Class: Shippy::Service

Inherits:
Object
  • Object
show all
Defined in:
lib/shippy/service.rb

Constant Summary collapse

ATTRIBUTES =
%i[
  annotations attach build blkio_config cpu_count cpu_percent cpu_shares cpu_period
  cpu_quota cpu_rt_runtime cpu_rt_period cpus cpuset cap_add cap_drop cgroup
  cgroup_parent command configs container_name credential_spec depends_on deploy
  develop device_cgroup_rules devices dns dns_opt dns_search domainname driver_opts
  entrypoint env_file environment expose extends external_links extra_hosts gpus
  group_add healthcheck hostname image init ipc isolation labels label_file links
  logging mac_address mem_limit mem_reservation mem_swappiness memswap_limit models
  network_mode networks oom_kill_disable oom_score_adj pid pids_limit platform
  ports post_start pre_stop privileged profiles provider pull_policy read_only
  restart runtime scale secrets security_opt shm_size stdin_open stop_grace_period
  stop_signal storage_opt sysctls tmpfs tty ulimits use_api_socket user
  userns_mode uts volumes volumes_from working_dir
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, app:, &block) ⇒ Service

Returns a new instance of Service.



30
31
32
33
34
35
36
# File 'lib/shippy/service.rb', line 30

def initialize(name, app:, &block)
  @name = name
  @app = app
  @data = {}

  instance_eval(&block)
end

Instance Attribute Details

#app ⇒ Object (readonly)

Returns the value of attribute app.



18
19
20
# File 'lib/shippy/service.rb', line 18

def app
  @app
end

#name ⇒ Object (readonly)

Returns the value of attribute name.



18
19
20
# File 'lib/shippy/service.rb', line 18

def name
  @name
end

Instance Method Details

#build_traefik_labels(name:, port: nil) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/shippy/service.rb', line 79

def build_traefik_labels(name:, port: nil)
  rule = "Host(`#{name}.#{wildcard_domain}`)"
  rule = yield(rule) if block_given?

  [
    "traefik.http.routers.websecure-#{name}.rule=#{rule}",
    "traefik.http.routers.websecure-#{name}.entrypoints=websecure",
    "traefik.http.routers.websecure-#{name}.tls=true",
    "traefik.http.routers.websecure-#{name}.tls.certresolver=ssl-resolver",
    "traefik.http.routers.websecure-#{name}.tls.domains[0].main=#{wildcard_domain}",
    "traefik.http.routers.websecure-#{name}.tls.domains[0].sans=*.#{wildcard_domain}",

    "traefik.http.routers.web-#{name}.rule=Host(`#{name}.#{wildcard_domain}`)",
    "traefik.http.routers.web-#{name}.entrypoints=web",
    "traefik.http.routers.web-#{name}.middlewares=secure-redirect-scheme@file"
  ].tap do |labels|
    if port
      labels << "traefik.http.services.#{name}.loadbalancer.server.port=#{port}"
      labels << "traefik.http.routers.websecure-#{name}.service=#{name}"
      labels << "traefik.http.routers.web-#{name}.service=#{name}"
    end
  end
end

#hooks ⇒ Object



112
113
114
115
116
117
118
# File 'lib/shippy/service.rb', line 112

def hooks
  if block_given?
    @hooks = normalize_hooks(yield)
  else
    @hooks.to_a.map { |data| [name, data[:options], data[:cmd]] }
  end
end

#secrets(name) ⇒ Object



103
104
105
# File 'lib/shippy/service.rb', line 103

def secrets(name)
  @app.secrets(name)
end

#to_hash ⇒ Object



38
39
40
# File 'lib/shippy/service.rb', line 38

def to_hash
  {@name => @data}
end

#use_default_logging ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/shippy/service.rb', line 52

def use_default_logging
  logging do
    {
      driver: "json-file",
      options: {
        "max-size": "10m",
        "max-file": "5"
      }
    }
  end
end

#use_default_networks ⇒ Object



64
65
66
# File 'lib/shippy/service.rb', line 64

def use_default_networks
  networks { ["lan_access"] }
end

#use_default_options ⇒ Object



42
43
44
45
46
# File 'lib/shippy/service.rb', line 42

def use_default_options
  use_default_restart
  use_default_networks
  use_default_logging
end

#use_default_restart ⇒ Object



48
49
50
# File 'lib/shippy/service.rb', line 48

def use_default_restart
  restart { "unless-stopped" }
end

#use_traefik(name:, alt: nil, port: nil, &block) ⇒ Object



68
69
70
71
72
73
74
75
76
77
# File 'lib/shippy/service.rb', line 68

def use_traefik(name:, alt: nil, port: nil, &block)
  labels do
    all_labels = ["traefik.enable=true"]
    all_labels += ["traefik.docker.network=lan_access"]
    all_labels += build_traefik_labels(name: name, port: port, &block)
    all_labels += build_traefik_labels(name: alt, port: port, &block) if alt

    all_labels
  end
end