mad-lawsuit/DEPLOYMENT.md
TheMaddax b7125cf2b7 Phase 4: Production deployment configuration
- Add Docker configuration (Dockerfile, docker-compose.yml)
- Add Nginx and Supervisor configuration
- Add deployment documentation (DEPLOYMENT.md)
- Complete Phase 3 data migration (63 entries, 63 docs, 28 subs)
- Add responsive PDF viewer component
- Fix date format to American (MM/DD/YYYY)
- Update typography to match v1.0
- Add admin dashboard with full CRUD operations
- Configure PostgreSQL with secure password
- Connect to caddy_network for reverse proxy
- Ready for production deployment
2025-12-17 19:12:32 -07:00

8.2 KiB

MAD Lawsuit v2.0 - Production Deployment Guide

Overview

This guide covers deploying the Laravel + Vue + Inertia application to production using Docker.

Production URL: https://v2.mad-lawsuit.org
Server: 10.4.0.205 (public-websites)
Directory: ~/websites/v2.mad-lawsuit.org/


Prerequisites

On Local Machine

  • Git repository with all changes committed
  • .env.production file ready (NOT in Git)
  • All PDF files in storage/app/public/documents/

On Production Server

  • Docker and Docker Compose installed
  • PostgreSQL container running (or use existing v1.0 database)
  • Caddy reverse proxy configured
  • SSH access: ssh chaulmark@10.4.0.205

Deployment Steps

1. Prepare Local Repository

# Ensure all changes are committed
cd /Users/chaulmark/Eliza-MAD-docket-website
git status

# Commit any pending changes
git add .
git commit -m "Phase 4: Production deployment configuration"

# Tag the release
git tag -a v2.0 -m "MAD Lawsuit v2.0 - Laravel + Vue + Inertia"

# Push to Gitea
git push origin main
git push origin v2.0

2. Transfer Sensitive Files via SCP

IMPORTANT: .env.production is NOT in Git for security.

# Copy .env.production to server
scp .env.production chaulmark@10.4.0.205:~/websites/v2.mad-lawsuit.org/.env

