- Complete task documentation per FFG-STD-002 - README.md: Overview, context, success criteria - deployment-plan.md: 9-phase step-by-step deployment - prerequisites.md: Comprehensive checklist Urgency: HIGH - Unblocks content migration for 76 Pokémon entries Timeline: Deploy tonight, migration starts tomorrow (Feb 27) Requested by: Michael & Claudius (Pokerole Project) Related: Aurelian Pokédex 100% complete, awaiting infrastructure
767 lines
15 KiB
Markdown
767 lines
15 KiB
Markdown
# Pokerole Wiki.js Deployment Plan
|
|
|
|
**Task:** Deploy fresh Wiki.js instance for Aurelian Pokédex
|
|
**Server:** Ghost VPS (64.50.188.14)
|
|
**Domain:** pokerole.firefrostgaming.com
|
|
**Estimated Time:** 2-3 hours
|
|
|
|
---
|
|
|
|
## Phase 1: Pre-Deployment Setup (15 minutes)
|
|
|
|
### Step 1: Create Deployment Directory
|
|
|
|
```bash
|
|
ssh root@64.50.188.14
|
|
cd /opt
|
|
mkdir -p pokerole-wiki
|
|
cd pokerole-wiki
|
|
```
|
|
|
|
### Step 2: Check Existing Wiki.js Installations
|
|
|
|
```bash
|
|
# Reference existing setups
|
|
ls -la /opt/ | grep wiki
|
|
docker ps | grep wiki
|
|
```
|
|
|
|
**Purpose:** Understand existing Wiki.js deployment pattern to replicate
|
|
|
|
### Step 3: Verify Prerequisites
|
|
|
|
```bash
|
|
# Check Docker
|
|
docker --version
|
|
|
|
# Check Docker Compose
|
|
docker-compose --version
|
|
|
|
# Check available disk space
|
|
df -h /opt
|
|
|
|
# Check network ports
|
|
netstat -tulpn | grep :300
|
|
```
|
|
|
|
**Expected:** Docker/Compose installed, sufficient space (500MB+), ports available
|
|
|
|
---
|
|
|
|
## Phase 2: DNS Configuration (5 minutes)
|
|
|
|
### Step 4: Create DNS A Record
|
|
|
|
**Action:** Add DNS record (via registrar/DNS provider)
|
|
|
|
```
|
|
Type: A
|
|
Name: pokerole
|
|
Value: 64.50.188.14
|
|
TTL: 300 (5 minutes)
|
|
```
|
|
|
|
### Step 5: Verify DNS Propagation
|
|
|
|
```bash
|
|
# Check DNS resolution
|
|
nslookup pokerole.firefrostgaming.com
|
|
|
|
# Alternative check
|
|
dig pokerole.firefrostgaming.com
|
|
```
|
|
|
|
**Note:** May take 5-15 minutes to propagate. Can proceed with IP testing while waiting.
|
|
|
|
---
|
|
|
|
## Phase 3: Docker Deployment (30 minutes)
|
|
|
|
### Step 6: Create docker-compose.yml
|
|
|
|
```bash
|
|
cd /opt/pokerole-wiki
|
|
nano docker-compose.yml
|
|
```
|
|
|
|
**File contents:**
|
|
|
|
```yaml
|
|
version: "3"
|
|
services:
|
|
pokerole-db:
|
|
image: postgres:15-alpine
|
|
container_name: pokerole-wiki-db
|
|
environment:
|
|
POSTGRES_DB: pokerole_wiki
|
|
POSTGRES_USER: pokerole_user
|
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
volumes:
|
|
- ./data/postgres:/var/lib/postgresql/data
|
|
restart: unless-stopped
|
|
networks:
|
|
- pokerole-network
|
|
|
|
pokerole-wiki:
|
|
image: ghcr.io/requarks/wiki:2
|
|
container_name: pokerole-wiki
|
|
depends_on:
|
|
- pokerole-db
|
|
environment:
|
|
DB_TYPE: postgres
|
|
DB_HOST: pokerole-db
|
|
DB_PORT: 5432
|
|
DB_USER: pokerole_user
|
|
DB_PASS: ${DB_PASSWORD}
|
|
DB_NAME: pokerole_wiki
|
|
ports:
|
|
- "3002:3000"
|
|
volumes:
|
|
- ./data/wiki:/wiki/data
|
|
- ./data/content:/wiki/data/content
|
|
restart: unless-stopped
|
|
networks:
|
|
- pokerole-network
|
|
|
|
networks:
|
|
pokerole-network:
|
|
driver: bridge
|
|
|
|
volumes:
|
|
postgres-data:
|
|
wiki-data:
|
|
```
|
|
|
|
**Port 3002** - Different from existing wikis (likely 3000, 3001)
|
|
|
|
### Step 7: Create Environment File
|
|
|
|
```bash
|
|
nano .env
|
|
```
|
|
|
|
**File contents:**
|
|
|
|
```bash
|
|
# Pokerole Wiki.js Environment
|
|
DB_PASSWORD=GENERATE_SECURE_PASSWORD_HERE
|
|
```
|
|
|
|
**Action:** Generate secure password:
|
|
|
|
```bash
|
|
openssl rand -base64 32
|
|
```
|
|
|
|
Copy result into .env file
|
|
|
|
### Step 8: Create Data Directories
|
|
|
|
```bash
|
|
mkdir -p data/postgres
|
|
mkdir -p data/wiki
|
|
mkdir -p data/content
|
|
chmod -R 755 data/
|
|
```
|
|
|
|
### Step 9: Deploy Containers
|
|
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
**Expected output:** Two containers created (pokerole-db, pokerole-wiki)
|
|
|
|
### Step 10: Verify Deployment
|
|
|
|
```bash
|
|
# Check container status
|
|
docker-compose ps
|
|
|
|
# Check logs
|
|
docker-compose logs -f pokerole-wiki
|
|
|
|
# Check database connection
|
|
docker-compose logs pokerole-db | grep "ready to accept"
|
|
```
|
|
|
|
**Expected:** Both containers running, no error messages, database accepting connections
|
|
|
|
### Step 11: Test Local Access
|
|
|
|
```bash
|
|
# From Ghost VPS
|
|
curl http://localhost:3002
|
|
|
|
# Should return HTML (Wiki.js interface)
|
|
```
|
|
|
|
---
|
|
|
|
## Phase 4: Nginx Reverse Proxy (30 minutes)
|
|
|
|
### Step 12: Create Nginx Config
|
|
|
|
```bash
|
|
nano /etc/nginx/sites-available/pokerole.firefrostgaming.com
|
|
```
|
|
|
|
**File contents:**
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
listen [::]:80;
|
|
server_name pokerole.firefrostgaming.com;
|
|
|
|
# Redirect to HTTPS (after SSL setup)
|
|
# return 301 https://$server_name$request_uri;
|
|
|
|
# Temporary HTTP access for testing
|
|
location / {
|
|
proxy_pass http://localhost:3002;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
}
|
|
}
|
|
```
|
|
|
|
### Step 13: Enable Site
|
|
|
|
```bash
|
|
# Create symlink
|
|
ln -s /etc/nginx/sites-available/pokerole.firefrostgaming.com /etc/nginx/sites-enabled/
|
|
|
|
# Test Nginx config
|
|
nginx -t
|
|
|
|
# Reload Nginx
|
|
systemctl reload nginx
|
|
```
|
|
|
|
### Step 14: Test HTTP Access
|
|
|
|
```bash
|
|
# From local machine (or curl)
|
|
curl http://pokerole.firefrostgaming.com
|
|
```
|
|
|
|
**Expected:** Wiki.js welcome/setup page
|
|
|
|
---
|
|
|
|
## Phase 5: SSL Certificate (30 minutes)
|
|
|
|
### Step 15: Install Certbot (if not present)
|
|
|
|
```bash
|
|
apt update
|
|
apt install certbot python3-certbot-nginx -y
|
|
```
|
|
|
|
### Step 16: Obtain SSL Certificate
|
|
|
|
```bash
|
|
certbot --nginx -d pokerole.firefrostgaming.com
|
|
```
|
|
|
|
**Prompts:**
|
|
- Email: (Michael's email)
|
|
- Terms: Agree
|
|
- Newsletter: Optional
|
|
- Redirect: Yes (automatically configure HTTPS redirect)
|
|
|
|
### Step 17: Verify SSL
|
|
|
|
```bash
|
|
# Test HTTPS access
|
|
curl https://pokerole.firefrostgaming.com
|
|
|
|
# Check certificate
|
|
certbot certificates | grep pokerole
|
|
```
|
|
|
|
### Step 18: Test Auto-Renewal
|
|
|
|
```bash
|
|
certbot renew --dry-run
|
|
```
|
|
|
|
**Expected:** Renewal process works (actual renewal happens automatically)
|
|
|
|
---
|
|
|
|
## Phase 6: Wiki.js Configuration (30 minutes)
|
|
|
|
### Step 19: Access Wiki.js Setup
|
|
|
|
**Browser:** Navigate to `https://pokerole.firefrostgaming.com`
|
|
|
|
**Expected:** Wiki.js initial setup wizard
|
|
|
|
### Step 20: Complete Setup Wizard
|
|
|
|
**Administrator Account:**
|
|
- Email: (Michael's email)
|
|
- Username: mkrause612
|
|
- Password: (Secure password - store in Vaultwarden)
|
|
|
|
**Site Configuration:**
|
|
- Site Title: "Aurelian Pokédex"
|
|
- Site Description: "Complete Pokédex for the Aurelian Region - Pokerole TTRPG"
|
|
- Company/Organization: "Firefrost Gaming"
|
|
|
|
**Telemetry:** Disable (privacy)
|
|
|
|
### Step 21: Configure Authentication
|
|
|
|
**Navigation:** Administration → Authentication
|
|
|
|
**Enable:**
|
|
- Local authentication (for Michael & Holly)
|
|
|
|
**Disable:**
|
|
- Social logins (unless needed)
|
|
|
|
### Step 22: Create Holly's Account
|
|
|
|
**Navigation:** Administration → Users
|
|
|
|
**Add User:**
|
|
- Email: (Holly's email)
|
|
- Username: Unicorn20089 (or Holly's preference)
|
|
- Role: Editor (full editing rights)
|
|
- Group: Editors
|
|
|
|
### Step 23: Configure Permissions
|
|
|
|
**Navigation:** Administration → Groups
|
|
|
|
**Editors group:**
|
|
- Read: All pages
|
|
- Write: All pages
|
|
- Upload: Images/files
|
|
- Manage: Own pages
|
|
|
|
**Guest group (public):**
|
|
- Read: All pages (after public launch)
|
|
- Write: None
|
|
- Upload: None
|
|
|
|
### Step 24: Configure Theme & Appearance
|
|
|
|
**Navigation:** Administration → Theme
|
|
|
|
**Recommended Settings:**
|
|
- Theme: Default (or Dark if preferred)
|
|
- Code Injection: None initially
|
|
- Logo: Upload Firefrost Gaming logo (optional)
|
|
|
|
### Step 25: Enable Markdown Editor
|
|
|
|
**Navigation:** Administration → Editors
|
|
|
|
**Enable:**
|
|
- Markdown editor (primary)
|
|
|
|
**Disable:**
|
|
- Visual editor (optional, can enable if preferred)
|
|
|
|
### Step 26: Configure Storage
|
|
|
|
**Navigation:** Administration → Storage
|
|
|
|
**Verify:**
|
|
- Local storage enabled for uploads
|
|
- Path: `/wiki/data/content` (from docker volume)
|
|
|
|
---
|
|
|
|
## Phase 7: Initial Structure Setup (Optional, 15 minutes)
|
|
|
|
### Step 27: Create Home Page
|
|
|
|
**Content:**
|
|
|
|
```markdown
|
|
# Aurelian Pokédex
|
|
|
|
Welcome to the complete Pokédex for the Aurelian Region!
|
|
|
|
## Quick Navigation
|
|
|
|
- [Tier 3 Pokémon](/tier3)
|
|
- [Tier 4 Pokémon](/tier4)
|
|
- [Tier 5 Regional Forms](/tier5)
|
|
|
|
## About This Pokédex
|
|
|
|
This Pokédex documents all Pokémon native to the Aurelian region for the Pokerole Tabletop RPG system.
|
|
|
|
### Statistics
|
|
|
|
- **Total Pokémon:** 76 unique entries
|
|
- **Regional Forms:** 19 Aurelian variants
|
|
- **Custom Abilities:** 19 unique abilities
|
|
- **Custom Moves:** 2 signature moves
|
|
|
|
### Tiers
|
|
|
|
- **Tier 3:** Rookie-tier Pokémon (26 entries)
|
|
- **Tier 4:** Advanced-tier Pokémon (31 entries)
|
|
- **Tier 5:** Regional variants of existing Pokémon (19 entries)
|
|
|
|
---
|
|
|
|
*This Pokédex is maintained by Firefrost Gaming for the Pokerole TTRPG community.*
|
|
```
|
|
|
|
### Step 28: Create Tier Index Pages
|
|
|
|
**Create 3 pages:**
|
|
|
|
1. `/tier3` - Tier 3 index
|
|
2. `/tier4` - Tier 4 index
|
|
3. `/tier5` - Tier 5 Regional Forms index
|
|
|
|
**Template for each:**
|
|
|
|
```markdown
|
|
# Tier [X] Pokémon
|
|
|
|
[Description of tier]
|
|
|
|
## Pokémon List
|
|
|
|
[Claudius will populate during migration]
|
|
|
|
---
|
|
|
|
*Navigation:* [Home](/) | [Tier 3](/tier3) | [Tier 4](/tier4) | [Tier 5](/tier5)
|
|
```
|
|
|
|
### Step 29: Create Pokémon Entry Template
|
|
|
|
**Purpose:** Give Claudius a consistent format for migration
|
|
|
|
**Create page:** `/template/pokemon-entry`
|
|
|
|
**Content:**
|
|
|
|
```markdown
|
|
# [Pokémon Name] (#[Dex Number])
|
|
|
|
 
|
|
|
|
## Basic Information
|
|
|
|
| Attribute | Value |
|
|
|-----------|-------|
|
|
| **Type** | [Type1] / [Type2] |
|
|
| **Rank** | [Rank] |
|
|
| **Evolution** | [Evolution line] |
|
|
|
|
## Stats
|
|
|
|
| HP | Str | Dex | Vit | Spe | Ins | Total |
|
|
|----|-----|-----|-----|-----|-----|-------|
|
|
| X | X | X | X | X | X | XX |
|
|
|
|
## Abilities
|
|
|
|
- **Ability 1:** [Name] - [Description]
|
|
- **Ability 2:** [Name] - [Description]
|
|
- **Hidden Ability:** [Name] - [Description]
|
|
|
|
## Pokédex Entry
|
|
|
|
"[Flavor text]"
|
|
|
|
## Move Pool
|
|
|
|
[Table with moves by rank]
|
|
|
|
## Evolution
|
|
|
|
[Evolution method and line]
|
|
|
|
---
|
|
|
|
*Navigation:* [Home](/) | [Tier Index](/tier[X])
|
|
```
|
|
|
|
---
|
|
|
|
## Phase 8: Handoff to Migration Team (5 minutes)
|
|
|
|
### Step 30: Create Access Document
|
|
|
|
**Create file:** `/opt/pokerole-wiki/ACCESS.md`
|
|
|
|
**Contents:**
|
|
|
|
```markdown
|
|
# Pokerole Wiki.js Access Information
|
|
|
|
**URL:** https://pokerole.firefrostgaming.com
|
|
|
|
## Admin Account
|
|
- **Username:** mkrause612
|
|
- **Password:** [In Vaultwarden: Pokerole Wiki Admin]
|
|
|
|
## Editor Account (Holly)
|
|
- **Username:** Unicorn20089
|
|
- **Password:** [Provided to Holly separately]
|
|
|
|
## Technical Details
|
|
- **Server:** Ghost VPS (64.50.188.14)
|
|
- **Port:** 3002 (internal)
|
|
- **Database:** PostgreSQL (pokerole-wiki-db container)
|
|
- **Data:** /opt/pokerole-wiki/data/
|
|
|
|
## Backup Locations
|
|
- **Database:** /opt/pokerole-wiki/data/postgres/
|
|
- **Uploads:** /opt/pokerole-wiki/data/content/
|
|
- **Config:** /opt/pokerole-wiki/docker-compose.yml
|
|
|
|
## Useful Commands
|
|
|
|
# View logs
|
|
cd /opt/pokerole-wiki
|
|
docker-compose logs -f pokerole-wiki
|
|
|
|
# Restart wiki
|
|
docker-compose restart pokerole-wiki
|
|
|
|
# Full restart (if needed)
|
|
docker-compose down && docker-compose up -d
|
|
|
|
# Backup database
|
|
docker exec pokerole-wiki-db pg_dump -U pokerole_user pokerole_wiki > backup.sql
|
|
```
|
|
|
|
### Step 31: Notify Michael & Claudius
|
|
|
|
**Message template:**
|
|
|
|
```
|
|
🎉 Pokerole Wiki.js Deployment COMPLETE!
|
|
|
|
✅ URL: https://pokerole.firefrostgaming.com
|
|
✅ Admin account created
|
|
✅ SSL certificate active
|
|
✅ Holly's editor account created
|
|
✅ Basic structure template ready
|
|
|
|
📋 Access details: /opt/pokerole-wiki/ACCESS.md
|
|
📋 Admin password: (in Vaultwarden)
|
|
|
|
🚀 Ready for content migration!
|
|
|
|
Next steps:
|
|
1. Michael: Log in and verify access
|
|
2. Claudius: Begin Tier 3 migration (26 Pokémon)
|
|
3. Upload sprites to /images/
|
|
4. Link evolution chains
|
|
|
|
The chronicle awaits! 💙🔥❄️
|
|
```
|
|
|
|
---
|
|
|
|
## Phase 9: Verification Checklist
|
|
|
|
### Deployment Verification
|
|
|
|
- [ ] Wiki accessible at https://pokerole.firefrostgaming.com
|
|
- [ ] SSL certificate valid (green lock)
|
|
- [ ] Admin account works (can log in)
|
|
- [ ] Holly's account created and works
|
|
- [ ] Markdown editor functional
|
|
- [ ] Can create new pages
|
|
- [ ] Can upload images
|
|
- [ ] Tables render correctly
|
|
- [ ] Search functionality works
|
|
- [ ] No errors in docker logs
|
|
|
|
### Security Verification
|
|
|
|
- [ ] HTTP redirects to HTTPS
|
|
- [ ] Strong passwords set
|
|
- [ ] Public access read-only
|
|
- [ ] Database password secured
|
|
- [ ] Certbot auto-renewal configured
|
|
|
|
### Handoff Verification
|
|
|
|
- [ ] Access document created
|
|
- [ ] Credentials stored in Vaultwarden
|
|
- [ ] Michael notified
|
|
- [ ] Claudius ready to begin migration
|
|
- [ ] Holly has access credentials
|
|
|
|
---
|
|
|
|
## Troubleshooting Guide
|
|
|
|
### Issue: Can't access wiki via domain
|
|
|
|
**Check DNS:**
|
|
```bash
|
|
nslookup pokerole.firefrostgaming.com
|
|
```
|
|
|
|
**Check Nginx:**
|
|
```bash
|
|
nginx -t
|
|
systemctl status nginx
|
|
```
|
|
|
|
**Check Docker:**
|
|
```bash
|
|
docker-compose ps
|
|
docker-compose logs pokerole-wiki
|
|
```
|
|
|
|
### Issue: SSL certificate fails
|
|
|
|
**Check DNS propagation first:**
|
|
```bash
|
|
dig pokerole.firefrostgaming.com
|
|
```
|
|
|
|
**Try manual certificate:**
|
|
```bash
|
|
certbot certonly --standalone -d pokerole.firefrostgaming.com
|
|
```
|
|
|
|
### Issue: Database connection errors
|
|
|
|
**Check database container:**
|
|
```bash
|
|
docker-compose logs pokerole-db
|
|
```
|
|
|
|
**Verify environment variables:**
|
|
```bash
|
|
cat .env
|
|
docker-compose exec pokerole-wiki env | grep DB_
|
|
```
|
|
|
|
### Issue: Can't upload images
|
|
|
|
**Check volume permissions:**
|
|
```bash
|
|
ls -la /opt/pokerole-wiki/data/content/
|
|
chmod -R 755 /opt/pokerole-wiki/data/content/
|
|
```
|
|
|
|
**Check storage config in Wiki.js admin panel**
|
|
|
|
---
|
|
|
|
## Rollback Procedure (If Needed)
|
|
|
|
### If deployment fails catastrophically:
|
|
|
|
```bash
|
|
cd /opt/pokerole-wiki
|
|
docker-compose down
|
|
rm -rf data/ # CAREFUL - only if starting fresh
|
|
# Remove Nginx config
|
|
rm /etc/nginx/sites-enabled/pokerole.firefrostgaming.com
|
|
systemctl reload nginx
|
|
# Revoke SSL cert (optional)
|
|
certbot revoke --cert-name pokerole.firefrostgaming.com
|
|
```
|
|
|
|
### Restore from backup (if re-deploying):
|
|
|
|
```bash
|
|
# Database restore
|
|
docker exec -i pokerole-wiki-db psql -U pokerole_user pokerole_wiki < backup.sql
|
|
```
|
|
|
|
---
|
|
|
|
## Post-Deployment Maintenance
|
|
|
|
### Daily Backups (Recommended)
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# /opt/pokerole-wiki/backup.sh
|
|
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
BACKUP_DIR=/opt/pokerole-wiki/backups
|
|
|
|
# Create backup directory
|
|
mkdir -p $BACKUP_DIR
|
|
|
|
# Backup database
|
|
docker exec pokerole-wiki-db pg_dump -U pokerole_user pokerole_wiki > $BACKUP_DIR/pokerole_db_$DATE.sql
|
|
|
|
# Backup uploads
|
|
tar -czf $BACKUP_DIR/pokerole_content_$DATE.tar.gz /opt/pokerole-wiki/data/content/
|
|
|
|
# Keep only last 7 days
|
|
find $BACKUP_DIR -name "pokerole_*" -mtime +7 -delete
|
|
|
|
echo "Backup complete: $DATE"
|
|
```
|
|
|
|
**Schedule with cron:**
|
|
```bash
|
|
crontab -e
|
|
# Add: 0 3 * * * /opt/pokerole-wiki/backup.sh
|
|
```
|
|
|
|
### Monitoring
|
|
|
|
**Add to Uptime Kuma:**
|
|
- URL: https://pokerole.firefrostgaming.com
|
|
- Check interval: 5 minutes
|
|
- Alert on downtime
|
|
|
|
---
|
|
|
|
## Success Criteria
|
|
|
|
✅ **Deployment Complete:**
|
|
- Wiki accessible via HTTPS
|
|
- Admin account functional
|
|
- SSL certificate valid
|
|
- Database operational
|
|
- No errors in logs
|
|
|
|
✅ **Migration Ready:**
|
|
- Michael can create pages
|
|
- Holly can edit pages
|
|
- Images can be uploaded
|
|
- Markdown renders correctly
|
|
- Search works
|
|
|
|
✅ **Production Ready (After Migration):**
|
|
- 76 Pokémon entries published
|
|
- 225 sprites uploaded
|
|
- Evolution chains linked
|
|
- Custom mechanics documented
|
|
- Public access enabled
|
|
|
|
---
|
|
|
|
**Estimated Total Time:** 2-3 hours
|
|
|
|
**Expected Completion:** Evening of February 26, 2026
|
|
|
|
**Next Phase:** Content migration begins February 27, 2026
|
|
|
|
---
|
|
|
|
💙🔥❄️ **"The infrastructure is forged. The chronicle awaits."** 🔥❄️💙
|