365 lines
11 KiB
Markdown
365 lines
11 KiB
Markdown
# Guia de Deploy e Manutenção - Vim
|
|
|
|
Este guia descreve o processo completo para implantar, atualizar e manter serviços no servidor Vim utilizando a plataforma Dokku.
|
|
|
|
## Visão Geral da Plataforma
|
|
|
|
O servidor Vim utiliza o Dokku como plataforma de deploy PaaS (Platform as a Service) self-hosted. O Dokku é uma ferramenta open-source que transforma um servidor Linux em um PaaS similar ao Heroku, permitindo o deploy de aplicações através de Git pushes. A plataforma utiliza o Docker para isolar as aplicações e o Nginx como proxy reverso para roteamento de tráfego baseado em domínios.
|
|
|
|
Esta arquitetura foi escolhida por oferecer um equilíbrio entre simplicidade e funcionalidade. Diferente de um cluster Kubernetes completo, o Dokku não requer conhecimento avançado de contêineres e permite que desenvolvedores façam deploys apenas com conhecimento de Git. A plataforma detecta automaticamente a linguagem de programação da aplicação (Node.js, Go, Python, etc.) através de buildpacks e configura o ambiente de execução apropriado.
|
|
|
|
## Pré-requisitos
|
|
|
|
Antes de fazer deploy no servidor Vim, certifique-se de ter os seguintes pré-requisitos atendidos:
|
|
|
|
Primeiro, você precisa de acesso SSH ao servidor com chave SSH configurada. A chave pública deve estar autorizada no arquivo `~/.ssh/authorized_keys` do servidor. Sem isso, você não conseguirá fazer o push do código. Segundo, você precisa do Dokku client instalado localmente. Em sistemas Debian/Ubuntu, instale com `sudo apt-get install dokku`. Terceiro, você precisa ter o Git instalado em sua máquina de desenvolvimento. E quarto, o repositório da aplicação deve ter um Dockerfile ou um dos buildpacks suportados (Node.js, Go, Python, Ruby, Java, PHP, Gradle, .NET Core).
|
|
|
|
## Estrutura de Repositórios
|
|
|
|
Cada projeto deve seguir uma estrutura específica para funcionar corretamente no Dokku. O repositório precisa ter um arquivo de configuração apropriado para a linguagem utilizada. Para Node.js, é necessário ter um `package.json` com scripts de start definidos. Para Go, o `go.mod` é essencial. O Dokku detecta automaticamente a linguagem e aplica o buildpack correto.
|
|
|
|
Abaixo está um exemplo de `package.json` otimizado para Dokku:
|
|
|
|
```json
|
|
{
|
|
"name": "gohorse-backend",
|
|
"version": "1.0.0",
|
|
"main": "dist/index.js",
|
|
"scripts": {
|
|
"start": "node dist/index.js",
|
|
"build": "tsc",
|
|
"dev": "nodemon src/index.ts"
|
|
},
|
|
"dependencies": {
|
|
"express": "^4.18.2",
|
|
"pg": "^8.11.0"
|
|
},
|
|
"devDependencies": {
|
|
"typescript": "^5.0.0",
|
|
"@types/node": "^20.0.0"
|
|
}
|
|
}
|
|
```
|
|
|
|
Para aplicações Go, o `go.mod` deve seguir este formato:
|
|
|
|
```go
|
|
module github.com/sua-empresa/gohorse-backend
|
|
|
|
go 1.21
|
|
|
|
require (
|
|
github.com/gin-gonic/gin v1.9.1
|
|
github.com/lib/pq v1.10.9
|
|
)
|
|
```
|
|
|
|
## Fazendo o Primeiro Deploy
|
|
|
|
O processo de deploy no Dokku é simples e segue o fluxo similar ao Heroku. Primeiro, você precisa adicionar o remote do Dokku ao seu repositório Git local. No diretório do seu projeto, execute o comando para adicionar o remote Dokku, substituindo o nome do app e o usuário:
|
|
|
|
```bash
|
|
git remote add dokku dokku@vim.rede5.com.br:gohorse-backend
|
|
```
|
|
|
|
Este comando configura o remote "dokku" apontando para o servidor Vim. Note que o nome após os dois pontos deve corresponder exatamente ao nome do app que você criou no Dokku. Se o app se chamar "gohorse-backend", você deve usar "gohorse-backend" no remote.
|
|
|
|
Se o app ainda não existe no Dokku, você pode criá-lo diretamente com o push:
|
|
|
|
```bash
|
|
git push dokku main:master
|
|
```
|
|
|
|
Quando o Dokku recebe o primeiro push para um app que não existe, ele automaticamente cria o app e inicia o processo de deploy. Se preferir criar o app manualmente antes do primeiro deploy, você pode SSH no servidor e executar:
|
|
|
|
```bash
|
|
dokku apps:create gohorse-backend
|
|
```
|
|
|
|
## Configurando Variáveis de Ambiente
|
|
|
|
As variáveis de ambiente são essenciais para o funcionamento correto das aplicações. No Dokku, você pode definir variáveis de ambiente tanto pelo servidor quanto através de arquivos `.env`. Para definir uma variável de ambiente pelo terminal, primeiro faça SSH no servidor:
|
|
|
|
```bash
|
|
ssh root@vim.rede5.com.br
|
|
```
|
|
|
|
Então, defina a variável para o app específico:
|
|
|
|
```bash
|
|
dokku config:set gohorse-backend DATABASE_URL=postgres://user:password@host:5432/dbname
|
|
dokku config:set gohorse-backend NODE_ENV=production
|
|
dokku config:set gohorse-backend PORT=5000
|
|
```
|
|
|
|
Para ver todas as variáveis de um app:
|
|
|
|
```bash
|
|
dokku config gohorse-backend
|
|
```
|
|
|
|
Para desenvolvimento local, crie um arquivo `.env` na raiz do projeto (que deve estar no `.gitignore`):
|
|
|
|
```
|
|
DATABASE_URL=postgres://postgres:password@localhost:5432/gohorse_dev
|
|
NODE_ENV=development
|
|
PORT=5000
|
|
```
|
|
|
|
Em aplicações Node.js, utilize a biblioteca `dotenv` para carregar essas variáveis:
|
|
|
|
```typescript
|
|
import dotenv from 'dotenv';
|
|
dotenv.config();
|
|
|
|
const port = process.env.PORT || 3000;
|
|
const dbUrl = process.env.DATABASE_URL;
|
|
```
|
|
|
|
## Configurando Bancos de Dados PostgreSQL
|
|
|
|
O servidor Vim possui dois bancos de dados PostgreSQL gerenciados pelo Dokku: o `postgres-main` (versão 17) e o `agno-db` (versão 18.1). Para conectar uma aplicação a um banco de dados, você deve criar um link entre o serviço e o app.
|
|
|
|
Para criar o link (isso automaticamente define a variável DATABASE_URL):
|
|
|
|
```bash
|
|
dokku postgres:link postgres-main gohorse-backend
|
|
```
|
|
|
|
Para desvincular:
|
|
|
|
```bash
|
|
dokku postgres:unlink postgres-main gohorse-backend
|
|
```
|
|
|
|
Para criar um novo banco de dados:
|
|
|
|
```bash
|
|
dokku postgres:create meu-novo-banco
|
|
dokku postgres:link meu-novo-banco minha-app
|
|
```
|
|
|
|
Para verificar informações do banco:
|
|
|
|
```bash
|
|
dokku postgres:info postgres-main
|
|
dokku postgres:list
|
|
```
|
|
|
|
## Configurando Domínios e SSL
|
|
|
|
O Dokku permite configurar domínios customizados para cada aplicação. Para adicionar um domínio:
|
|
|
|
```bash
|
|
dokku domains:set gohorse-backend gohorse.dokku.rede5.com.br
|
|
```
|
|
|
|
Para habilitar HTTPS com Let's Encrypt (plugin instalado):
|
|
|
|
```bash
|
|
dokku letsencrypt:enable gohorse-backend
|
|
```
|
|
|
|
Para renewal automático de certificados:
|
|
|
|
```bash
|
|
dokku letsencrypt:auto-renew gohorse-backend
|
|
```
|
|
|
|
Sem o plugin Let's Encrypt, você pode configurar SSL manualmente através do Nginx ou usando certificados propios. O Nginx do servidor Vim está configurado para aceitar conexões HTTPS nas portas 80 e 443, então você pode também gerenciar certificados manualmente se preferir.
|
|
|
|
## Mapeamento de Portas
|
|
|
|
O Dokku expõe automaticamente as aplicações em portas dinâmicas. Por padrão, ele usa a variável PORT definida no ambiente do container. Para configurar o mapeamento de portas explicitamente:
|
|
|
|
```bash
|
|
dokku ports:set gohorse-backend http:80:5000
|
|
```
|
|
|
|
Este comando mapeia a porta 80 do host para a porta 5000 do container. Para múltiplas portas (HTTP e HTTPS):
|
|
|
|
```bash
|
|
dokku ports:set gohorse-backend http:80:8080 https:443:8080
|
|
```
|
|
|
|
## Comandos de Deploy
|
|
|
|
### Deploy Padrão
|
|
|
|
Para fazer o deploy de uma nova versão, basta fazer push para o remote Dokku:
|
|
|
|
```bash
|
|
git push dokku main:master
|
|
```
|
|
|
|
O Dokku mostrará o progresso do build e informará quando o deploy estiver completo. Você pode acompanhar os logs do deploy em tempo real.
|
|
|
|
### Rollback
|
|
|
|
Se algo der errado após o deploy, você pode fazer rollback para a versão anterior:
|
|
|
|
```bash
|
|
dokku releases:rollback gohorse-backend
|
|
```
|
|
|
|
Para ver o histórico de releases:
|
|
|
|
```bash
|
|
dokku releases gohorse-backend
|
|
```
|
|
|
|
### Deploy com Build Especial
|
|
|
|
Se você precisa fazer build local e apenas enviar a imagem:
|
|
|
|
```bash
|
|
docker build -t dokku/gohorse-backend:latest .
|
|
docker push dokku/gohorse-backend:latest
|
|
dokku deploy gohorse-backend
|
|
```
|
|
|
|
## Gerenciando Serviços
|
|
|
|
### Verificar Status
|
|
|
|
Para ver o status de uma aplicação:
|
|
|
|
```bash
|
|
dokku apps:info gohorse-backend
|
|
```
|
|
|
|
Para ver os logs em tempo real:
|
|
|
|
```bash
|
|
dokku logs gohorse-backend -t
|
|
```
|
|
|
|
Para ver logs de uma quantidade específica de linhas:
|
|
|
|
```bash
|
|
dokku logs gohorse-backend -n 100
|
|
```
|
|
|
|
### Reiniciar Aplicação
|
|
|
|
```bash
|
|
dokku ps:restart gohorse-backend
|
|
```
|
|
|
|
### Parar e Iniciar
|
|
|
|
```bash
|
|
dokku ps:stop gohorse-backend
|
|
dokku ps:start gohorse-backend
|
|
```
|
|
|
|
### Escalar Aplicação
|
|
|
|
O Dokku suporta múltiplas instâncias de um app (apenas para Dockerfiles):
|
|
|
|
```bash
|
|
dokku ps:scale gohorse-backend=2
|
|
```
|
|
|
|
## Configurando Persistent Storage
|
|
|
|
Se sua aplicação precisa de armazenamento persistente (uploads, arquivos, etc.), você pode configurar volumes:
|
|
|
|
```bash
|
|
dokku storage:mount gohorse-backend /var/lib/dokku/gohorse-backend/uploads:/app/uploads
|
|
```
|
|
|
|
O primeiro caminho é no host (servidor) e o segundo é dentro do container. Após adicionar um mount, reinicie o app:
|
|
|
|
```bash
|
|
dokku ps:restart gohorse-backend
|
|
```
|
|
|
|
Para listar mounts:
|
|
|
|
```bash
|
|
dokku storage:list gohorse-backend
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Aplicação Não Inicia
|
|
|
|
Se o container não inicia, verifique os logs:
|
|
|
|
```bash
|
|
dokku logs gohorse-backend
|
|
```
|
|
|
|
Erros comuns incluem: variável PORT incorreta (o Dokku define automaticamente a variável PORT baseado no Dockerfile ou Procfile), dependências faltando no package.json ou go.mod, e banco de dados não vinculado corretamente.
|
|
|
|
### Erro de Build
|
|
|
|
Se o build falha, verifique a saída do comando git push. Erros comuns incluem: versão do Node/Go não compatível, memória insuficiente durante o build (pode precisar de swap), e dependências privadas não acessíveis.
|
|
|
|
### Problemas de Conexão com Banco
|
|
|
|
Se a aplicação não conecta ao banco: verifique se o link foi criado corretamente com `dokku postgres:info postgres-main`, confirme que a variável DATABASE_URL está correta com `dokku config gohorse-backend`, e verifique se o banco está rodando com `dokku postgres:status postgres-main`.
|
|
|
|
### Container em Estado de Crash
|
|
|
|
Se o container está constantemente reiniciando:
|
|
|
|
```bash
|
|
dokku logs gohorse-backend --num 50
|
|
```
|
|
|
|
Pode ser necessário ajustar a configuração de healthcheck ou verificar se há erros de inicialização no código.
|
|
|
|
## Checklist de Boas Práticas
|
|
|
|
Antes de fazer deploy para produção, siga esta checklist:
|
|
|
|
Garanta que o arquivo Procfile ou Dockerfile esteja correto e defina o comando de start apropriado. Para Node.js com package.json, o Dokku detecta automaticamente. Para outros casos, crie um Procfile:
|
|
|
|
```
|
|
web: npm start
|
|
worker: npm run worker
|
|
```
|
|
|
|
Confirme que todas as variáveis de ambiente necessárias estão configuradas no Dokku. O banco de dados está linkado corretamente. Os domínios estão configurados e DNS está apontando para o servidor. Os certificados SSL estão válidos (se aplicável). Os logs estão funcionando e você consegue acessar para debugar.
|
|
|
|
## Limpeza e Manutenção
|
|
|
|
Para limpar recursos não utilizados:
|
|
|
|
```bash
|
|
# Limpar containers Docker órfãos
|
|
docker container prune -f
|
|
|
|
# Limpar imagens não utilizadas
|
|
docker image prune -a -f
|
|
|
|
# Limpar volumes não utilizados
|
|
docker volume prune -f
|
|
|
|
# Limpar builds antigos do Dokku
|
|
dokku cleanup
|
|
```
|
|
|
|
Para verificar uso de disco:
|
|
|
|
```bash
|
|
df -h
|
|
docker system df
|
|
```
|
|
|
|
## Referência Rápida de Comandos
|
|
|
|
| Ação | Comando |
|
|
|------|---------|
|
|
| Listar apps | `dokku apps:list` |
|
|
| Criar app | `dokku apps:create nome-app` |
|
|
| Deletar app | `dokku apps:destroy nome-app` |
|
|
| Ver config | `dokku config nome-app` |
|
|
| Setar config | `dokku config:set nome-app CHAVE=valor` |
|
|
| Ver logs | `dokku logs nome-app -t` |
|
|
| Reiniciar | `dokku ps:restart nome-app` |
|
|
| Listar bancos | `dokku postgres:list` |
|
|
| Info banco | `dokku postgres:info nome-banco` |
|
|
| Link banco | `dokku postgres:link nome-banco nome-app` |
|