Class: Kamal::Configuration

Inherits:
Object
  • Object
show all
Includes:
Validation
Defined in:
lib/kamal/configuration.rb

Defined Under Namespace

Modules: Validation Classes: Accessory, Alias, Boot, Builder, Env, Logging, Proxy, Registry, Role, Servers, Ssh, Sshkit, Validator, Volume

Constant Summary collapse

PROXY_MINIMUM_VERSION =
"v0.7.0"
PROXY_HTTP_PORT =
80
PROXY_HTTPS_PORT =
443

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Validation

#validate!, #validation_yml

Constructor Details

#initialize(raw_config, destination: nil, version: nil, validate: true) ⇒ Configuration

Returns a new instance of Configuration.



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/kamal/configuration.rb', line 50

def initialize(raw_config, destination: nil, version: nil, validate: true)
  @raw_config = ActiveSupport::InheritableOptions.new(raw_config)
  @destination = destination
  @declared_version = version

  validate! raw_config, example: validation_yml.symbolize_keys, context: "", with: Kamal::Configuration::Validator::Configuration

  @secrets = Kamal::Secrets.new(destination: destination)

  # Eager load config to validate it, these are first as they have dependencies later on
  @servers = Servers.new(config: self)
  @registry = Registry.new(config: self)

  @accessories = @raw_config.accessories&.keys&.collect { |name| Accessory.new(name, config: self) } || []
  @aliases = @raw_config.aliases&.keys&.to_h { |name| [ name, Alias.new(name, config: self) ] } || {}
  @boot = Boot.new(config: self)
  @builder = Builder.new(config: self)
  @env = Env.new(config: @raw_config.env || {}, secrets: secrets)

  @logging = Logging.new(logging_config: @raw_config.logging)
  @proxy = Proxy.new(config: self, proxy_config: @raw_config.proxy || {})
  @ssh = Ssh.new(config: self)
  @sshkit = Sshkit.new(config: self)

  ensure_destination_if_required
  ensure_required_keys_present
  ensure_valid_kamal_version
  ensure_retain_containers_valid
  ensure_valid_service_name
  ensure_no_traefik_reboot_hooks
  ensure_one_host_for_ssl_roles
  ensure_unique_hosts_for_ssl_roles
end

Instance Attribute Details

#accessoriesObject (readonly)

Returns the value of attribute accessories.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def accessories
  @accessories
end

#aliasesObject (readonly)

Returns the value of attribute aliases.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def aliases
  @aliases
end

#bootObject (readonly)

Returns the value of attribute boot.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def boot
  @boot
end

#builderObject (readonly)

Returns the value of attribute builder.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def builder
  @builder
end

#destinationObject (readonly)

Returns the value of attribute destination.



12
13
14
# File 'lib/kamal/configuration.rb', line 12

def destination
  @destination
end

#envObject (readonly)

Returns the value of attribute env.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def env
  @env
end

#loggingObject (readonly)

Returns the value of attribute logging.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def logging
  @logging
end

#proxyObject (readonly)

Returns the value of attribute proxy.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def proxy
  @proxy
end

#raw_configObject (readonly)

Returns the value of attribute raw_config.



12
13
14
# File 'lib/kamal/configuration.rb', line 12

def raw_config
  @raw_config
end

#registryObject (readonly)

Returns the value of attribute registry.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def registry
  @registry
end

#secretsObject (readonly)

Returns the value of attribute secrets.



12
13
14
# File 'lib/kamal/configuration.rb', line 12

def secrets
  @secrets
end

#serversObject (readonly)

Returns the value of attribute servers.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def servers
  @servers
end

#sshObject (readonly)

Returns the value of attribute ssh.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def ssh
  @ssh
end

#sshkitObject (readonly)

Returns the value of attribute sshkit.



13
14
15
# File 'lib/kamal/configuration.rb', line 13

def sshkit
  @sshkit
end

Class Method Details

.create_from(config_file:, destination: nil, version: nil) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/kamal/configuration.rb', line 22

