# Ubuntu Server Deployment Guide

## Overview

This guide walks you through deploying the House of Prayer Song Lyrics System on an Ubuntu server (20.04/22.04/24.04).

## Prerequisites

- Ubuntu Server 20.04+ with sudo access
- Domain name (optional, but recommended for HTTPS)
- MongoDB Atlas account (or local MongoDB installation)
- Minimum 2GB RAM, 2 CPU cores, 20GB disk space

## Architecture

- **Backend**: Flask (Python) API on port 5000
- **Frontend**: React app served via Nginx on port 80/443
- **Database**: MongoDB Atlas (cloud) or local MongoDB
- **Reverse Proxy**: Nginx for SSL/TLS and routing
- **Process Manager**: systemd services for automatic startup

---

## Step 1: Initial Server Setup

### 1.1 Update System

```bash
sudo apt update && sudo apt upgrade -y
```

### 1.2 Install Required System Packages

```bash
sudo apt install -y \
    python3 python3-pip python3-venv \
    nodejs npm \
    nginx \
    git \
    curl \
    ufw \
    tesseract-ocr \
    poppler-utils \
    libtesseract-dev \
    libleptonica-dev
```

### 1.3 Configure Firewall

```bash
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
```

---

## Step 2: Transfer Project Files

### 2.1 Copy Project to Server

From your Windows machine, use one of these methods:

**Option A: Using Git (Recommended)**

```bash
# On Ubuntu server
cd /var/www
sudo mkdir -p church-songlyric
sudo chown $USER:$USER church-songlyric
cd church-songlyric

# Clone your repository (if you have one)
git clone <your-repo-url> .

# OR upload via SCP from Windows PowerShell:
# scp -r "E:\Documents\Website Projects\Church_SongLyric\*" username@your-server-ip:/var/www/church-songlyric/
```

**Option B: Using SFTP/WinSCP**

1. Use WinSCP or FileZilla to transfer the entire project folder
2. Place it in `/var/www/church-songlyric/`

### 2.2 Set Proper Permissions

```bash
cd /var/www/church-songlyric
sudo chown -R $USER:www-data .
sudo chmod -R 755 .
```

---

## Step 3: Backend Setup

### 3.1 Create Python Virtual Environment

```bash
cd /var/www/church-songlyric/backend
python3 -m venv venv
source venv/bin/activate
```

### 3.2 Install Python Dependencies

```bash
pip install --upgrade pip
pip install -r requirements.txt
```

### 3.3 Configure Environment Variables

```bash
nano .env
```

Add the following (replace with your actual values):

```env
# MongoDB Connection (use your Atlas connection string)
MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/songlyric?retryWrites=true&w=majority

# Flask Configuration
FLASK_PORT=5000
FLASK_ENV=production
SECRET_KEY=your-super-secret-key-here-change-this

# API Tokens (optional)
GENIUS_TOKEN=your_genius_token_if_needed

# Server Configuration
ALLOWED_ORIGINS=http://your-domain.com,https://your-domain.com,http://your-server-ip
```

### 3.4 Test Backend

```bash
source venv/bin/activate
python app.py
# Should start on port 5000
# Press Ctrl+C to stop
```

---

## Step 4: Frontend Setup

### 4.1 Install Node Dependencies

```bash
cd /var/www/church-songlyric/frontend
npm install
```

### 4.2 Update API Configuration

Edit `src/api.js` to use your server's domain or IP:

```bash
nano src/api.js
```

Update the base URL:

```javascript
const API_BASE_URL = process.env.REACT_APP_API_URL || 'http://your-domain.com/api';
```

### 4.3 Create Production Environment File

```bash
nano .env.production
```

Add:

```env
REACT_APP_API_URL=http://your-domain.com/api
# Or for HTTPS:
# REACT_APP_API_URL=https://your-domain.com/api
```

### 4.4 Build Frontend

```bash
npm run build
# Creates optimized production build in ./build/
```

---

## Step 5: Configure Nginx

### 5.1 Create Nginx Configuration

```bash
sudo nano /etc/nginx/sites-available/church-songlyric
```

Paste the following configuration:

```nginx
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;  # Replace with your domain or server IP

    # Serve React frontend
    root /var/www/church-songlyric/frontend/build;
    index index.html;

    # Frontend routing - serve index.html for all routes
    location / {
        try_files $uri $uri/ /index.html;
    }

    # Proxy API requests to Flask backend
    location /api {
        proxy_pass http://localhost:5000;
        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;
    }

    # Static file caching
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}
```

### 5.2 Enable Site and Test Configuration

```bash
sudo ln -s /etc/nginx/sites-available/church-songlyric /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```

---

## Step 6: Create Systemd Services

### 6.1 Backend Service

