428c4d6a67
continuous-integration/drone/push Build is passing
Add a new deployment options document and update the quick start guide to address common PostgreSQL connection issues, offering three distinct deployment strategies: Docker Compose, external PostgreSQL server configuration, and managed PostgreSQL with SSL. This also includes a diagnostic script for external PostgreSQL. Replit-Commit-Author: Agent Replit-Commit-Session-Id: ceced2fc-aa46-458d-ba87-ddd4b7bb1518 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/659922a9-0087-461c-90dd-6d9a58b81d4d/ceced2fc-aa46-458d-ba87-ddd4b7bb1518/mgDhgbG
7.0 KiB
7.0 KiB
Quick Start: Deploy with Docker Compose PostgreSQL 🚀
The Fastest Solution
Instead of fighting with your external PostgreSQL configuration, use the included PostgreSQL container that's already configured in your docker-compose.yml.
This approach:
- ✅ Works out of the box (no pg_hba.conf configuration needed)
- ✅ Runs PostgreSQL alongside your TaskFlow app
- ✅ Handles all SSL/authentication automatically
- ✅ Production-ready with persistent storage
- ✅ Easy to backup and manage
How to Deploy
Option 1: Using Docker Compose (Recommended)
# 1. Clone your repository on your production server
git clone https://your-repo-url/taskflow.git
cd taskflow
# 2. Create .env file (optional - uses defaults if not created)
cat > .env << EOF
POSTGRES_USER=taskflow
POSTGRES_PASSWORD=$(openssl rand -base64 32)
POSTGRES_DB=taskflow
APP_PORT=5000
EOF
# 3. Start everything
docker-compose up -d
# 4. Check logs
docker-compose logs -f app
# Expected output:
# serving on port 5000
# Checking database schema...
# ✓ Database schema is up to date
# ✓ Created default labels
# ✓ Database initialized successfully
Option 2: Pull Pre-built Image
If you're using Drone CI to build images:
# 1. Create docker-compose.production.yml
cat > docker-compose.production.yml << 'EOF'
version: '3.8'
services:
postgres:
image: postgres:16-alpine
container_name: taskflow-db
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-taskflow}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-taskflow_password}
POSTGRES_DB: ${POSTGRES_DB:-taskflow}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- taskflow-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U taskflow"]
interval: 10s
timeout: 5s
retries: 5
app:
image: registry.local.nothaft.cloud/taskflow:latest
container_name: taskflow-app
restart: unless-stopped
environment:
NODE_ENV: production
DATABASE_URL: postgresql://${POSTGRES_USER:-taskflow}:${POSTGRES_PASSWORD:-taskflow_password}@postgres:5432/${POSTGRES_DB:-taskflow}
PORT: 5000
ports:
- "5000:5000"
depends_on:
postgres:
condition: service_healthy
networks:
- taskflow-network
volumes:
postgres_data:
driver: local
networks:
taskflow-network:
driver: bridge
EOF
# 2. Pull and start
docker pull registry.local.nothaft.cloud/taskflow:latest
docker-compose -f docker-compose.production.yml up -d
# 3. Verify
docker-compose -f docker-compose.production.yml logs -f app
What This Gives You
1. Zero Configuration
- PostgreSQL is pre-configured for the TaskFlow app
- No pg_hba.conf editing required
- No SSL configuration needed
- Works immediately
2. Production Ready
- Persistent Data: PostgreSQL data stored in Docker volume
- Automatic Backups: Easy to backup the
postgres_datavolume - Health Checks: Both app and database monitored
- Auto-restart: Containers restart on failure or reboot
3. Isolated Network
- App and database on private Docker network
- PostgreSQL not exposed to internet by default
- Secure communication between containers
Data Persistence
Your PostgreSQL data is stored in a Docker volume:
# View volume
docker volume ls | grep postgres_data
# Backup database
docker exec taskflow-db pg_dump -U taskflow taskflow > backup.sql
# Backup volume
docker run --rm -v taskflow_postgres_data:/data -v $(pwd):/backup \
alpine tar czf /backup/postgres-backup.tar.gz /data
# Restore volume
docker run --rm -v taskflow_postgres_data:/data -v $(pwd):/backup \
alpine tar xzf /backup/postgres-backup.tar.gz -C /
Accessing the Database
# Connect to PostgreSQL from host
docker exec -it taskflow-db psql -U taskflow -d taskflow
# Or using psql on host (if installed)
psql "postgresql://taskflow:taskflow_password@localhost:5432/taskflow"
Exposing PostgreSQL (Optional)
If you need external access to PostgreSQL:
# In docker-compose.yml, uncomment:
services:
postgres:
ports:
- "5432:5432" # Exposes PostgreSQL on host
Warning: Only expose if needed and use strong passwords!
Monitoring
# View all logs
docker-compose logs -f
# View app logs only
docker-compose logs -f app
# View database logs only
docker-compose logs -f postgres
# Check container status
docker-compose ps
# Check resource usage
docker stats taskflow-app taskflow-db
Scaling Considerations
For Production Use:
-
Use Strong Passwords
POSTGRES_PASSWORD=$(openssl rand -base64 32) -
Configure Backups
# Add to cron 0 2 * * * docker exec taskflow-db pg_dump -U taskflow taskflow | gzip > /backups/taskflow-$(date +\%Y\%m\%d).sql.gz -
Monitor Resources
- Set memory limits in docker-compose.yml
- Monitor disk usage for postgres_data volume
-
Set Up Reverse Proxy (nginx/Caddy)
server { listen 80; server_name taskflow.yourdomain.com; location / { proxy_pass http://localhost:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
Troubleshooting
Container Won't Start
# Check logs
docker-compose logs
# Restart containers
docker-compose restart
# Rebuild if needed
docker-compose down
docker-compose up -d --build
Database Connection Issues
# Check PostgreSQL is running
docker-compose ps postgres
# Check PostgreSQL logs
docker-compose logs postgres
# Test connection
docker exec taskflow-app npx tsx -e "
import { Pool } from 'pg';
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
pool.query('SELECT NOW()').then(r => console.log('Connected:', r.rows[0])).catch(e => console.error('Error:', e.message));
"
Port Already in Use
# Change port in .env
echo "APP_PORT=8000" >> .env
# Restart
docker-compose up -d
Migrating from External PostgreSQL
If you were using an external PostgreSQL and want to migrate:
# 1. Backup external database
pg_dump -h external-host -U taskflow -d taskflow > external-backup.sql
# 2. Start docker-compose PostgreSQL
docker-compose up -d postgres
# 3. Restore to new database
cat external-backup.sql | docker exec -i taskflow-db psql -U taskflow -d taskflow
# 4. Start app
docker-compose up -d app
Why This Works
The included PostgreSQL container:
- Has no SSL requirements configured
- Has permissive pg_hba.conf (allows all local network connections)
- Runs on the same Docker network as your app
- Is pre-configured for the TaskFlow schema
Next Steps
- ✅ Deploy using docker-compose (see commands above)
- ✅ Verify application is running
- ✅ Set up backups
- ✅ Configure reverse proxy/SSL (if exposing to internet)
- ✅ Monitor and maintain
This is the recommended approach for getting your TaskFlow application running quickly in production. Once it's working, you can always migrate to an external PostgreSQL later if needed.