infracloud/vps/apolo/deployment_guide.md
2026-01-10 10:21:12 -06:00

132 lines
3.7 KiB
Markdown

# Guia de Deploy e Manutenção - Apolo
Este guia descreve o processo completo para implantar, atualizar e manter serviços na VPS Apolo utilizando Podman e Quadlet, seguindo o padrão da infraestrutura.
## 🚀 Adicionando um Novo Serviço
O **Quadlet** permite declarar containers como serviços `systemd`. Siga estes passos para criar um novo.
### 1. Preparação
Escolha onde o arquivo ficará:
- **Global (Root)**: `/etc/containers/systemd/` (Padrão para serviços core/produção).
- **Usuário**: `~/.config/containers/systemd/` (Recomendado para experimentos ou serviços pessoais).
> **Nota:** A maioria dos serviços no Apolo roda como **root** em `/etc/containers/systemd/` para acesso facilitado a portas baixas e volumes globais, mas o modo rootless é suportado.
### 2. Criar o Arquivo `.container`
Crie um arquivo com sufixo `.container`, por exemplo, `meu-app.container`.
```ini
[Unit]
Description=Meu App Exemplo
After=network-online.target
[Container]
# 1. Imagem Docker
Image=docker.io/minha-empresa/meu-app:latest
AutoUpdate=registry
# 2. Variáveis de Ambiente
Environment=PORT=3000
Environment=DB_HOST=postgres-main
# 3. Persistência (opcional)
Volume=/mnt/data/meu-app:/app:Z
# Explicação:
# - /mnt/data/meu-app : Pasta no Host (Servidor)
# - /app : Pasta dentro do Container
# - :Z : Configura permissão SELinux (Essencial no AlmaLinux)
# 4. Rede e Exposição (Traefik)
Network=web_proxy
Label=traefik.enable=true
# Roteamento de Host (URL)
Label=traefik.http.routers.meu-app.rule=Host(`app.rede5.com.br`)
Label=traefik.http.routers.meu-app.entrypoints=websecure
Label=traefik.http.routers.meu-app.tls.certresolver=myresolver
# Porta Interna do Container (Load Balancer)
Label=traefik.http.services.meu-app.loadbalancer.server.port=3000
# Middleware (Ex: Redirect HTTP->HTTPS) - Opcional se entrypoints já for websecure
# Label=traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
[Install]
WantedBy=multi-user.target
```
### 3. Aplicar as Alterações
O systemd precisa ler o novo arquivo e gerar o serviço correspondente.
```bash
# Se criado como Root (Padrão Apolo)
sudo systemctl daemon-reload
sudo systemctl start meu-app
# Se criado como Usuário
systemctl --user daemon-reload
systemctl --user start meu-app
```
---
## 🔄 Atualizando um Serviço
Se a imagem estiver configurada com `AutoUpdate=registry`, o Podman pode atualizar automaticamente. Para fazer manual:
1. **Baixar nova imagem**: `podman pull docker.io/minha-empresa/meu-app:latest`
2. **Reiniciar serviço**: `systemctl restart meu-app`
---
## 🛠️ Troubleshooting
### Verificar Status do Serviço
```bash
systemctl status meu-app
```
### Ver Logs da Aplicação
```bash
# Follow logs em tempo real
journalctl -f -u meu-app
# Ver logs anteriores
journalctl -u meu-app -n 100
```
### O Container não sobe?
1. Verifique erros de sintaxe no arquivo `.container`:
```bash
/usr/libexec/podman/quadlet -dryrun
```
2. Verifique se a porta está em uso.
3. Verifique se a imagem existe e foi baixada.
### O domínio não responde (Erro 404/502)?
1. Verifique se o container está na rede `web_proxy`.
2. Confira se a `port` no Label do Traefik bate com a porta que a aplicação escuta internamente.
3. Veja os logs do Traefik: `journalctl -f -u traefik`
---
## 📂 Estrutura de Diretórios Recomendada
Mantenha os volumes organizados em `/mnt/data/`:
```text
/mnt/data/
├── postgres-general/ # Banco de Dados Principal
├── redis-gohorsejobs/ # Redis Dedicado
├── saveinmed/
│ ├── backend/
│ │ └── .env
│ ├── marketplace/
│ └── ...
├── farmacia/
├── obramarket/
└── [nome-do-projeto]/
```