def create_from(config_file:, destination: nil, version: nil)
  ENV["KAMAL_DESTINATION"] = destination

  raw_config = load_config_files(config_file, *destination_config_file(config_file, destination))

  new raw_config, destination: destination, version: version
end

Instance Method Details

#abbreviated_versionObject



93
94
95
96
97
98
99
100
101
102
# File 'lib/kamal/configuration.rb', line 93

def abbreviated_version
  if version
    # Don't abbreviate <sha>_uncommitted_<etc>
    if version.include?("_")
      version
    else
      version[0...7]
    end
  end
end

#absolute_imageObject



158
159
160
# File 'lib/kamal/configuration.rb', line 158

def absolute_image
  "#{repository}:#{version}"
end

#accessory(name) ⇒ Object



117
118
119
# File 'lib/kamal/configuration.rb', line 117

def accessory(name)
  accessories.detect { |a| a.name == name.to_s }
end

#all_hostsObject



122
123
124
# File 'lib/kamal/configuration.rb', line 122

def all_hosts
  (roles + accessories).flat_map(&:hosts).uniq
end

#allow_empty_roles?Boolean

Returns:

  • (Boolean)


138
139
140
# File 'lib/kamal/configuration.rb', line 138

def allow_empty_roles?
  raw_config.allow_empty_roles
end

#app_directoryObject



217
218
219
# File 'lib/kamal/configuration.rb', line 217

def app_directory
  File.join apps_directory, [ service, destination ].compact.join("-")
end

#apps_directoryObject



213
214
215
# File 'lib/kamal/configuration.rb', line 213

def apps_directory
  File.join run_directory, "apps"
end

#asset_pathObject



234
235
236
# File 'lib/kamal/configuration.rb', line 234

def asset_path
  raw_config.asset_path
end

#assets_directoryObject



225
226
227
# File 'lib/kamal/configuration.rb', line 225

def assets_directory
  File.join app_directory, "assets"
end

#deploy_timeoutObject



200
201
202
# File 'lib/kamal/configuration.rb', line 200

def deploy_timeout
  raw_config.deploy_timeout || 30
end

#drain_timeoutObject



204
205
206
# File 'lib/kamal/configuration.rb', line 204

def drain_timeout
  raw_config.drain_timeout || 30
end

#env_directoryObject



221
222
223
# File 'lib/kamal/configuration.rb', line 221

def env_directory
  File.join app_directory, "env"
end

#env_tag(name) ⇒ Object



247
248
249
# File 'lib/kamal/configuration.rb', line 247

def env_tag(name)
  env_tags.detect { |t| t.name == name.to_s }
end

#env_tagsObject



239
240
241
242
243
244
245
# File 'lib/kamal/configuration.rb', line 239

def env_tags
  @env_tags ||= if (tags = raw_config.env["tags"])
    tags.collect { |name, config| Env::Tag.new(name, config: config, secrets: secrets) }
  else
    []
  end
end

#hooks_pathObject



230
231
232
# File 'lib/kamal/configuration.rb', line 230

def hooks_path
  raw_config.hooks_path || ".kamal/hooks"
end

#latest_imageObject



162
163
164
# File 'lib/kamal/configuration.rb', line 162

def latest_image
  "#{repository}:#{latest_tag}"
end

#latest_tagObject



166
167
168
# File 'lib/kamal/configuration.rb', line 166

def latest_tag
  [ "latest", *destination ].join("-")
end

#logging_argsObject



191
192
193
# File 'lib/kamal/configuration.rb', line 191

def logging_args
  logging.args
end

#minimum_versionObject



104
105
106
# File 'lib/kamal/configuration.rb', line 104

def minimum_version
  raw_config.minimum_version
end

#primary_hostObject



126
127
128
# File 'lib/kamal/configuration.rb', line 126

def primary_host
  primary_role&.primary_host
end

#primary_roleObject



134
135
136
# File 'lib/kamal/configuration.rb', line 134

def primary_role
  role(primary_role_name)
end

#primary_role_nameObject



130
131
132
# File 'lib/kamal/configuration.rb', line 130

def primary_role_name
  raw_config.primary_role || "web"
end

