- 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
420 lines
8.2 KiB
Markdown
420 lines
8.2 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
# 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.
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
ssh chaulmark@10.4.0.205
|
|
```
|
|
|
|
### 4. Clone/Pull Repository
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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`
|
|
|
|
```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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# Reload Caddy configuration
|
|
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
|
|
```
|
|
|
|
---
|
|
|
|
## Database Configuration
|
|
|
|
### Option 1: Use Existing v1.0 PostgreSQL
|
|
|
|
Update `.env`:
|
|
```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:
|
|
```env
|
|
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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# Check PostgreSQL container
|
|
docker compose ps postgres
|
|
|
|
# Test connection
|
|
docker compose exec app php artisan tinker
|
|
>>> DB::connection()->getPdo();
|
|
```
|
|
|
|
### Permission Errors
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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*
|