- Todos os testes passando (30/30 - 100%)
- Sem warnings do Pydantic (model_dump em vez de .dict())
- Código sem erros de linting (flake8)
- Documentação de API atualizada (/docs, /redoc)
- SECRET_KEY obrigatória via variável de ambiente
- CORS configurado via variável de ambiente
- Senhas nunca hardcoded no código
- .env no .gitignore
- .env.example criado para referência
- Documentação de segurança (SECURITY.md)
- Arquivo
.env.examplecriado em/backend -
.envlistado no.gitignore - Variáveis necessárias documentadas:
- DATABASE_URL
- SECRET_KEY (obrigatória)
- ALGORITHM
- ACCESS_TOKEN_EXPIRE_MINUTES
- ALLOWED_ORIGINS
- ENVIRONMENT
- Script de migração testado (
database/init.sql) - Backup do banco de desenvolvimento criado
- Credenciais de produção separadas
- Índices de performance verificados
- Build de produção testado (
npm run build) - Variáveis de ambiente do Nuxt configuradas
- API_BASE_URL apontando para produção
- Assets otimizados
# Atualizar sistema
sudo apt update && sudo apt upgrade -y
# Instalar Python 3.9+
sudo apt install python3 python3-pip python3-venv -y
# Instalar MySQL
sudo apt install mysql-server -y
sudo mysql_secure_installation# Clonar repositório
git clone https://github.com/Beto1821/hotel-management-app.git
cd hotel-management-app/backend
# Criar e ativar ambiente virtual
python3 -m venv venv
source venv/bin/activate
# Instalar dependências
pip install -r requirements.txt# Criar arquivo .env (NUNCA commitar!)
nano .envConteúdo do .env de PRODUÇÃO:
# Database - Usar credenciais de produção
DATABASE_URL=mysql+pymysql://usuario_prod:senha_forte@localhost:3306/hotel_prod
# JWT - GERAR NOVA SECRET_KEY!
SECRET_KEY=use-o-comando-abaixo-para-gerar
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# CORS - Adicionar domínio de produção
ALLOWED_ORIGINS=https://seu-dominio.com,https://www.seu-dominio.com
# Environment
ENVIRONMENT=productionIMPORTANTE: Gerar SECRET_KEY segura:
python -c "import secrets; print(secrets.token_urlsafe(32))"# Criar banco de dados
mysql -u root -pCREATE DATABASE hotel_prod CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'usuario_prod'@'localhost' IDENTIFIED BY 'senha_forte_aqui';
GRANT ALL PRIVILEGES ON hotel_prod.* TO 'usuario_prod'@'localhost';
FLUSH PRIVILEGES;
EXIT;# Executar script de inicialização
mysql -u usuario_prod -p hotel_prod < database/init.sql# Instalar Gunicorn
pip install gunicorn
# Criar arquivo de serviço systemd
sudo nano /etc/systemd/system/hotel-api.serviceConteúdo do hotel-api.service:
[Unit]
Description=Hotel Management API
After=network.target
[Service]
User=seu_usuario
Group=www-data
WorkingDirectory=/caminho/para/hotel-management-app/backend
Environment="PATH=/caminho/para/hotel-management-app/backend/venv/bin"
ExecStart=/caminho/para/hotel-management-app/backend/venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000
[Install]
WantedBy=multi-user.target# Iniciar serviço
sudo systemctl start hotel-api
sudo systemctl enable hotel-api
sudo systemctl status hotel-apisudo apt install nginx -y
sudo nano /etc/nginx/sites-available/hotel-apiConteúdo do hotel-api:
server {
listen 80;
server_name api.seu-dominio.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}# Ativar site
sudo ln -s /etc/nginx/sites-available/hotel-api /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxsudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d api.seu-dominio.comcd ../frontend
nano .envConteúdo do .env de PRODUÇÃO:
NUXT_PUBLIC_API_BASE_URL=https://api.seu-dominio.com/api/v1npm install
npm run buildsudo nano /etc/nginx/sites-available/hotel-frontendConteúdo do hotel-frontend:
server {
listen 80;
server_name seu-dominio.com www.seu-dominio.com;
root /caminho/para/hotel-management-app/frontend/.output/public;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# API proxy (opcional se usar domínio separado)
location /api {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}sudo ln -s /etc/nginx/sites-available/hotel-frontend /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxsudo certbot --nginx -d seu-dominio.com -d www.seu-dominio.com- SECRET_KEY única e forte (32+ caracteres)
- Credenciais de banco diferentes de desenvolvimento
- HTTPS/SSL configurado (certbot)
- Firewall configurado (UFW)
sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable - Desabilitar /docs e /redoc em produção (já configurado via ENVIRONMENT)
- Rate limiting no Nginx
- Backup automático do banco de dados
- Monitoring (Prometheus, Grafana)
- Logs centralizados (ELK Stack)
- Alerts de erro (Sentry)
- CI/CD configurado (GitHub Actions)
- Testes automáticos no pipeline
# Verificar se API está rodando
curl https://api.seu-dominio.com/
# Verificar logs
sudo journalctl -u hotel-api -f
# Status do serviço
sudo systemctl status hotel-api# Verificar se site carrega
curl https://seu-dominio.com/
# Verificar logs do Nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log# Conectar e verificar tabelas
mysql -u usuario_prod -p hotel_prod
SHOW TABLES;
SELECT COUNT(*) FROM users;git checkout desenvolvimento
# Fazer alterações
python -m pytest tests/
git add .
git commit -m "feat: nova funcionalidade"
git push origin desenvolvimentogit checkout main
git merge desenvolvimento
git push origin main# No servidor
cd /caminho/para/hotel-management-app
git pull origin main
cd backend
source venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart hotel-api
# Frontend
cd ../frontend
npm install
npm run build
sudo systemctl restart nginx# Backup do banco
mysqldump -u usuario_prod -p hotel_prod > backup_$(date +%Y%m%d).sql
# Restaurar backup
mysql -u usuario_prod -p hotel_prod < backup_20241121.sql
# Ver logs da API
sudo journalctl -u hotel-api --since "1 hour ago"
# Reiniciar todos os serviços
sudo systemctl restart hotel-api nginx mysql
# Limpar logs antigos
sudo journalctl --vacuum-time=7d- Criar arquivo .env local seguindo
.env.example - Testar localmente com as novas configurações
- Rodar todos os testes (30/30 devem passar)
- Verificar se não há .env commitado no git
- Revisar CORS e origens permitidas
- Documentar mudanças no CHANGELOG ou release notes
Solução: Criar arquivo .env com SECRET_KEY
Solução: Verificar se API está rodando (systemctl status hotel-api)
Solução: Adicionar origem em ALLOWED_ORIGINS no .env
Solução: Verificar DATABASE_URL e credenciais no .env
Data: 21/11/2024
Status: ✅ Pronto para merge desenvolvimento → main
Versão: 1.0.0