Vapora/docs/CUSTOM_DEPLOYMENT_SETUP.md
Jesús Pérez 7110ffeea2
Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
chore: extend doc: adr, tutorials, operations, etc
2026-01-12 03:32:47 +00:00

505 lines
12 KiB
Markdown

# Custom Deployment Server Setup Guide
Complete reference for configuring mdBook documentation deployment to custom servers.
## 📋 What's Included
### Deployment Script
**File**: `.scripts/deploy-docs.sh` (9.9 KB, executable)
**Capabilities**:
- ✅ 6 deployment methods (SSH, SFTP, HTTP, Docker, S3, GCS)
- ✅ Pre-flight validation (connectivity, files, permissions)
- ✅ Automatic backups (SSH/SFTP)
- ✅ Post-deployment verification
- ✅ Rollback support (SSH)
- ✅ Detailed logging and error handling
### Configuration Files
**Files**: `.scripts/.deploy-config.*`
Templates for:
-`.deploy-config.production` — Production environment
-`.deploy-config.staging` — Staging/testing environment
### Documentation
**Files**:
-`docs/CUSTOM_DEPLOYMENT_SERVER.md` — Complete reference (45+ KB)
-`.scripts/DEPLOYMENT_QUICK_START.md` — Quick start guide (5 min setup)
---
## 🚀 Quick Start (5 Minutes)
### Fastest Way: GitHub Pages
```bash
# 1. Repository → Settings → Pages
# 2. Select: GitHub Actions
# 3. Save
# 4. Push any docs/ change
# Done!
```
### Fastest Way: SSH to Existing Server
```bash
# Generate SSH key
ssh-keygen -t ed25519 -f ~/.ssh/vapora-docs -N ""
# Add to server
ssh-copy-id -i ~/.ssh/vapora-docs user@your-server.com
# Add GitHub secrets (Settings → Secrets → Actions)
# DOCS_DEPLOY_METHOD = ssh
# DOCS_DEPLOY_HOST = your-server.com
# DOCS_DEPLOY_USER = user
# DOCS_DEPLOY_PATH = /var/www/docs
# DOCS_DEPLOY_KEY = [base64: cat ~/.ssh/vapora-docs | base64]
```
---
## 📦 Deployment Methods Comparison
| Method | Setup | Speed | Cost | Best For |
|--------|-------|-------|------|----------|
| **GitHub Pages** | 2 min | Fast | Free | Public docs |
| **SSH** | 10 min | Medium | Server | Private docs, full control |
| **S3 + CloudFront** | 5 min | Fast | $1-5/mo | Global scale |
| **Docker** | 15 min | Medium | Varies | Container orchestration |
| **HTTP API** | 20 min | Medium | Server | Custom deployment logic |
| **GCS** | 5 min | Fast | $0.02/GB | Google Cloud users |
---
## 🔐 Security
### SSH Key Management
```bash
# Generate key securely
ssh-keygen -t ed25519 -f ~/.ssh/vapora-docs -N "strong-passphrase"
# Encode for GitHub (base64)
cat ~/.ssh/vapora-docs | base64 -w0 > /tmp/key.b64
# Add to GitHub Secrets (do NOT commit key anywhere)
# Settings → Secrets and variables → Actions → DOCS_DEPLOY_KEY
```
### Principle of Least Privilege
```bash
# Create restricted deployment user
sudo useradd -m -d /var/www/docs -s /bin/false docs
# Grant only necessary permissions
sudo chmod 755 /var/www/docs
sudo chown docs:www-data /var/www/docs
# SSH key permissions (on server)
sudo -u docs chmod 700 ~/.ssh
sudo -u docs chmod 600 ~/.ssh/authorized_keys
```
### Secrets Rotation
**Recommended**: Rotate deployment secrets quarterly
```bash
# Generate new key
ssh-keygen -t ed25519 -f ~/.ssh/vapora-docs-new -N ""
# Update on server
ssh-copy-id -i ~/.ssh/vapora-docs-new user@your-server.com
# Update GitHub secret
# Settings → Secrets → DOCS_DEPLOY_KEY → Update
# Remove old key from server
ssh user@your-server.com
sudo -u docs nano ~/.ssh/authorized_keys
# Delete old key, save
```
---
## 🎯 Deployment Flow
### From Code to Live
```
Developer Push (docs/)
↓ GitHub Detects Change
mdBook Build & Deploy Workflow
├─ Checkout repository
├─ Install mdBook
├─ Build documentation
├─ Validate output
├─ Upload artifact (30-day retention)
└─ Done
mdBook Publish & Sync Workflow (triggered)
├─ Download artifact
├─ Setup credentials
├─ Run deployment script
│ ├─ Pre-flight checks
│ │ ├─ Verify mdBook output exists
│ │ ├─ Check server connectivity
│ │ └─ Validate configuration
│ ├─ Deploy (method-specific)
│ │ ├─ SSH: rsync + backup
│ │ ├─ S3: sync to bucket
│ │ ├─ HTTP: upload archive
│ │ ├─ Docker: push image
│ │ └─ GCS: sync to bucket
│ └─ Post-deployment verify
├─ Create deployment record
├─ Send notifications
└─ Done
✅ Documentation Live
```
**Total Time**: ~1-2 minutes
---
## 📊 File Structure
```
.github/
├── workflows/
│ ├── mdbook-build-deploy.yml (Build workflow)
│ └── mdbook-publish.yml (Deployment workflow) ✨ Updated
├── WORKFLOWS.md (Reference)
└── CI_CD_CHECKLIST.md (Setup checklist)
.scripts/
├── deploy-docs.sh (Main script) ✨ New
├── .deploy-config.production (Config) ✨ New
├── .deploy-config.staging (Config) ✨ New
└── DEPLOYMENT_QUICK_START.md (Quick guide) ✨ New
docs/
├── MDBOOK_SETUP.md (mdBook guide)
├── GITHUB_ACTIONS_SETUP.md (Workflow details)
├── DEPLOYMENT_GUIDE.md (Deployment reference)
├── CUSTOM_DEPLOYMENT_SERVER.md (Complete setup) ✨ New
└── CUSTOM_DEPLOYMENT_SETUP.md (This file) ✨ New
```
---
## 🔧 Environment Variables
### Deployment Script Uses
```bash
# Core
DOCS_DEPLOY_METHOD # ssh, sftp, http, docker, s3, gcs
# SSH/SFTP
DOCS_DEPLOY_HOST # hostname or IP
DOCS_DEPLOY_USER # remote username
DOCS_DEPLOY_PATH # remote directory path
DOCS_DEPLOY_KEY # SSH private key (base64)
# HTTP
DOCS_DEPLOY_ENDPOINT # HTTP endpoint URL
DOCS_DEPLOY_TOKEN # Bearer token
# AWS S3
AWS_ACCESS_KEY_ID # AWS credentials
AWS_SECRET_ACCESS_KEY
AWS_DOCS_BUCKET # S3 bucket name
AWS_REGION # AWS region
# Google Cloud Storage
GOOGLE_APPLICATION_CREDENTIALS # Service account JSON
GCS_DOCS_BUCKET # GCS bucket name
# Docker
DOCKER_REGISTRY # Registry hostname
DOCKER_USERNAME # Docker credentials
DOCKER_PASSWORD
```
---
## ✅ Setup Checklist
### Pre-Setup
- [ ] Choose deployment method
- [ ] Prepare server/cloud account
- [ ] Generate credentials
- [ ] Read relevant documentation
### SSH/SFTP Setup
- [ ] Create docs user on server
- [ ] Configure SSH directory and permissions
- [ ] Add SSH public key to server
- [ ] Test SSH connectivity
- [ ] Install nginx/apache on server
- [ ] Configure web server for docs
### GitHub Configuration
- [ ] Add GitHub secret: `DOCS_DEPLOY_METHOD`
- [ ] Add deployment credentials (method-specific)
- [ ] Verify secrets are not visible
- [ ] Review updated workflows
- [ ] Enable Actions tab
### Testing
- [ ] Build documentation locally
- [ ] Run deployment script locally (if possible)
- [ ] Make test commit to docs/
- [ ] Monitor Actions tab
- [ ] Verify workflow completed
- [ ] Check documentation site
- [ ] Test search functionality
- [ ] Test dark mode
### Monitoring
- [ ] Set up log monitoring
- [ ] Configure webhook notifications
- [ ] Create deployment dashboard
- [ ] Set up alerts for failures
### Maintenance
- [ ] Document your setup
- [ ] Schedule credential rotation
- [ ] Test rollback procedure
- [ ] Plan backup strategy
---
## 🆘 Common Issues
### Issue: "Cannot connect to server"
**Cause**: SSH connectivity problem
**Fix**:
```bash
# Test SSH directly
ssh -vvv -i ~/.ssh/vapora-docs user@your-server.com
# Check GitHub secret encoding
cat ~/.ssh/vapora-docs | base64 | wc -c
# Should be long string
# Verify server firewall
ssh -p 22 user@your-server.com echo "ok"
```
### Issue: "rsync: command not found"
**Cause**: rsync not installed on server
**Fix**:
```bash
ssh user@your-server.com
sudo apt-get install rsync # Debian/Ubuntu
# OR
sudo yum install rsync # RedHat/CentOS
```
### Issue: "Permission denied" on server
**Cause**: docs user doesn't have write permission
**Fix**:
```bash
ssh user@your-server.com
sudo chown -R docs:docs /var/www/docs
sudo chmod -R 755 /var/www/docs
```
### Issue: Documentation not appearing on site
**Cause**: nginx not configured or files not updated
**Fix**:
```bash
# Check nginx config
sudo nginx -T | grep root
# Verify files are there
sudo ls -la /var/www/docs/index.html
# Reload nginx
sudo systemctl reload nginx
# Check nginx logs
sudo tail -f /var/log/nginx/error.log
```
### Issue: GitHub Actions fails with "No secrets found"
**Cause**: Secrets not configured
**Fix**:
```bash
# Settings → Secrets and variables → Actions
# Verify all required secrets are present
# Check spelling matches deployment script
```
---
## 📈 Performance Monitoring
### Workflow Performance
Track metrics after each deployment:
```
Build Time: ~2-3 seconds
Deploy Time: ~10-30 seconds (method-dependent)
Total Time: ~1-2 minutes
```
### Site Performance
Monitor after deployment:
```bash
# Page load time
curl -w "Time: %{time_total}s\n" https://docs.your-domain.com/
# Lighthouse audit
lighthouse https://docs.your-domain.com
# Cache headers
curl -I https://docs.your-domain.com/ | grep Cache-Control
```
### Artifact Management
Default: 30 days retention
```bash
# View artifacts
GitHub → Actions → Workflow run → Artifacts
# Manual cleanup
# (GitHub handles auto-cleanup after 30 days)
```
---
## 🔄 Disaster Recovery
### Rollback Procedure (SSH)
```bash
# SSH into server
ssh -i ~/.ssh/vapora-docs user@your-server.com
# List backups
ls -la /var/www/docs/backups/
# Restore from backup
sudo -u docs mv /var/www/docs/current /var/www/docs/current-failed
sudo -u docs mv /var/www/docs/backups/backup_20260112_143000 \
/var/www/docs/current
sudo -u docs ln -sfT /var/www/docs/current /var/www/docs/docs
```
### Manual Deployment (No GitHub Actions)
```bash
# Build locally
cd docs
mdbook build
# Deploy using script
DOCS_DEPLOY_METHOD=ssh \
DOCS_DEPLOY_HOST=your-server.com \
DOCS_DEPLOY_USER=docs \
DOCS_DEPLOY_PATH=/var/www/docs \
bash .scripts/deploy-docs.sh production
```
---
## 📞 Support Resources
| Topic | Location |
|-------|----------|
| Quick Start | `.scripts/DEPLOYMENT_QUICK_START.md` |
| Full Reference | `docs/CUSTOM_DEPLOYMENT_SERVER.md` |
| Workflow Details | `.github/WORKFLOWS.md` |
| Setup Checklist | `.github/CI_CD_CHECKLIST.md` |
| Deployment Script | `.scripts/deploy-docs.sh` |
| mdBook Guide | `docs/MDBOOK_SETUP.md` |
---
## ✨ What's New
✨ = New with custom deployment setup
**New Files**:
-`.scripts/deploy-docs.sh` (9.9 KB)
-`.scripts/.deploy-config.production`
-`.scripts/.deploy-config.staging`
-`.scripts/DEPLOYMENT_QUICK_START.md`
-`docs/CUSTOM_DEPLOYMENT_SERVER.md` (45+ KB)
-`docs/CUSTOM_DEPLOYMENT_SETUP.md` (This file)
**Updated Files**:
-`.github/workflows/mdbook-publish.yml` (Enhanced with deployment integration)
**Total Addition**: ~100 KB documentation + deployment scripts
---
## 🎓 Learning Path
**Beginner** (Just want it working):
1. Read: `.scripts/DEPLOYMENT_QUICK_START.md` (5 min)
2. Choose: SSH or GitHub Pages
3. Setup: Follow instructions (10 min)
4. Test: Push docs/ change (automatic)
**Intermediate** (Want to understand):
1. Read: `docs/GITHUB_ACTIONS_SETUP.md` (15 min)
2. Read: `.github/WORKFLOWS.md` (10 min)
3. Setup: Full SSH deployment (20 min)
**Advanced** (Want all options):
1. Read: `docs/CUSTOM_DEPLOYMENT_SERVER.md` (30 min)
2. Study: `.scripts/deploy-docs.sh` (15 min)
3. Setup: Multiple deployment targets (60 min)
---
## 📞 Need Help?
**Quick Questions**:
- Check: `.scripts/DEPLOYMENT_QUICK_START.md`
- Check: `.github/WORKFLOWS.md`
**Detailed Setup**:
- Reference: `docs/CUSTOM_DEPLOYMENT_SERVER.md`
- Reference: `docs/DEPLOYMENT_GUIDE.md`
**Troubleshooting**:
- Check: `docs/CUSTOM_DEPLOYMENT_SERVER.md` → "Troubleshooting"
- Check: `.github/CI_CD_CHECKLIST.md` → "Troubleshooting Reference"
---
**Last Updated**: 2026-01-12
**Status**: ✅ Production Ready
**Total Setup Time**: 5-20 minutes (depending on method)
For immediate next steps, see: `.scripts/DEPLOYMENT_QUICK_START.md`