Kamal 2: Secrets changes

Secrets have moved from .env/.env.rb to .kamal/secrets.

If you are using destinations, secrets will be read from .kamal/secrets.<DESTINATION> first or .kamal/secrets if it is not found.

Interpolating secrets

The kamal envify and kamal env commands have been removed and secrets no longer have a separate lifecycle.

If you were generating secrets with kamal envify you can instead use dotenv’s command and variable substitution.

The substitution will be performed on demand when running kamal commands that needs them.

# .kamal/secrets

SECRET_FROM_ENV=$SECRET_FROM_ENV
SECRET_FROM_COMMAND=$(op read ...)

See here for more details

Environment variables in deploy.yml

In Kamal 1, .env was loaded into the environment, so you could refer to values from it via ERB in deploy.yml. This is no longer the case in Kamal 2. Values from .kamal/secrets are not loaded either.

Kamal 1:

# .env
SERVER_IP=127.0.0.1

# config/deploy.yml
servers
  - <%= ENV["SERVER_IP"] %>

To make this work in Kamal 2, you can manually load .env.

Kamal 2:

# .env
SERVER_IP=127.0.0.1

# config/deploy.yml

<% require "dotenv"; Dotenv.load(".env") %>

servers
  - <%= ENV["SERVER_IP"] %>