# Production Directory Structure Migration Plan ## Overview This document outlines the plan to migrate the ginxsom production deployment from the current configuration to a new, more organized directory structure. ## Current Configuration (As-Is) ``` Binary Location: /var/www/html/blossom/ginxsom.fcgi Database Location: /var/www/html/blossom/ginxsom.db Data Directory: /var/www/html/blossom/ Working Directory: /var/www/html/blossom/ (set via spawn-fcgi -d) Socket: /tmp/ginxsom-fcgi.sock ``` **Issues with Current Setup:** 1. Binary and database mixed with data files in web-accessible directory 2. Database path hardcoded as relative path `db/ginxsom.db` but database is at root of working directory 3. No separation between application files and user data 4. Security concern: application files in web root ## Target Configuration (To-Be) ``` Binary Location: /home/ubuntu/ginxsom/ginxsom.fcgi Database Location: /home/ubuntu/ginxsom/db/ginxsom.db Data Directory: /var/www/html/blossom/ Working Directory: /home/ubuntu/ginxsom/ (set via spawn-fcgi -d) Socket: /tmp/ginxsom-fcgi.sock ``` **Benefits of New Setup:** 1. Application files separated from user data 2. Database in proper subdirectory structure 3. Application files outside web root (better security) 4. Clear separation of concerns 5. Easier backup and maintenance ## Directory Structure ### Application Directory: `/home/ubuntu/ginxsom/` ``` /home/ubuntu/ginxsom/ ├── ginxsom.fcgi # FastCGI binary ├── db/ │ └── ginxsom.db # SQLite database ├── build/ # Build artifacts (from rsync) ├── src/ # Source code (from rsync) ├── include/ # Headers (from rsync) ├── config/ # Config files (from rsync) └── scripts/ # Utility scripts (from rsync) ``` ### Data Directory: `/var/www/html/blossom/` ``` /var/www/html/blossom/ ├── .jpg # User uploaded files ├── .png ├── .mp4 └── ... ``` ## Command-Line Arguments The ginxsom binary supports these arguments (from [`src/main.c`](src/main.c:1488-1509)): ```bash --db-path PATH # Database file path (default: db/ginxsom.db) --storage-dir DIR # Storage directory for files (default: .) --help, -h # Show help message ``` ## Migration Steps ### 1. Update deploy_lt.sh Configuration Update the configuration variables in [`deploy_lt.sh`](deploy_lt.sh:16-23): ```bash # Configuration REMOTE_HOST="laantungir.net" REMOTE_USER="ubuntu" REMOTE_DIR="/home/ubuntu/ginxsom" REMOTE_DB_PATH="/home/ubuntu/ginxsom/db/ginxsom.db" REMOTE_NGINX_CONFIG="/etc/nginx/conf.d/default.conf" REMOTE_BINARY_PATH="/home/ubuntu/ginxsom/ginxsom.fcgi" REMOTE_SOCKET="/tmp/ginxsom-fcgi.sock" REMOTE_DATA_DIR="/var/www/html/blossom" ``` ### 2. Update Binary Deployment Modify the binary copy section (lines 82-97) to use new path: ```bash # Copy binary to application directory (not web directory) print_status "Copying ginxsom binary to application directory..." ssh $REMOTE_USER@$REMOTE_HOST << EOF # Stop any running process first sudo pkill -f ginxsom-fcgi || true sleep 1 # Remove old binary if it exists rm -f $REMOTE_BINARY_PATH # Copy new binary cp $REMOTE_DIR/build/ginxsom-fcgi $REMOTE_BINARY_PATH chmod +x $REMOTE_BINARY_PATH chown ubuntu:ubuntu $REMOTE_BINARY_PATH echo "Binary copied successfully" EOF ``` ### 3. Create Database Directory Structure Add database setup before starting FastCGI: ```bash # Setup database directory print_status "Setting up database directory..." ssh $REMOTE_USER@$REMOTE_HOST << EOF # Create db directory if it doesn't exist mkdir -p $REMOTE_DIR/db # Copy database if it exists in old location if [ -f /var/www/html/blossom/ginxsom.db ]; then echo "Migrating database from old location..." cp /var/www/html/blossom/ginxsom.db $REMOTE_DB_PATH elif [ ! -f $REMOTE_DB_PATH ]; then echo "Initializing new database..." # Database will be created by application on first run fi # Set proper permissions chown -R ubuntu:ubuntu $REMOTE_DIR/db chmod 755 $REMOTE_DIR/db chmod 644 $REMOTE_DB_PATH 2>/dev/null || true echo "Database directory setup complete" EOF ``` ### 4. Update spawn-fcgi Command Modify the FastCGI startup (line 164) to include command-line arguments: ```bash # Start FastCGI process with explicit paths echo "Starting ginxsom FastCGI..." sudo spawn-fcgi \ -M 666 \ -u www-data \ -g www-data \ -s $REMOTE_SOCKET \ -U www-data \ -G www-data \ -d $REMOTE_DIR \ -- $REMOTE_BINARY_PATH \ --db-path "$REMOTE_DB_PATH" \ --storage-dir "$REMOTE_DATA_DIR" ``` **Key Changes:** - `-d $REMOTE_DIR`: Sets working directory to `/home/ubuntu/ginxsom/` - `--db-path "$REMOTE_DB_PATH"`: Explicit database path - `--storage-dir "$REMOTE_DATA_DIR"`: Explicit data directory ### 5. Verify Permissions Ensure proper permissions for all directories: ```bash # Application directory - owned by ubuntu sudo chown -R ubuntu:ubuntu /home/ubuntu/ginxsom sudo chmod 755 /home/ubuntu/ginxsom sudo chmod +x /home/ubuntu/ginxsom/ginxsom.fcgi # Database directory - readable by www-data sudo chmod 755 /home/ubuntu/ginxsom/db sudo chmod 644 /home/ubuntu/ginxsom/db/ginxsom.db # Data directory - writable by www-data sudo chown -R www-data:www-data /var/www/html/blossom sudo chmod 755 /var/www/html/blossom ``` ## Path Resolution Logic ### How Paths Work with spawn-fcgi -d Option When spawn-fcgi starts the FastCGI process: 1. **Working Directory**: Set to `/home/ubuntu/ginxsom/` via `-d` option 2. **Relative Paths**: Resolved from working directory 3. **Absolute Paths**: Used as-is ### Default Behavior (Without Arguments) From [`src/main.c`](src/main.c:30-31): ```c char g_db_path[MAX_PATH_LEN] = "db/ginxsom.db"; // Relative to working dir char g_storage_dir[MAX_PATH_LEN] = "."; // Current working dir ``` With working directory `/home/ubuntu/ginxsom/`: - Database: `/home/ubuntu/ginxsom/db/ginxsom.db` ✓ - Storage: `/home/ubuntu/ginxsom/` ✗ (wrong - we want `/var/www/html/blossom/`) ### With Command-Line Arguments ```bash --db-path "/home/ubuntu/ginxsom/db/ginxsom.db" --storage-dir "/var/www/html/blossom" ``` Result: - Database: `/home/ubuntu/ginxsom/db/ginxsom.db` ✓ - Storage: `/var/www/html/blossom/` ✓ ## Testing Plan ### 1. Pre-Migration Verification ```bash # Check current setup ssh ubuntu@laantungir.net " echo 'Current binary location:' ls -la /var/www/html/blossom/ginxsom.fcgi echo 'Current database location:' ls -la /var/www/html/blossom/ginxsom.db echo 'Current process:' ps aux | grep ginxsom-fcgi | grep -v grep " ``` ### 2. Post-Migration Verification ```bash # Check new setup ssh ubuntu@laantungir.net " echo 'New binary location:' ls -la /home/ubuntu/ginxsom/ginxsom.fcgi echo 'New database location:' ls -la /home/ubuntu/ginxsom/db/ginxsom.db echo 'Data directory:' ls -la /var/www/html/blossom/ | head -10 echo 'Process working directory:' sudo ls -la /proc/\$(pgrep -f ginxsom.fcgi)/cwd echo 'Process command line:' ps aux | grep ginxsom-fcgi | grep -v grep " ``` ### 3. Functional Testing ```bash # Test health endpoint curl -k https://blossom.laantungir.net/health # Test file upload ./tests/file_put_production.sh # Test file retrieval curl -k -I https://blossom.laantungir.net/ # Test list endpoint curl -k https://blossom.laantungir.net/list/ ``` ## Rollback Plan If migration fails: 1. **Stop new process:** ```bash sudo pkill -f ginxsom-fcgi ``` 2. **Restore old binary location:** ```bash sudo cp /home/ubuntu/ginxsom/build/ginxsom-fcgi /var/www/html/blossom/ginxsom.fcgi sudo chown www-data:www-data /var/www/html/blossom/ginxsom.fcgi ``` 3. **Restart with old configuration:** ```bash sudo spawn-fcgi -M 666 -u www-data -g www-data \ -s /tmp/ginxsom-fcgi.sock \ -U www-data -G www-data \ -d /var/www/html/blossom \ /var/www/html/blossom/ginxsom.fcgi ``` ## Additional Considerations ### 1. Database Backup Before migration, backup the current database: ```bash ssh ubuntu@laantungir.net " cp /var/www/html/blossom/ginxsom.db /var/www/html/blossom/ginxsom.db.backup " ``` ### 2. NIP-94 Origin Configuration After migration, update [`src/bud08.c`](src/bud08.c) to return production domain: ```c void nip94_get_origin(char *origin, size_t origin_size) { snprintf(origin, origin_size, "https://blossom.laantungir.net"); } ``` ### 3. Monitoring Monitor logs after migration: ```bash # Application logs ssh ubuntu@laantungir.net "sudo journalctl -u nginx -f" # FastCGI process ssh ubuntu@laantungir.net "ps aux | grep ginxsom-fcgi" ``` ## Success Criteria Migration is successful when: 1. ✓ Binary running from `/home/ubuntu/ginxsom/ginxsom.fcgi` 2. ✓ Database accessible at `/home/ubuntu/ginxsom/db/ginxsom.db` 3. ✓ Files stored in `/var/www/html/blossom/` 4. ✓ Health endpoint returns 200 OK 5. ✓ File upload works correctly 6. ✓ File retrieval works correctly 7. ✓ Database queries succeed 8. ✓ No permission errors in logs ## Timeline 1. **Preparation**: Update deploy_lt.sh script (15 minutes) 2. **Backup**: Backup current database (5 minutes) 3. **Migration**: Run updated deployment script (10 minutes) 4. **Testing**: Verify all endpoints (15 minutes) 5. **Monitoring**: Watch for issues (30 minutes) **Total Estimated Time**: ~75 minutes ## References - Current deployment script: [`deploy_lt.sh`](deploy_lt.sh) - Main application: [`src/main.c`](src/main.c) - Command-line parsing: [`src/main.c:1488-1509`](src/main.c:1488-1509) - Global configuration: [`src/main.c:30-31`](src/main.c:30-31) - Database operations: [`src/main.c:333-385`](src/main.c:333-385)