Some checks failed
Deploy to Coolify / Code Quality (pull_request) Has been cancelled
Deploy to Coolify / Run Tests (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Development (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Production (pull_request) Has been cancelled
Deploy to Coolify / Deploy to Test (pull_request) Has been cancelled
Pull Request Checks / Validate PR (pull_request) Has been cancelled
- Production compose file with single app service - Separate from development compose (now docker-compose.dev.yml) - Environment variable configuration - Health checks and resource limits - .env.production.example template - Comprehensive DEPLOYMENT.md guide Deployment guide covers: - Quick start with Docker Compose - Supabase setup (cloud + self-hosted) - Multiple deployment options (Coolify, Docker, K8s, VPS) - HTTPS/SSL configuration - Monitoring and logging - Backup and restore procedures - Troubleshooting - Security checklist - Performance optimization Ready for production deployment on any platform. Closes #38
6.9 KiB
6.9 KiB
Deployment Guide
Prerequisites
- Supabase project (managed or self-hosted)
- Docker and Docker Compose installed
- Domain name (optional, for production)
- SSL certificate (for HTTPS, recommended)
Quick Start (Docker Compose)
1. Clone the repository
git clone https://gitea.jeanlucmakiola.de/pantry-app/pantry.git
cd pantry
2. Configure environment
cp .env.production.example .env.production
# Edit .env.production with your Supabase credentials
nano .env.production
Required environment variables:
NUXT_PUBLIC_SUPABASE_URL- Your Supabase project URLNUXT_PUBLIC_SUPABASE_ANON_KEY- Your Supabase anonymous key
3. Build and run
docker-compose -f docker-compose.prod.yml --env-file .env.production up -d
The app will be available at http://localhost:3000
4. Verify deployment
# Check health
curl http://localhost:3000/api/health
# View logs
docker-compose -f docker-compose.prod.yml logs -f app
# Check status
docker-compose -f docker-compose.prod.yml ps
Supabase Setup
Option 1: Supabase Cloud (Recommended)
- Create a free account at supabase.com
- Create a new project
- Run migrations:
supabase/migrations/*.sql - Copy project URL and anon key to
.env.production
Option 2: Self-Hosted Supabase
Use the included docker-compose.yml for local Supabase:
# Create .env file
cp .env.example .env
# Edit .env with secure passwords
nano .env
# Start Supabase stack
docker-compose up -d
# Wait for services to be ready
docker-compose ps
# Run migrations
docker-compose exec db psql -U postgres -f /docker-entrypoint-initdb.d/001_initial_schema.sql
Supabase will be available at:
- API: http://localhost:54321
- Studio: http://localhost:54323
Production Deployment Options
Option 1: Coolify (Recommended)
- Add new Resource → Docker Compose
- Paste
docker-compose.prod.yml - Add environment variables in Coolify UI
- Deploy
Option 2: Docker Standalone
# Build image
docker build -t pantry:latest .
# Run container
docker run -d \
--name pantry \
-p 3000:3000 \
-e NUXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co \
-e NUXT_PUBLIC_SUPABASE_ANON_KEY=your-key \
--restart unless-stopped \
pantry:latest
Option 3: Kubernetes
Example deployment manifest:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pantry
spec:
replicas: 2
selector:
matchLabels:
app: pantry
template:
metadata:
labels:
app: pantry
spec:
containers:
- name: pantry
image: pantry:latest
ports:
- containerPort: 3000
env:
- name: NUXT_PUBLIC_SUPABASE_URL
valueFrom:
secretKeyRef:
name: pantry-secrets
key: supabase-url
- name: NUXT_PUBLIC_SUPABASE_ANON_KEY
valueFrom:
secretKeyRef:
name: pantry-secrets
key: supabase-key
livenessProbe:
httpGet:
path: /api/health
port: 3000
initialDelaySeconds: 40
periodSeconds: 30
resources:
limits:
memory: "512Mi"
cpu: "1000m"
requests:
memory: "256Mi"
cpu: "500m"
Option 4: VPS with Nginx
# /etc/nginx/sites-available/pantry
server {
listen 80;
server_name pantry.yourdomain.com;
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_cache_bypass $http_upgrade;
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;
}
}
HTTPS/SSL
Using Let's Encrypt (Certbot)
# Install Certbot
sudo apt install certbot python3-certbot-nginx
# Get certificate
sudo certbot --nginx -d pantry.yourdomain.com
# Auto-renewal
sudo certbot renew --dry-run
Using Cloudflare
- Add your domain to Cloudflare
- Enable "Full (strict)" SSL/TLS mode
- Point DNS A record to your server IP
- Cloudflare handles SSL automatically
Monitoring
Health Checks
# Manual check
curl http://localhost:3000/api/health
# With watch
watch -n 5 'curl -s http://localhost:3000/api/health | jq'
Docker Stats
docker stats pantry-app
Logs
# Follow logs
docker-compose -f docker-compose.prod.yml logs -f
# Last 100 lines
docker logs --tail 100 pantry-app
# Since timestamp
docker logs --since "2024-01-01T00:00:00" pantry-app
Updating
Pull latest changes
cd pantry
git pull origin main
# Rebuild and restart
docker-compose -f docker-compose.prod.yml build
docker-compose -f docker-compose.prod.yml up -d
Rolling back
# Tag before upgrading
docker tag pantry:latest pantry:backup-20240101
# Rollback if needed
docker-compose -f docker-compose.prod.yml down
docker tag pantry:backup-20240101 pantry:latest
docker-compose -f docker-compose.prod.yml up -d
Backup
Database (Supabase)
# Manual backup
pg_dump -h localhost -U postgres -d postgres > backup.sql
# Restore
psql -h localhost -U postgres -d postgres < backup.sql
Docker Volumes
# Backup
docker run --rm -v pantry_db-data:/data -v $(pwd):/backup ubuntu tar czf /backup/db-backup.tar.gz /data
# Restore
docker run --rm -v pantry_db-data:/data -v $(pwd):/backup ubuntu tar xzf /backup/db-backup.tar.gz -C /
Troubleshooting
Container won't start
# Check logs
docker logs pantry-app
# Verify environment variables
docker exec pantry-app env | grep NUXT
# Inspect container
docker inspect pantry-app
Supabase connection issues
- Verify Supabase URL and key
- Check network connectivity
- Verify RLS policies in Supabase
- Check CORS settings
Performance issues
- Check resource limits
- Monitor with
docker stats - Increase memory/CPU limits in docker-compose
- Enable compression in Nginx
PWA not updating
- Clear browser cache
- Unregister service worker
- Check that service worker is being served with correct headers
- Verify manifest.json is accessible
Security Checklist
- Use HTTPS (SSL certificate)
- Set secure environment variables
- Don't commit .env files
- Use strong Supabase passwords
- Enable RLS policies in Supabase
- Keep Docker images updated
- Use firewall rules
- Regular backups
- Monitor logs for suspicious activity
Performance Optimization
- Enable CDN (Cloudflare)
- Use HTTP/2
- Enable gzip/brotli compression
- Set proper cache headers
- Optimize images
- Use Supabase CDN for assets
Support
- Documentation: docs/
- Issues: Gitea Issues
- Wiki: Coming soon
Happy hosting! 🚀