680 lines
12 KiB
Markdown
680 lines
12 KiB
Markdown
# DevBench Manager - Deployment Guide
|
|
|
|
## Table of Contents
|
|
1. [Prerequisites](#prerequisites)
|
|
2. [Quick Start](#quick-start)
|
|
3. [Detailed Deployment](#detailed-deployment)
|
|
4. [Configuration](#configuration)
|
|
5. [Verification](#verification)
|
|
6. [Troubleshooting](#troubleshooting)
|
|
7. [Maintenance](#maintenance)
|
|
8. [Backup & Recovery](#backup--recovery)
|
|
|
|
## Prerequisites
|
|
|
|
### Required Software
|
|
- **Docker**: Version 20.10 or higher
|
|
- **Docker Compose**: Version 2.0 or higher
|
|
- **Git**: For cloning the repository
|
|
- **SSH Access**: To remote VM host (asf-server.duckdns.org:49152)
|
|
|
|
### System Requirements
|
|
- **OS**: Linux (Ubuntu 20.04+ recommended), macOS, or Windows with WSL2
|
|
- **RAM**: Minimum 512MB for container
|
|
- **Disk**: Minimum 1GB free space
|
|
- **Network**: Internet connection for Docker images and SSH
|
|
|
|
### Access Requirements
|
|
- SSH credentials for VM host
|
|
- Domain name configured (optional, for Caddy)
|
|
- Port 9090 available (or configure different port)
|
|
|
|
## Quick Start
|
|
|
|
### One-Command Deployment
|
|
|
|
```bash
|
|
# Clone the repository
|
|
git clone <repository-url>
|
|
cd ASF_devbench
|
|
|
|
# Run deployment script
|
|
chmod +x deploy.sh
|
|
./deploy.sh
|
|
```
|
|
|
|
That's it! The application will be available at:
|
|
- **Direct**: http://localhost:9090
|
|
- **Via Caddy**: https://tbm.nabd-co.com (if configured)
|
|
|
|
### Default Credentials
|
|
- **Username**: admin
|
|
- **Password**: admin123
|
|
|
|
⚠️ **Important**: Change the default password after first login!
|
|
|
|
## Detailed Deployment
|
|
|
|
### Step 1: Clone Repository
|
|
|
|
```bash
|
|
git clone <repository-url>
|
|
cd ASF_devbench
|
|
```
|
|
|
|
### Step 2: Review Configuration
|
|
|
|
Check `config.js` for default settings:
|
|
```javascript
|
|
{
|
|
port: 3001,
|
|
database: { path: './data/devbench.db' },
|
|
session: { secret: 'your-secret-key' },
|
|
defaultAdmin: {
|
|
username: 'admin',
|
|
password: 'admin123',
|
|
email: 'admin@nabd-co.com'
|
|
}
|
|
}
|
|
```
|
|
|
|
### Step 3: Set Environment Variables (Optional)
|
|
|
|
Create `.env` file:
|
|
```bash
|
|
NODE_ENV=production
|
|
PORT=3001
|
|
SECRET_KEY=your-secure-secret-key
|
|
ADMIN_EMAIL=admin@yourdomain.com
|
|
ADMIN_PASSWORD=your-secure-password
|
|
```
|
|
|
|
### Step 4: Prepare Directories
|
|
|
|
```bash
|
|
# Create necessary directories
|
|
mkdir -p data logs public/downloads
|
|
|
|
# Set permissions
|
|
chmod 755 data logs
|
|
chmod +x provision_vm.sh deploy.sh
|
|
```
|
|
|
|
### Step 5: Configure Docker Network
|
|
|
|
```bash
|
|
# Create Caddy network (if using reverse proxy)
|
|
docker network create caddy_network
|
|
```
|
|
|
|
### Step 6: Deploy with Docker Compose
|
|
|
|
```bash
|
|
# Build and start container
|
|
docker-compose up -d --build
|
|
|
|
# Check status
|
|
docker-compose ps
|
|
|
|
# View logs
|
|
docker-compose logs -f
|
|
```
|
|
|
|
### Step 7: Verify Deployment
|
|
|
|
```bash
|
|
# Check health endpoint
|
|
curl http://localhost:9090/health
|
|
|
|
# Expected response:
|
|
# {"status":"ok","timestamp":"2025-11-23T...","version":"1.0.0"}
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Docker Compose Configuration
|
|
|
|
Edit `docker-compose.yml`:
|
|
|
|
```yaml
|
|
services:
|
|
devbench-manager:
|
|
ports:
|
|
- "9090:3001" # Change external port here
|
|
environment:
|
|
- NODE_ENV=production
|
|
- SECRET_KEY=${SECRET_KEY:-dev-secret-key}
|
|
volumes:
|
|
- ./data:/app/data
|
|
- ./logs:/app/logs
|
|
- ./provision_vm.sh:/app/provision_vm.sh:ro
|
|
```
|
|
|
|
### Caddy Reverse Proxy
|
|
|
|
Add to your Caddyfile:
|
|
|
|
```
|
|
tbm.nabd-co.com {
|
|
reverse_proxy devbench-manager:3001
|
|
}
|
|
```
|
|
|
|
Ensure Caddy container is on `caddy_network`:
|
|
|
|
```bash
|
|
# Check Caddy network
|
|
docker network inspect caddy_network
|
|
|
|
# Connect Caddy to network if needed
|
|
docker network connect caddy_network caddy-container-name
|
|
```
|
|
|
|
### SSH Configuration
|
|
|
|
The application connects to the VM host via SSH. Ensure:
|
|
|
|
1. **Host**: asf-server.duckdns.org
|
|
2. **Port**: 49152
|
|
3. **User**: asf
|
|
4. **Password**: ASF (configured in provision_vm.sh)
|
|
|
|
Test SSH connection:
|
|
```bash
|
|
ssh -p 49152 asf@asf-server.duckdns.org
|
|
```
|
|
|
|
### Firewall Configuration
|
|
|
|
Open required ports:
|
|
|
|
```bash
|
|
# For direct access
|
|
sudo ufw allow 9090/tcp
|
|
|
|
# For Caddy (if using)
|
|
sudo ufw allow 80/tcp
|
|
sudo ufw allow 443/tcp
|
|
```
|
|
|
|
## Verification
|
|
|
|
### 1. Container Status
|
|
|
|
```bash
|
|
# Check if container is running
|
|
docker ps | grep devbench-manager
|
|
|
|
# Expected output:
|
|
# CONTAINER ID IMAGE STATUS PORTS
|
|
# abc123... devbench-manager:latest Up 2 minutes 0.0.0.0:9090->3001/tcp
|
|
```
|
|
|
|
### 2. Health Check
|
|
|
|
```bash
|
|
# Test health endpoint
|
|
curl http://localhost:9090/health
|
|
|
|
# Or with jq for formatted output
|
|
curl -s http://localhost:9090/health | jq
|
|
```
|
|
|
|
### 3. Network Connectivity
|
|
|
|
```bash
|
|
# Check networks
|
|
docker inspect devbench-manager --format='{{range $k, $v := .NetworkSettings.Networks}}{{$k}} {{end}}'
|
|
|
|
# Expected: app-network caddy_network
|
|
```
|
|
|
|
### 4. Database
|
|
|
|
```bash
|
|
# Check if database was created
|
|
ls -la data/devbench.db
|
|
|
|
# Connect to database
|
|
docker exec -it devbench-manager sqlite3 /app/data/devbench.db
|
|
|
|
# Run query
|
|
sqlite> SELECT * FROM users;
|
|
```
|
|
|
|
### 5. Logs
|
|
|
|
```bash
|
|
# View application logs
|
|
docker-compose logs -f
|
|
|
|
# View last 50 lines
|
|
docker-compose logs --tail=50
|
|
|
|
# View specific service
|
|
docker-compose logs devbench-manager
|
|
```
|
|
|
|
### 6. Web Interface
|
|
|
|
1. Open browser: http://localhost:9090
|
|
2. Login with admin credentials
|
|
3. Create a test DevBench
|
|
4. Verify real-time log output
|
|
5. Check connection information
|
|
|
|
## Troubleshooting
|
|
|
|
### Container Won't Start
|
|
|
|
**Problem**: Container exits immediately
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Check logs
|
|
docker-compose logs
|
|
|
|
# Common issues:
|
|
# 1. Port already in use
|
|
sudo lsof -i :9090
|
|
# Kill process or change port in docker-compose.yml
|
|
|
|
# 2. Permission issues
|
|
sudo chown -R $USER:$USER data logs
|
|
|
|
# 3. Missing provision script
|
|
ls -la provision_vm.sh
|
|
chmod +x provision_vm.sh
|
|
```
|
|
|
|
### Cannot Access Web Interface
|
|
|
|
**Problem**: Connection refused or timeout
|
|
|
|
**Solution**:
|
|
```bash
|
|
# 1. Check if container is running
|
|
docker ps | grep devbench-manager
|
|
|
|
# 2. Check port mapping
|
|
docker port devbench-manager
|
|
|
|
# 3. Test from inside container
|
|
docker exec devbench-manager wget -O- http://localhost:3001/health
|
|
|
|
# 4. Check firewall
|
|
sudo ufw status
|
|
sudo ufw allow 9090/tcp
|
|
|
|
# 5. Check if port is listening
|
|
sudo netstat -tlnp | grep 9090
|
|
```
|
|
|
|
### Caddy Proxy Not Working
|
|
|
|
**Problem**: Cannot access via domain
|
|
|
|
**Solution**:
|
|
```bash
|
|
# 1. Check if both containers are on caddy_network
|
|
docker network inspect caddy_network
|
|
|
|
# 2. Connect devbench-manager to network
|
|
docker network connect caddy_network devbench-manager
|
|
|
|
# 3. Restart Caddy
|
|
docker restart caddy-container-name
|
|
|
|
# 4. Check Caddy logs
|
|
docker logs caddy-container-name
|
|
|
|
# 5. Test from Caddy container
|
|
docker exec caddy-container-name wget -O- http://devbench-manager:3001/health
|
|
```
|
|
|
|
### SSH Connection Fails
|
|
|
|
**Problem**: Cannot connect to VM host
|
|
|
|
**Solution**:
|
|
```bash
|
|
# 1. Test SSH manually
|
|
ssh -p 49152 asf@asf-server.duckdns.org
|
|
|
|
# 2. Check if sshpass is installed in container
|
|
docker exec devbench-manager which sshpass
|
|
|
|
# 3. Check provision script
|
|
docker exec devbench-manager cat /app/provision_vm.sh | grep SSH_
|
|
|
|
# 4. Test from container
|
|
docker exec -it devbench-manager bash
|
|
./provision_vm.sh status test_vm
|
|
```
|
|
|
|
### Database Errors
|
|
|
|
**Problem**: Database locked or corrupted
|
|
|
|
**Solution**:
|
|
```bash
|
|
# 1. Stop container
|
|
docker-compose down
|
|
|
|
# 2. Backup database
|
|
cp data/devbench.db data/devbench.db.backup
|
|
|
|
# 3. Check database integrity
|
|
sqlite3 data/devbench.db "PRAGMA integrity_check;"
|
|
|
|
# 4. If corrupted, restore from backup or recreate
|
|
rm data/devbench.db
|
|
docker-compose up -d
|
|
```
|
|
|
|
### WebSocket Not Working
|
|
|
|
**Problem**: Real-time updates not appearing
|
|
|
|
**Solution**:
|
|
```bash
|
|
# 1. Check browser console for errors
|
|
# Open DevTools → Console
|
|
|
|
# 2. Verify WebSocket connection
|
|
# Look for "WebSocket connected" message
|
|
|
|
# 3. Check if behind proxy
|
|
# Ensure proxy supports WebSocket upgrade
|
|
|
|
# 4. Test WebSocket endpoint
|
|
wscat -c ws://localhost:9090
|
|
```
|
|
|
|
## Maintenance
|
|
|
|
### Regular Tasks
|
|
|
|
#### Daily
|
|
- Monitor logs for errors
|
|
- Check disk space
|
|
- Verify health endpoint
|
|
|
|
#### Weekly
|
|
- Review user activity
|
|
- Clean up old logs
|
|
- Check for updates
|
|
|
|
#### Monthly
|
|
- Backup database
|
|
- Review security
|
|
- Update dependencies
|
|
|
|
### Updating the Application
|
|
|
|
```bash
|
|
# 1. Pull latest changes
|
|
git pull origin main
|
|
|
|
# 2. Backup database
|
|
cp data/devbench.db data/devbench.db.$(date +%Y%m%d)
|
|
|
|
# 3. Rebuild and restart
|
|
docker-compose down
|
|
docker-compose up -d --build
|
|
|
|
# 4. Verify
|
|
curl http://localhost:9090/health
|
|
```
|
|
|
|
### Viewing Logs
|
|
|
|
```bash
|
|
# Real-time logs
|
|
docker-compose logs -f
|
|
|
|
# Last 100 lines
|
|
docker-compose logs --tail=100
|
|
|
|
# Specific time range
|
|
docker-compose logs --since 2h
|
|
|
|
# Save logs to file
|
|
docker-compose logs > logs/docker-$(date +%Y%m%d).log
|
|
```
|
|
|
|
### Cleaning Up
|
|
|
|
```bash
|
|
# Remove stopped containers
|
|
docker container prune -f
|
|
|
|
# Remove unused images
|
|
docker image prune -a -f
|
|
|
|
# Remove unused volumes
|
|
docker volume prune -f
|
|
|
|
# Clean everything
|
|
docker system prune -a -f
|
|
```
|
|
|
|
### Scaling (Future)
|
|
|
|
For multiple instances:
|
|
|
|
```bash
|
|
# Scale to 3 instances
|
|
docker-compose up -d --scale devbench-manager=3
|
|
|
|
# Use load balancer (nginx/haproxy)
|
|
# Configure session persistence
|
|
```
|
|
|
|
## Backup & Recovery
|
|
|
|
### Backup Strategy
|
|
|
|
#### Database Backup
|
|
|
|
```bash
|
|
# Manual backup
|
|
cp data/devbench.db backups/devbench-$(date +%Y%m%d-%H%M%S).db
|
|
|
|
# Automated backup script
|
|
#!/bin/bash
|
|
BACKUP_DIR="backups"
|
|
mkdir -p $BACKUP_DIR
|
|
cp data/devbench.db $BACKUP_DIR/devbench-$(date +%Y%m%d).db
|
|
# Keep only last 7 days
|
|
find $BACKUP_DIR -name "devbench-*.db" -mtime +7 -delete
|
|
```
|
|
|
|
#### Full Backup
|
|
|
|
```bash
|
|
# Backup everything
|
|
tar -czf devbench-backup-$(date +%Y%m%d).tar.gz \
|
|
data/ \
|
|
logs/ \
|
|
config.js \
|
|
.env \
|
|
docker-compose.yml
|
|
```
|
|
|
|
### Recovery
|
|
|
|
#### Restore Database
|
|
|
|
```bash
|
|
# 1. Stop container
|
|
docker-compose down
|
|
|
|
# 2. Restore database
|
|
cp backups/devbench-20251123.db data/devbench.db
|
|
|
|
# 3. Start container
|
|
docker-compose up -d
|
|
|
|
# 4. Verify
|
|
curl http://localhost:9090/health
|
|
```
|
|
|
|
#### Full Recovery
|
|
|
|
```bash
|
|
# 1. Extract backup
|
|
tar -xzf devbench-backup-20251123.tar.gz
|
|
|
|
# 2. Deploy
|
|
./deploy.sh
|
|
|
|
# 3. Verify all services
|
|
```
|
|
|
|
### Disaster Recovery
|
|
|
|
#### Complete System Failure
|
|
|
|
```bash
|
|
# 1. Fresh installation
|
|
git clone <repository-url>
|
|
cd ASF_devbench
|
|
|
|
# 2. Restore backups
|
|
cp /backup/location/devbench.db data/
|
|
cp /backup/location/.env .
|
|
|
|
# 3. Deploy
|
|
./deploy.sh
|
|
|
|
# 4. Verify users and DevBenches
|
|
```
|
|
|
|
## Security Hardening
|
|
|
|
### Change Default Credentials
|
|
|
|
```bash
|
|
# 1. Login as admin
|
|
# 2. Go to admin panel
|
|
# 3. Reset admin password
|
|
# Or use API:
|
|
curl -X POST http://localhost:9090/admin/reset-password/1 \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"newPassword":"new-secure-password"}'
|
|
```
|
|
|
|
### Update Session Secret
|
|
|
|
Edit `.env`:
|
|
```bash
|
|
SECRET_KEY=$(openssl rand -base64 32)
|
|
```
|
|
|
|
Restart:
|
|
```bash
|
|
docker-compose restart
|
|
```
|
|
|
|
### Enable HTTPS
|
|
|
|
Use Caddy for automatic HTTPS:
|
|
```
|
|
tbm.nabd-co.com {
|
|
reverse_proxy devbench-manager:3001
|
|
}
|
|
```
|
|
|
|
### Restrict Access
|
|
|
|
Use firewall:
|
|
```bash
|
|
# Allow only specific IPs
|
|
sudo ufw allow from 192.168.1.0/24 to any port 9090
|
|
```
|
|
|
|
## Monitoring
|
|
|
|
### Health Monitoring
|
|
|
|
```bash
|
|
# Simple health check script
|
|
#!/bin/bash
|
|
if curl -sf http://localhost:9090/health > /dev/null; then
|
|
echo "OK"
|
|
else
|
|
echo "FAILED"
|
|
# Send alert
|
|
fi
|
|
```
|
|
|
|
### Log Monitoring
|
|
|
|
```bash
|
|
# Watch for errors
|
|
docker-compose logs -f | grep -i error
|
|
|
|
# Count errors
|
|
docker-compose logs | grep -i error | wc -l
|
|
```
|
|
|
|
### Resource Monitoring
|
|
|
|
```bash
|
|
# Container stats
|
|
docker stats devbench-manager
|
|
|
|
# Disk usage
|
|
du -sh data/ logs/
|
|
|
|
# Database size
|
|
ls -lh data/devbench.db
|
|
```
|
|
|
|
## Performance Tuning
|
|
|
|
### Database Optimization
|
|
|
|
```bash
|
|
# Vacuum database
|
|
docker exec devbench-manager sqlite3 /app/data/devbench.db "VACUUM;"
|
|
|
|
# Analyze database
|
|
docker exec devbench-manager sqlite3 /app/data/devbench.db "ANALYZE;"
|
|
```
|
|
|
|
### Container Resources
|
|
|
|
Edit `docker-compose.yml`:
|
|
```yaml
|
|
services:
|
|
devbench-manager:
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1.0'
|
|
memory: 512M
|
|
reservations:
|
|
cpus: '0.5'
|
|
memory: 256M
|
|
```
|
|
|
|
## Support
|
|
|
|
### Getting Help
|
|
|
|
1. Check logs: `docker-compose logs`
|
|
2. Review documentation in `/docs`
|
|
3. Check GitHub issues
|
|
4. Contact system administrator
|
|
|
|
### Reporting Issues
|
|
|
|
Include:
|
|
- Docker version: `docker --version`
|
|
- Docker Compose version: `docker-compose --version`
|
|
- Container logs: `docker-compose logs`
|
|
- Error messages
|
|
- Steps to reproduce
|