Deploy
Guia completo para deploy do CSGOFlip em produção.
Pré-requisitos
- Servidor Linux (Ubuntu 22.04 LTS recomendado)
- Docker e Docker Compose
- Node.js 20 LTS
- PostgreSQL 15+
- Redis 7+
- Domínio configurado
- Certificado SSL
Arquitetura de Deploy
Passo a Passo
1. Preparar Servidor
bash
# Atualizar sistema
sudo apt update && sudo apt upgrade -y
# Instalar dependências
sudo apt install -y curl git build-essential
# Instalar Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Instalar Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Instalar PM2
sudo npm install -g pm2
# Instalar Nginx
sudo apt install -y nginx2. Configurar PostgreSQL
bash
# Criar container
docker run -d \
--name postgres \
-e POSTGRES_USER=csgoflip \
-e POSTGRES_PASSWORD=your-secure-password \
-e POSTGRES_DB=csgoflip \
-v postgres_data:/var/lib/postgresql/data \
-p 5432:5432 \
--restart always \
postgres:15-alpine
# Verificar
docker logs postgres3. Configurar Redis
bash
# Criar container
docker run -d \
--name redis \
-v redis_data:/data \
-p 6379:6379 \
--restart always \
redis:7-alpine redis-server --requirepass your-redis-password --appendonly yes
# Verificar
docker exec redis redis-cli -a your-redis-password ping4. Configurar MinIO (Storage)
bash
docker run -d \
--name minio \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin-secret \
-v minio_data:/data \
-p 9000:9000 \
-p 9001:9001 \
--restart always \
minio/minio server /data --console-address ":9001"5. Clonar e Configurar Projeto
bash
# Clonar repositório
git clone https://github.com/your-org/csgoflip.git
cd csgoflip
# Instalar dependências
npm ci
# Configurar variáveis de ambiente
cp .env.example .env
nano .env6. Configurar Variáveis de Ambiente
bash
# .env
NODE_ENV=production
PORT=3000
# Database
DATABASE_URL=postgresql://csgoflip:your-secure-password@localhost:5432/csgoflip
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=your-redis-password
# Steam
STEAM_API_KEY=your-steam-api-key
STEAM_REALM=https://csgoflip.com
STEAM_RETURN_URL=https://api.csgoflip.com/auth/steam/callback
# Storage
S3_ENDPOINT=http://localhost:9000
S3_ACCESS_KEY=minioadmin
S3_SECRET_KEY=minioadmin-secret
S3_BUCKET=csgoflip
# Security
SESSION_SECRET=generate-a-secure-random-string
ENCRYPTION_KEY=generate-a-32-byte-hex-string
# URLs
API_URL=https://api.csgoflip.com
FRONTEND_URL=https://csgoflip.com
ADMIN_URL=https://admin.csgoflip.com7. Build e Migrations
bash
# Build da API
npm run build
# Gerar Prisma Client
npx prisma generate
# Executar migrations
npx prisma migrate deploy
# Seed (opcional)
npx prisma db seed8. Configurar PM2
javascript
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'csgoflip-api',
script: 'dist/main.js',
instances: 'max',
exec_mode: 'cluster',
env_production: {
NODE_ENV: 'production',
},
max_memory_restart: '1G',
error_file: './logs/api-error.log',
out_file: './logs/api-out.log',
},
],
};bash
# Iniciar API
pm2 start ecosystem.config.js --env production
# Salvar configuração
pm2 save
# Configurar startup
pm2 startup9. Build Frontend
bash
# Client (site principal)
cd client
npm ci
npm run build
pm2 start npm --name "csgoflip-client" -- start
# Admin Dashboard
cd ../next-shadcn-admin-dashboard
npm ci
npm run build
pm2 start npm --name "csgoflip-admin" -- start10. Configurar Nginx
nginx
# /etc/nginx/sites-available/csgoflip.conf
# API
server {
listen 443 ssl http2;
server_name api.csgoflip.com;
ssl_certificate /etc/letsencrypt/live/csgoflip.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/csgoflip.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
}
}
# Frontend
server {
listen 443 ssl http2;
server_name csgoflip.com www.csgoflip.com;
ssl_certificate /etc/letsencrypt/live/csgoflip.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/csgoflip.com/privkey.pem;
location / {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
# Admin
server {
listen 443 ssl http2;
server_name admin.csgoflip.com;
ssl_certificate /etc/letsencrypt/live/csgoflip.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/csgoflip.com/privkey.pem;
# IP whitelist (opcional)
# allow 192.168.1.0/24;
# deny all;
location / {
proxy_pass http://localhost:3002;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# Redirect HTTP to HTTPS
server {
listen 80;
server_name csgoflip.com www.csgoflip.com api.csgoflip.com admin.csgoflip.com;
return 301 https://$host$request_uri;
}bash
# Habilitar site
sudo ln -s /etc/nginx/sites-available/csgoflip.conf /etc/nginx/sites-enabled/
# Testar configuração
sudo nginx -t
# Recarregar
sudo systemctl reload nginx11. SSL com Certbot
bash
# Instalar Certbot
sudo apt install -y certbot python3-certbot-nginx
# Obter certificados
sudo certbot --nginx -d csgoflip.com -d www.csgoflip.com -d api.csgoflip.com -d admin.csgoflip.com
# Renovação automática
sudo certbot renew --dry-run12. Configurar Cloudflare
- Adicionar domínio ao Cloudflare
- Atualizar nameservers no registrador
- Configurar registros DNS:
A-csgoflip.com→ IP do servidorA-api.csgoflip.com→ IP do servidorA-admin.csgoflip.com→ IP do servidor
- Habilitar SSL/TLS → Full (strict)
- Habilitar Always Use HTTPS
- Configurar WAF rules
Monitoramento
PM2
bash
# Status
pm2 status
# Logs
pm2 logs
# Monitoramento
pm2 monitHealth Checks
bash
# API
curl https://api.csgoflip.com/health
# PostgreSQL
docker exec postgres pg_isready
# Redis
docker exec redis redis-cli -a your-password pingBackup
Script de Backup
bash
#!/bin/bash
# backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backups
# PostgreSQL
docker exec postgres pg_dump -U csgoflip csgoflip > $BACKUP_DIR/db_$DATE.sql
# Redis
docker exec redis redis-cli -a your-password BGSAVE
docker cp redis:/data/dump.rdb $BACKUP_DIR/redis_$DATE.rdb
# Compactar
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz $BACKUP_DIR/db_$DATE.sql $BACKUP_DIR/redis_$DATE.rdb
# Limpar arquivos temporários
rm $BACKUP_DIR/db_$DATE.sql $BACKUP_DIR/redis_$DATE.rdb
# Upload para S3 (opcional)
aws s3 cp $BACKUP_DIR/backup_$DATE.tar.gz s3://backups/csgoflip/Cron
bash
# Backup diário às 3h
0 3 * * * /path/to/backup.sh >> /var/log/backup.log 2>&1Atualizações
Script de Deploy
bash
#!/bin/bash
# deploy.sh
cd /path/to/csgoflip
# Pull latest
git pull origin main
# Install dependencies
npm ci
# Build
npm run build
# Migrations
npx prisma migrate deploy
# Restart API
pm2 restart csgoflip-api
# Build and restart frontend
cd client
npm ci
npm run build
pm2 restart csgoflip-client
# Build and restart admin
cd ../next-shadcn-admin-dashboard
npm ci
npm run build
pm2 restart csgoflip-admin
echo "Deploy completed!"Rollback
bash
# Voltar para commit anterior
git reset --hard HEAD~1
# Rebuild
npm run build
# Restart
pm2 restart allChecklist de Produção
- [ ] Variáveis de ambiente configuradas
- [ ] SSL/TLS habilitado
- [ ] Firewall configurado (ufw)
- [ ] Backups automáticos
- [ ] Monitoramento ativo
- [ ] Logs rotacionados
- [ ] Rate limiting configurado
- [ ] WAF habilitado
- [ ] 2FA obrigatório para admins
- [ ] Alertas configurados
