# Coolify Terminal Deployment Guide ## ๐Ÿ–ฅ๏ธ What Happens When You Start from Coolify Terminal? When you deploy Spark Platform via Coolify and access the terminal, you're inside the **application container** (frontend or directus), NOT the host server. --- ## ๐Ÿ“ Understanding Coolify's Container Architecture ### What Coolify Creates: ``` Host Server (72.61.15.216) โ”œโ”€โ”€ postgresql-xxxxx (PostgreSQL container) โ”œโ”€โ”€ redis-xxxxx (Redis container) โ”œโ”€โ”€ directus-xxxxx (Directus container) โ””โ”€โ”€ frontend-xxxxx (Frontend container) ``` ### When You Open "Terminal" in Coolify: - You're inside ONE specific container (e.g., `frontend-xxxxx`) - You can't directly access other containers - You need to use `docker exec` to access PostgreSQL --- ## ๐Ÿš€ Setup from Coolify Terminal ### Option 1: From Directus Container Terminal **Steps:** 1. Go to Coolify dashboard 2. Click on your Spark project 3. Click on "Directus" service 4. Click "Terminal" button 5. Run these commands: ```bash # You're now inside the Directus container # 1. Install PostgreSQL client (if not already installed) apt-get update && apt-get install -y postgresql-client # 2. Download the schema file from your repo curl -o /tmp/complete_schema.sql https://raw.githubusercontent.com/YOUR_USERNAME/spark/main/complete_schema.sql # OR if you have it locally, use Coolify's file upload feature # 3. Find PostgreSQL container name PGHOST=$(echo $DB_HOST) # Should be 'postgresql' # 4. Execute SQL psql -h $PGHOST -U postgres -d directus -f /tmp/complete_schema.sql # 5. Restart Directus (from host, see below) ``` ### Option 2: From Host Server Terminal (Recommended) **This is easier because you have full access to all containers:** 1. SSH into the host server: ```bash ssh root@72.61.15.216 ``` 2. Run the setup: ```bash # Find PostgreSQL container PG_CONTAINER=$(docker ps --filter 'name=postgresql' --format '{{.Names}}' | head -1) # Copy SQL file (if you have it on the server) docker cp /path/to/complete_schema.sql $PG_CONTAINER:/tmp/ # Execute SQL docker exec $PG_CONTAINER psql -U postgres -d directus -f /tmp/complete_schema.sql # Restart Directus DIRECTUS_CONTAINER=$(docker ps --filter 'name=directus' --format '{{.Names}}' | head -1) docker restart $DIRECTUS_CONTAINER ``` --- ## ๐ŸŽฏ Best Approach: Use Coolify's Built-in Features ### Method 1: Add Init Script to Docker Compose **Update `docker-compose.yaml` to include init script:** ```yaml services: postgresql: image: postgis/postgis:17-3.5 volumes: - postgres-data:/var/lib/postgresql/data - ./complete_schema.sql:/docker-entrypoint-initdb.d/01-schema.sql # Auto-run on first start environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: Idk@2026lolhappyha232 POSTGRES_DB: directus ``` **How it works:** - PostgreSQL automatically runs any `.sql` files in `/docker-entrypoint-initdb.d/` - **Only runs on FIRST start** (when database is empty) - No manual steps needed! **Limitation:** - Only works for brand new deployments - Won't run if database already exists --- ### Method 2: Add a Setup Service **Add this to `docker-compose.yaml`:** ```yaml services: # ... existing services ... db-setup: image: postgres:17 depends_on: postgresql: condition: service_healthy volumes: - ./complete_schema.sql:/schema.sql environment: PGHOST: postgresql PGUSER: postgres PGPASSWORD: Idk@2026lolhappyha232 PGDATABASE: directus command: > sh -c " echo 'Waiting for PostgreSQL...'; sleep 10; echo 'Checking if tables exist...'; TABLE_COUNT=$$(psql -t -c \"SELECT COUNT(*) FROM pg_tables WHERE schemaname='public' AND tablename NOT LIKE 'directus_%'\"); if [ $$TABLE_COUNT -lt 10 ]; then echo 'Creating tables...'; psql -f /schema.sql; echo 'Tables created!'; else echo 'Tables already exist, skipping...'; fi " restart: "no" # Only run once ``` **How it works:** - Runs automatically after PostgreSQL starts - Checks if tables exist - Creates them if missing - Doesn't run again after first success --- ## ๐Ÿ“‹ Step-by-Step: Fresh Deployment with Auto-Setup ### 1. Update docker-compose.yaml Add the `db-setup` service (see above) ### 2. Commit and Push ```bash git add docker-compose.yaml complete_schema.sql git commit -m "feat: add automatic database setup on deployment" git push ``` ### 3. Deploy via Coolify - Coolify detects new commit - Pulls latest code - Starts all services - `db-setup` runs automatically - Creates all tables - Restarts Directus ### 4. Done! โœ… No manual steps needed! --- ## ๐Ÿ” What Happens in Each Scenario ### Scenario 1: Brand New Deployment (Empty Database) **With init script:** ``` 1. PostgreSQL starts 2. Sees /docker-entrypoint-initdb.d/01-schema.sql 3. Runs SQL automatically 4. Creates all 39 tables 5. Directus starts 6. Recognizes tables 7. โœ… Everything works! ``` **Without init script:** ``` 1. PostgreSQL starts (empty) 2. Directus starts 3. Creates only directus_* system tables 4. โŒ No custom tables 5. Need to run setup_database.sh manually ``` ### Scenario 2: Existing Deployment (Database Has Data) **With db-setup service:** ``` 1. PostgreSQL starts (has data) 2. db-setup checks table count 3. Sees tables exist 4. Skips SQL execution 5. โœ… No duplicate tables ``` **With init script:** ``` 1. PostgreSQL starts (has data) 2. Init script doesn't run (only runs on empty DB) 3. โœ… Existing data preserved ``` --- ## ๐ŸŽฏ Recommended Setup for Production ### Use BOTH methods: ```yaml services: postgresql: image: postgis/postgis:17-3.5 volumes: - postgres-data:/var/lib/postgresql/data - ./complete_schema.sql:/docker-entrypoint-initdb.d/01-schema.sql # For new deployments # ... rest of config ... db-setup: image: postgres:17 depends_on: postgresql: condition: service_healthy volumes: - ./complete_schema.sql:/schema.sql environment: PGHOST: postgresql PGUSER: postgres PGPASSWORD: Idk@2026lolhappyha232 PGDATABASE: directus command: > sh -c " sleep 10; TABLE_COUNT=$$(psql -t -c \"SELECT COUNT(*) FROM pg_tables WHERE schemaname='public' AND tablename NOT LIKE 'directus_%' AND tablename NOT LIKE 'spatial_%'\" | tr -d ' '); if [ \"$$TABLE_COUNT\" -lt \"10\" ]; then echo '๐Ÿš€ Creating database tables...'; psql -f /schema.sql; echo 'โœ… Tables created successfully!'; else echo 'โœ… Tables already exist ($$TABLE_COUNT tables found)'; fi " restart: "no" ``` **Why both?** - Init script: Handles brand new deployments - db-setup: Handles edge cases and provides logging --- ## ๐Ÿงช Testing from Coolify Terminal ### To verify setup worked: 1. Open Coolify terminal (Directus service) 2. Run: ```bash # Check environment variables env | grep DB_ # Test database connection apt-get update && apt-get install -y postgresql-client psql -h $DB_HOST -U $DB_USER -d $DB_DATABASE -c " SELECT COUNT(*) as table_count FROM pg_tables WHERE schemaname = 'public' AND tablename NOT LIKE 'directus_%'; " # Should show: 39 ``` --- ## ๐Ÿ“Š Comparison: Manual vs Automated | Method | Steps | Time | Reliability | |--------|-------|------|-------------| | **Manual (setup_database.sh)** | 1 command | 2-3 min | โœ… Works always | | **Init Script** | 0 (automatic) | 0 min | โœ… New deployments only | | **db-setup Service** | 0 (automatic) | 0 min | โœ… Works always | | **Coolify Terminal** | Multiple commands | 5-10 min | โš ๏ธ Manual, error-prone | **Recommendation:** Use **db-setup service** for best results --- ## ๐Ÿš€ Quick Answer to Your Question **"What happens if you start from Coolify terminal?"** ### Current Setup (Without Automation): 1. Open Coolify terminal 2. You're inside a container (limited access) 3. Need to manually run SQL commands 4. More complex than using setup_database.sh ### With Automated Setup (Recommended): 1. Deploy via Coolify 2. db-setup service runs automatically 3. Tables created automatically 4. โœ… No terminal needed! --- ## ๐Ÿ“ Implementation Checklist To enable automatic setup: - [ ] Add `db-setup` service to docker-compose.yaml - [ ] Ensure `complete_schema.sql` is in repo root - [ ] Commit and push changes - [ ] Redeploy via Coolify - [ ] Verify tables created (check Directus admin) - [ ] Test admin pages work --- **Created:** December 14, 2025 **Recommendation:** Add db-setup service for zero-manual-step deployments