990 lines
19 KiB
Markdown
990 lines
19 KiB
Markdown
# Veza Backend API - Deployment Guide
|
|
|
|
## Table of Contents
|
|
|
|
1. [Overview](#overview)
|
|
2. [Prerequisites](#prerequisites)
|
|
3. [Environment Configuration](#environment-configuration)
|
|
4. [Local Development Deployment](#local-development-deployment)
|
|
5. [Staging Deployment](#staging-deployment)
|
|
6. [Production Deployment](#production-deployment)
|
|
7. [Docker Deployment](#docker-deployment)
|
|
8. [Ansible Deployment](#ansible-deployment)
|
|
9. [Kubernetes Deployment](#kubernetes-deployment)
|
|
10. [Database Migrations](#database-migrations)
|
|
11. [Health Checks and Monitoring](#health-checks-and-monitoring)
|
|
12. [Rollback Procedures](#rollback-procedures)
|
|
13. [Troubleshooting](#troubleshooting)
|
|
14. [Maintenance](#maintenance)
|
|
|
|
## Overview
|
|
|
|
This guide covers deployment procedures for the Veza Backend API across all environments:
|
|
- **Local Development**: Docker Compose for local testing
|
|
- **Staging**: Pre-production environment for testing
|
|
- **Production**: Production deployment with high availability
|
|
|
|
The API supports multiple deployment methods:
|
|
- Docker and Docker Compose
|
|
- Ansible automation
|
|
- Kubernetes orchestration
|
|
- Manual deployment
|
|
|
|
## Prerequisites
|
|
|
|
### System Requirements
|
|
|
|
**Minimum Requirements:**
|
|
- CPU: 2 cores
|
|
- RAM: 4GB
|
|
- Storage: 20GB
|
|
- Network: 100Mbps
|
|
|
|
**Recommended for Production:**
|
|
- CPU: 4+ cores
|
|
- RAM: 8GB+
|
|
- Storage: 100GB+ (SSD recommended)
|
|
- Network: 1Gbps
|
|
|
|
### Software Requirements
|
|
|
|
- **Operating System**: Linux (Debian 12+, Ubuntu 22.04+, RHEL 8+)
|
|
- **Container Runtime**: Docker 20.10+ or containerd 1.6+
|
|
- **Orchestration**: Kubernetes 1.24+ (optional)
|
|
- **Database**: PostgreSQL 12+
|
|
- **Cache**: Redis 6+ (optional but recommended)
|
|
- **Reverse Proxy**: Nginx 1.20+ or HAProxy 2.4+ (for production)
|
|
|
|
### Development Tools
|
|
|
|
- Go 1.23+
|
|
- Git
|
|
- Make
|
|
- Docker and Docker Compose
|
|
|
|
## Environment Configuration
|
|
|
|
### Environment Variables
|
|
|
|
The API uses environment variables for configuration. Create a `.env` file or set environment variables:
|
|
|
|
#### Required Variables
|
|
|
|
```bash
|
|
# Database
|
|
DATABASE_URL=postgres://user:password@host:5432/dbname?sslmode=disable
|
|
|
|
# Security
|
|
JWT_SECRET=<32+ character secret>
|
|
JWT_EXPIRY=24h
|
|
|
|
# Application
|
|
APP_ENV=production # development|staging|production
|
|
API_PORT=8080
|
|
```
|
|
|
|
#### Production Required Variables
|
|
|
|
```bash
|
|
# CORS (Required in production)
|
|
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
|
|
|
|
# Database
|
|
DB_MAX_RETRIES=5
|
|
DB_RETRY_INTERVAL=5s
|
|
DB_MAX_OPEN_CONNS=25
|
|
DB_MAX_IDLE_CONNS=5
|
|
DB_CONN_MAX_LIFETIME=5m
|
|
|
|
# Redis (Optional but recommended)
|
|
REDIS_URL=redis://:password@host:6379
|
|
REDIS_PASSWORD=your_redis_password
|
|
|
|
# Logging
|
|
LOG_LEVEL=INFO # DEBUG|INFO|WARN|ERROR
|
|
LOG_FORMAT=json # json|text
|
|
```
|
|
|
|
#### Optional Variables
|
|
|
|
```bash
|
|
# ClamAV (Antivirus scanning)
|
|
ENABLE_CLAMAV=true
|
|
CLAMAV_REQUIRED=true
|
|
CLAMAV_HOST=localhost
|
|
CLAMAV_PORT=3310
|
|
|
|
# Email
|
|
SMTP_HOST=smtp.example.com
|
|
SMTP_PORT=587
|
|
SMTP_USER=user@example.com
|
|
SMTP_PASSWORD=password
|
|
SMTP_FROM=noreply@veza.com
|
|
|
|
# Storage
|
|
UPLOAD_DIR=/var/lib/veza/uploads
|
|
MAX_UPLOAD_SIZE=500MB
|
|
ALLOWED_AUDIO_FORMATS=mp3,wav,flac,ogg
|
|
|
|
# Rate Limiting
|
|
RATE_LIMIT_ENABLED=true
|
|
RATE_LIMIT_REDIS_URL=redis://:password@host:6379
|
|
|
|
# Monitoring
|
|
PROMETHEUS_ENABLED=true
|
|
PROMETHEUS_PORT=9090
|
|
|
|
# Chat Integration
|
|
CHAT_SERVER_URL=http://chat-server:8081
|
|
CHAT_JWT_SECRET=<32+ character secret>
|
|
|
|
# Stream Server Integration
|
|
STREAM_SERVER_URL=http://stream-server:8082
|
|
|
|
# Webhooks
|
|
WEBHOOK_SECRET=<32+ character secret>
|
|
WEBHOOK_TIMEOUT=30s
|
|
```
|
|
|
|
### Configuration Files
|
|
|
|
#### Production Config Example
|
|
|
|
Create `config/production.env`:
|
|
|
|
```bash
|
|
# Production Configuration
|
|
APP_ENV=production
|
|
LOG_LEVEL=INFO
|
|
LOG_FORMAT=json
|
|
|
|
# Database
|
|
DATABASE_URL=postgres://veza_user:secure_password@db.veza.internal:5432/veza_prod?sslmode=require
|
|
DB_MAX_OPEN_CONNS=50
|
|
DB_MAX_IDLE_CONNS=10
|
|
|
|
# Security
|
|
JWT_SECRET=<generate-strong-secret-32-chars-min>
|
|
JWT_EXPIRY=24h
|
|
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
|
|
|
|
# Redis
|
|
REDIS_URL=redis://:redis_password@redis.veza.internal:6379/0
|
|
|
|
# Storage
|
|
UPLOAD_DIR=/var/lib/veza/uploads
|
|
MAX_UPLOAD_SIZE=500MB
|
|
|
|
# Monitoring
|
|
PROMETHEUS_ENABLED=true
|
|
```
|
|
|
|
## Local Development Deployment
|
|
|
|
### Quick Start with Docker Compose
|
|
|
|
```bash
|
|
# Clone repository
|
|
git clone <repository-url>
|
|
cd veza
|
|
|
|
# Copy environment file
|
|
cp veza-backend-api/.env.example veza-backend-api/.env
|
|
|
|
# Edit .env with your local settings
|
|
nano veza-backend-api/.env
|
|
|
|
# Start all services
|
|
docker-compose up -d
|
|
|
|
# Check logs
|
|
docker-compose logs -f backend-api
|
|
|
|
# Stop services
|
|
docker-compose down
|
|
```
|
|
|
|
### Manual Local Setup
|
|
|
|
```bash
|
|
# Install dependencies
|
|
cd veza-backend-api
|
|
go mod download
|
|
|
|
# Run database migrations
|
|
make migrate-up
|
|
|
|
# Build application
|
|
make build
|
|
|
|
# Run application
|
|
./bin/veza-backend-api
|
|
|
|
# Or run with hot reload (development)
|
|
make dev
|
|
```
|
|
|
|
### Local Development with Hot Reload
|
|
|
|
```bash
|
|
# Install air for hot reload
|
|
go install github.com/cosmtrek/air@latest
|
|
|
|
# Run with hot reload
|
|
air
|
|
|
|
# Or use make
|
|
make dev
|
|
```
|
|
|
|
## Staging Deployment
|
|
|
|
### Staging Environment Setup
|
|
|
|
Staging environment should mirror production as closely as possible:
|
|
|
|
```bash
|
|
# Set environment
|
|
export APP_ENV=staging
|
|
|
|
# Use staging database
|
|
export DATABASE_URL=postgres://user:pass@staging-db:5432/veza_staging
|
|
|
|
# Use staging Redis
|
|
export REDIS_URL=redis://:pass@staging-redis:6379
|
|
|
|
# Deploy with Docker Compose
|
|
docker-compose -f docker-compose.staging.yml up -d
|
|
|
|
# Run migrations
|
|
docker-compose -f docker-compose.staging.yml exec backend-api ./veza-api migrate up
|
|
|
|
# Check health
|
|
curl https://staging-api.veza.com/healthz
|
|
```
|
|
|
|
### Staging Docker Compose
|
|
|
|
Create `docker-compose.staging.yml`:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
backend-api:
|
|
image: veza/backend-api:staging
|
|
environment:
|
|
APP_ENV: staging
|
|
DATABASE_URL: ${DATABASE_URL}
|
|
JWT_SECRET: ${JWT_SECRET}
|
|
CORS_ALLOWED_ORIGINS: https://staging.veza.com
|
|
LOG_LEVEL: DEBUG
|
|
ports:
|
|
- "8080:8080"
|
|
restart: unless-stopped
|
|
```
|
|
|
|
## Production Deployment
|
|
|
|
### Pre-Deployment Checklist
|
|
|
|
- [ ] All environment variables configured
|
|
- [ ] Database backups created
|
|
- [ ] SSL certificates valid
|
|
- [ ] DNS records configured
|
|
- [ ] Firewall rules configured
|
|
- [ ] Monitoring alerts configured
|
|
- [ ] Rollback plan prepared
|
|
- [ ] Team notified of deployment
|
|
|
|
### Production Deployment Methods
|
|
|
|
#### Method 1: Docker Compose (Single Server)
|
|
|
|
```bash
|
|
# Pull latest image
|
|
docker pull veza/backend-api:latest
|
|
|
|
# Stop current deployment
|
|
docker-compose -f docker-compose.production.yml down
|
|
|
|
# Backup database
|
|
./scripts/backup-database.sh
|
|
|
|
# Update environment variables
|
|
nano .env.production
|
|
|
|
# Start new deployment
|
|
docker-compose -f docker-compose.production.yml up -d
|
|
|
|
# Run migrations
|
|
docker-compose -f docker-compose.production.yml exec backend-api ./veza-api migrate up
|
|
|
|
# Verify health
|
|
curl https://api.veza.com/healthz
|
|
|
|
# Check logs
|
|
docker-compose -f docker-compose.production.yml logs -f backend-api
|
|
```
|
|
|
|
#### Method 2: Docker (Standalone)
|
|
|
|
```bash
|
|
# Build production image
|
|
docker build -f Dockerfile.production -t veza/backend-api:latest .
|
|
|
|
# Tag for registry
|
|
docker tag veza/backend-api:latest registry.veza.com/veza/backend-api:v1.2.0
|
|
|
|
# Push to registry
|
|
docker push registry.veza.com/veza/backend-api:v1.2.0
|
|
|
|
# Run container
|
|
docker run -d \
|
|
--name veza-backend-api \
|
|
--restart unless-stopped \
|
|
-p 8080:8080 \
|
|
--env-file .env.production \
|
|
-v /var/lib/veza/uploads:/app/uploads \
|
|
veza/backend-api:latest
|
|
|
|
# Check logs
|
|
docker logs -f veza-backend-api
|
|
```
|
|
|
|
#### Method 3: Systemd Service
|
|
|
|
Create `/etc/systemd/system/veza-backend-api.service`:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Veza Backend API
|
|
After=network.target postgresql.service redis.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=veza
|
|
Group=veza
|
|
WorkingDirectory=/opt/veza/backend-api
|
|
EnvironmentFile=/etc/veza/backend-api.env
|
|
ExecStart=/opt/veza/backend-api/bin/veza-backend-api
|
|
Restart=always
|
|
RestartSec=10
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
Enable and start:
|
|
|
|
```bash
|
|
# Reload systemd
|
|
sudo systemctl daemon-reload
|
|
|
|
# Enable service
|
|
sudo systemctl enable veza-backend-api
|
|
|
|
# Start service
|
|
sudo systemctl start veza-backend-api
|
|
|
|
# Check status
|
|
sudo systemctl status veza-backend-api
|
|
|
|
# View logs
|
|
sudo journalctl -u veza-backend-api -f
|
|
```
|
|
|
|
## Docker Deployment
|
|
|
|
### Building Docker Images
|
|
|
|
#### Development Image
|
|
|
|
```bash
|
|
docker build -t veza/backend-api:dev -f Dockerfile .
|
|
```
|
|
|
|
#### Production Image
|
|
|
|
```bash
|
|
docker build -t veza/backend-api:latest -f Dockerfile.production .
|
|
```
|
|
|
|
### Docker Compose Production
|
|
|
|
Use `docker-compose.production.yml`:
|
|
|
|
```bash
|
|
# Start services
|
|
docker-compose -f docker-compose.production.yml up -d
|
|
|
|
# View logs
|
|
docker-compose -f docker-compose.production.yml logs -f
|
|
|
|
# Scale backend (if needed)
|
|
docker-compose -f docker-compose.production.yml up -d --scale backend-api=3
|
|
|
|
# Stop services
|
|
docker-compose -f docker-compose.production.yml down
|
|
|
|
# Stop and remove volumes
|
|
docker-compose -f docker-compose.production.yml down -v
|
|
```
|
|
|
|
### Docker Health Checks
|
|
|
|
The production Dockerfile includes health checks:
|
|
|
|
```dockerfile
|
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
|
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
|
|
```
|
|
|
|
Check container health:
|
|
|
|
```bash
|
|
docker ps # Shows health status
|
|
docker inspect veza-backend-api | grep Health
|
|
```
|
|
|
|
## Ansible Deployment
|
|
|
|
### Prerequisites
|
|
|
|
```bash
|
|
# Install Ansible
|
|
pip install ansible
|
|
|
|
# Install required collections
|
|
ansible-galaxy collection install community.general community.docker
|
|
```
|
|
|
|
### Full Deployment
|
|
|
|
```bash
|
|
cd ansible
|
|
|
|
# Run full deployment
|
|
./deploy-veza.sh
|
|
|
|
# Or with custom domain
|
|
./deploy-veza.sh -d api.veza.com -e admin@veza.com
|
|
```
|
|
|
|
### Step-by-Step Deployment
|
|
|
|
```bash
|
|
# 1. Bootstrap target host
|
|
ansible-playbook -i inventory/prod/hosts.yml playbooks/00-bootstrap-remote.yml
|
|
|
|
# 2. Install Incus and OVN
|
|
ansible-playbook -i inventory/prod/hosts.yml playbooks/10-incus-ovn.yml
|
|
|
|
# 3. Create containers
|
|
ansible-playbook -i inventory/prod/hosts.yml playbooks/20-incus-containers.yml
|
|
|
|
# 4. Configure HAProxy and SSL
|
|
ansible-playbook -i inventory/prod/hosts.yml playbooks/30-haproxy-acme.yml \
|
|
-e domain=api.veza.com -e acme_email=admin@veza.com
|
|
|
|
# 5. Deploy applications
|
|
ansible-playbook -i inventory/prod/hosts.yml playbooks/40-veza-apps.yml
|
|
|
|
# 6. Run smoke tests
|
|
ansible-playbook -i inventory/prod/hosts.yml playbooks/50-smoke-tests.yml
|
|
```
|
|
|
|
### Ansible Inventory
|
|
|
|
Create `ansible/inventory/prod/hosts.yml`:
|
|
|
|
```yaml
|
|
all:
|
|
children:
|
|
production:
|
|
hosts:
|
|
api-server:
|
|
ansible_host: 192.168.1.100
|
|
ansible_user: deploy
|
|
ansible_ssh_private_key_file: ~/.ssh/deploy_key
|
|
```
|
|
|
|
## Kubernetes Deployment
|
|
|
|
### Prerequisites
|
|
|
|
- Kubernetes cluster 1.24+
|
|
- kubectl configured
|
|
- Helm 3.8+ (optional)
|
|
|
|
### Deploy with kubectl
|
|
|
|
```bash
|
|
# Create namespace
|
|
kubectl create namespace veza
|
|
|
|
# Create secrets
|
|
kubectl create secret generic veza-backend-secrets \
|
|
--from-env-file=.env.production \
|
|
-n veza
|
|
|
|
# Deploy application
|
|
kubectl apply -f k8s/deployment.yaml
|
|
|
|
# Deploy service
|
|
kubectl apply -f k8s/service.yaml
|
|
|
|
# Check status
|
|
kubectl get pods -n veza
|
|
kubectl logs -f deployment/veza-backend-api -n veza
|
|
```
|
|
|
|
### Kubernetes Deployment Example
|
|
|
|
Create `k8s/deployment.yaml`:
|
|
|
|
```yaml
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: veza-backend-api
|
|
namespace: veza
|
|
spec:
|
|
replicas: 3
|
|
selector:
|
|
matchLabels:
|
|
app: veza-backend-api
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: veza-backend-api
|
|
spec:
|
|
containers:
|
|
- name: backend-api
|
|
image: veza/backend-api:latest
|
|
ports:
|
|
- containerPort: 8080
|
|
envFrom:
|
|
- secretRef:
|
|
name: veza-backend-secrets
|
|
resources:
|
|
requests:
|
|
memory: "512Mi"
|
|
cpu: "500m"
|
|
limits:
|
|
memory: "1Gi"
|
|
cpu: "1000m"
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /healthz
|
|
port: 8080
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 10
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /healthz
|
|
port: 8080
|
|
initialDelaySeconds: 10
|
|
periodSeconds: 5
|
|
```
|
|
|
|
### Deploy with Helm
|
|
|
|
```bash
|
|
# Install Helm chart
|
|
helm install veza-backend ./helm/veza-backend \
|
|
--namespace veza \
|
|
--set image.tag=v1.2.0 \
|
|
--set env.databaseUrl=postgres://... \
|
|
--set env.jwtSecret=...
|
|
|
|
# Upgrade
|
|
helm upgrade veza-backend ./helm/veza-backend \
|
|
--namespace veza \
|
|
--set image.tag=v1.2.1
|
|
|
|
# Rollback
|
|
helm rollback veza-backend 1 --namespace veza
|
|
```
|
|
|
|
## Database Migrations
|
|
|
|
### Running Migrations
|
|
|
|
#### With Docker
|
|
|
|
```bash
|
|
# Run migrations
|
|
docker-compose exec backend-api ./veza-api migrate up
|
|
|
|
# Rollback last migration
|
|
docker-compose exec backend-api ./veza-api migrate down
|
|
|
|
# Check migration status
|
|
docker-compose exec backend-api ./veza-api migrate status
|
|
```
|
|
|
|
#### Manual Migration
|
|
|
|
```bash
|
|
# Install migrate tool
|
|
go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
|
|
|
|
# Run migrations
|
|
migrate -path ./migrations -database "$DATABASE_URL" up
|
|
|
|
# Rollback
|
|
migrate -path ./migrations -database "$DATABASE_URL" down 1
|
|
|
|
# Check status
|
|
migrate -path ./migrations -database "$DATABASE_URL" version
|
|
```
|
|
|
|
### Migration Best Practices
|
|
|
|
1. **Always backup before migrations in production**
|
|
2. **Test migrations in staging first**
|
|
3. **Run migrations during low-traffic periods**
|
|
4. **Monitor application after migration**
|
|
5. **Have rollback plan ready**
|
|
|
|
```bash
|
|
# Backup before migration
|
|
pg_dump -h db.veza.internal -U veza_user veza_prod > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
|
|
# Run migration
|
|
migrate -path ./migrations -database "$DATABASE_URL" up
|
|
|
|
# Verify
|
|
psql -h db.veza.internal -U veza_user -d veza_prod -c "SELECT version FROM schema_migrations;"
|
|
```
|
|
|
|
## Health Checks and Monitoring
|
|
|
|
### Health Check Endpoints
|
|
|
|
```bash
|
|
# Basic health check
|
|
curl http://localhost:8080/healthz
|
|
|
|
# Detailed health check
|
|
curl http://localhost:8080/health
|
|
|
|
# Readiness check
|
|
curl http://localhost:8080/ready
|
|
```
|
|
|
|
### Health Check Response
|
|
|
|
```json
|
|
{
|
|
"status": "healthy",
|
|
"timestamp": "2025-01-01T00:00:00Z",
|
|
"checks": {
|
|
"database": "healthy",
|
|
"redis": "healthy",
|
|
"disk": "healthy"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Monitoring Setup
|
|
|
|
#### Prometheus Metrics
|
|
|
|
The API exposes Prometheus metrics at `/metrics`:
|
|
|
|
```bash
|
|
# Scrape metrics
|
|
curl http://localhost:8080/metrics
|
|
```
|
|
|
|
#### Prometheus Configuration
|
|
|
|
```yaml
|
|
scrape_configs:
|
|
- job_name: 'veza-backend-api'
|
|
scrape_interval: 15s
|
|
static_configs:
|
|
- targets: ['backend-api:8080']
|
|
metrics_path: '/metrics'
|
|
```
|
|
|
|
#### Grafana Dashboard
|
|
|
|
Import the provided Grafana dashboard from `ops/prometheus/grafana-dashboard.json`.
|
|
|
|
### Logging
|
|
|
|
#### Log Levels
|
|
|
|
- `DEBUG`: Detailed information for debugging
|
|
- `INFO`: General informational messages
|
|
- `WARN`: Warning messages
|
|
- `ERROR`: Error messages
|
|
|
|
#### Log Formats
|
|
|
|
- `json`: Structured JSON logs (production)
|
|
- `text`: Human-readable text logs (development)
|
|
|
|
#### Viewing Logs
|
|
|
|
```bash
|
|
# Docker logs
|
|
docker logs -f veza-backend-api
|
|
|
|
# Docker Compose logs
|
|
docker-compose logs -f backend-api
|
|
|
|
# Systemd logs
|
|
journalctl -u veza-backend-api -f
|
|
|
|
# Kubernetes logs
|
|
kubectl logs -f deployment/veza-backend-api -n veza
|
|
```
|
|
|
|
## Rollback Procedures
|
|
|
|
### Docker Rollback
|
|
|
|
```bash
|
|
# Stop current deployment
|
|
docker-compose -f docker-compose.production.yml down
|
|
|
|
# Tag previous image
|
|
docker tag veza/backend-api:previous veza/backend-api:latest
|
|
|
|
# Start previous version
|
|
docker-compose -f docker-compose.production.yml up -d
|
|
|
|
# Verify
|
|
curl https://api.veza.com/healthz
|
|
```
|
|
|
|
### Database Migration Rollback
|
|
|
|
```bash
|
|
# Rollback last migration
|
|
migrate -path ./migrations -database "$DATABASE_URL" down 1
|
|
|
|
# Rollback to specific version
|
|
migrate -path ./migrations -database "$DATABASE_URL" force <version>
|
|
```
|
|
|
|
### Kubernetes Rollback
|
|
|
|
```bash
|
|
# Rollback deployment
|
|
kubectl rollout undo deployment/veza-backend-api -n veza
|
|
|
|
# Rollback to specific revision
|
|
kubectl rollout undo deployment/veza-backend-api -n veza --to-revision=2
|
|
|
|
# Check rollout history
|
|
kubectl rollout history deployment/veza-backend-api -n veza
|
|
```
|
|
|
|
### Ansible Rollback
|
|
|
|
```bash
|
|
# Revert to previous playbook version
|
|
git checkout <previous-commit>
|
|
ansible-playbook -i inventory/prod/hosts.yml playbooks/40-veza-apps.yml
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### Application Won't Start
|
|
|
|
```bash
|
|
# Check logs
|
|
docker logs veza-backend-api
|
|
journalctl -u veza-backend-api
|
|
|
|
# Verify environment variables
|
|
docker exec veza-backend-api env | grep -E 'DATABASE|JWT|APP_ENV'
|
|
|
|
# Check database connectivity
|
|
docker exec veza-backend-api ./veza-api migrate status
|
|
```
|
|
|
|
#### Database Connection Issues
|
|
|
|
```bash
|
|
# Test database connection
|
|
psql "$DATABASE_URL" -c "SELECT 1;"
|
|
|
|
# Check database is running
|
|
docker ps | grep postgres
|
|
systemctl status postgresql
|
|
|
|
# Verify network connectivity
|
|
docker exec veza-backend-api ping postgres
|
|
```
|
|
|
|
#### High Memory Usage
|
|
|
|
```bash
|
|
# Check memory usage
|
|
docker stats veza-backend-api
|
|
|
|
# Adjust database connection pool
|
|
export DB_MAX_OPEN_CONNS=25
|
|
export DB_MAX_IDLE_CONNS=5
|
|
|
|
# Restart with new settings
|
|
docker-compose restart backend-api
|
|
```
|
|
|
|
#### Slow Response Times
|
|
|
|
```bash
|
|
# Check application metrics
|
|
curl http://localhost:8080/metrics | grep http_request_duration
|
|
|
|
# Check database query times
|
|
# Enable slow query log in PostgreSQL
|
|
|
|
# Check Redis connectivity
|
|
redis-cli -h redis.veza.internal ping
|
|
```
|
|
|
|
### Debug Mode
|
|
|
|
Enable debug logging:
|
|
|
|
```bash
|
|
export LOG_LEVEL=DEBUG
|
|
export LOG_FORMAT=text
|
|
```
|
|
|
|
### Performance Tuning
|
|
|
|
#### Database Connection Pool
|
|
|
|
```bash
|
|
DB_MAX_OPEN_CONNS=50
|
|
DB_MAX_IDLE_CONNS=10
|
|
DB_CONN_MAX_LIFETIME=5m
|
|
```
|
|
|
|
#### Application Resources
|
|
|
|
```yaml
|
|
# Kubernetes resources
|
|
resources:
|
|
requests:
|
|
memory: "1Gi"
|
|
cpu: "1000m"
|
|
limits:
|
|
memory: "2Gi"
|
|
cpu: "2000m"
|
|
```
|
|
|
|
## Maintenance
|
|
|
|
### Regular Maintenance Tasks
|
|
|
|
#### Daily
|
|
|
|
- Monitor health checks
|
|
- Review error logs
|
|
- Check disk space
|
|
- Verify backups
|
|
|
|
#### Weekly
|
|
|
|
- Review performance metrics
|
|
- Check for security updates
|
|
- Review database size
|
|
- Clean up old logs
|
|
|
|
#### Monthly
|
|
|
|
- Update dependencies
|
|
- Review and optimize database
|
|
- Review and update documentation
|
|
- Security audit
|
|
|
|
### Backup Procedures
|
|
|
|
#### Database Backup
|
|
|
|
```bash
|
|
# Automated backup script
|
|
#!/bin/bash
|
|
BACKUP_DIR="/var/backups/veza"
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
pg_dump "$DATABASE_URL" > "$BACKUP_DIR/veza_db_$DATE.sql"
|
|
gzip "$BACKUP_DIR/veza_db_$DATE.sql"
|
|
|
|
# Keep only last 30 days
|
|
find "$BACKUP_DIR" -name "veza_db_*.sql.gz" -mtime +30 -delete
|
|
```
|
|
|
|
#### Application Backup
|
|
|
|
```bash
|
|
# Backup uploads directory
|
|
tar -czf /var/backups/veza/uploads_$(date +%Y%m%d).tar.gz /var/lib/veza/uploads
|
|
|
|
# Backup configuration
|
|
cp .env.production /var/backups/veza/env_$(date +%Y%m%d).env
|
|
```
|
|
|
|
### Update Procedures
|
|
|
|
#### Minor Updates
|
|
|
|
```bash
|
|
# Pull latest image
|
|
docker pull veza/backend-api:latest
|
|
|
|
# Rolling update
|
|
docker-compose -f docker-compose.production.yml up -d --no-deps backend-api
|
|
|
|
# Verify
|
|
curl https://api.veza.com/healthz
|
|
```
|
|
|
|
#### Major Updates
|
|
|
|
1. Backup database
|
|
2. Test in staging
|
|
3. Schedule maintenance window
|
|
4. Deploy new version
|
|
5. Run migrations
|
|
6. Verify functionality
|
|
7. Monitor for issues
|
|
|
|
### Security Updates
|
|
|
|
```bash
|
|
# Update base image
|
|
docker pull golang:1.23-alpine
|
|
|
|
# Rebuild with security updates
|
|
docker build --no-cache -f Dockerfile.production -t veza/backend-api:latest .
|
|
|
|
# Scan for vulnerabilities
|
|
docker scan veza/backend-api:latest
|
|
```
|
|
|
|
## Additional Resources
|
|
|
|
- **API Documentation**: See `docs/API_DOCUMENTATION.md`
|
|
- **Development Guide**: See `README.md`
|
|
- **Ansible Deployment**: See `ansible/DEPLOYMENT_GUIDE.md`
|
|
- **Kubernetes Manifests**: See `k8s/` directory
|
|
- **Monitoring Setup**: See `ops/prometheus/` directory
|
|
|
|
## Support
|
|
|
|
For deployment issues:
|
|
- **Email**: ops@veza.com
|
|
- **Documentation**: https://docs.veza.com
|
|
- **Issues**: https://github.com/veza/veza-backend-api/issues
|
|
|