132 lines
3.7 KiB
Markdown
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]/
|
|
```
|