- Document production server requirements and prerequisites - Explain three deployment options (manual, automated script, Docker) - Provide clear step-by-step instructions for each method - Include testing checklists for both local and production - Add troubleshooting guide for common deployment issues - Document rollback procedures (git revert and backup restore) - Include automation options (webhook, CI/CD) - Add monitoring and health check recommendations - Document backup strategy and retention policy - Include security considerations for production - Provide quick reference for common commands This guide ensures reliable and safe production deployments. 💘 Generated with Crush Assisted-by: GLM-4.7 via Crush <crush@charm.land>
407 lines
8.7 KiB
Markdown
407 lines
8.7 KiB
Markdown
# Production Deployment Guide
|
|
|
|
This guide covers deploying the Starting Line Productions LLC website to production.
|
|
|
|
## Prerequisites
|
|
|
|
### Production Server Requirements
|
|
- SSH access to production server
|
|
- Docker installed (optional - can use direct PHP)
|
|
- Git installed
|
|
- Web server (nginx, Apache, etc.)
|
|
- PHP 8.1+ (if not using Docker)
|
|
|
|
### Access
|
|
- SSH credentials to production server
|
|
- Git repository access (git@knownelement.com:StartingLineProductions.com/STLPWebsite.git)
|
|
- Write access to Grav web root
|
|
|
|
## Deployment Options
|
|
|
|
### Option 1: Manual Git Pull (Recommended)
|
|
|
|
Use this option for simple, controlled deployments.
|
|
|
|
```bash
|
|
# SSH into production server
|
|
ssh user@your-production-server.com
|
|
|
|
# Navigate to Grav root
|
|
cd /var/www/grav
|
|
|
|
# Backup current installation (optional but recommended)
|
|
tar -czf backup_$(date +%Y%m%d).tar.gz user/
|
|
|
|
# Pull latest changes
|
|
git pull origin main
|
|
|
|
# Clear cache
|
|
rm -rf user/cache/* user/logs/*
|
|
|
|
# Set permissions
|
|
chown -R www-data:www-data user/
|
|
find user -type d -exec chmod 775 {} \;
|
|
find user -type f -exec chmod 664 {} \;
|
|
|
|
# Test in browser
|
|
```
|
|
|
|
### Option 2: Automated Script
|
|
|
|
Use the provided deployment script for automated deployment with backups.
|
|
|
|
```bash
|
|
# Copy script to production server
|
|
scp deploy-production.sh user@your-server.com:/tmp/
|
|
|
|
# SSH into production server
|
|
ssh user@your-production-server.com
|
|
|
|
# Make script executable
|
|
chmod +x /tmp/deploy-production.sh
|
|
|
|
# Run deployment
|
|
sudo /tmp/deploy-production.sh
|
|
```
|
|
|
|
**What the script does:**
|
|
1. Creates timestamped backup of current installation
|
|
2. Pulls latest changes from git repository
|
|
3. Sets correct permissions for Grav
|
|
4. Clears cache and logs
|
|
5. Updates plugins (if using GPM)
|
|
|
|
### Option 3: Docker Deployment
|
|
|
|
If production uses Docker for consistency with development:
|
|
|
|
```bash
|
|
# SSH into production server
|
|
ssh user@your-production-server.com
|
|
|
|
# Navigate to project directory
|
|
cd /var/www/STLPWebsite
|
|
|
|
# Pull latest code
|
|
git pull origin main
|
|
|
|
# Rebuild and restart containers
|
|
docker compose down
|
|
docker compose pull
|
|
docker compose up -d
|
|
|
|
# Clear cache
|
|
docker exec stlp-grav rm -rf /config/www/user/cache/*
|
|
```
|
|
|
|
## Development Workflow
|
|
|
|
### Local Development (Current Workflow)
|
|
|
|
1. **Make changes locally**
|
|
- Edit markdown files in `/config/www/user/pages/`
|
|
- Edit configuration in `/config/www/user/config/`
|
|
- Test changes in browser at http://localhost:5001
|
|
|
|
2. **Commit changes**
|
|
```bash
|
|
git add .
|
|
git commit -m "feat(area): add new equipment page"
|
|
```
|
|
|
|
3. **Push to repository**
|
|
```bash
|
|
git push origin main
|
|
```
|
|
|
|
4. **Deploy to production**
|
|
- SSH into production server
|
|
- Run: `git pull origin main`
|
|
- Clear cache: `rm -rf user/cache/*`
|
|
|
|
### Admin UI Editing (Future Workflow)
|
|
|
|
When non-technical users need to edit content:
|
|
|
|
1. **Use local admin UI**
|
|
- Access: http://localhost:5001/admin
|
|
- Login with admin credentials
|
|
- Edit content using visual interface
|
|
- Changes automatically update markdown files
|
|
|
|
2. **Commit admin changes**
|
|
```bash
|
|
git add user/pages/
|
|
git commit -m "feat: update homepage content via admin"
|
|
git push origin main
|
|
```
|
|
|
|
3. **Deploy to production**
|
|
- SSH into production server
|
|
- Run: `git pull origin main`
|
|
|
|
## Testing Before Deployment
|
|
|
|
### Local Testing Checklist
|
|
|
|
Before deploying to production, verify:
|
|
|
|
- [ ] All pages load without errors
|
|
- [ ] Navigation links work correctly
|
|
- [ ] Images display properly
|
|
- [ ] Forms submit (contact, booking)
|
|
- [ ] Mobile responsiveness tested
|
|
- [ ] Clear cache: `docker exec stlp-grav rm -rf /config/www/user/cache/*`
|
|
|
|
### Production Testing Checklist
|
|
|
|
After deployment to production:
|
|
|
|
- [ ] Homepage loads
|
|
- [ ] Navigation works
|
|
- [ ] All pages are accessible
|
|
- [ ] No 404 errors
|
|
- [ ] No PHP errors in logs
|
|
- [ ] Forms can be submitted
|
|
- [ ] Site speed is acceptable
|
|
- [ ] SSL certificate valid (if HTTPS)
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
#### 1. Changes Not Visible
|
|
|
|
**Problem:** Deployed but changes not showing
|
|
**Solution:** Clear cache
|
|
```bash
|
|
rm -rf user/cache/* user/logs/*
|
|
```
|
|
|
|
#### 2. Permission Errors
|
|
|
|
**Problem:** Files not writable
|
|
**Solution:** Fix permissions
|
|
```bash
|
|
chown -R www-data:www-data user/
|
|
find user -type d -exec chmod 775 {} \;
|
|
find user -type f -exec chmod 664 {} \;
|
|
```
|
|
|
|
#### 3. Git Pull Fails
|
|
|
|
**Problem:** Can't pull due to conflicts
|
|
**Solution:** Resolve conflicts
|
|
```bash
|
|
# Stash local changes (if any)
|
|
git stash
|
|
|
|
# Pull remote changes
|
|
git pull origin main
|
|
|
|
# Resolve conflicts if needed
|
|
vim user/pages/conflict.md
|
|
|
|
# Commit resolution
|
|
git add .
|
|
git commit -m "fix: resolve merge conflicts"
|
|
```
|
|
|
|
#### 4. Plugin Errors
|
|
|
|
**Problem:** Plugin causes site to break
|
|
**Solution:** Disable plugin
|
|
```bash
|
|
# Disable problematic plugin
|
|
rm -rf user/plugins/problem-plugin
|
|
|
|
# Reinstall via GPM (if using Docker)
|
|
docker exec stlp-grav php bin/gpm install problem-plugin
|
|
```
|
|
|
|
## Rollback Procedure
|
|
|
|
If deployment causes issues:
|
|
|
|
### Quick Rollback (Git)
|
|
|
|
```bash
|
|
# SSH into production server
|
|
cd /var/www/grav
|
|
|
|
# View previous commit
|
|
git log --oneline -5
|
|
|
|
# Revert to previous commit
|
|
git revert HEAD
|
|
# OR
|
|
git reset --hard HEAD~1
|
|
|
|
# Clear cache
|
|
rm -rf user/cache/* user/logs/*
|
|
```
|
|
|
|
### Restore from Backup
|
|
|
|
```bash
|
|
# SSH into production server
|
|
cd /var/www/grav
|
|
|
|
# Remove broken user directory
|
|
rm -rf user/
|
|
|
|
# Restore from backup
|
|
tar -xzf /var/backups/grav/grav_backup_YYYYMMDD_HHMMSS.tar.gz
|
|
|
|
# Clear cache
|
|
rm -rf user/cache/* user/logs/*
|
|
|
|
# Set permissions
|
|
chown -R www-data:www-data user/
|
|
```
|
|
|
|
## Automation Options
|
|
|
|
### Webhook Deployment
|
|
|
|
For automatic deployment when pushing to git:
|
|
|
|
1. **Set up webhook on Git repository**
|
|
2. **Configure webhook URL:** `https://your-server.com/webhook.php`
|
|
3. **Create webhook handler script** (simple PHP or bash)
|
|
4. **Script runs:** `git pull`, clear cache, set permissions
|
|
|
|
### CI/CD Pipeline
|
|
|
|
For more complex deployments:
|
|
|
|
1. **Use GitLab CI/CD or GitHub Actions**
|
|
2. **Pipeline stages:**
|
|
- Test: Validate syntax and links
|
|
- Build: Compile assets (if needed)
|
|
- Deploy: SSH to production, pull changes
|
|
3. **Deploy on:** Manual approval or automatic on main branch
|
|
|
|
## Monitoring
|
|
|
|
### Health Checks
|
|
|
|
Implement these health checks for production:
|
|
|
|
```bash
|
|
# Check site is responding
|
|
curl -f https://startinglineproductions.com/ || alert "Site down!"
|
|
|
|
# Check for PHP errors
|
|
grep -i "error" /var/www/grav/user/logs/grav.log | tail -10
|
|
|
|
# Check disk space
|
|
df -h | grep /var/www
|
|
|
|
# Check Git status (ensure clean)
|
|
cd /var/www/grav
|
|
git status
|
|
```
|
|
|
|
### Log Monitoring
|
|
|
|
Monitor these logs:
|
|
|
|
- **Grav log:** `/var/www/grav/user/logs/grav.log`
|
|
- **Nginx log:** `/var/log/nginx/access.log`
|
|
- **PHP error log:** `/var/log/php/error.log`
|
|
|
|
## Backup Strategy
|
|
|
|
### Automated Backups
|
|
|
|
Set up cron jobs for automated backups:
|
|
|
|
```bash
|
|
# Daily backup of user directory (2 AM)
|
|
0 2 * * * /usr/bin/tar -czf /var/backups/grav/grav_$(date +\%Y\%m\%d).tar.gz /var/www/grav/user/
|
|
|
|
# Weekly backup of entire Grav installation
|
|
0 3 * * 0 /usr/bin/tar -czf /var/backups/grav/grav_full_$(date +\%Y\%m\%d).tar.gz /var/www/grav/
|
|
```
|
|
|
|
### Retention Policy
|
|
|
|
- Keep daily backups for 7 days
|
|
- Keep weekly backups for 4 weeks
|
|
- Keep monthly backups for 6 months
|
|
- Offsite backup recommended
|
|
|
|
## Security Considerations
|
|
|
|
### Production Security
|
|
|
|
- **SSH Keys:** Use SSH keys instead of passwords
|
|
- **Firewall:** Restrict SSH to specific IPs
|
|
- **Git Access:** Use deploy keys with restricted permissions
|
|
- **File Permissions:** Never make files world-writable
|
|
- **Updates:** Keep Grav and plugins updated
|
|
|
|
### Environment Variables
|
|
|
|
Set these in production:
|
|
|
|
```bash
|
|
# Grav environment
|
|
GRAV_ENV=production
|
|
GRAV_DEBUG=0
|
|
|
|
# Database (if using)
|
|
DB_HOST=localhost
|
|
DB_USER=grav_user
|
|
DB_PASS=secure_password
|
|
DB_NAME=grav_db
|
|
```
|
|
|
|
## Support
|
|
|
|
For deployment issues:
|
|
|
|
1. Check logs: `/var/www/grav/user/logs/`
|
|
2. Review this guide
|
|
3. Check AGENTS.md for architecture details
|
|
4. Contact technical support
|
|
|
|
## Quick Reference
|
|
|
|
### Common Commands
|
|
|
|
```bash
|
|
# Local development
|
|
docker compose up -d # Start Grav
|
|
docker exec stlp-grav rm -rf user/cache/* # Clear cache
|
|
docker logs stlp-grav # View logs
|
|
|
|
# Git operations
|
|
git add . # Stage changes
|
|
git commit -m "message" # Commit changes
|
|
git push origin main # Push to remote
|
|
git pull origin main # Pull from remote
|
|
|
|
# Production deployment
|
|
git pull origin main # Pull changes
|
|
rm -rf user/cache/* user/logs/* # Clear cache
|
|
chown -R www-data:www-data user/ # Set permissions
|
|
```
|
|
|
|
### File Locations
|
|
|
|
| Type | Location |
|
|
|-------|----------|
|
|
| Pages | `user/pages/` |
|
|
| Config | `user/config/` |
|
|
| Cache | `user/cache/` (ignored by git) |
|
|
| Logs | `user/logs/` (ignored by git) |
|
|
| Themes | `user/themes/` |
|
|
| Plugins | `user/plugins/` |
|
|
|
|
---
|
|
|
|
**Last Updated:** January 13, 2026
|
|
**Version:** 1.0
|