- 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
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.productionfile 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
.envfile has secureAPP_KEY- Database password is strong and unique
- Admin password changed from default
APP_DEBUG=falsein production- SSL certificates active (via Caddy)
- File permissions correct (775 for storage)
.envfile NOT in Git repository- Firewall rules configured (if applicable)
Rollback Plan
If v2.0 has issues, v1.0 remains operational:
- Keep v1.0 running at https://mad-lawsuit.org
- Test v2.0 at https://v2.mad-lawsuit.org
- Switch DNS only after thorough testing
- Rollback: Simply revert Caddy configuration to point to v1.0
Next Steps After Deployment
- Test thoroughly on v2.mad-lawsuit.org
- Implement email notifications (Phase 4.2)
- Monitor logs for errors
- Update DNS to switch from v1.0 to v2.0
- 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