Files
task-manager/QUICK-START-DOCKER-COMPOSE.md
T
paul-nothaft 428c4d6a67
continuous-integration/drone/push Build is passing
Provide comprehensive deployment options for TaskFlow
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
2025-10-23 19:35:26 +00:00

301 lines
7.0 KiB
Markdown

# 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.