Atualizando do Kamal 1 para o Kamal 2

Aqui estão alguns passos e notas para a atualização de uma configuração de servidor único do Kamal para o novo Kamal 2.

1. Atualizar para o Kamal 1.9.x

Primeiro, atualize para o Kamal 1.9 e confirme se ainda consegue realizar o deploy:

$ gem install kamal --version 1.9.0
$ kamal config
$ kamal deploy

2. Atualizar para o Kamal 2

Atualize novamente a versão do Kamal para um lançamento 2.x:

$ gem install kamal --version 2.1.0

Não realize o deploy ainda.

3. Remover referências ao Traefik

Remova a seção Traefik de config/deploy.yml:

traefik:
  options:
    publish:
      - "443:443"
    volume:
      - "/letsencrypt/acme.json:/letsencrypt/acme.json"
    network: "private"
  ...

E remova qualquer outra referência ao proxy, como rótulos traefik.* em qualquer lugar.

4. Remover a seção de verificação de saúde (healthcheck)

Remova as configurações antigas de healthcheck de config/deploy.yml:

healthcheck:
  # path: /up
  # port: 3000
  interval: 5s

5. Atualizar a configuração do builder

Remova a opção multiarch e especifique uma ou mais arquiteturas com arch (as opções são amd64 e arm64):

builder:
  arch: 
    - amd64
    - arm64

Você provavelmente usará amd64. Pode manter as configurações de cache.

Consulte o guia oficial para builders remotos.

6. Adicionar as novas configurações de proxy

Adicione configurações semelhantes de Kamal Proxy de acordo com suas necessidades:

proxy:
  ssl: true
  host: tubeandchill.com
  app_port: 3000
  healthcheck:
    path: /up
    interval: 3
    timeout: 30

Se você estava emitindo certificados TLS com o Traefik, agora pode substituí-lo definindo ssl como true e especificando seu host. Caso contrário, pode pular esta etapa.

O caminho de healthcheck permaneceu o mesmo em /up, mas você pode precisar removê-lo das verificações de SSL ou hostname:

# Ignora redirecionamento de http para https para o endpoint padrão de healthcheck.
config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }

# Ignora proteção de reatribuição de DNS para o endpoint padrão de healthcheck.
config.host_authorization = { exclude: ->(request) { request.path == "/up" } }

A porta da aplicação agora está definida para 80 (era 3000). Altere-a de volta para 3000 ou atualize seu Dockerfile para usar a porta 80.

7. Criar novo arquivo de secrets

O Kamal mudou a forma como os secrets funcionam. Antes de explorar as novas opções de secrets, você pode simplesmente mover os antigos:

$ cp .env .kamal/secrets

Isso significa que .kamal/secrets também não pode ser incluído no controle de versão, então adicione-o ao .gitignore.

Você pode explorar os novos secrets em mais detalhes na documentação.

Observe que não há mais conversão de .env.erb ou kamal push env. Todos foram removidos.

8. Verificar novamente sua configuração

Verifique sua nova configuração executando o comando kamal config:

$ kamal config

Se você estava usando redes Docker personalizadas para comunicação de acessórios, não as remova ainda. Somente se você as nomeou como kamal, remova-as da configuração para evitar conflitos.

9. Executar a atualização in-place

Faça o primeiro deploy do Kamal 2 executando uma atualização:

$ kamal upgrade

Isso fará várias coisas, como remover o Traefik, criar a rede Docker do Kamal, alternar para o Kamal Proxy, reiniciar a aplicação e, finalmente, reiniciar os acessórios.

10. Remover redes Docker personalizadas

Agora você pode remover sua rede Docker personalizada, pois tudo pode ser executado com a nova rede do Kamal.

Você pode reiniciar sua aplicação e acessórios para aplicar essa última mudança:

$ kamal deploy
$ kamal accessory reboot [ACCESSORY]

11. Corrigir falhas na atualização

Lembre-se de que, se a atualização substituir o proxy, mas falhar posteriormente, você pode corrigir o problema subjacente e continuar fazendo o redeploy da aplicação ou reiniciando os acessórios.