Provide comprehensive deployment options for TaskFlow
continuous-integration/drone/push Build is passing
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
This commit is contained in:
@@ -0,0 +1,300 @@
|
||||
# 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)
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# 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_data` volume
|
||||
- **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:
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```yaml
|
||||
# In docker-compose.yml, uncomment:
|
||||
services:
|
||||
postgres:
|
||||
ports:
|
||||
- "5432:5432" # Exposes PostgreSQL on host
|
||||
```
|
||||
|
||||
**Warning**: Only expose if needed and use strong passwords!
|
||||
|
||||
## Monitoring
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
1. **Use Strong Passwords**
|
||||
```bash
|
||||
POSTGRES_PASSWORD=$(openssl rand -base64 32)
|
||||
```
|
||||
|
||||
2. **Configure Backups**
|
||||
```bash
|
||||
# Add to cron
|
||||
0 2 * * * docker exec taskflow-db pg_dump -U taskflow taskflow | gzip > /backups/taskflow-$(date +\%Y\%m\%d).sql.gz
|
||||
```
|
||||
|
||||
3. **Monitor Resources**
|
||||
- Set memory limits in docker-compose.yml
|
||||
- Monitor disk usage for postgres_data volume
|
||||
|
||||
4. **Set Up Reverse Proxy** (nginx/Caddy)
|
||||
```nginx
|
||||
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
|
||||
|
||||
```bash
|
||||
# Check logs
|
||||
docker-compose logs
|
||||
|
||||
# Restart containers
|
||||
docker-compose restart
|
||||
|
||||
# Rebuild if needed
|
||||
docker-compose down
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
### Database Connection Issues
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
1. ✅ Deploy using docker-compose (see commands above)
|
||||
2. ✅ Verify application is running
|
||||
3. ✅ Set up backups
|
||||
4. ✅ Configure reverse proxy/SSL (if exposing to internet)
|
||||
5. ✅ 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.
|
||||
Reference in New Issue
Block a user