DEV Community

Cover image for SSL para SaaS com multiplos domínios usando Docker e Caddy
Marllon Gomes
Marllon Gomes

Posted on

SSL para SaaS com multiplos domínios usando Docker e Caddy

Precisa fornecer automaticamente certificados SSL para os usuários do seu SaaS (Software as a Service)? Pode parecer uma tarefa difícil à medida que você expande a quantidade de domínios. A boa notícia é que há uma solução viável e simples chamada Caddy.

Claro que existem várias soluções pagas disponíveis no mercado, tipo SSL para SaaS da Cloudflare, que simplificam o processo. Só que os preços são salgados, especialmente para empresas que estão começando e ainda não podem fazer esse investimento.

Depois de uma boa pesquisa e testes, descobri o Caddy, que oferece https on_demand, com validação de domínio.

Vou te mostrar como implementei essa configuração usando Docker e Docker-compose.

Considerando um docker-compose com a aplicação principal e um container caddy. No container caddy, temos 3 volumes mapeados: "caddydata", "caddycfg" e o Caddyfile (próximo parágrafo).

version: '3'

services:
  caddy:
    image: caddy:latest
    restart: always
    ports:
      - '80:80'
      - '443:443'
      - '443:443/udp'
    volumes:
      - caddydata:/data
      - caddycfg:/config
      - ./Caddyfile:/etc/caddy/Caddyfile
    depends_on:
      - app
    networks:
      - app

  app:
    build:
      context: .
      dockerfile: ./dockerassets/app/Dockerfile
    restart: always
    networks:
      - app

networks:
  app:

volumes:
  caddydataprod:
  caddycfgprod:
Enter fullscreen mode Exit fullscreen mode

Criando o Caddyfile:

{
    email email@suaempresa.com

    on_demand_tls {
        ask http://app/api/check-domain
        interval 2m
        burst 5
    }
}
Enter fullscreen mode Exit fullscreen mode

No topo do arquivo, temos as configurações gerais do Caddy, incluindo o e-mail usado para emitir os certificados SSL e as configurações do on demand tls. No “on_demand_tls”, definimos a URL que responde com status 200, caso o domínio esteja cadastrado e ativo na sua aplicação, além do tempo de cache.

Assim, sempre que uma requisição de um domínio que ainda não tem certificado chega no servidor, o Caddy envia uma requisição para a URL do parâmetro “ask”, com o domínio como parâmetro de URL. Por exemplo: http://app/api/check-domain?domain=dominio.com. (lembre-se do www).

Aqui, temos o redirecionamento de http para https.

http:// {
    redir https://{host}{uri} permanent
}
Enter fullscreen mode Exit fullscreen mode

E finalmente, o proxy reverso com tls on demand para a aplicação.

https:// {
    tls {
        on_demand
    }

    reverse_proxy app:80
}
Enter fullscreen mode Exit fullscreen mode

Confira o Caddyfile completo com todas as configurações acima:

{
    email email@suaempresa.com
    on_demand_tls {
        ask http://app/api/check-domain
        interval 2m
        burst 5
    }
}

http:// {
    redir https://{host}{uri} permanent
}

https:// {
    tls {
        on_demand
    }

    reverse_proxy app:80
}
Enter fullscreen mode Exit fullscreen mode

Pronto! Com tudo configurado corretamente, basta um simples "docker compose up -d" para que sua aplicação comece a fornecer certificados SSL para domínios apontados para o seu servidor.

Top comments (0)