```bash
sudo nano /etc/systemd/system/church-songlyric-backend.service
```

Paste:

```ini
[Unit]
Description=Church Song Lyric Backend (Flask)
After=network.target

[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

[Install]
WantedBy=multi-user.target
```

### 6.2 Enable and Start Services

```bash
sudo systemctl daemon-reload
sudo systemctl enable church-songlyric-backend
sudo systemctl start church-songlyric-backend
sudo systemctl status church-songlyric-backend
```

---

## Step 7: MongoDB Setup

### 7.1 MongoDB Atlas (Recommended)

1. Sign up at [MongoDB Atlas](https://www.mongodb.com/cloud/atlas/register)
2. Create a free M0 cluster
3. Add your server's IP address to the IP whitelist (or use 0.0.0.0/0 for all IPs)
4. Create a database user with read/write permissions
5. Get your connection string and add it to `/var/www/church-songlyric/backend/.env`

### 7.2 Migrate Data (if you have existing SQLite data)

```bash
cd /var/www/church-songlyric/backend
source venv/bin/activate

# Copy your app.db to the backend folder, then:
python migrate_to_mongodb.py
```

---

## Step 8: SSL/TLS Setup (Optional but Recommended)

### 8.1 Install Certbot

```bash
sudo apt install certbot python3-certbot-nginx -y
```

### 8.2 Obtain SSL Certificate

```bash
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
```

Follow the prompts. Certbot will automatically update your Nginx configuration.

### 8.3 Auto-Renewal

```bash
sudo systemctl status certbot.timer
# Should show active
```

---

## Step 9: Verify Deployment

### 9.1 Check Services

```bash
sudo systemctl status church-songlyric-backend
sudo systemctl status nginx
```

### 9.2 Test API

```bash
curl http://localhost:5000/api/health
# Should return: {"status":"healthy"}
```

### 9.3 Test Frontend

Open browser to: `http://your-domain.com` or `http://your-server-ip`

---

## Step 10: Monitoring and Maintenance

### 10.1 View Logs

```bash
# Backend logs
sudo journalctl -u church-songlyric-backend -f

# Nginx logs
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
```

### 10.2 Restart Services

```bash
sudo systemctl restart church-songlyric-backend
sudo systemctl restart nginx
```

### 10.3 Update Application

```bash
cd /var/www/church-songlyric

# Pull latest changes (if using git)
git pull

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

---

## Troubleshooting

### Backend Won't Start

```bash
# Check logs
sudo journalctl -u church-songlyric-backend -n 50

# Check if port 5000 is in use
sudo netstat -tulpn | grep 5000

# Test manually
cd /var/www/church-songlyric/backend
source venv/bin/activate
python app.py
```

### Frontend Shows Blank Page

```bash
# Check Nginx configuration
sudo nginx -t

# Verify build files exist
ls -la /var/www/church-songlyric/frontend/build/

# Check browser console for errors
```

### MongoDB Connection Issues

```bash
# Test connection from server
cd /var/www/church-songlyric/backend
source venv/bin/activate
python -c "from mongodb_models import get_db; db = get_db(); print('Connected:', db.name)"
```

### Permission Issues

```bash
# Fix ownership
sudo chown -R www-data:www-data /var/www/church-songlyric

# Fix permissions
sudo chmod -R 755 /var/www/church-songlyric
```

---

## Quick Reference Commands

```bash
# Start services
sudo systemctl start church-songlyric-backend
sudo systemctl start nginx

# Stop services
sudo systemctl stop church-songlyric-backend
sudo systemctl stop nginx

# Restart services
sudo systemctl restart church-songlyric-backend
sudo systemctl restart nginx

# View status
sudo systemctl status church-songlyric-backend
sudo systemctl status nginx

# View logs
sudo journalctl -u church-songlyric-backend -f
sudo tail -f /var/log/nginx/error.log

# Test configurations
sudo nginx -t
python -c "from mongodb_models import get_db; print('DB OK')"
```

---

## Security Best Practices

1. **Keep system updated**: `sudo apt update && sudo apt upgrade -y`
2. **Use strong passwords** for MongoDB and SSH
3. **Enable firewall**: Only allow necessary ports (22, 80, 443)
4. **Use SSH keys** instead of passwords
5. **Regular backups** of MongoDB data
6. **Monitor logs** for suspicious activity
7. **Keep dependencies updated**: `pip list --outdated`, `npm outdated`

---

## Support

- Check logs first: `sudo journalctl -u church-songlyric-backend -f`
- Verify MongoDB connection in `.env` file
- Ensure firewall allows traffic on ports 80/443
- Test API directly: `curl http://localhost:5000/api/health`

---

**Congratulations!** Your Church Song Lyric System is now running on Ubuntu Server! 🎉
