9.3 KiB
9.3 KiB
PostgreSQL Ubuntu Server Deployment Guide
Overview
This guide will help you deploy the Church Song Lyric application to your Ubuntu server at 192.168.10.130 using PostgreSQL database on port 5100.
Prerequisites
- Ubuntu Server 20.04+ at 192.168.10.130 with sudo access
- SSH access configured
- Minimum 2GB RAM, 2 CPU cores, 20GB disk space
Step 1: Connect to Ubuntu Server
From your Windows machine:
ssh username@192.168.10.130
Step 2: Install PostgreSQL
# Update system
sudo apt update && sudo apt upgrade -y
# Install PostgreSQL
sudo apt install postgresql postgresql-contrib -y
# Start and enable PostgreSQL
sudo systemctl start postgresql
sudo systemctl enable postgresql
# Check status
sudo systemctl status postgresql
Step 3: Create PostgreSQL Database and User
# Switch to postgres user
sudo -u postgres psql
# In PostgreSQL prompt, run these commands:
CREATE DATABASE church_songlyric;
CREATE USER songlyric_user WITH ENCRYPTED PASSWORD 'your_secure_password_here';
GRANT ALL PRIVILEGES ON DATABASE church_songlyric TO songlyric_user;
# For PostgreSQL 15+, also grant schema privileges:
\c church_songlyric
GRANT ALL ON SCHEMA public TO songlyric_user;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO songlyric_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO songlyric_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO songlyric_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO songlyric_user;
# Exit psql
\q
Step 4: Configure PostgreSQL for Network Access
# Edit PostgreSQL configuration
sudo nano /etc/postgresql/*/main/postgresql.conf
# Find and uncomment/modify this line:
listen_addresses = '*'
# Save and exit (Ctrl+X, Y, Enter)
# Edit pg_hba.conf to allow connections
sudo nano /etc/postgresql/*/main/pg_hba.conf
# Add this line at the end:
host church_songlyric songlyric_user 192.168.10.0/24 md5
# Save and exit
# Restart PostgreSQL
sudo systemctl restart postgresql
Step 5: Transfer Project Files
From your Windows machine (PowerShell):
# Transfer entire project
scp -r "E:\Documents\Website Projects\Church_SongLyric" username@192.168.10.130:/tmp/
# Or use WinSCP/FileZilla
Step 6: Setup Project on Ubuntu
SSH to the server and run:
# Move project to installation directory
sudo mkdir -p /var/www
sudo mv /tmp/Church_SongLyric /var/www/church-songlyric
cd /var/www/church-songlyric
# Set ownership
sudo chown -R $USER:www-data .
sudo chmod -R 755 .
# Make scripts executable
chmod +x *.sh
Step 7: Install System Dependencies
sudo apt install -y \
python3 \
python3-pip \
python3-venv \
python3-dev \
libpq-dev \
nodejs \
npm \
nginx \
git \
curl \
ufw \
tesseract-ocr \
poppler-utils \
libtesseract-dev \
libleptonica-dev
Step 8: Setup Backend
cd /var/www/church-songlyric/backend
# Create virtual environment
python3 -m venv venv
# Activate virtual environment
source venv/bin/activate
# Upgrade pip
pip install --upgrade pip
# Install Python dependencies
pip install -r requirements.txt
# Create .env file
nano .env
Add this to .env:
# PostgreSQL connection
POSTGRESQL_URI=postgresql://songlyric_user:your_secure_password_here@192.168.10.130:5432/church_songlyric
# Flask configuration
FLASK_PORT=5100
FLASK_ENV=production
SECRET_KEY=change-this-to-a-random-secret-key-min-32-chars
# Allowed origins
ALLOWED_ORIGINS=http://192.168.10.130,http://192.168.10.178:3000
# Optional API tokens
GENIUS_TOKEN=your_genius_token_if_needed
Save and exit (Ctrl+X, Y, Enter)
Step 9: Migrate Data to PostgreSQL
# Still in backend folder with venv activated
cd /var/www/church-songlyric/backend
source venv/bin/activate
# Run migration script
python migrate_to_postgresql.py
# This will migrate data from data.json to PostgreSQL
Step 10: Test Backend
# Test the backend
python app.py
# Should show:
# * Running on http://0.0.0.0:5100
# Open another terminal and test:
curl http://192.168.10.130:5100/api/health
# Should return: {"status":"ok","ts":"..."}
# Stop the test server (Ctrl+C)
Step 11: Setup Frontend
cd /var/www/church-songlyric/frontend
# Install dependencies
npm install
# Update .env.production
nano .env.production
Add:
REACT_APP_API_URL=http://192.168.10.130/api
GENERATE_SOURCEMAP=false
Save and build:
npm run build
Step 12: Create Systemd Service
sudo nano /etc/systemd/system/church-songlyric-backend.service
Paste:
[Unit]
Description=Church Song Lyric Backend (Flask)
After=network.target postgresql.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/church-songlyric/backend
Environment="PATH=/var/www/church-songlyric/backend/venv/bin"
ExecStart=/var/www/church-songlyric/backend/venv/bin/python app.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Save and enable:
sudo systemctl daemon-reload
sudo systemctl enable church-songlyric-backend
sudo systemctl start church-songlyric-backend
sudo systemctl status church-songlyric-backend
Step 13: Configure Nginx
sudo nano /etc/nginx/sites-available/church-songlyric
Paste:
server {
listen 80;
server_name 192.168.10.130;
# Serve React frontend
root /var/www/church-songlyric/frontend/build;
index index.html;
# Frontend routing
location / {
try_files $uri $uri/ /index.html;
}
# Proxy API requests to Flask backend
location /api {
proxy_pass http://localhost:5100;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Increase timeouts
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
# Static file caching
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
client_max_body_size 50M;
}
Enable and restart:
sudo ln -sf /etc/nginx/sites-available/church-songlyric /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl restart nginx
Step 14: Configure Firewall
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw allow 5432/tcp # PostgreSQL
sudo ufw enable
sudo ufw status
Step 15: Verify Deployment
Check services
sudo systemctl status church-songlyric-backend
sudo systemctl status nginx
sudo systemctl status postgresql
Test API
curl http://192.168.10.130/api/health
Access from browser
Open: http://192.168.10.130
Troubleshooting
Backend won't start
sudo journalctl -u church-songlyric-backend -n 50 --no-pager
PostgreSQL connection issues
# Test connection
psql -h 192.168.10.130 -U songlyric_user -d church_songlyric
# Check if PostgreSQL is listening
sudo netstat -tulpn | grep 5432
Port conflicts
# Check if port 5100 is in use
sudo netstat -tulpn | grep 5100
Permission errors
sudo chown -R www-data:www-data /var/www/church-songlyric
Management Commands
# Service management
sudo systemctl start church-songlyric-backend
sudo systemctl stop church-songlyric-backend
sudo systemctl restart church-songlyric-backend
sudo systemctl status church-songlyric-backend
# View logs
sudo journalctl -u church-songlyric-backend -f
# PostgreSQL management
sudo -u postgres psql
\c church_songlyric
\dt # List tables
SELECT * FROM songs LIMIT 5;
Backup PostgreSQL Database
# Backup
pg_dump -h 192.168.10.130 -U songlyric_user -d church_songlyric > backup.sql
# Restore
psql -h 192.168.10.130 -U songlyric_user -d church_songlyric < backup.sql
Update Application
# Transfer new files via SCP
# Then on server:
cd /var/www/church-songlyric
# Update backend
cd backend
source venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart church-songlyric-backend
# Update frontend
cd ../frontend
npm install
npm run build
sudo systemctl reload nginx
Success! 🎉
Your Church Song Lyric application is now running on:
- URL: http://192.168.10.130
- API: http://192.168.10.130/api
- Port: 5100 (backend)
- Database: PostgreSQL on 192.168.10.130:5432