# Copy PDF files (if not already on server)
scp -r storage/app/public/documents/*.pdf chaulmark@10.4.0.205:~/websites/v2.mad-lawsuit.org/storage/app/public/documents/

3. SSH to Production Server

ssh chaulmark@10.4.0.205

4. Clone/Pull Repository

# If first deployment
cd ~/websites
git clone https://gitea.sigd.net/chaulmark/mad-lawsuit.git v2.mad-lawsuit.org
cd v2.mad-lawsuit.org
git checkout v2.0

# If updating existing deployment
cd ~/websites/v2.mad-lawsuit.org
git fetch --all
git checkout v2.0
git pull origin v2.0

5. Configure Environment

# Verify .env file exists (transferred via SCP)
ls -la .env

# Generate application key
docker compose run --rm app php artisan key:generate

# Update .env with generated key
nano .env
# Copy the APP_KEY value from output above

6. Build and Start Docker Containers

# Build the Docker image
docker compose build

# Start containers
docker compose up -d

# Check container status
docker compose ps
docker compose logs -f app

7. Run Database Migrations

# Run migrations
docker compose exec app php artisan migrate --force

# Seed admin user
docker compose exec app php artisan db:seed --class=AdminSeeder

# Import v1.0 data
docker compose exec app php artisan db:seed --class=V1DataMigrationSeeder

# Create storage symlink
docker compose exec app php artisan storage:link

8. Verify Application

# Check if app is running
curl http://localhost:8080

# Check database connection
docker compose exec app php artisan tinker
>>> DB::connection()->getPdo();
>>> \App\Models\DocketEntry::count();
>>> exit

Caddy Configuration

Add to Caddyfile

File: /home/chaulmark/docker/caddy/config/Caddyfile

# MAD Lawsuit v2.0
v2.mad-lawsuit.org {
    reverse_proxy 172.18.0.X:8080
    
    encode gzip
    
    log {
        output file /var/log/caddy/v2-mad-lawsuit.log
    }
}

Note: Replace 172.18.0.X with the actual container IP on the caddy_network.

Find Container IP

# Get container IP
docker inspect mad-lawsuit-v2 | grep IPAddress

# Or use docker network inspect
docker network inspect caddy_network | grep -A 5 mad-lawsuit-v2

Reload Caddy

# Reload Caddy configuration
docker exec caddy caddy reload --config /etc/caddy/Caddyfile

Database Configuration

Option 1: Use Existing v1.0 PostgreSQL

Update .env:

DB_CONNECTION=pgsql
DB_HOST=mad-lawsuit-db  # v1.0 container name
DB_PORT=5432
DB_DATABASE=docket_db
DB_USERNAME=docket_user
DB_PASSWORD=<v1.0_password>

Option 2: Use New PostgreSQL Container

The docker-compose.yml includes a PostgreSQL container:

DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=mad_lawsuit_v2
DB_USERNAME=mad_user
DB_PASSWORD=<secure_password>

Post-Deployment Verification

1. Test Public Website

# From local machine
curl https://v2.mad-lawsuit.org

Or visit in browser: https://v2.mad-lawsuit.org

Check:

  • Home page loads
  • Docket entries display
  • PDF downloads work
  • Email subscription form works

2. Test Admin Dashboard

Visit: https://v2.mad-lawsuit.org/admin/login

Credentials:

  • Username: admin
  • Password: password (change after first login)

Check:

  • Login works
  • Dashboard shows correct statistics
  • Can view docket entries
  • Can create new entry
  • Can upload PDF
  • Can view subscribers

3. Check Logs

# Application logs
docker compose logs -f app

# Nginx logs
docker compose exec app tail -f /var/log/nginx/access.log
docker compose exec app tail -f /var/log/nginx/error.log

# Caddy logs
docker exec caddy tail -f /var/log/caddy/v2-mad-lawsuit.log

Troubleshooting

Container Won't Start

# Check logs
docker compose logs app

# Check if port 8080 is available
netstat -tuln | grep 8080

# Rebuild container
docker compose down
docker compose build --no-cache
docker compose up -d

Database Connection Failed

# Check PostgreSQL container
docker compose ps postgres

# Test connection
docker compose exec app php artisan tinker
>>> DB::connection()->getPdo();

Permission Errors

# Fix storage permissions
docker compose exec app chown -R www-data:www-data /var/www/html/storage
docker compose exec app chmod -R 775 /var/www/html/storage

PDF Files Not Found

# Check if files exist
docker compose exec app ls -la /var/www/html/storage/app/public/documents/

# Recreate storage symlink
docker compose exec app php artisan storage:link

Caddy Not Routing

# Check Caddy logs
docker exec caddy caddy validate --config /etc/caddy/Caddyfile

# Reload Caddy
docker exec caddy caddy reload --config /etc/caddy/Caddyfile

# Check container IP
docker inspect mad-lawsuit-v2 | grep IPAddress

Maintenance Commands

Update Application

# Pull latest code
cd ~/websites/v2.mad-lawsuit.org
git pull origin main

# Rebuild and restart
docker compose down
docker compose build
docker compose up -d

# Run migrations
docker compose exec app php artisan migrate --force

# Clear caches
docker compose exec app php artisan cache:clear
docker compose exec app php artisan config:clear
docker compose exec app php artisan view:clear

Backup Database

# Backup PostgreSQL
docker compose exec postgres pg_dump -U mad_user mad_lawsuit_v2 > backup-$(date +%Y%m%d).sql

# Or use v1.0 database
docker exec mad-lawsuit-db pg_dump -U docket_user docket_db > backup-$(date +%Y%m%d).sql

View Logs

# All logs
docker compose logs -f

# Specific service
docker compose logs -f app
docker compose logs -f postgres

# Last 100 lines
docker compose logs --tail=100 app

Restart Services

# Restart all
docker compose restart

# Restart specific service
docker compose restart app

Security Checklist

  • .env file has secure APP_KEY
  • Database password is strong and unique
  • Admin password changed from default
  • APP_DEBUG=false in production
  • SSL certificates active (via Caddy)
  • File permissions correct (775 for storage)
  • .env file NOT in Git repository
  • Firewall rules configured (if applicable)

Rollback Plan

If v2.0 has issues, v1.0 remains operational:

  1. Keep v1.0 running at https://mad-lawsuit.org
  2. Test v2.0 at https://v2.mad-lawsuit.org
  3. Switch DNS only after thorough testing
  4. Rollback: Simply revert Caddy configuration to point to v1.0

Next Steps After Deployment

  1. Test thoroughly on v2.mad-lawsuit.org
  2. Implement email notifications (Phase 4.2)
  3. Monitor logs for errors
  4. Update DNS to switch from v1.0 to v2.0
  5. Decommission v1.0 after 48 hours of stable v2.0

Support

Repository: https://gitea.sigd.net/chaulmark/mad-lawsuit
Server: 10.4.0.205 (public-websites)
Contact: chaulmark@sigd.net


Last Updated: December 17, 2025