feat: adição de workflows e documentação para publicação no Docker Hub
- 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.
This commit is contained in:
65
.github/workflows/docker-publish.yml
vendored
Normal file
65
.github/workflows/docker-publish.yml
vendored
Normal file
@@ -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 }}
|
||||||
270
DEPLOY_COOLIFY.md
Normal file
270
DEPLOY_COOLIFY.md
Normal file
@@ -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
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Ver instruções detalhadas</summary>
|
||||||
|
|
||||||
|
### 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)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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
|
||||||
130
DEPLOY_README.md
Normal file
130
DEPLOY_README.md
Normal file
@@ -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
|
||||||
303
DOCKER_HUB.md
Normal file
303
DOCKER_HUB.md
Normal file
@@ -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
|
||||||
131
docker-compose.prod.yml
Normal file
131
docker-compose.prod.yml
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user