# Fogbreak Hetzner Deployment — Quick Start

**TL;DR version of DEPLOYMENT.md**

---

## One-Command Setup

```bash
ssh root@<HETZNER_IP>
sudo bash <(curl -fsSL https://raw.githubusercontent.com/fogbreak-io/fogbreak/main/deploy/setup-server.sh) \
  --domain=fogbreak.io \
  --github-repo=fogbreak-io/fogbreak \
  --github-token=ghp_xxxx \
  --db-password="$(openssl rand -base64 32)"
```

**Takes:** 15–20 minutes

---

## After Setup (5 Steps)

### 1. Update Config

```bash
sudo nano /var/www/fogbreak.io/api/config.php
sudo cp /var/www/fogbreak.io/.env.example /var/www/fogbreak.io/.env
sudo nano /var/www/fogbreak.io/.env
```

### 2. Fix Permissions

```bash
sudo chown -R www-data:www-data /var/www/fogbreak.io
sudo chmod 750 /var/www/fogbreak.io
sudo chmod 640 /var/www/fogbreak.io/api/config.php
sudo chmod 640 /var/www/fogbreak.io/.env
```

### 3. Verify Application

```bash
curl -I https://fogbreak.io/
# Should return 200 OK
```

### 4. Set GitHub Webhook

In GitHub → Settings → Webhooks → Add webhook:
- **URL:** `https://fogbreak.io/deploy/webhook.php`
- **Secret:** From `.env GITHUB_WEBHOOK_SECRET`
- **Events:** Push

### 5. Import Database (If You Have a Dump)

```bash
sudo mysql fogbreak < /path/to/dump.sql
```

---

## Essential Commands

### Check Logs

```bash
# Web server errors
tail -f /var/log/nginx/fogbreak-error.log

# PHP errors
tail -f /var/log/php/fogbreak-error.log

# Cron execution
tail -f /var/log/fogbreak/cron.log

# Webhooks
tail -f /var/log/fogbreak/webhook.log
```

### Service Management

```bash
# Restart Nginx
sudo systemctl restart nginx

# Restart PHP-FPM
sudo systemctl restart php8.3-fpm

# Restart MySQL
sudo systemctl restart mysql

# Check all services
systemctl status nginx php8.3-fpm mysql redis-server
```

### Database

```bash
# Connect as fogbreak_app
mysql -u fogbreak_app -p

# Quick query
mysql -u fogbreak_app -p fogbreak -e "SELECT COUNT(*) FROM clients;"

# Export backup
mysqldump -u fogbreak_app -p fogbreak > backup.sql
```

### Files

```bash
# App root
cd /var/www/fogbreak.io

# Config files
nano /var/www/fogbreak.io/api/config.php
nano /var/www/fogbreak.io/.env

# Nginx config
nano /etc/nginx/sites-available/fogbreak.io

# Cron job
cat /etc/cron.d/fogbreak-cron
```

### Test API

```bash
# Health check
curl https://fogbreak.io/api/admin.php?action=status

# With headers
curl -H "Authorization: Bearer MTH_PORTAL_2026" https://fogbreak.io/api/cron.php
```

---

## Verify Everything Works

```bash
# 1. Services running?
systemctl is-active nginx php8.3-fpm mysql redis-server
# Should all say "active"

# 2. Web accessible?
curl -I https://fogbreak.io/
# Should return 200 OK

# 3. Database connected?
mysql -u fogbreak_app -p fogbreak -e "SELECT 1;" 2>/dev/null
# Should succeed silently

# 4. PHP working?
php -v
# Should show PHP 8.3

# 5. Cron running?
ls -la /var/log/fogbreak/cron.log
# Should have recent entries (updated every 15 min)
```

---

## Common Issues & Fixes

| Issue | Diagnosis | Fix |
|-------|-----------|-----|
| 500 Error | `tail /var/log/php/fogbreak-error.log` | `systemctl restart php8.3-fpm` |
| 404 Not Found | `sudo nginx -t` | `sudo systemctl restart nginx` |
| DB Connection Failed | `mysql -u fogbreak_app -p` | Check password in config.php |
| SSL Not Found | `ls /etc/letsencrypt/live/fogbreak.io/` | `sudo certbot certonly --nginx -d fogbreak.io` |
| Cron Not Running | `ps aux \| grep cron` | `sudo systemctl restart cron` |
| Webhook Not Deploying | `tail /var/log/fogbreak/webhook.log` | Check secret in GitHub settings |

---

## Monitoring

```bash
# Real-time system
htop

# Disk space
df -h

# Memory usage
free -h

# Service health
systemctl status [service-name]
```

---

## Useful SSH Aliases

Add to `~/.bashrc` on local machine:

```bash
alias fogbreak-logs='ssh root@<IP> "tail -f /var/log/fogbreak/*.log"'
alias fogbreak-status='ssh root@<IP> "systemctl status nginx php8.3-fpm mysql redis-server"'
alias fogbreak-config='ssh root@<IP> "nano /var/www/fogbreak.io/api/config.php"'
alias fogbreak-pull='ssh root@<IP> "cd /var/www/fogbreak.io && git pull origin main"'
```

Then use:
```bash
fogbreak-status
fogbreak-logs
fogbreak-config
```

---

## Full Documentation

- **DEPLOYMENT.md** — Step-by-step guide with screenshots
- **setup-server.sh** — Automated installer (400+ lines, well-commented)
- **CLAUDE.md** — Project context and operational rules
- **ARCHITECTURE.html** — System design

---

## Troubleshooting Commands (Copy-Paste)

```bash
# System health check (all at once)
echo "=== SERVICES ===" && systemctl status nginx php8.3-fpm mysql redis-server && \
echo "" && \
echo "=== DISK ===" && df -h && \
echo "" && \
echo "=== MEMORY ===" && free -h && \
echo "" && \
echo "=== DNS ===" && nslookup fogbreak.io && \
echo "" && \
echo "=== SSL ===" && ls /etc/letsencrypt/live/fogbreak.io/ && \
echo "" && \
echo "=== RECENT ERRORS ===" && tail -5 /var/log/php/fogbreak-error.log

# Restart everything
sudo systemctl restart nginx php8.3-fpm mysql redis-server

# Clear PHP opcache & restart
sudo php -r 'opcache_reset();' && sudo systemctl restart php8.3-fpm

# Force database connection test
mysql -u fogbreak_app -p"PASSWORD" fogbreak -e "SELECT NOW();"
```

---

**Last Updated:** March 29, 2026
