594 lines
12 KiB
Markdown
594 lines
12 KiB
Markdown
# Stoatchat Service Management
|
|
|
|
Complete guide for managing Stoatchat services on the Seattle VM.
|
|
|
|
## Service Architecture
|
|
|
|
```
|
|
Stoatchat Services (Native Binaries)
|
|
├── revolt-delta (API Server) → Port 14702
|
|
├── revolt-bonfire (Events WebSocket) → Port 14703
|
|
├── revolt-autumn (File Server) → Port 14704
|
|
├── revolt-january (Media Proxy) → Port 14705
|
|
└── revolt-gifbox (GIF Service) → Port 14706
|
|
|
|
Infrastructure Services (Docker)
|
|
├── Redis (KeyDB) → Port 6380
|
|
├── MongoDB → Port 27017
|
|
├── MinIO → Port 14009
|
|
└── LiveKit → Port 7880
|
|
|
|
System Services
|
|
└── Nginx → Ports 80, 443
|
|
```
|
|
|
|
## Starting Services
|
|
|
|
### 1. Start Infrastructure Services
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Start all Docker services
|
|
docker-compose up -d
|
|
|
|
# Check status
|
|
docker-compose ps
|
|
|
|
# Wait for services to be ready (important!)
|
|
sleep 30
|
|
```
|
|
|
|
### 2. Start Stoatchat Services
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Start all services in background
|
|
nohup ./target/debug/revolt-delta > api.log 2>&1 &
|
|
nohup ./target/debug/revolt-bonfire > events.log 2>&1 &
|
|
nohup ./target/debug/revolt-autumn > files.log 2>&1 &
|
|
nohup ./target/debug/revolt-january > proxy.log 2>&1 &
|
|
nohup ./target/debug/revolt-gifbox > gifbox.log 2>&1 &
|
|
|
|
echo "All Stoatchat services started"
|
|
```
|
|
|
|
### 3. Automated Startup Script
|
|
```bash
|
|
# Create startup script
|
|
cat > /root/stoatchat/start-all-services.sh << 'EOF'
|
|
#!/bin/bash
|
|
cd /root/stoatchat
|
|
|
|
echo "Starting infrastructure services..."
|
|
docker-compose up -d
|
|
|
|
echo "Waiting for infrastructure to be ready..."
|
|
sleep 30
|
|
|
|
echo "Starting Stoatchat services..."
|
|
nohup ./target/debug/revolt-delta > api.log 2>&1 &
|
|
nohup ./target/debug/revolt-bonfire > events.log 2>&1 &
|
|
nohup ./target/debug/revolt-autumn > files.log 2>&1 &
|
|
nohup ./target/debug/revolt-january > proxy.log 2>&1 &
|
|
nohup ./target/debug/revolt-gifbox > gifbox.log 2>&1 &
|
|
|
|
echo "All services started. Checking status..."
|
|
sleep 5
|
|
ps aux | grep revolt | grep -v grep
|
|
EOF
|
|
|
|
chmod +x /root/stoatchat/start-all-services.sh
|
|
```
|
|
|
|
## Stopping Services
|
|
|
|
### 1. Stop Stoatchat Services
|
|
```bash
|
|
# Stop all revolt processes
|
|
pkill -f revolt-
|
|
|
|
# Or stop individually
|
|
pkill -f revolt-delta # API
|
|
pkill -f revolt-bonfire # Events
|
|
pkill -f revolt-autumn # Files
|
|
pkill -f revolt-january # Proxy
|
|
pkill -f revolt-gifbox # GIF
|
|
```
|
|
|
|
### 2. Stop Infrastructure Services
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Stop all Docker services
|
|
docker-compose down
|
|
|
|
# Or stop individually
|
|
docker-compose stop redis
|
|
docker-compose stop database
|
|
docker-compose stop minio
|
|
docker-compose stop livekit
|
|
```
|
|
|
|
### 3. Complete Shutdown Script
|
|
```bash
|
|
# Create shutdown script
|
|
cat > /root/stoatchat/stop-all-services.sh << 'EOF'
|
|
#!/bin/bash
|
|
cd /root/stoatchat
|
|
|
|
echo "Stopping Stoatchat services..."
|
|
pkill -f revolt-
|
|
|
|
echo "Stopping infrastructure services..."
|
|
docker-compose down
|
|
|
|
echo "All services stopped."
|
|
EOF
|
|
|
|
chmod +x /root/stoatchat/stop-all-services.sh
|
|
```
|
|
|
|
## Restarting Services
|
|
|
|
### 1. Restart Individual Stoatchat Service
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Example: Restart API server
|
|
pkill -f revolt-delta
|
|
nohup ./target/debug/revolt-delta > api.log 2>&1 &
|
|
|
|
# Example: Restart Events service
|
|
pkill -f revolt-bonfire
|
|
nohup ./target/debug/revolt-bonfire > events.log 2>&1 &
|
|
```
|
|
|
|
### 2. Restart Infrastructure Service
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Example: Restart Redis
|
|
docker-compose restart redis
|
|
|
|
# Example: Restart MongoDB
|
|
docker-compose restart database
|
|
```
|
|
|
|
### 3. Complete Restart
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Stop everything
|
|
./stop-all-services.sh
|
|
|
|
# Wait a moment
|
|
sleep 5
|
|
|
|
# Start everything
|
|
./start-all-services.sh
|
|
```
|
|
|
|
## Service Status Monitoring
|
|
|
|
### 1. Check Running Processes
|
|
```bash
|
|
# Check all Stoatchat processes
|
|
ps aux | grep revolt | grep -v grep
|
|
|
|
# Check specific service
|
|
ps aux | grep revolt-delta
|
|
|
|
# Check with process tree
|
|
pstree -p | grep revolt
|
|
```
|
|
|
|
### 2. Check Listening Ports
|
|
```bash
|
|
# Check all Stoatchat ports
|
|
ss -tlnp | grep -E "(14702|14703|14704|14705|14706|7880)"
|
|
|
|
# Check specific port
|
|
ss -tlnp | grep 14702
|
|
|
|
# Check with netstat
|
|
netstat -tlnp | grep -E "(14702|14703|14704|14705|14706|7880)"
|
|
```
|
|
|
|
### 3. Check Docker Services
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Check all services
|
|
docker-compose ps
|
|
|
|
# Check specific service
|
|
docker-compose ps redis
|
|
|
|
# Check service logs
|
|
docker-compose logs redis
|
|
docker-compose logs database
|
|
docker-compose logs minio
|
|
docker-compose logs livekit
|
|
```
|
|
|
|
### 4. Service Health Check
|
|
```bash
|
|
# Test all endpoints
|
|
curl -s https://api.st.vish.gg/ | jq .revolt
|
|
curl -s https://files.st.vish.gg/ | jq .autumn
|
|
curl -s https://proxy.st.vish.gg/ | jq .january
|
|
curl -s https://voice.st.vish.gg/
|
|
|
|
# Or use the health check script
|
|
/root/stoatchat/health-check.sh
|
|
```
|
|
|
|
## Log Management
|
|
|
|
### 1. View Service Logs
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# View current logs
|
|
tail -f api.log # API server
|
|
tail -f events.log # Events WebSocket
|
|
tail -f files.log # File server
|
|
tail -f proxy.log # Media proxy
|
|
tail -f gifbox.log # GIF service
|
|
|
|
# View all logs simultaneously
|
|
tail -f *.log
|
|
|
|
# View with timestamps
|
|
tail -f api.log | while read line; do echo "$(date): $line"; done
|
|
```
|
|
|
|
### 2. Log Rotation
|
|
```bash
|
|
# Create log rotation script
|
|
cat > /root/stoatchat/rotate-logs.sh << 'EOF'
|
|
#!/bin/bash
|
|
cd /root/stoatchat
|
|
|
|
# Rotate logs if they're larger than 100MB
|
|
for log in api.log events.log files.log proxy.log gifbox.log; do
|
|
if [ -f "$log" ] && [ $(stat -f%z "$log" 2>/dev/null || stat -c%s "$log") -gt 104857600 ]; then
|
|
mv "$log" "$log.$(date +%Y%m%d-%H%M%S)"
|
|
touch "$log"
|
|
echo "Rotated $log"
|
|
fi
|
|
done
|
|
EOF
|
|
|
|
chmod +x /root/stoatchat/rotate-logs.sh
|
|
|
|
# Add to crontab for daily rotation
|
|
# crontab -e
|
|
# 0 2 * * * /root/stoatchat/rotate-logs.sh
|
|
```
|
|
|
|
### 3. Clear Logs
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Clear all logs
|
|
> api.log
|
|
> events.log
|
|
> files.log
|
|
> proxy.log
|
|
> gifbox.log
|
|
|
|
# Or remove and recreate
|
|
rm -f *.log
|
|
touch api.log events.log files.log proxy.log gifbox.log
|
|
```
|
|
|
|
## Configuration Management
|
|
|
|
### 1. Backup Configuration
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Create backup
|
|
cp Revolt.overrides.toml Revolt.overrides.toml.backup.$(date +%Y%m%d)
|
|
cp livekit.yml livekit.yml.backup.$(date +%Y%m%d)
|
|
cp compose.yml compose.yml.backup.$(date +%Y%m%d)
|
|
```
|
|
|
|
### 2. Apply Configuration Changes
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# After editing Revolt.overrides.toml
|
|
# Restart affected services
|
|
pkill -f revolt-
|
|
./start-all-services.sh
|
|
|
|
# After editing livekit.yml
|
|
docker-compose restart livekit
|
|
|
|
# After editing compose.yml
|
|
docker-compose down
|
|
docker-compose up -d
|
|
```
|
|
|
|
### 3. Validate Configuration
|
|
```bash
|
|
cd /root/stoatchat
|
|
|
|
# Check TOML syntax
|
|
python3 -c "import toml; toml.load('Revolt.overrides.toml')" && echo "TOML valid"
|
|
|
|
# Check YAML syntax
|
|
python3 -c "import yaml; yaml.safe_load(open('livekit.yml'))" && echo "YAML valid"
|
|
python3 -c "import yaml; yaml.safe_load(open('compose.yml'))" && echo "Compose valid"
|
|
|
|
# Check nginx configuration
|
|
nginx -t
|
|
```
|
|
|
|
## Systemd Service Setup (Optional)
|
|
|
|
### 1. Create Systemd Services
|
|
```bash
|
|
# API Service
|
|
cat > /etc/systemd/system/stoatchat-api.service << 'EOF'
|
|
[Unit]
|
|
Description=Stoatchat API Server
|
|
After=network.target docker.service
|
|
Requires=docker.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=root
|
|
WorkingDirectory=/root/stoatchat
|
|
ExecStart=/root/stoatchat/target/debug/revolt-delta
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=append:/root/stoatchat/api.log
|
|
StandardError=append:/root/stoatchat/api.log
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Events Service
|
|
cat > /etc/systemd/system/stoatchat-events.service << 'EOF'
|
|
[Unit]
|
|
Description=Stoatchat Events WebSocket
|
|
After=network.target docker.service stoatchat-api.service
|
|
Requires=docker.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=root
|
|
WorkingDirectory=/root/stoatchat
|
|
ExecStart=/root/stoatchat/target/debug/revolt-bonfire
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=append:/root/stoatchat/events.log
|
|
StandardError=append:/root/stoatchat/events.log
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Files Service
|
|
cat > /etc/systemd/system/stoatchat-files.service << 'EOF'
|
|
[Unit]
|
|
Description=Stoatchat File Server
|
|
After=network.target docker.service
|
|
Requires=docker.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=root
|
|
WorkingDirectory=/root/stoatchat
|
|
ExecStart=/root/stoatchat/target/debug/revolt-autumn
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=append:/root/stoatchat/files.log
|
|
StandardError=append:/root/stoatchat/files.log
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Proxy Service
|
|
cat > /etc/systemd/system/stoatchat-proxy.service << 'EOF'
|
|
[Unit]
|
|
Description=Stoatchat Media Proxy
|
|
After=network.target docker.service
|
|
Requires=docker.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=root
|
|
WorkingDirectory=/root/stoatchat
|
|
ExecStart=/root/stoatchat/target/debug/revolt-january
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=append:/root/stoatchat/proxy.log
|
|
StandardError=append:/root/stoatchat/proxy.log
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# GIF Service
|
|
cat > /etc/systemd/system/stoatchat-gifbox.service << 'EOF'
|
|
[Unit]
|
|
Description=Stoatchat GIF Service
|
|
After=network.target docker.service
|
|
Requires=docker.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=root
|
|
WorkingDirectory=/root/stoatchat
|
|
ExecStart=/root/stoatchat/target/debug/revolt-gifbox
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=append:/root/stoatchat/gifbox.log
|
|
StandardError=append:/root/stoatchat/gifbox.log
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
```
|
|
|
|
### 2. Enable and Start Systemd Services
|
|
```bash
|
|
# Reload systemd
|
|
systemctl daemon-reload
|
|
|
|
# Enable services
|
|
systemctl enable stoatchat-api
|
|
systemctl enable stoatchat-events
|
|
systemctl enable stoatchat-files
|
|
systemctl enable stoatchat-proxy
|
|
systemctl enable stoatchat-gifbox
|
|
|
|
# Start services
|
|
systemctl start stoatchat-api
|
|
systemctl start stoatchat-events
|
|
systemctl start stoatchat-files
|
|
systemctl start stoatchat-proxy
|
|
systemctl start stoatchat-gifbox
|
|
|
|
# Check status
|
|
systemctl status stoatchat-api
|
|
systemctl status stoatchat-events
|
|
systemctl status stoatchat-files
|
|
systemctl status stoatchat-proxy
|
|
systemctl status stoatchat-gifbox
|
|
```
|
|
|
|
### 3. Manage with Systemd
|
|
```bash
|
|
# Start all services
|
|
systemctl start stoatchat-api stoatchat-events stoatchat-files stoatchat-proxy stoatchat-gifbox
|
|
|
|
# Stop all services
|
|
systemctl stop stoatchat-api stoatchat-events stoatchat-files stoatchat-proxy stoatchat-gifbox
|
|
|
|
# Restart all services
|
|
systemctl restart stoatchat-api stoatchat-events stoatchat-files stoatchat-proxy stoatchat-gifbox
|
|
|
|
# Check status of all services
|
|
systemctl status stoatchat-*
|
|
```
|
|
|
|
## Maintenance Tasks
|
|
|
|
### 1. Regular Maintenance
|
|
```bash
|
|
# Weekly maintenance script
|
|
cat > /root/stoatchat/weekly-maintenance.sh << 'EOF'
|
|
#!/bin/bash
|
|
cd /root/stoatchat
|
|
|
|
echo "=== Weekly Stoatchat Maintenance ==="
|
|
echo "Date: $(date)"
|
|
|
|
# Rotate logs
|
|
./rotate-logs.sh
|
|
|
|
# Update Docker images
|
|
docker-compose pull
|
|
|
|
# Restart services with new images
|
|
docker-compose down
|
|
docker-compose up -d
|
|
|
|
# Clean up old Docker images
|
|
docker image prune -f
|
|
|
|
# Check disk usage
|
|
echo "Disk usage:"
|
|
df -h /root/stoatchat
|
|
|
|
echo "Maintenance completed."
|
|
EOF
|
|
|
|
chmod +x /root/stoatchat/weekly-maintenance.sh
|
|
```
|
|
|
|
### 2. Update Procedures
|
|
```bash
|
|
# Update Stoatchat code
|
|
cd /root/stoatchat
|
|
git pull origin main
|
|
|
|
# Rebuild services
|
|
cargo build
|
|
|
|
# Restart services
|
|
./stop-all-services.sh
|
|
./start-all-services.sh
|
|
```
|
|
|
|
### 3. Backup Procedures
|
|
```bash
|
|
# Create backup script
|
|
cat > /root/stoatchat/backup.sh << 'EOF'
|
|
#!/bin/bash
|
|
BACKUP_DIR="/root/stoatchat-backups/$(date +%Y%m%d)"
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
cd /root/stoatchat
|
|
|
|
# Backup configuration
|
|
cp Revolt.overrides.toml "$BACKUP_DIR/"
|
|
cp livekit.yml "$BACKUP_DIR/"
|
|
cp compose.yml "$BACKUP_DIR/"
|
|
|
|
# Backup MongoDB
|
|
docker exec stoatchat-mongodb mongodump --out "$BACKUP_DIR/mongodb"
|
|
|
|
# Backup MinIO data
|
|
docker exec stoatchat-minio tar czf - /data > "$BACKUP_DIR/minio-data.tar.gz"
|
|
|
|
echo "Backup completed: $BACKUP_DIR"
|
|
EOF
|
|
|
|
chmod +x /root/stoatchat/backup.sh
|
|
```
|
|
|
|
## Quick Reference
|
|
|
|
### Essential Commands
|
|
```bash
|
|
# Start everything
|
|
cd /root/stoatchat && ./start-all-services.sh
|
|
|
|
# Stop everything
|
|
cd /root/stoatchat && ./stop-all-services.sh
|
|
|
|
# Check status
|
|
ps aux | grep revolt && docker-compose ps
|
|
|
|
# View logs
|
|
cd /root/stoatchat && tail -f *.log
|
|
|
|
# Test endpoints
|
|
curl https://api.st.vish.gg/ && curl https://files.st.vish.gg/
|
|
```
|
|
|
|
### Service Ports
|
|
- API (revolt-delta): 14702
|
|
- Events (revolt-bonfire): 14703
|
|
- Files (revolt-autumn): 14704
|
|
- Proxy (revolt-january): 14705
|
|
- GIF (revolt-gifbox): 14706
|
|
- LiveKit: 7880
|
|
- Redis: 6380
|
|
- MongoDB: 27017
|
|
- MinIO: 14009
|
|
|
|
### Important Files
|
|
- Configuration: `/root/stoatchat/Revolt.overrides.toml`
|
|
- LiveKit config: `/root/stoatchat/livekit.yml`
|
|
- Docker config: `/root/stoatchat/compose.yml`
|
|
- Nginx config: `/etc/nginx/sites-available/stoatchat`
|
|
- Logs: `/root/stoatchat/*.log` |