Sessions 6-10 Feature Specs: - Session 6: Inventory & Warranty Tracking (equipment management) - Session 7: Maintenance Scheduler (recurring tasks with alerts) - Session 8: Crew & Contact Management (marine operations directory) - Session 9: Compliance & Certification Tracker (regulatory compliance) - Session 10: Fuel Log & Expense Tracker (financial management) Deployment Documentation: - STACKCP_DEPLOYMENT_GUIDE.md (complete deployment process) - DEPLOYMENT_SUMMARY.md (executive overview) - DEPLOYMENT_ARCHITECTURE.md (technical deep dive) - DEPLOYMENT_INDEX.md (navigation hub) - README_DEPLOYMENT.txt (quick start) - STACKCP_QUICK_COMMANDS.sh (copy-paste commands) Session Prompts: - 4 new prompts with step-by-step build instructions Total: ~450-600 min build time across 5 features Demo value: Complete boat management platform
18 KiB
NaviDocs StackCP Deployment Guide
Status: Production Ready (65% MVP) Target Environment: StackCP Shared Hosting (20i) Architecture: Node.js + Express + Vue 3 + SQLite + Meilisearch Estimated Deployment Time: 30-45 minutes
Executive Summary
NaviDocs is a fully-integrated boat documentation management platform with three production features:
- Smart OCR - 36x performance improvement (180s → 5s per 100-page PDF)
- Multi-format Uploads - PDF, images, Word, Excel, text files
- Timeline Feature - Activity logging and document history tracking
This guide walks through deploying the complete application to StackCP with all features enabled.
Pre-Deployment Checklist
- SSH access to StackCP verified (
stackcpalias configured) /tmp/nodeexecutable (v20.19.5) ✅- Meilisearch running on port 7700 ✅
/tmpdirectory is executable (confirmed ext4 mount)- ~480 MB disk space available in home directory
- NVM 0.39.0 available for npm installation
- All three features merged and tested locally
Step 1: Review Environment Setup
The StackCP environment has been pre-verified. Key details:
# SSH Configuration
Host stackcp
HostName ssh.gb.stackcp.com
User digital-lab.ca
IdentityFile ~/.ssh/icw_stackcp_ed25519
IdentitiesOnly yes
# Storage Architecture
/tmp/ ← EXECUTABLE (for code)
├── node v20.19.5
└── meilisearch v1.6.2 (running)
~/navidocs-data/ ← PERSISTENT (for data)
├── db/navidocs.db
├── uploads/
└── logs/
Test connection:
ssh stackcp "echo 'Ready to deploy' && /tmp/node --version"
Step 2: Quick Deploy Script (Automated)
Run the existing deployment script that handles everything:
cd /home/setup/navidocs
# Make script executable
chmod +x deploy-stackcp.sh
# Run deployment (production environment)
./deploy-stackcp.sh production
What this does:
- ✅ Verifies SSH connection
- ✅ Fixes
/tmp/nodepermissions (chmod +x) - ✅ Checks Meilisearch health
- ✅ Creates data directories
- ✅ Packages and uploads code to
/tmp/navidocs/ - ✅ Installs npm dependencies (via NVM)
- ✅ Initializes SQLite database
- ✅ Runs smoke tests
- ✅ Displays next steps
Expected output:
==================================
NaviDocs StackCP Deployment
Environment: production
==================================
Step 1: Verifying SSH connection...
✅ SSH connection established
Step 2: Ensuring /tmp/node has execute permission...
✅ Node.js ready: v20.19.5
Step 3: Verifying Meilisearch...
✅ Meilisearch is running and healthy
Step 4: Creating data directories...
✅ Data directories created/verified
Step 5: Deploying application code to /tmp/navidocs...
✅ Application code deployed
Step 6: Setting up environment variables...
✅ Environment file configured
Step 7: Installing Node.js dependencies...
✅ Dependencies installed
Step 8: Initializing database...
✅ Database initialized (Size: 2.0M)
Step 9: Running smoke tests...
✅ Server health check passed
✅ Smoke tests completed
==================================
Deployment Complete!
==================================
Step 3: Manual Deploy (If Script Fails)
3a. Deploy Code to StackCP
# From local navidocs directory
cd /home/setup/navidocs
# Create deployment package (excludes node_modules, .git, .env)
tar --exclude='node_modules' \
--exclude='.git' \
--exclude='dist' \
--exclude='.env' \
-czf /tmp/navidocs-deploy.tar.gz \
server/ client/ package.json README.md
# Upload to StackCP
scp /tmp/navidocs-deploy.tar.gz stackcp:/tmp/
# Extract on StackCP
ssh stackcp << 'EOF'
cd /tmp
rm -rf navidocs
tar -xzf navidocs-deploy.tar.gz
mv server navidocs
mkdir -p navidocs/client # ensure client dir exists
EOF
# Cleanup
rm /tmp/navidocs-deploy.tar.gz
3b. Create Data Directories
ssh stackcp << 'EOF'
mkdir -p ~/navidocs-data/{db,uploads,logs}
echo "Data directories ready"
EOF
3c. Setup Environment Variables
ssh stackcp << 'EOF'
cat > ~/navidocs-data/.env << 'ENVEOF'
# Server Configuration
PORT=8001
NODE_ENV=production
# Database
DATABASE_PATH=~/navidocs-data/db/navidocs.db
# Meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_MASTER_KEY=$(openssl rand -hex 32)
MEILISEARCH_INDEX_NAME=navidocs-pages
MEILISEARCH_SEARCH_KEY=$(openssl rand -hex 32)
# Redis (local for now)
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
# Authentication
JWT_SECRET=$(openssl rand -hex 32)
JWT_EXPIRES_IN=15m
# System Settings Encryption
SETTINGS_ENCRYPTION_KEY=$(node -e 'console.log(require("crypto").randomBytes(32).toString("hex"))')
# Admin Configuration
SYSTEM_ADMIN_EMAILS=admin@example.com
# File Upload
MAX_FILE_SIZE=50000000
UPLOAD_DIR=~/navidocs-data/uploads
ALLOWED_MIME_TYPES=application/pdf
# OCR Settings
OCR_LANGUAGE=eng
OCR_CONFIDENCE_THRESHOLD=0.7
USE_REMOTE_OCR=false
OCR_WORKER_URL=https://fr-antibes.duckdns.org/naviocr
OCR_WORKER_TIMEOUT=300000
# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100
ENVEOF
echo ".env file created"
EOF
3d. Install Dependencies
ssh stackcp << 'EOF'
source ~/.nvm/nvm.sh
cd /tmp/navidocs
npm install --production
echo "Dependencies installed"
EOF
3e. Initialize Database
ssh stackcp << 'EOF'
/tmp/node /tmp/navidocs/server/db/init.js
ls -lh ~/navidocs-data/db/navidocs.db
EOF
3f. Run Smoke Tests
ssh stackcp << 'EOF'
# Start server in background
nohup /tmp/node /tmp/navidocs/server/index.js > ~/navidocs-data/logs/test.log 2>&1 &
sleep 5
# Check health
curl -s http://localhost:8001/health | head -20
# Kill test server
pkill -f "node /tmp/navidocs" || true
EOF
Step 4: Start the Application
Option A: StackCP Node.js Application Manager (Recommended)
- Login to StackCP Control Panel (https://www.stackcp.com/client/)
- Navigate to Node.js Manager
- Click Create New Application
- Configure:
- Application Name:
navidocs - Start File:
/tmp/navidocs/server/index.js - Port:
8001 - Environment:
production - Node Version:
20.19.5or latest LTS
- Application Name:
- Set Environment Variables:
- Load from file:
~/navidocs-data/.env
- Load from file:
- Enable Auto-restart on crash
- Click Create
Verify it's running:
ssh stackcp "curl -s http://localhost:8001/health | jq ."
Option B: Manual systemd Service (If GUI not available)
ssh stackcp << 'EOF'
# Create systemd service file
cat > ~/.config/systemd/user/navidocs.service << 'SVCEOF'
[Unit]
Description=NaviDocs Application
After=network.target
[Service]
Type=simple
WorkingDirectory=/tmp/navidocs
ExecStart=/tmp/node /tmp/navidocs/server/index.js
EnvironmentFile=~/navidocs-data/.env
Restart=always
RestartSec=10
StandardOutput=append:~/navidocs-data/logs/app.log
StandardError=append:~/navidocs-data/logs/app.log
[Install]
WantedBy=default.target
SVCEOF
# Enable and start service
systemctl --user daemon-reload
systemctl --user enable navidocs.service
systemctl --user start navidocs.service
# Check status
systemctl --user status navidocs.service
EOF
Option C: Manual Process (Debug/Testing Only)
ssh stackcp << 'EOF'
source ~/.nvm/nvm.sh
export $(cat ~/navidocs-data/.env | xargs)
cd /tmp/navidocs
/tmp/node server/index.js
EOF
Step 5: Build and Deploy Frontend
The frontend (Vue 3) needs to be built before deploying:
Local Build
cd /home/setup/navidocs/client
# Install dependencies
npm install
# Build for production
npm run build
# Output goes to: dist/
ls -la dist/
Deploy Built Frontend to StackCP
# Upload built files
scp -r /home/setup/navidocs/client/dist/* \
stackcp:~/public_html/digital-lab.ca/navidocs/
# Verify files
ssh stackcp "ls -la ~/public_html/digital-lab.ca/navidocs/"
Step 6: Configure Nginx Reverse Proxy
Configure Nginx to proxy API requests from the web frontend to the Node.js server:
ssh stackcp << 'EOF'
cat > ~/nginx-config-navidocs.conf << 'NGINXEOF'
server {
listen 80;
listen 443 ssl http2;
server_name digital-lab.ca;
# Frontend static files (Vue built app)
location / {
root ~/public_html/digital-lab.ca;
try_files $uri $uri/ /navidocs/index.html;
}
# Backend API proxy
location /api/ {
proxy_pass http://127.0.0.1:8001;
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;
# WebSocket support (if used)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeouts for large file uploads
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
}
# Health check endpoint
location /health {
proxy_pass http://127.0.0.1:8001;
access_log off;
}
# Meilisearch search proxy (if exposing)
location /search/ {
proxy_pass http://127.0.0.1:7700/;
proxy_set_header Host $host;
# Only allow POST requests
limit_except POST {
deny all;
}
}
}
NGINXEOF
# Note: Copy this config to your Nginx sites-available/
# Usually: /etc/nginx/sites-available/digital-lab.ca
echo "Nginx config saved - copy to /etc/nginx/sites-available/"
EOF
Step 7: Verify Deployment
Health Checks
# 1. Server is running
ssh stackcp "curl -s http://localhost:8001/health | jq ."
# 2. Database is accessible
ssh stackcp "sqlite3 ~/navidocs-data/db/navidocs.db 'SELECT COUNT(*) FROM sqlite_master;'"
# 3. Meilisearch is responding
ssh stackcp "curl -s http://localhost:7700/health | jq ."
# 4. Frontend files are served
ssh stackcp "ls -la ~/public_html/digital-lab.ca/navidocs/ | head -10"
# 5. Check disk usage
ssh stackcp "du -sh ~/navidocs-data/ && df -h | grep home"
Manual Test Flow
# Test upload endpoint
ssh stackcp << 'EOF'
# Create test user
curl -X POST http://localhost:8001/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"password": "TestPass123!",
"name": "Test User"
}'
# Login and get token
TOKEN=$(curl -s -X POST http://localhost:8001/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"password": "TestPass123!"
}' | jq -r '.token')
# Test upload
curl -X POST http://localhost:8001/api/upload \
-H "Authorization: Bearer $TOKEN" \
-F "file=@test-document.pdf"
EOF
Step 8: Deployment File Structure
After successful deployment, your StackCP environment should look like:
/tmp/navidocs/ (EXECUTABLE, 200-300 MB)
├── server/
│ ├── index.js ← Main entry point
│ ├── package.json
│ ├── config/
│ │ └── db.js
│ ├── routes/
│ │ ├── upload.js
│ │ ├── search.js
│ │ ├── timeline.js
│ │ ├── auth.routes.js
│ │ └── ...
│ ├── services/
│ │ ├── ocr.js ← Smart OCR engine
│ │ ├── pdf-text-extractor.js ← Native PDF text
│ │ ├── document-processor.js ← Multi-format routing
│ │ ├── activity-logger.js ← Timeline logging
│ │ └── ...
│ ├── workers/
│ │ └── ocr-worker.js ← Background job processor
│ └── node_modules/ (350+ MB)
│
└── client/
└── package.json
~/navidocs-data/ (PERSISTENT, starts ~10 MB)
├── .env ← SECRETS (chmod 600)
├── db/
│ └── navidocs.db ← SQLite database
├── uploads/ ← User document files
│ ├── document-uuid-1.pdf
│ ├── document-uuid-2.jpg
│ └── ...
└── logs/
├── app.log ← Application logs
├── ocr-worker.log ← Background job logs
└── test.log
~/public_html/digital-lab.ca/navidocs/ (SERVED via web)
├── index.html ← Vue app entry
├── assets/
│ ├── index-xxxxx.js ← Bundled Vue code
│ └── index-xxxxx.css ← Bundled styles
└── ...
Step 9: Monitor and Maintain
Viewing Logs
# Real-time server logs
ssh stackcp "tail -f ~/navidocs-data/logs/app.log"
# OCR worker logs
ssh stackcp "tail -f ~/navidocs-data/logs/ocr-worker.log"
# All errors
ssh stackcp "grep ERROR ~/navidocs-data/logs/app.log | tail -20"
Database Maintenance
# Check database size
ssh stackcp "du -h ~/navidocs-data/db/navidocs.db"
# Vacuum to reclaim space (runs nightly)
ssh stackcp "/tmp/node -e \"
const Database = require('better-sqlite3');
const db = new Database('~/navidocs-data/db/navidocs.db');
db.exec('VACUUM');
console.log('Database vacuumed');
\""
Monitoring Disk Usage
# StackCP has 480 MB available - monitor closely
ssh stackcp "watch -n 5 'du -sh ~/navidocs-data/ && df -h'"
# Archive old uploads monthly
ssh stackcp "find ~/navidocs-data/uploads -mtime +90 -exec tar -czf ~/backups/old-uploads-{}.tar.gz {} \\;"
Restart Application
# If using systemd
ssh stackcp "systemctl --user restart navidocs.service"
# If using StackCP GUI
# → Control Panel → Node.js Manager → navidocs → Restart
# Manual (if needed)
ssh stackcp "pkill -f 'node /tmp/navidocs'; sleep 2; /tmp/node /tmp/navidocs/server/index.js &"
Step 10: Post-Deployment Configuration
Set Admin Email
ssh stackcp << 'EOF'
# Update .env
sed -i 's/admin@example.com/your-email@example.com/g' ~/navidocs-data/.env
# Restart
systemctl --user restart navidocs.service
EOF
Configure OCR Worker URL
If using the remote OCR worker (fr-antibes.duckdns.org):
ssh stackcp << 'EOF'
# Already configured in .env:
# OCR_WORKER_URL=https://fr-antibes.duckdns.org/naviocr
# OCR_WORKER_TIMEOUT=300000 (5 minutes)
# Test connection
curl -v https://fr-antibes.duckdns.org/naviocr/health || echo "Worker unavailable"
EOF
Enable Redis for Caching (Optional)
For better performance, use Redis Cloud free tier:
# Update .env with Redis Cloud credentials
ssh stackcp << 'EOF'
# Redis Cloud (free tier: https://redis.com/try-free/)
REDIS_HOST=your-instance.redis.cloud
REDIS_PORT=xxxxx
REDIS_PASSWORD=your-password
REDIS_USERNAME=default
EOF
Troubleshooting
Issue: Server won't start
# Check Node.js executable
ssh stackcp "chmod +x /tmp/node && /tmp/node --version"
# Check .env file exists
ssh stackcp "cat ~/navidocs-data/.env | head -5"
# Check database initialization
ssh stackcp "ls -lh ~/navidocs-data/db/navidocs.db"
# View startup errors
ssh stackcp "/tmp/node /tmp/navidocs/server/index.js 2>&1 | head -50"
Issue: Database locked
# Kill zombie processes
ssh stackcp "lsof | grep navidocs.db | awk '{print \$2}' | xargs kill -9 || true"
# Restart app
ssh stackcp "systemctl --user restart navidocs.service"
Issue: npm install fails
# Use NVM explicitly
ssh stackcp << 'EOF'
source ~/.nvm/nvm.sh
cd /tmp/navidocs
npm install --production --verbose
EOF
Issue: Out of disk space
# Check usage
ssh stackcp "du -sh ~/navidocs-data/*"
# Clean old uploads (keep last 30 days)
ssh stackcp "find ~/navidocs-data/uploads -mtime +30 -delete"
# Archive database (SQLite)
ssh stackcp "cp ~/navidocs-data/db/navidocs.db ~/backups/navidocs-$(date +%Y%m%d).db"
Performance Benchmarks
Expected performance on StackCP:
| Operation | Performance | Notes |
|---|---|---|
| Native PDF text extraction (100 pages) | 5s | Smart OCR enabled |
| Image OCR | 3s per page | Async processing |
| Word doc upload | 0.8s | Mammoth library |
| Search query | <10ms | Meilisearch optimized |
| Timeline query | <50ms | SQLite indexed |
Rollback Procedure
If deployment fails critically:
# 1. Stop application
ssh stackcp "systemctl --user stop navidocs.service"
# 2. Restore previous version from git
ssh stackcp << 'EOF'
cd /tmp
rm -rf navidocs
git clone https://github.com/dannystocker/navidocs.git
cd navidocs
source ~/.nvm/nvm.sh
npm install --production
EOF
# 3. Restart with old version
ssh stackcp "systemctl --user start navidocs.service"
Success Indicators
Deployment is complete and successful when:
- ✅
curl http://localhost:8001/healthreturns{"status":"ok"} - ✅ Frontend loads at
https://digital-lab.ca/navidocs/ - ✅ Can login and create test user
- ✅ Can upload PDF and see OCR progress
- ✅ Search index responds
- ✅ Timeline shows activity events
- ✅ Logs show no errors (grep -c "ERROR" should be 0 or minimal)
Next Steps
- Configuration: Customize admin email, OCR settings, rate limits
- Backup: Setup automated daily backups to off-site storage
- Monitoring: Configure uptime monitoring (UptimeRobot, etc.)
- SSL: Ensure HTTPS certificate is valid (StackCP should provide)
- DNS: Ensure digital-lab.ca DNS records point to StackCP
- Testing: Run full E2E test suite in production environment
- Documentation: Update user guides with new NaviDocs features
Support & Debugging
For issues, check these files:
- Environment Report:
/home/setup/navidocs/STACKCP_ENVIRONMENT_REPORT.md - Architecture Analysis:
/home/setup/navidocs/STACKCP_ARCHITECTURE_ANALYSIS.md - Developer Guide:
/home/setup/navidocs/docs/DEVELOPER.md
Remote SSH troubleshooting:
ssh stackcp << 'EOF'
echo "=== Environment Check ==="
echo "Node: $(/tmp/node --version)"
echo "Meilisearch: $(curl -s http://localhost:7700/health | jq .version)"
echo "Database: $(ls -lh ~/navidocs-data/db/navidocs.db)"
echo "Disk: $(df -h | grep home)"
EOF
Deployment Date: 2025-11-13 Version: NaviDocs v1.0.0 Status: Production Ready