#proxy_container_nameObject



263
264
265
# File 'lib/kamal/configuration.rb', line 263

def proxy_container_name
  "kamal-proxy"
end

#proxy_directoryObject



267
268
269
# File 'lib/kamal/configuration.rb', line 267

def proxy_directory
  File.join run_directory, "proxy"
end

#proxy_hostsObject



150
151
152
# File 'lib/kamal/configuration.rb', line 150

def proxy_hosts
  proxy_roles.flat_map(&:hosts).uniq
end

#proxy_imageObject



259
260
261
# File 'lib/kamal/configuration.rb', line 259

def proxy_image
  "basecamp/kamal-proxy:#{PROXY_MINIMUM_VERSION}"
end

#proxy_options_defaultObject



255
256
257
# File 'lib/kamal/configuration.rb', line 255

def proxy_options_default
  proxy_publish_args PROXY_HTTP_PORT, PROXY_HTTPS_PORT
end

#proxy_options_fileObject



271
272
273
# File 'lib/kamal/configuration.rb', line 271

def proxy_options_file
  File.join proxy_directory, "options"
end

#proxy_publish_args(http_port, https_port) ⇒ Object



251
252
253
# File 'lib/kamal/configuration.rb', line 251

def proxy_publish_args(http_port, https_port)
  argumentize "--publish", [ "#{http_port}:#{PROXY_HTTP_PORT}", "#{https_port}:#{PROXY_HTTPS_PORT}" ]
end

#proxy_role_namesObject



146
147
148
# File 'lib/kamal/configuration.rb', line 146

def proxy_role_names
  proxy_roles.flat_map(&:name)
end

#proxy_rolesObject



142
143
144
# File 'lib/kamal/configuration.rb', line 142

def proxy_roles
  roles.select(&:running_proxy?)
end

#readiness_delayObject



196
197
198
# File 'lib/kamal/configuration.rb', line 196

def readiness_delay
  raw_config.readiness_delay || 7
end

#repositoryObject



154
155
156
# File 'lib/kamal/configuration.rb', line 154

def repository
  [ registry.server, image ].compact.join("/")
end

#require_destination?Boolean

Returns:

  • (Boolean)


174
175
176
# File 'lib/kamal/configuration.rb', line 174

def require_destination?
  raw_config.require_destination
end

#retain_containersObject



178
179
180
# File 'lib/kamal/configuration.rb', line 178

def retain_containers
  raw_config.retain_containers || 5
end

#role(name) ⇒ Object



113
114
115
# File 'lib/kamal/configuration.rb', line 113

def role(name)
  roles.detect { |r| r.name == name.to_s }
end

#rolesObject



109
110
111
# File 'lib/kamal/configuration.rb', line 109

def roles
  servers.roles
end

#run_directoryObject



209
210
211
# File 'lib/kamal/configuration.rb', line 209

def run_directory
  ".kamal"
end

#service_with_versionObject



170
171
172
# File 'lib/kamal/configuration.rb', line 170

def service_with_version
  "#{service}-#{version}"
end

#to_hObject



276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
# File 'lib/kamal/configuration.rb', line 276

def to_h
  {
    roles: role_names,
    hosts: all_hosts,
    primary_host: primary_host,
    version: version,
    repository: repository,
    absolute_image: absolute_image,
    service_with_version: service_with_version,
    volume_args: volume_args,
    ssh_options: ssh.to_h,
    sshkit: sshkit.to_h,
    builder: builder.to_h,
    accessories: raw_config.accessories,
    logging: logging_args
  }.compact
end

#versionObject



89
90
91
# File 'lib/kamal/configuration.rb', line 89

def version
  @declared_version.presence || ENV["VERSION"] || git_version
end

#version=(version) ⇒ Object



85
86
87
# File 'lib/kamal/configuration.rb', line 85

def version=(version)
  @declared_version = version
end

#volume_argsObject



183
184
185
186
187
188
189
# File 'lib/kamal/configuration.rb', line 183

def volume_args
  if raw_config.volumes.present?
    argumentize "--volume", raw_config.volumes
  else
    []
  end
end