From 8600e31797176dc725041f2f512dd79566cfc51d Mon Sep 17 00:00:00 2001 From: Eduardo Lopes <155753879+eduardolopesx03@users.noreply.github.com> Date: Mon, 9 Feb 2026 23:20:04 -0300 Subject: [PATCH] Add production docker compose and deploy guide --- .env.example | 20 ++++++++++++++++++++ DEPLOY.md | 45 ++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 .env.example create mode 100644 DEPLOY.md create mode 100644 docker-compose.yml diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2e94369 --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# Backend +ASPNETCORE_ENVIRONMENT=Production +APP_USE_HTTPS_REDIRECTION=false + +# JWT +JWT_KEY=CHANGE_ME_TO_A_LONG_RANDOM_SECRET +JWT_ISSUER=LineGestao +JWT_AUDIENCE=LineGestao + +# Seed admin (first login) +SEED_ADMIN_EMAIL=admin@seu-dominio.com +SEED_ADMIN_PASSWORD=CHANGE_ME_TO_A_STRONG_PASSWORD + +# PostgreSQL +POSTGRES_DB=linegestao +POSTGRES_USER=linegestao_app +POSTGRES_PASSWORD=CHANGE_ME_TO_A_STRONG_PASSWORD + +# Front-end URL used by CORS +FRONTEND_PUBLIC_URL=https://seu-dominio.com diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..cdef371 --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,45 @@ +# Deploy rápido (API + Postgres) + +## Erro: `no configuration file provided: not found` +Esse erro acontece quando o `docker compose` é executado em uma pasta sem `docker-compose.yml`. + +Este repositório agora inclui `docker-compose.yml` na raiz do projeto. + +## Passo a passo + +1. Entre na pasta da API: + +```bash +cd ~/apps/line-gestao-api +``` + +2. Crie o `.env` a partir do exemplo: + +```bash +cp .env.example .env +nano .env +``` + +3. Suba os containers: + +```bash +docker compose up -d --build +``` + +4. Verifique o status e logs: + +```bash +docker compose ps +docker compose logs -f --tail=200 +``` + +5. Teste healthcheck da API: + +```bash +curl -I http://SEU_SERVIDOR:4000/health +``` + +## Observações +- O Postgres **não é exposto** para fora do Docker (sem `5432:5432`). +- A API sobe na porta `4000` do host (`4000:8080`). +- Defina valores fortes para `JWT_KEY`, `SEED_ADMIN_PASSWORD` e `POSTGRES_PASSWORD`. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..bcbe69d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,47 @@ +services: + db: + image: postgres:16-alpine + container_name: linegestao-db + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB:-linegestao} + POSTGRES_USER: ${POSTGRES_USER:-linegestao_app} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} + volumes: + - pg_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-linegestao_app} -d ${POSTGRES_DB:-linegestao}"] + interval: 10s + timeout: 5s + retries: 10 + + api: + build: + context: . + dockerfile: Dockerfile + container_name: linegestao-api + restart: unless-stopped + depends_on: + db: + condition: service_healthy + ports: + - "4000:8080" + environment: + ASPNETCORE_ENVIRONMENT: ${ASPNETCORE_ENVIRONMENT:-Production} + App__UseHttpsRedirection: ${APP_USE_HTTPS_REDIRECTION:-false} + ConnectionStrings__Default: Host=db;Port=5432;Database=${POSTGRES_DB:-linegestao};Username=${POSTGRES_USER:-linegestao_app};Password=${POSTGRES_PASSWORD} + Jwt__Key: ${JWT_KEY:?JWT_KEY is required} + Jwt__Issuer: ${JWT_ISSUER:-LineGestao} + Jwt__Audience: ${JWT_AUDIENCE:-LineGestao} + Seed__AdminEmail: ${SEED_ADMIN_EMAIL:?SEED_ADMIN_EMAIL is required} + Seed__AdminPassword: ${SEED_ADMIN_PASSWORD:?SEED_ADMIN_PASSWORD is required} + Cors__AllowedOrigins__0: ${FRONTEND_PUBLIC_URL:?FRONTEND_PUBLIC_URL is required} + healthcheck: + test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/health"] + interval: 20s + timeout: 5s + retries: 10 + start_period: 20s + +volumes: + pg_data: