From 4358bcfb10fd7d78b2230f86b81f7633a4cca65e Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Sat, 15 Nov 2025 16:37:27 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20adi=C3=A7=C3=A3o=20de=20workflows=20e?= =?UTF-8?q?=20documenta=C3=A7=C3=A3o=20para=20publica=C3=A7=C3=A3o=20no=20?= =?UTF-8?q?Docker=20Hub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implementado o workflow GitHub Actions para build e push da imagem do OpenSheets para o Docker Hub. - Criado guia de deploy no Coolify, detalhando opções de uso e configuração. - Atualizados arquivos de configuração do Docker Compose para produção, incluindo serviços e variáveis de ambiente. - Adicionadas instruções para gerenciamento de versões e troubleshooting. --- .github/workflows/docker-publish.yml | 65 ++++++ DEPLOY_COOLIFY.md | 270 ++++++++++++++++++++++++ DEPLOY_README.md | 130 ++++++++++++ DOCKER_HUB.md | 303 +++++++++++++++++++++++++++ docker-compose.prod.yml | 131 ++++++++++++ 5 files changed, 899 insertions(+) create mode 100644 .github/workflows/docker-publish.yml create mode 100644 DEPLOY_COOLIFY.md create mode 100644 DEPLOY_README.md create mode 100644 DOCKER_HUB.md create mode 100644 docker-compose.prod.yml diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..43b9d79 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,65 @@ +name: Build and Push to Docker Hub + +on: + push: + branches: + - main + tags: + - 'v*.*.*' + pull_request: + branches: + - main + workflow_dispatch: + +env: + DOCKER_IMAGE_NAME: opensheets + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ secrets.DOCKER_USERNAME }}/${{ env.DOCKER_IMAGE_NAME }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=raw,value=latest,enable={{is_default_branch}} + type=sha,prefix={{branch}}- + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + platforms: linux/amd64,linux/arm64 + + - name: Image digest + run: echo ${{ steps.meta.outputs.digest }} diff --git a/DEPLOY_COOLIFY.md b/DEPLOY_COOLIFY.md new file mode 100644 index 0000000..5c0aab8 --- /dev/null +++ b/DEPLOY_COOLIFY.md @@ -0,0 +1,270 @@ +# Deploy do OpenSheets no Coolify + +Este guia mostra como fazer deploy do OpenSheets no Coolify usando Docker. + +## 🚀 Resumo Rápido + +**Duas formas principais:** + +### 1. Com imagem do Docker Hub (MAIS RÁPIDO ⚡) +- Publicar imagem no Docker Hub primeiro +- Deploy em segundos (só faz pull) +- Ideal para produção e CI/CD +- **Ver guia:** [DOCKER_HUB.md](./DOCKER_HUB.md) + +### 2. Build direto no Coolify (MAIS SIMPLES) +- Usar `docker-compose.yml` original +- Coolify faz build completo (2-5 min) +- Ideal para começar rápido + +--- + +## Qual opção escolher? + +| Opção | Quando usar | Deploy | Complexidade | +|-------|-------------|--------|--------------| +| **Opção 1: Imagem Docker Hub** | Deploy rápido, CI/CD, produção | ⚡ Segundos | ⭐ Fácil | +| **Opção 2: Build no Coolify** | Começar rápido, teste | 🐢 2-5 min | ⭐ Fácil | +| **Opção 3: PostgreSQL separado** | Backups automáticos, melhor gestão | 🐢 2-5 min | ⭐⭐ Médio | + +**Recomendado para produção: Opção 1 (Docker Hub)** ✅ + +--- + +## Opção 1: Deploy com Docker Hub (Recomendado para Produção) + +**Vantagens:** +- ✅ Deploy em **segundos** (vs minutos) +- ✅ Mesma imagem em múltiplos ambientes +- ✅ CI/CD automático via GitHub Actions +- ✅ Rollback fácil (trocar tag) + +### Passo 0: Publicar Imagem no Docker Hub + +**Siga o guia completo:** [DOCKER_HUB.md](./DOCKER_HUB.md) + +Resumo rápido: +1. Configurar secrets no GitHub (DOCKER_USERNAME e DOCKER_PASSWORD) +2. Push para main ou criar tag → GitHub Actions publica automaticamente +3. Verificar imagem em https://hub.docker.com/ + +### Passo 1: Criar Aplicação no Coolify + +1. No Coolify: **Projects** → **+ New Resource** → **Docker Compose Empty** +2. Configure: + - **Name**: `opensheets` + - **Source**: Conecte ao seu repositório Git + - **Branch**: `main` + - **Docker Compose Location**: `docker-compose.prod.yml` + +### Passo 2: Configurar Variáveis de Ambiente + +```bash +# Configuração da imagem do Docker Hub +DOCKER_USERNAME=seu-usuario-dockerhub +IMAGE_TAG=latest + +# PostgreSQL +POSTGRES_USER=opensheets +POSTGRES_PASSWORD=SENHA_FORTE_AQUI +POSTGRES_DB=opensheets_db +DATABASE_URL=postgresql://opensheets:SENHA_FORTE_AQUI@db:5432/opensheets_db + +# Better Auth (OBRIGATÓRIO) +BETTER_AUTH_SECRET=GERAR_COM_OPENSSL +BETTER_AUTH_URL=https://seu-dominio.com + +# Opcionais: EMAIL, OAUTH, AI (ver abaixo) +``` + +### Passo 3: Deploy + +1. Clique em **Deploy** +2. **Coolify vai fazer PULL da imagem** (segundos) ⚡ +3. PostgreSQL sobe primeiro +4. App executa migrations e inicia + +--- + +## Opção 2: Deploy com Build no Coolify (Mais Simples) + +**Use se:** Quer começar rápido sem configurar Docker Hub + +### Passo 1: Criar Aplicação no Coolify + +1. **Projects** → **+ New Resource** → **Docker Compose Empty** +2. Configure: + - **Name**: `opensheets` + - **Source**: Conecte ao repositório + - **Branch**: `main` + - **Docker Compose Location**: `docker-compose.yml` (ou deixe vazio) + +### Passo 2: Variáveis de Ambiente + +```bash +# PostgreSQL +POSTGRES_USER=opensheets +POSTGRES_PASSWORD=SENHA_FORTE_AQUI +POSTGRES_DB=opensheets_db +DATABASE_URL=postgresql://opensheets:MESMA_SENHA_ACIMA@db:5432/opensheets_db + +# Better Auth +BETTER_AUTH_SECRET=GERAR_COM_OPENSSL +BETTER_AUTH_URL=https://seu-dominio.com +``` + +**Gerar secrets:** +```bash +openssl rand -base64 32 # Para POSTGRES_PASSWORD +openssl rand -base64 32 # Para BETTER_AUTH_SECRET +``` + +**⚠️ IMPORTANTE:** A senha em `POSTGRES_PASSWORD` e `DATABASE_URL` deve ser igual! + +### Passo 3: Deploy + +1. Clique em **Deploy** +2. Coolify faz **build completo** (2-5 min) 🐢 +3. PostgreSQL e app sobem juntos + +--- + +## Opção 3: PostgreSQL Separado + +**Vantagens:** +- ✅ Backups automáticos do Coolify +- ✅ Monitoring independente +- ✅ Melhor para produção + +
+Ver instruções detalhadas + +### Passo 1: Criar PostgreSQL + +1. **Databases** → **+ New Database** → **PostgreSQL 18** +2. Configure nome, usuário, senha +3. Copie a **Internal Connection String** + +### Passo 2: Criar Aplicação + +1. **Docker Compose Empty** → apontar para `docker-compose.coolify.yml` +2. Configurar variáveis (DATABASE_URL aponta para PostgreSQL separado) + +
+ +--- + +## Variáveis de Ambiente Opcionais + +```bash +# Email (Resend) +RESEND_API_KEY=re_... +EMAIL_FROM=noreply@seu-dominio.com + +# OAuth Google +GOOGLE_CLIENT_ID=... +GOOGLE_CLIENT_SECRET=... + +# OAuth GitHub +GITHUB_CLIENT_ID=... +GITHUB_CLIENT_SECRET=... + +# AI Providers +ANTHROPIC_API_KEY=sk-ant-... +OPENAI_API_KEY=sk-... +GOOGLE_GENERATIVE_AI_API_KEY=... +OPENROUTER_API_KEY=... +``` + +--- + +## Configurar Domínio + +1. No Coolify: **Domains** +2. Adicione seu domínio +3. SSL automático via Let's Encrypt + +--- + +## Verificação de Deploy + +1. **Health Check**: `https://seu-dominio.com/api/health` + ```json + {"status":"ok","timestamp":"...","service":"opensheets-app"} + ``` + +2. **Logs**: No Coolify → Logs + +3. **Database**: Verificar se migrations rodaram + +--- + +## Comparação das Opções + +| | Docker Hub | Build no Coolify | PostgreSQL Separado | +|---|---|---|---| +| **Tempo de deploy** | ⚡ Segundos | 🐢 2-5 min | 🐢 2-5 min | +| **Complexidade** | Médio (setup inicial) | Fácil | Médio | +| **CI/CD** | ✅ Automático | ❌ Manual | ✅ Possível | +| **Rollback** | ✅ Fácil (trocar tag) | ❌ Rebuild | ✅ Fácil | +| **Backups DB** | ❌ Manual | ❌ Manual | ✅ Automático | +| **Ideal para** | Produção | Desenvolvimento/Teste | Produção crítica | + +--- + +## Atualizações + +### Com Docker Hub (Opção 1): +```bash +# Fazer alterações +git add . +git commit -m "feat: nova funcionalidade" +git push origin main +# → GitHub Actions publica nova imagem automaticamente + +# No Coolify: Redeploy (faz pull da nova imagem) +``` + +### Com Build no Coolify (Opção 2): +```bash +git push origin main +# No Coolify: Redeploy (faz build novamente) +``` + +--- + +## Troubleshooting + +### Deploy demora muito +**Causa:** Fazendo build completo +**Solução:** Use Opção 1 (Docker Hub) + +### Erro de conexão com banco +**Causa:** DATABASE_URL incorreta +**Solução:** Verificar host (`db` para compose local, ou nome do serviço no Coolify) + +### Migrations não executam +**Solução:** Executar manualmente no terminal do container: +```bash +pnpm db:push +``` + +--- + +## Recursos + +- [Documentação Coolify](https://coolify.io/docs) +- [Guia Docker Hub](./DOCKER_HUB.md) +- [Next.js Deployment](https://nextjs.org/docs/deployment) +- [Drizzle Migrations](https://orm.drizzle.team/docs/migrations) + +--- + +## Próximos Passos + +1. ✅ Configurar domínio personalizado +2. ✅ Configurar OAuth (Google, GitHub) +3. ✅ Configurar email (Resend) +4. ✅ Configurar AI providers +5. ✅ Configurar backups (se PostgreSQL separado) +6. ✅ Configurar monitoring diff --git a/DEPLOY_README.md b/DEPLOY_README.md new file mode 100644 index 0000000..b0b6ab4 --- /dev/null +++ b/DEPLOY_README.md @@ -0,0 +1,130 @@ +# Guias de Deploy do OpenSheets + +Escolha o guia apropriado para seu caso: + +## 📚 Guias Disponíveis + +### 1. [DEPLOY_COOLIFY.md](./DEPLOY_COOLIFY.md) +**Deploy no Coolify usando Docker** + +**Use para:** Deploy em produção no Coolify + +**Opções disponíveis:** +- ⚡ Com imagem do Docker Hub (deploy rápido) +- 🐢 Com build direto no Coolify (mais simples) +- 🔐 Com PostgreSQL separado (melhor gestão) + +--- + +### 2. [DOCKER_HUB.md](./DOCKER_HUB.md) +**Publicação de imagens no Docker Hub** + +**Use para:** +- Configurar CI/CD com GitHub Actions +- Publicar imagens automaticamente +- Deploy ultra-rápido (segundos vs minutos) + +**Inclui:** +- Workflow GitHub Actions pronto +- Publicação automática e manual +- Gestão de versões e tags + +--- + +## 🚀 Fluxo Recomendado para Produção + +``` +1. Configurar Docker Hub + └─> Seguir: DOCKER_HUB.md + ├─ Criar access token no Docker Hub + ├─ Configurar secrets no GitHub + └─ Push código → imagem publicada automaticamente + +2. Deploy no Coolify + └─> Seguir: DEPLOY_COOLIFY.md → Opção 1 + ├─ Usar docker-compose.prod.yml + ├─ Configurar variáveis de ambiente + └─ Deploy em segundos ⚡ +``` + +--- + +## ⚡ Quick Start (Mais Rápido) + +**Não quer configurar Docker Hub agora?** + +``` +└─> Seguir: DEPLOY_COOLIFY.md → Opção 2 + ├─ Usar docker-compose.yml original + ├─ Configurar variáveis básicas + └─ Deploy em 2-5 minutos 🐢 +``` + +--- + +## 📁 Arquivos de Configuração + +| Arquivo | Uso | +|---------|-----| +| `docker-compose.yml` | Desenvolvimento local + Deploy simples no Coolify | +| `docker-compose.prod.yml` | Produção com imagem do Docker Hub | +| `docker-compose.coolify.yml` | Deploy no Coolify com PostgreSQL separado | +| `.env.production.example` | Template de variáveis de ambiente | +| `.github/workflows/docker-publish.yml` | CI/CD automático para Docker Hub | + +--- + +## 🔧 Variáveis de Ambiente + +Ver template completo: [.env.production.example](./.env.production.example) + +### Mínimo necessário: +```bash +# PostgreSQL +POSTGRES_PASSWORD=... +DATABASE_URL=postgresql://opensheets:senha@db:5432/opensheets_db + +# Better Auth +BETTER_AUTH_SECRET=... +BETTER_AUTH_URL=https://seu-dominio.com +``` + +### Gerar secrets: +```bash +openssl rand -base64 32 +``` + +--- + +## 🆘 Troubleshooting + +| Problema | Solução | +|----------|---------| +| Deploy muito lento | Use Docker Hub (DOCKER_HUB.md) | +| Erro de conexão com banco | Verificar DATABASE_URL | +| Imagem não encontrada | Configurar DOCKER_USERNAME no Coolify | +| Migrations não executam | Executar manualmente: `pnpm db:push` | + +--- + +## 📖 Mais Recursos + +- [Documentação Coolify](https://coolify.io/docs) +- [Docker Hub](https://hub.docker.com/) +- [GitHub Actions](https://docs.github.com/en/actions) +- [Next.js Deployment](https://nextjs.org/docs/deployment) + +--- + +## 🎯 Resumo + +**Para produção (recomendado):** +1. DOCKER_HUB.md → Configurar CI/CD +2. DEPLOY_COOLIFY.md → Opção 1 (Docker Hub) + +**Para começar rápido:** +- DEPLOY_COOLIFY.md → Opção 2 (Build direto) + +**Dúvidas?** +- Abra uma issue no GitHub +- Consulte os guias detalhados acima diff --git a/DOCKER_HUB.md b/DOCKER_HUB.md new file mode 100644 index 0000000..4cef4a2 --- /dev/null +++ b/DOCKER_HUB.md @@ -0,0 +1,303 @@ +# Publicação no Docker Hub + +Este guia mostra como publicar a imagem do OpenSheets no Docker Hub e usar no Coolify. + +## 🚀 Resumo Rápido + +1. **Configurar secrets no GitHub** (DOCKER_USERNAME e DOCKER_PASSWORD) +2. **Push para main ou criar tag** → GitHub Actions publica automaticamente +3. **No Coolify:** usar `docker-compose.prod.yml` apontando para sua imagem do Docker Hub + +--- + +## Opção 1: Publicação Automática (GitHub Actions) + +### Passo 1: Criar Access Token no Docker Hub + +1. Acesse [Docker Hub](https://hub.docker.com/) +2. Faça login na sua conta +3. Vá em **Account Settings** → **Security** → **New Access Token** +4. Configure: + - **Description**: `GitHub Actions - OpenSheets` + - **Access permissions**: `Read & Write` +5. Clique em **Generate** e **copie o token** (você não verá novamente!) + +### Passo 2: Configurar Secrets no GitHub + +1. Vá no seu repositório GitHub +2. **Settings** → **Secrets and variables** → **Actions** +3. Clique em **New repository secret** +4. Adicione 2 secrets: + +**Secret 1:** +- **Name**: `DOCKER_USERNAME` +- **Value**: seu username do Docker Hub (ex: `felipecoutinho`) + +**Secret 2:** +- **Name**: `DOCKER_PASSWORD` +- **Value**: o access token copiado acima + +### Passo 3: Publicar a Imagem + +O workflow `.github/workflows/docker-publish.yml` já está configurado e vai publicar automaticamente quando você: + +#### Opção A: Push para main (cria tag `latest`) +```bash +git add . +git commit -m "feat: nova versão" +git push origin main +``` + +Isso vai gerar as tags: +- `seu-usuario/opensheets:latest` +- `seu-usuario/opensheets:main` +- `seu-usuario/opensheets:main-abc123` (hash do commit) + +#### Opção B: Criar release com tag semântica (recomendado) +```bash +# Criar tag de versão +git tag v1.0.0 +git push origin v1.0.0 +``` + +Isso vai gerar as tags: +- `seu-usuario/opensheets:latest` +- `seu-usuario/opensheets:1.0.0` +- `seu-usuario/opensheets:1.0` +- `seu-usuario/opensheets:1` + +### Passo 4: Verificar Publicação + +1. Acesse [Docker Hub](https://hub.docker.com/) +2. Vá em **Repositories** +3. Você verá `seu-usuario/opensheets` com as tags publicadas + +Ou verifique pelo terminal: +```bash +docker pull seu-usuario/opensheets:latest +``` + +--- + +## Opção 2: Publicação Manual + +Se preferir publicar manualmente sem GitHub Actions: + +### Passo 1: Login no Docker Hub +```bash +docker login +# Digite seu username e password/token +``` + +### Passo 2: Build da Imagem +```bash +# Build com tag do seu usuário +docker build -t seu-usuario/opensheets:latest . + +# Opcional: criar tags adicionais +docker tag seu-usuario/opensheets:latest seu-usuario/opensheets:v1.0.0 +``` + +### Passo 3: Push para o Docker Hub +```bash +# Enviar a imagem +docker push seu-usuario/opensheets:latest + +# Se criou tags adicionais +docker push seu-usuario/opensheets:v1.0.0 +``` + +### Passo 4: Verificar +```bash +docker pull seu-usuario/opensheets:latest +``` + +--- + +## Usando no Coolify + +### Opção A: Docker Compose Production (Recomendado) + +1. **No Coolify:** + - Projects → + New Resource → **Docker Compose Empty** + - Conecte ao repositório + - **Docker Compose Location**: `docker-compose.prod.yml` + +2. **Configure variáveis de ambiente:** + ```bash + # Configuração da imagem do Docker Hub + DOCKER_USERNAME=seu-usuario + IMAGE_TAG=latest + + # PostgreSQL + POSTGRES_USER=opensheets + POSTGRES_PASSWORD=SENHA_FORTE_AQUI + POSTGRES_DB=opensheets_db + DATABASE_URL=postgresql://opensheets:SENHA_FORTE_AQUI@db:5432/opensheets_db + + # Better Auth + BETTER_AUTH_SECRET=GERAR_COM_OPENSSL + BETTER_AUTH_URL=https://seu-dominio.com + ``` + +3. **Deploy** + - Clique em Deploy + - O Coolify vai fazer **pull da imagem** do Docker Hub (não build!) + - Muito mais rápido! ⚡ + +### Opção B: Editar docker-compose.prod.yml antes + +Você pode editar o arquivo e fixar sua imagem: + +```yaml +app: + image: felipecoutinho/opensheets:latest # Seu usuário aqui + # ... resto da configuração +``` + +Depois fazer commit e push. No Coolify vai usar direto a imagem configurada. + +--- + +## Vantagens de Usar Imagem do Docker Hub + +✅ **Deploy mais rápido** - Apenas pull da imagem (segundos) vs build completo (minutos) +✅ **Mesma imagem em múltiplos ambientes** - Staging, produção, testes +✅ **Rollback fácil** - Trocar tag da imagem para versão anterior +✅ **CI/CD automatizado** - Push no GitHub → build automático → disponível no hub +✅ **Multi-arch** - Suporte para AMD64 e ARM64 (servidores diferentes) + +--- + +## Gestão de Versões + +### Estratégia Recomendada + +```bash +# Desenvolvimento contínuo +main branch → seu-usuario/opensheets:latest + +# Releases estáveis +v1.0.0 → seu-usuario/opensheets:1.0.0 +v1.1.0 → seu-usuario/opensheets:1.1.0 +v2.0.0 → seu-usuario/opensheets:2.0.0 +``` + +### Exemplo de Workflow Completo + +```bash +# 1. Desenvolver feature +git checkout -b feature/nova-funcionalidade +# ... fazer alterações ... +git add . +git commit -m "feat: adiciona nova funcionalidade" + +# 2. Merge para main +git checkout main +git merge feature/nova-funcionalidade +git push origin main +# → GitHub Actions publica seu-usuario/opensheets:latest + +# 3. Criar release quando estável +git tag v1.1.0 +git push origin v1.1.0 +# → GitHub Actions publica: +# - seu-usuario/opensheets:1.1.0 +# - seu-usuario/opensheets:1.1 +# - seu-usuario/opensheets:1 +# - seu-usuario/opensheets:latest +``` + +### No Coolify: Controle de Versões + +```bash +# Usar sempre a última versão (auto-update) +IMAGE_TAG=latest + +# Fixar versão específica (produção estável) +IMAGE_TAG=1.0.0 + +# Usar versão minor mais recente +IMAGE_TAG=1.1 +``` + +--- + +## Troubleshooting + +### Erro: "unauthorized: authentication required" + +**Causa:** Secrets não configurados ou token inválido + +**Solução:** +1. Verifique se DOCKER_USERNAME e DOCKER_PASSWORD estão nos secrets do GitHub +2. Gere um novo access token no Docker Hub +3. Atualize o secret DOCKER_PASSWORD + +### Erro: "denied: requested access to the resource is denied" + +**Causa:** Username incorreto ou permissões insuficientes + +**Solução:** +1. Verifique se DOCKER_USERNAME está correto (lowercase) +2. Certifique-se que o access token tem permissão "Read & Write" + +### Build demora muito no GitHub Actions + +**Causa:** Cache não está funcionando + +**Solução:** +- O workflow já usa cache (buildx cache) +- Espere o primeiro build (demora mais) +- Builds seguintes serão mais rápidos + +### Coolify não encontra a imagem + +**Causa:** Variável DOCKER_USERNAME não configurada ou imagem não existe + +**Solução:** +1. Verifique se a imagem existe no Docker Hub +2. Configure DOCKER_USERNAME no Coolify +3. Tente fazer pull manual: `docker pull seu-usuario/opensheets:latest` + +--- + +## Limpeza de Imagens Antigas + +No Docker Hub (free tier tem limite de 1 repositório privado): + +1. Vá em **Repositories** → `opensheets` → **Tags** +2. Delete tags antigas que não usa mais +3. Mantenha: `latest`, versões estáveis importantes + +Ou use Docker Hub CLI: +```bash +# Instalar hub-tool +brew install docker/hub-tool/hub-tool # macOS + +# Listar tags +hub-tool tag ls seu-usuario/opensheets + +# Deletar tag +hub-tool tag rm seu-usuario/opensheets:old-tag +``` + +--- + +## Recursos + +- [Docker Hub](https://hub.docker.com/) +- [GitHub Actions - Docker](https://docs.github.com/en/actions/publishing-packages/publishing-docker-images) +- [Docker Build Push Action](https://github.com/docker/build-push-action) +- [Semantic Versioning](https://semver.org/) + +--- + +## Próximos Passos + +Depois de configurar: + +1. ✅ Push código para GitHub → imagem publicada automaticamente +2. ✅ No Coolify, usar `docker-compose.prod.yml` +3. ✅ Deploy super rápido (apenas pull da imagem) +4. ✅ Criar releases com tags quando tiver versões estáveis diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..04f6328 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,131 @@ +# Docker Compose para Produção (com imagem do Docker Hub) +# Uso: docker compose -f docker-compose.prod.yml up -d + +name: opensheets + +services: + # ============================================ + # Serviço: PostgreSQL (Banco de dados) + # ============================================ + db: + image: postgres:18-alpine + container_name: opensheets_postgres + restart: unless-stopped + + environment: + POSTGRES_USER: ${POSTGRES_USER:-opensheets} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-opensheets_dev_password} + POSTGRES_DB: ${POSTGRES_DB:-opensheets_db} + POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C" + + ports: + - "${DB_PORT:-5432}:5432" + + volumes: + - postgres_data:/var/lib/postgresql/data + - ./scripts/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro + + healthcheck: + test: + [ + "CMD-SHELL", + "pg_isready -U ${POSTGRES_USER:-opensheets} -d ${POSTGRES_DB:-opensheets_db}", + ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + networks: + - opensheets_network + + # ============================================ + # Serviço: Aplicação Next.js (imagem do Docker Hub) + # ============================================ + app: + # IMPORTANTE: Substitua 'seu-usuario' pelo seu username do Docker Hub + # Exemplo: felipecoutinho/opensheets:latest + image: ${DOCKER_USERNAME:-seu-usuario}/opensheets:${IMAGE_TAG:-latest} + + container_name: opensheets_app + restart: unless-stopped + + ports: + - "${APP_PORT:-3000}:3000" + + environment: + NODE_ENV: production + + # Database URL + DATABASE_URL: ${DATABASE_URL} + + # Better Auth (OBRIGATÓRIO) + BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET} + BETTER_AUTH_URL: ${BETTER_AUTH_URL:-http://localhost:3000} + + # Email (opcional) + RESEND_API_KEY: ${RESEND_API_KEY:-} + EMAIL_FROM: ${EMAIL_FROM:-} + + # OAuth (opcional) + GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-} + GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-} + GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-} + GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-} + + # AI Providers (opcional) + ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} + OPENAI_API_KEY: ${OPENAI_API_KEY:-} + GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY:-} + OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-} + + depends_on: + db: + condition: service_healthy + + networks: + - opensheets_network + + # Script de inicialização: roda migrations antes de iniciar + entrypoint: ["/bin/sh", "-c"] + command: + - | + echo "🚀 Aguardando banco de dados..." + sleep 5 + + echo "📦 Rodando migrations..." + pnpm db:push || echo "⚠️ Migrations falharam ou já estão atualizadas" + + echo "✅ Iniciando aplicação Next.js..." + node server.js + + healthcheck: + test: + [ + "CMD", + "wget", + "--quiet", + "--tries=1", + "--spider", + "http://localhost:3000/api/health", + ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +# ============================================ +# Volumes +# ============================================ +volumes: + postgres_data: + name: opensheets_postgres_data + driver: local + +# ============================================ +# Networks +# ============================================ +networks: + opensheets_network: + name: opensheets_network + driver: bridge