Guia completo para deploy na Digital Ocean App Platform
- Conta criada em https://cloud.digitalocean.com/
- Billing configurado (cartão de crédito)
- API Token gerado (Settings → API → Generate New Token)
- Código commitado no GitHub/GitLab/Bitbucket
- Branch
mainoumasteratualizada - Dockerfile presente no repositório
Você precisará configurar as seguintes variáveis de ambiente na Digital Ocean:
# Supabase (obrigatórias)
SUPABASE_URL=
SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
# Cloudinary (obrigatórias)
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=
# Anthropic Claude (obrigatória)
ANTHROPIC_API_KEY=
# Google AI Gemini (obrigatória)
GOOGLE_AI_API_KEY=
# Apify (obrigatória)
APIFY_API_TOKEN=
# WhatsApp UAZapi (obrigatórias)
UAZAPI_INSTANCE_ID=
UAZAPI_TOKEN=
UAZAPI_WEBHOOK_URL=
# Google Drive (opcional - para export)
GOOGLE_DRIVE_CLIENT_EMAIL=
GOOGLE_DRIVE_PRIVATE_KEY=
GOOGLE_DRIVE_FOLDER_ID=
# Mistral (opcional - OCR alternativo)
MISTRAL_API_KEY=
# Node Environment
NODE_ENV=production
NEXT_TELEMETRY_DISABLED=1- Tipo de App: Docker Container
- Runtime: Node.js 18 (via Debian base)
- Build: Multi-stage Dockerfile otimizado
- Recursos mínimos recomendados:
- CPU: 1 vCPU
- RAM: 1 GB (mínimo) / 2 GB (recomendado)
- Disco: 10 GB
- Next.js 15 App Router
- Puppeteer (screenshots e slides)
- Remotion (renderização de vídeos)
- Supabase (PostgreSQL)
- Cloudinary (upload de imagens)
- UAZapi (WhatsApp)
- Acesse Digital Ocean App Platform
- Clique em "Create App"
- Selecione GitHub/GitLab/Bitbucket
- Autorize acesso ao repositório
- Selecione o repositório
postexpress2 - Escolha branch:
main
Tipo de Recurso:
- Selecione: "Detect from Dockerfile" (automático)
- Confirme que detectou o
Dockerfile
Nome do App:
- Digite:
croko-laboupostexpress
Região:
- Recomendado: New York (latência menor para Brasil)
- Alternativa: San Francisco
- Na seção "Environment Variables", clique em "Edit"
- Adicione TODAS as variáveis listadas acima
- IMPORTANTE: Marque como "Encrypted" as chaves secretas:
SUPABASE_SERVICE_ROLE_KEYANTHROPIC_API_KEYGOOGLE_AI_API_KEYAPIFY_API_TOKENCLOUDINARY_API_KEYCLOUDINARY_API_SECRETUAZAPI_TOKENGOOGLE_DRIVE_PRIVATE_KEY
Na seção "Build Phase", adicione Build Arguments:
SUPABASE_URL=${SUPABASE_URL}
SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY}
SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE_KEY}
NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
NEXT_PUBLIC_SUPABASE_ANON_KEY=${NEXT_PUBLIC_SUPABASE_ANON_KEY}
Por que? Next.js precisa das variáveis NEXT_PUBLIC_* no build time para embedá-las no bundle.
Basic (Recomendado para começar):
- 1 vCPU
- 1 GB RAM
- ~$12/mês
Professional (Recomendado para produção):
- 1 vCPU
- 2 GB RAM
- ~$24/mês
- Revise todas as configurações
- Clique em "Create Resources"
- Aguarde o build (~5-10 minutos)
- App estará disponível em:
https://croko-lab-xxxxx.ondigitalocean.app
# macOS
brew install doctl
# Linux
cd ~
wget https://github.com/digitalocean/doctl/releases/download/v1.94.0/doctl-1.94.0-linux-amd64.tar.gz
tar xf ~/doctl-1.94.0-linux-amd64.tar.gz
sudo mv ~/doctl /usr/local/bindoctl auth init
# Cole seu API token quando solicitadoCrie digital-ocean-app.yaml:
name: croko-lab
region: nyc
services:
- name: web
dockerfile_path: Dockerfile
github:
repo: seu-usuario/postexpress2
branch: main
deploy_on_push: true
http_port: 3000
instance_count: 1
instance_size_slug: basic-xxs # 1 vCPU, 1 GB RAM
envs:
- key: NODE_ENV
value: production
- key: NEXT_TELEMETRY_DISABLED
value: "1"
- key: SUPABASE_URL
scope: RUN_TIME
type: SECRET
- key: SUPABASE_ANON_KEY
scope: RUN_TIME
type: SECRET
# ... adicione todas as outras variáveis
health_check:
http_path: /api/health# Criar app
doctl apps create --spec digital-ocean-app.yaml
# Ver status
doctl apps list
# Ver logs
doctl apps logs <app-id> --followApós deploy, você precisa atualizar o webhook do UAZapi com a URL final:
# URL do webhook será:
https://seu-app.ondigitalocean.app/api/whatsapp/webhook
# Configurar no painel UAZapi:
# Settings → Webhook → URLSe usar export para Google Drive, configure redirect URI:
https://seu-app.ondigitalocean.app/api/auth/callback/google
Adicione domínio Digital Ocean nas configurações Cloudinary:
https://seu-app.ondigitalocean.app
# Via doctl
doctl apps logs <app-id> --follow --type build
doctl apps logs <app-id> --follow --type run
# Via Web
Apps → Seu App → Runtime LogsDigital Ocean fornece automaticamente:
- CPU usage
- Memory usage
- Network bandwidth
- Request count
- Response time
Configure alertas em:
Apps → Seu App → Settings → Alerts
Recomendado:
- CPU > 80% por 5 minutos
- Memory > 90% por 5 minutos
- App Down por 2 minutos
| Plano | vCPU | RAM | Preço/mês |
|---|---|---|---|
| Basic XXS | 1 | 512 MB | $5 |
| Basic XS | 1 | 1 GB | $12 |
| Basic S | 1 | 2 GB | $24 |
| Professional XS | 2 | 2 GB | $48 |
| Serviço | Custo estimado/mês |
|---|---|
| Supabase Free | $0 |
| Cloudinary Free | $0 (até 25 GB) |
| Anthropic Claude | ~$10-50 (depende uso) |
| Google Gemini | ~$5-20 (depende uso) |
| Apify | ~$10-30 (depende uso) |
| UAZapi | ~$0.01/mensagem |
Total estimado: $37-182/mês (dependendo do uso)
Erro: Chromium not found
Solução: Verificar se Dockerfile instala dependências corretas:
RUN apt-get update && apt-get install -y chromiumErro: npm ci falha
Solução: Verificar se package-lock.json está commitado
Erro: Cannot connect to Supabase
Solução: Verificar variáveis de ambiente:
doctl apps env list <app-id>Erro: Out of memory
Solução: Aumentar plano para 2 GB RAM
Erro: UAZapi não recebe eventos
Solução:
- Verificar URL do webhook no painel UAZapi
- Testar endpoint:
curl https://seu-app.ondigitalocean.app/api/whatsapp/webhook - Verificar logs para erros
Crie .github/workflows/deploy-digitalocean.yml:
name: Deploy to Digital Ocean
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install doctl
uses: digitalocean/action-doctl@v2
with:
token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
- name: Trigger deployment
run: doctl apps create-deployment ${{ secrets.APP_ID }}Secrets necessários:
DIGITALOCEAN_ACCESS_TOKENAPP_ID(ID do app na Digital Ocean)
- Código commitado e pushed
-
.dockerignorecriado - Variáveis de ambiente preparadas
- Testes passando (
npm test) - Build local funciona (
npm run build)
- Repositório conectado
- Dockerfile detectado
- Variáveis de ambiente configuradas
- Build arguments configurados
- Plano selecionado
- App rodando (verificar URL)
- Webhook UAZapi atualizado
- Logs sem erros críticos
- Testar fluxo completo (WhatsApp → Conteúdo → Slides)
- Configurar alertas
- Configurar domínio customizado (opcional)
doctl apps update <app-id> --spec digital-ocean-app.yamlEm digital-ocean-app.yaml:
domains:
- domain: croko.lab
type: PRIMARY
- domain: www.croko.lab
type: ALIASNo seu provedor DNS (Cloudflare, Namecheap, etc.):
Tipo: CNAME
Nome: @
Valor: <app-url>.ondigitalocean.app
TTL: 300
Digital Ocean provisiona automaticamente certificado Let's Encrypt.
- Digital Ocean Docs: https://docs.digitalocean.com/products/app-platform/
- Community: https://www.digitalocean.com/community/
- Tickets: https://cloud.digitalocean.com/support/tickets
Guia criado em 2026-02-28 - Post Express v1.0 Deploy otimizado para Digital Ocean App Platform