Replace Traefik with Caddy in production compose
This commit is contained in:
parent
3202899d76
commit
fd6e99e18b
|
|
@ -19,6 +19,6 @@ POSTGRES_PASSWORD=CHANGE_ME_TO_A_STRONG_PASSWORD
|
||||||
# Front-end URL used by CORS
|
# Front-end URL used by CORS
|
||||||
FRONTEND_PUBLIC_URL=https://seu-dominio.com
|
FRONTEND_PUBLIC_URL=https://seu-dominio.com
|
||||||
|
|
||||||
# Domain / HTTPS (docker-compose.prod.yml)
|
# Domain / HTTPS (docker-compose.prod.yml with Caddy)
|
||||||
API_DOMAIN=api.seu-dominio.com
|
API_DOMAIN=api.seu-dominio.com
|
||||||
ACME_EMAIL=seu-email@seu-dominio.com
|
ACME_EMAIL=seu-email@seu-dominio.com
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
email {$ACME_EMAIL}
|
||||||
|
}
|
||||||
|
|
||||||
|
{$API_DOMAIN} {
|
||||||
|
encode zstd gzip
|
||||||
|
reverse_proxy api:8080
|
||||||
|
}
|
||||||
|
|
@ -39,12 +39,14 @@ docker compose logs -f --tail=200
|
||||||
curl -I http://SEU_SERVIDOR:4000/health
|
curl -I http://SEU_SERVIDOR:4000/health
|
||||||
```
|
```
|
||||||
|
|
||||||
## Opção 2: subir já com domínio + HTTPS automático (Traefik)
|
## Opção 2: subir já com domínio + HTTPS automático (Caddy)
|
||||||
|
|
||||||
### Pré-requisitos
|
### Pré-requisitos
|
||||||
- O DNS do domínio/subdomínio da API deve apontar para o IP do servidor (registro `A`).
|
- O DNS do domínio/subdomínio da API deve apontar para o IP do servidor (registro `A`).
|
||||||
- Portas 80 e 443 abertas no firewall/security group.
|
- Portas 80 e 443 abertas no firewall/security group.
|
||||||
|
|
||||||
|
> Se você viu erro do tipo `client version 1.24 is too old` no Traefik, use este modo com Caddy: ele não depende da API Docker para criar rotas e evita esse problema.
|
||||||
|
|
||||||
### 1) Ajuste o `.env`
|
### 1) Ajuste o `.env`
|
||||||
Na pasta da API:
|
Na pasta da API:
|
||||||
|
|
||||||
|
|
@ -60,7 +62,7 @@ Preencha obrigatoriamente:
|
||||||
- `FRONTEND_PUBLIC_URL` (URL pública do front)
|
- `FRONTEND_PUBLIC_URL` (URL pública do front)
|
||||||
- `JWT_KEY`, `SEED_ADMIN_*`, `POSTGRES_PASSWORD`
|
- `JWT_KEY`, `SEED_ADMIN_*`, `POSTGRES_PASSWORD`
|
||||||
|
|
||||||
### 2) Suba em modo produção com Traefik
|
### 2) Suba em modo produção com Caddy
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose -f docker-compose.prod.yml up -d --build
|
docker compose -f docker-compose.prod.yml up -d --build
|
||||||
|
|
@ -116,5 +118,5 @@ docker compose -f docker-compose.prod.yml up -d --build
|
||||||
## Observações
|
## Observações
|
||||||
- O Postgres **não é exposto** para fora do Docker (sem `5432:5432`).
|
- O Postgres **não é exposto** para fora do Docker (sem `5432:5432`).
|
||||||
- No modo IP, a API sobe na porta `4000` do host (`4000:8080`).
|
- No modo IP, a API sobe na porta `4000` do host (`4000:8080`).
|
||||||
- No modo domínio, a API fica atrás do Traefik em `443` (HTTPS).
|
- No modo domínio, a API fica atrás do Caddy em `443` (HTTPS).
|
||||||
- Defina valores fortes para `JWT_KEY`, `SEED_ADMIN_PASSWORD` e `POSTGRES_PASSWORD`.
|
- Defina valores fortes para `JWT_KEY`, `SEED_ADMIN_PASSWORD` e `POSTGRES_PASSWORD`.
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,21 @@
|
||||||
services:
|
services:
|
||||||
traefik:
|
caddy:
|
||||||
image: traefik:v3.3
|
image: caddy:2.10-alpine
|
||||||
container_name: linegestao-traefik
|
container_name: linegestao-caddy
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command:
|
|
||||||
- --providers.docker=true
|
|
||||||
- --providers.docker.exposedbydefault=false
|
|
||||||
- --entrypoints.web.address=:80
|
|
||||||
- --entrypoints.websecure.address=:443
|
|
||||||
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
|
|
||||||
- --certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL:?ACME_EMAIL is required}
|
|
||||||
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
|
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "443:443"
|
||||||
|
environment:
|
||||||
|
API_DOMAIN: ${API_DOMAIN:?API_DOMAIN is required}
|
||||||
|
ACME_EMAIL: ${ACME_EMAIL:?ACME_EMAIL is required}
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- ./Caddyfile:/etc/caddy/Caddyfile:ro
|
||||||
- traefik_letsencrypt:/letsencrypt
|
- caddy_data:/data
|
||||||
|
- caddy_config:/config
|
||||||
|
depends_on:
|
||||||
|
api:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: postgres:16-alpine
|
image: postgres:16-alpine
|
||||||
|
|
@ -59,13 +58,8 @@ services:
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 20s
|
start_period: 20s
|
||||||
labels:
|
|
||||||
- traefik.enable=true
|
|
||||||
- traefik.http.routers.linegestao-api.rule=Host(`${API_DOMAIN:?API_DOMAIN is required}`)
|
|
||||||
- traefik.http.routers.linegestao-api.entrypoints=websecure
|
|
||||||
- traefik.http.routers.linegestao-api.tls.certresolver=letsencrypt
|
|
||||||
- traefik.http.services.linegestao-api.loadbalancer.server.port=8080
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
pg_data:
|
pg_data:
|
||||||
traefik_letsencrypt:
|
caddy_data:
|
||||||
|
caddy_config:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue