# Deploying the Hatch Homepage

This document describes how the Hatch static homepage is deployed to hatch.surf.

## Overview

The homepage is deployed to two locations:

1. **GitHub Pages** - Serves as a fallback and for GitHub-based discovery
2. **hatch.surf server** - Primary deployment at https://hatch.surf

## Architecture

```
site/
├── index.html          # Main homepage
├── style.css           # Stylesheet
├── brand/              # Logo and favicon assets
│   ├── favicon/
│   └── og/
└── blog/               # Blog directory (placeholder)
```

## Server Setup

### Prerequisites

- Server: 46.250.250.48 (hatch.surf)
- nginx installed and configured
- Let's Encrypt certificate for hatch.surf
- SSH access for deployment

### Nginx Configuration

The nginx server block is located at:
- `/etc/nginx/sites-available/hatch.surf.conf`
- Symlinked to `/etc/nginx/sites-enabled/hatch.surf.conf`

Configuration highlights:
- HTTP → HTTPS redirect
- SSL with Let's Encrypt certificate
- Security headers (X-Content-Type-Options, X-Frame-Options, Referrer-Policy)
- Gzip compression
- Static asset caching (30 days)

### SSL Certificate

- Certificate managed by Let's Encrypt
- Auto-renewal via certbot
- Expiry: September 22, 2026

## Deployment

### Automated (GitHub Actions)

When changes are pushed to `main` branch affecting `site/` directory:

1. **GitHub Pages** - Deployed automatically via GitHub Actions
2. **Server** - Deployed via rsync to `/var/www/hatch.surf/`

Required GitHub secrets:
- `DEPLOY_HOST` - Server IP (46.250.250.48)
- `DEPLOY_USER` - SSH username (root)
- `DEPLOY_KEY` - SSH private key (base64 encoded)

### Manual Deployment

Use the deployment script:

```bash
# Dry run
./scripts/deploy-site.sh --dry-run

# Deploy
DEPLOY_HOST=46.250.250.48 \
DEPLOY_USER=root \
DEPLOY_KEY=$(cat ~/.ssh/id_rsa | base64) \
./scripts/deploy-site.sh
```

### Direct rsync

```bash
rsync -avz --delete site/ root@46.250.250.48:/var/www/hatch.surf/
ssh root@46.250.250.48 "nginx -t && systemctl reload nginx"
```

### Direct Deployment (When Running on Server)

If you're running on the same server as hatch.surf (e.g., in a Paperclip agent environment), you can deploy directly without SSH:

```bash
# Copy files directly to the deployment directory
sudo cp site/index.html /var/www/hatch.surf/index.html
sudo cp site/style.css /var/www/hatch.surf/style.css
sudo cp site/main.js /var/www/hatch.surf/main.js

# Set correct ownership
sudo chown www-data:www-data /var/www/hatch.surf/index.html
sudo chown www-data:www-data /var/www/hatch.surf/style.css
sudo chown www-data:www-data /var/www/hatch.surf/main.js

# Verify deployment
curl -s -I https://hatch.surf
```

**Note:** This method was used successfully in [ELF-196](/ELF/issues/ELF-196) when the agent had direct server access.

## Verification

### Check Site Status

```bash
# HTTP redirect
curl -s -o /dev/null -w "%{http_code}" http://hatch.surf/

# HTTPS site
curl -s -o /dev/null -w "%{http_code}" https://hatch.surf/

# SSL certificate
curl -v https://hatch.surf/ 2>&1 | grep -E "expire|issuer|subject"

# Static assets
curl -s -o /dev/null -w "%{http_code}" https://hatch.surf/style.css
curl -s -o /dev/null -w "%{http_code}" https://hatch.surf/brand/og/default.png
```

### Browser Verification

1. Visit https://hatch.surf
2. Verify no browser warnings (SSL valid)
3. Check that all assets load (CSS, images)
4. Test responsive design

## Troubleshooting

### SSL Certificate Issues

```bash
# Check certificate status
sudo certbot certificates

# Renew certificate manually
sudo certbot renew --cert-name hatch.surf

# Test nginx config
sudo nginx -t
```

### Deployment Failures

1. Check GitHub Actions logs
2. Verify SSH access: `ssh root@46.250.250.48`
3. Check nginx status: `sudo systemctl status nginx`
4. Check nginx logs: `sudo tail -f /var/log/nginx/error.log`

### Missing Assets

1. Verify files exist on server: `ls -la /var/www/hatch.surf/brand/`
2. Check nginx access logs: `sudo tail -f /var/log/nginx/access.log`
3. Ensure proper file permissions: `chown -R www-data:www-data /var/www/hatch.surf`

## Maintenance

### Updating Content

1. Edit files in `site/` directory
2. Commit and push to `main` branch
3. GitHub Actions will auto-deploy to both locations

### SSL Renewal

Certbot is configured to auto-renew. To check renewal status:

```bash
sudo certbot renew --dry-run
```

### Backup

The site is version-controlled in Git. For server backups:

```bash
# Backup nginx config
sudo tar -czf nginx-hatch-backup.tar.gz /etc/nginx/sites-available/hatch.surf.conf /etc/letsencrypt/live/hatch.surf/
```

## Related Issues

- [ELF-192](/ELF/issues/ELF-192) - Build homepage and deploy it on hatch.surf
- [ELF-171](/ELF/issues/ELF-171) - Server setup (nginx, SSL)
- [ELF-196](/ELF/issues/ELF-196) - Deploy redesigned hatch.surf homepage (v2 files from ELF-195)
