- Complete Coolify deployment guide (COOLIFY_DEPLOYMENT.md) - Deployment checklist (DEPLOYMENT_CHECKLIST.md) - Step-by-step Coolify setup - Supabase configuration - Environment variable setup - Domain & SSL configuration - Monitoring setup - Troubleshooting guide - Rollback procedures - Security checklist - Backup strategy - Staging environment setup Documentation covers: - Git-based deployment - Continuous deployment via webhooks - Health checks and monitoring - Performance optimization - Cost estimates - Post-deployment verification - Common issues and solutions Ready for production deployment to Coolify. Closes #39
7.3 KiB
Coolify Deployment Guide
Prerequisites
- Coolify instance running (self-hosted or cloud)
- Gitea repository accessible to Coolify
- Supabase project (cloud or self-hosted)
- Domain name (optional, for production)
Deployment Steps
1. Prepare Supabase
Option A: Supabase Cloud
- Sign in to supabase.com
- Create new project (or use existing)
- Run migrations:
- Go to SQL Editor
- Copy/paste each file from
supabase/migrations/ - Run in order: 001_, 002_, 003_, etc.
- Get credentials:
- Project Settings → API
- Copy Project URL
- Copy
anon/publickey
Option B: Self-Hosted Supabase
cd supabase
docker-compose up -d
# Wait for services to start
docker-compose ps
Migrations run automatically from supabase/migrations/ directory.
2. Add Resource in Coolify
- Log in to Coolify
- Click "New Resource"
- Select "Docker Compose"
- Choose deployment source:
- Git Repository (recommended)
- Public Git Repository
- Docker Image
3. Configure Git Repository
If using Git source:
-
Repository URL:
https://gitea.jeanlucmakiola.de/pantry-app/pantry.git -
Branch:
main(ordevelopfor staging) -
Docker Compose File:
docker-compose.prod.yml -
Build Path: Leave empty (uses root)
4. Set Environment Variables
In Coolify → Environment Variables, add:
# Required
NUXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NUXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here
# Optional
NODE_ENV=production
HOST=0.0.0.0
PORT=3000
Security Note: Never commit .env files with real credentials!
5. Configure Domain (Optional)
- In Coolify → Domains
- Add your domain:
pantry.yourdomain.com - Coolify auto-provisions SSL with Let's Encrypt
- DNS: Point A record to Coolify server IP
6. Deploy
- Click "Deploy" button
- Watch build logs
- Wait for "Deployed successfully" message
Expected deploy time: 2-5 minutes
7. Verify Deployment
Health Check
curl https://pantry.yourdomain.com/api/health
Expected response:
{
"status": "ok",
"timestamp": "2026-02-25T00:00:00.000Z",
"uptime": 123.456
}
PWA Check
- Visit app in browser
- Open DevTools → Application → Manifest
- Verify manifest loads
- Check Service Worker is registered
Functionality Test
- Homepage loads
- Can sign up / sign in
- Can view inventory
- Can add item
- PWA install prompt appears
- Offline mode works
Troubleshooting
Build Fails
Check build logs in Coolify:
Common issues:
- Missing dependencies → Check package.json
- npm/node version mismatch → Use Node 20 Alpine
- Out of memory → Increase Coolify resource limits
Container Won't Start
Check runtime logs in Coolify:
Common issues:
- Missing environment variables
- Port conflict (use 3000)
- Supabase connection timeout
Supabase Connection Error
- Verify Supabase URL is correct (no trailing slash)
- Check anon key is valid
- Test Supabase API directly:
curl https://your-project.supabase.co/rest/v1/ - Check Supabase RLS policies allow access
SSL Certificate Issues
Coolify should auto-provision Let's Encrypt cert:
- Ensure domain points to correct IP
- Check DNS propagation (can take 48h)
- Verify port 80/443 open on firewall
App Loads but No Data
- Check browser console for errors
- Verify Supabase connection in Network tab
- Check RLS policies in Supabase
- Verify migrations ran successfully
Continuous Deployment
Auto-Deploy on Push
- In Coolify → Settings → Webhooks
- Copy webhook URL
- In Gitea → Repo → Settings → Webhooks
- Add webhook:
- URL: [Coolify webhook URL]
- Events: Push events
- Branch: main (or develop)
Now every git push triggers auto-deployment!
Manual Deploy
In Coolify interface:
- Click "Deploy Latest" button
- Or use Coolify API:
curl -X POST https://coolify.example.com/api/deploy/[resource-id] \ -H "Authorization: Bearer [your-token]"
Monitoring
View Logs
Coolify Dashboard → Logs tab
Real-time logs:
# If SSH access to Coolify host
docker logs -f [container-name]
Resource Usage
Coolify shows:
- CPU usage
- Memory usage
- Network traffic
- Storage
Uptime Monitoring
Recommended external services:
- UptimeRobot (free tier)
- BetterStack
- Freshping
Monitor: https://pantry.yourdomain.com/api/health
Rollback
To Previous Version
- In Coolify → Deployments
- Click on previous successful deployment
- Click "Redeploy"
Using Git Tags
# Tag current release
git tag -a v0.1.0 -m "MVP Release"
git push origin v0.1.0
# Rollback by changing branch in Coolify
# Or deploy specific tag
Performance Optimization
Resource Limits
In docker-compose.prod.yml:
deploy:
resources:
limits:
memory: 512M
cpus: '1.0'
Adjust based on traffic.
CDN (Recommended)
- Add domain to Cloudflare
- Set DNS proxy (orange cloud)
- Enable caching rules
- Set SSL to "Full (strict)"
Result: ~50% faster load times globally
Database Connection Pooling
If self-hosting Supabase:
- Use PgBouncer (included in Supabase)
- Set max connections: 20-50
Security Checklist
Before going live:
- HTTPS enabled (automatic with Coolify)
- Environment variables set (not in repo)
- Supabase RLS policies enabled
- Strong database passwords
- Firewall configured (only 80/443 open)
- Supabase auth configured
- Regular backups enabled
- Monitoring alerts set up
Backup Strategy
Database Backups
Supabase Cloud: Automatic daily backups
Self-hosted:
# Manual backup
docker exec supabase-db pg_dump -U postgres > backup.sql
# Automated (cron)
0 2 * * * /path/to/backup-script.sh
Volume Backups
Coolify persistent volumes:
docker run --rm \
-v coolify_pantry_data:/data \
-v $(pwd):/backup \
ubuntu tar czf /backup/pantry-backup.tar.gz /data
Staging Environment
Recommended setup:
Production:
- Branch:
main - Domain:
pantry.yourdomain.com - Supabase: Production project
Staging:
- Branch:
develop - Domain:
staging.pantry.yourdomain.com - Supabase: Separate test project
In Coolify, create two resources pointing to different branches.
Cost Estimate
Coolify (self-hosted):
- VPS: $5-10/month (Hetzner, Digital Ocean)
- Domain: $10-15/year
- Total: ~$8/month
Supabase Cloud:
- Free tier: 500MB database, 1GB file storage
- Pro tier: $25/month (more resources)
Total Cost: $8-33/month for full stack
Support
Coolify:
- Docs: https://coolify.io/docs
- Discord: https://discord.gg/coolify
Pantry:
- Issues: https://gitea.jeanlucmakiola.de/pantry-app/pantry/issues
- Discussions: TBD
Post-Deployment Checklist
After first deployment:
- Health check passes
- Can access homepage
- Can sign up / sign in
- Can add inventory item
- PWA installs correctly
- Offline mode works
- SSL certificate valid
- Monitoring alerts configured
- Backup strategy in place
- Team notified of URL
Next Steps
- Run E2E tests (see E2E_TESTING.md)
- Monitor for 24-48 hours
- Announce to users
- Set up analytics (optional)
- Plan first iteration
Congratulations! Your app is live! 🎉