7.1 KiB
7.1 KiB
Migration to Unified Email Reports
Summary
✅ Merged email_reports and email_reports_merchbay into ONE container
Before:
- Two separate directories
- Two separate containers
- Two separate cron jobs calling via HTTP
After:
- Single unified container
- Handles both Crew & MerchBay
- Two cron jobs (23:55, 23:56) running internally
- No HTTP calls needed
What Changed
New Unified Architecture
email_reports/
├── send_report.php # NEW: Unified script for both brands
├── index.php # KEPT: Legacy Crew script (backward compatible)
├── Dockerfile # UPDATED: Runs both cron jobs
├── docker-compose.yml # UPDATED: Unified container config
├── .env.example # UPDATED: Both Crew + MerchBay vars
└── .gitea/workflows/
└── deploy.yml # UPDATED: Deploys unified container
Key Changes
-
send_report.php - Brand-agnostic report generator
- Uses
BRANDenvironment variable (crewormerchbay) - Auto-selects database, SMTP, recipients per brand
- Writes to separate CSV directories
- Uses
-
Cron Jobs - Two jobs in one container:
55 23 * * * BRAND=crew php /app/send_report.php 56 23 * * * BRAND=merchbay php /app/send_report.php -
Separate CSV Directories:
daily_order_reports_crew/daily_order_reports_merchbay/
-
Unified Logs - Single
email.logwith brand prefixes:2026-01-02 23:55:00 [CREW] successfully sent (5 orders) 2026-01-02 23:56:00 [MERCHBAY] No order for today
Migration Steps
1. Server Preparation
SSH to your production server:
ssh user@server
cd /var/www/apps/email_reports
# Backup existing setup
tar -czf email_reports_backup_$(date +%Y%m%d).tar.gz \
daily_order_reports/ email.log .env
# Create new directories
mkdir -p daily_order_reports_crew daily_order_reports_merchbay
# Move existing Crew reports (optional)
mv daily_order_reports/* daily_order_reports_crew/ 2>/dev/null || true
2. Update .env File
Replace your .env with unified configuration:
cd /var/www/apps/email_reports
cat > .env << 'EOL'
# Crew Sportswear Database
DB_HOST_CREW=mysql
DB_PORT_CREW=3306
DB_NAME_CREW=custom_design
DB_USER_CREW=crew_user
DB_PASS_CREW=your_crew_password
# MerchBay Database
DB_HOST_MERCHBAY=mysql
DB_PORT_MERCHBAY=3306
DB_NAME_MERCHBAY=merchbay_laravel
DB_USER_MERCHBAY=merchbay_user
DB_PASS_MERCHBAY=your_merchbay_password
# SMTP Configuration
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
# Crew SMTP (mail@crewsportswear.com)
SMTP_PASS_CREW=your_crew_gmail_app_password
# MerchBay SMTP (support@merchbay.com)
SMTP_PASS_MERCHBAY=your_merchbay_gmail_app_password
EOL
chmod 600 .env
3. Remove Old Cron Jobs
If you had host-level cron jobs calling via HTTP:
crontab -e
# REMOVE these lines:
# 55 23 * * * wget -qO- https://www.crewsportswear.com/email_reports/index.php &> /dev/null
# 55 23 * * * wget -qO- https://www.crewsportswear.com/email_reports_merchbay/index.php &> /dev/null
The container now handles scheduling internally!
4. Deploy Unified Container
# From your local machine
cd email_reports
git add .
git commit -m "Migrate to unified email reports container"
git push origin main
Gitea workflow will automatically:
- Build unified image
- Deploy to server
- Start container with both cron jobs
5. Verify Deployment
# On server
docker ps | grep email_reports
# Should show:
# email_reports_unified Up X minutes
# Check cron schedule
docker exec email_reports_unified crontab -l
# Expected output:
# 55 23 * * * BRAND=crew php /app/send_report.php >> /var/log/cron.log 2>&1
# 56 23 * * * BRAND=merchbay php /app/send_report.php >> /var/log/cron.log 2>&1
6. Test Both Reports
# Test Crew report
docker exec email_reports_unified BRAND=crew php /app/send_report.php
# Test MerchBay report
docker exec email_reports_unified BRAND=merchbay php /app/send_report.php
# Check logs
docker exec email_reports_unified tail /app/email.log
# Expected:
# 2026-01-02 15:30:00 [CREW] successfully sent
# 2026-01-02 15:30:15 [MERCHBAY] successfully sent
7. Verify Email Delivery
- Check
graphics@crewsportswear.cominbox - Should receive two separate emails:
- "CREW Daily Order Report - 2026-01-02"
- "Merchbay Daily Order Report - 2026-01-02"
What to Delete
On Server
# The old email_reports_merchbay directory is no longer needed
# (if it exists on the server)
rm -rf /var/www/apps/email_reports_merchbay
# Old container (will be removed automatically by deployment)
docker rm -f email_reports_crew email_reports_merchbay
In Git Repository
The email_reports_merchbay/ directory in your repos can stay for reference, or archive it:
cd /path/to/repos
tar -czf email_reports_merchbay_archive.tar.gz email_reports_merchbay/
# Optional: rm -rf email_reports_merchbay/
Troubleshooting
Both Reports Not Running
# Check crontab
docker exec email_reports_unified crontab -l
# Manually trigger both
docker exec email_reports_unified BRAND=crew php /app/send_report.php
docker exec email_reports_unified BRAND=merchbay php /app/send_report.php
MerchBay Database Connection Failed
# Verify MerchBay DB credentials in .env
docker exec email_reports_unified env | grep MERCHBAY
# Test connection
docker exec email_reports_unified php -r "
new PDO(
'mysql:host=' . getenv('DB_HOST_MERCHBAY') . ';dbname=' . getenv('DB_NAME_MERCHBAY'),
getenv('DB_USER_MERCHBAY'),
getenv('DB_PASS_MERCHBAY')
);
echo 'MerchBay DB: OK\n';
"
Only One Email Received
# Check which brand succeeded
docker exec email_reports_unified grep "$(date +%Y-%m-%d)" /app/email.log
# Look for [CREW] or [MERCHBAY] prefixes
# If one failed, check the error message
CSV Files Not Created
# Check directories exist
docker exec email_reports_unified ls -la /app/ | grep daily_order
# Should show:
# daily_order_reports_crew/
# daily_order_reports_merchbay/
# Check permissions
docker exec email_reports_unified stat -c '%a' /app/daily_order_reports_crew
# Should be 755
Rollback Plan
If something goes wrong:
# On server
cd /var/www/apps/email_reports
# Stop unified container
docker compose down
# Restore backup
tar -xzf email_reports_backup_YYYYMMDD.tar.gz
# Restore old .env
# Start old container
Benefits of Unified Container
✅ Simpler Infrastructure
- One container instead of two
- Single deployment process
- Shared codebase
✅ Better Resource Usage
- One cron daemon
- Shared Docker image
- Less memory overhead
✅ Easier Maintenance
- Update both brands at once
- Unified logging
- Single point of monitoring
✅ Consistent Behavior
- Same PHPMailer version
- Same PHP version
- Same timezone handling
Next Steps
- ✅ Deploy unified container
- ✅ Test both reports manually
- ✅ Wait for automatic execution at 23:55/23:56
- ✅ Verify emails received
- ✅ Monitor logs for first week
- ✅ Remove old cron jobs
- ✅ Archive old email_reports_merchbay directory
Migration Complete! 🎉