init tools repo
This commit is contained in:
679
asf-cloud-server/TBM_devbench/docs/DEPLOYMENT.md
Normal file
679
asf-cloud-server/TBM_devbench/docs/DEPLOYMENT.md
Normal file
@@ -0,0 +1,679 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user