505 lines
12 KiB
Markdown
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`
|