423 lines
9.9 KiB
Markdown
423 lines
9.9 KiB
Markdown
# Stoatchat (Revolt Chat Backend) Setup Guide
|
|
|
|
**🟢 Chat Service**
|
|
|
|
## 📋 Service Overview
|
|
|
|
| Property | Value |
|
|
|----------|-------|
|
|
| **Service Name** | stoatchat (Revolt Chat Backend) |
|
|
| **Host** | homelab_vm |
|
|
| **Category** | Communication |
|
|
| **Difficulty** | 🔴 Advanced |
|
|
| **Domain** | st.vish.gg |
|
|
| **Repository** | https://github.com/stoatchat/stoatchat |
|
|
| **Technology** | Rust, MongoDB, Redis, MinIO |
|
|
|
|
## 🎯 Purpose
|
|
|
|
Stoatchat is a self-hosted Revolt chat backend that provides a Discord-like chat experience with full control over your data. It includes API, WebSocket events, file handling, media proxy, and voice chat capabilities.
|
|
|
|
## 🏗️ Architecture
|
|
|
|
### Core Services
|
|
- **API Server** (revolt-delta): Main REST API endpoint
|
|
- **Events Server** (revolt-bonfire): WebSocket events and real-time communication
|
|
- **Files Server** (revolt-autumn): File uploads, downloads, and storage
|
|
- **Proxy Server** (revolt-january): Media proxy and external content handling
|
|
- **Gifbox Server** (revolt-gifbox): GIF processing and optimization
|
|
|
|
### Background Services
|
|
- **Push Daemon** (revolt-pushd): Push notifications
|
|
- **Cron Daemon** (revolt-crond): Scheduled tasks and maintenance
|
|
|
|
### Supporting Infrastructure
|
|
- **MongoDB**: Primary database
|
|
- **Redis/KeyDB**: Caching and session management
|
|
- **MinIO**: S3-compatible object storage for files
|
|
- **RabbitMQ**: Message queuing
|
|
- **MailDev**: Email testing (development)
|
|
- **LiveKit**: Voice and video chat (optional)
|
|
|
|
## 🚀 Quick Start
|
|
|
|
### Prerequisites
|
|
- Ubuntu/Debian Linux system
|
|
- Docker and Docker Compose
|
|
- Rust toolchain (managed via mise)
|
|
- Domain with Cloudflare DNS (st.vish.gg)
|
|
- At least 4GB RAM and 20GB storage
|
|
|
|
### Installation Steps
|
|
|
|
1. **Clone the Repository**
|
|
```bash
|
|
git clone https://github.com/stoatchat/stoatchat.git
|
|
cd stoatchat
|
|
```
|
|
|
|
2. **Install Dependencies**
|
|
```bash
|
|
# Install mise (Rust toolchain manager)
|
|
curl https://mise.run | sh
|
|
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
|
|
source ~/.bashrc
|
|
|
|
# Install system dependencies
|
|
sudo apt update
|
|
sudo apt install -y pkg-config libssl-dev build-essential
|
|
```
|
|
|
|
3. **Configure LiveKit**
|
|
```bash
|
|
cp livekit.example.yml livekit.yml
|
|
# Edit livekit.yml with your configuration
|
|
```
|
|
|
|
4. **Create Production Configuration**
|
|
```bash
|
|
# Create Revolt.overrides.toml with domain settings
|
|
cat > Revolt.overrides.toml << 'EOF'
|
|
[api]
|
|
url = "https://api.st.vish.gg"
|
|
|
|
[events]
|
|
url = "wss://events.st.vish.gg"
|
|
|
|
[autumn]
|
|
url = "https://files.st.vish.gg"
|
|
|
|
[january]
|
|
url = "https://proxy.st.vish.gg"
|
|
|
|
[livekit]
|
|
url = "wss://voice.st.vish.gg"
|
|
|
|
[email]
|
|
smtp_host = "protonmail-bridge"
|
|
smtp_port = 25
|
|
smtp_username = ""
|
|
smtp_password = ""
|
|
from_address = "noreply@st.vish.gg"
|
|
EOF
|
|
```
|
|
|
|
5. **Start Supporting Services**
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
6. **Build and Start Stoatchat Services**
|
|
```bash
|
|
# Build the project
|
|
mise run build
|
|
|
|
# Start all services
|
|
mise service:api > api.log 2>&1 &
|
|
mise service:events > events.log 2>&1 &
|
|
mise service:files > files.log 2>&1 &
|
|
mise service:proxy > proxy.log 2>&1 &
|
|
mise service:gifbox > gifbox.log 2>&1 &
|
|
mise service:pushd > pushd.log 2>&1 &
|
|
mise service:crond > crond.log 2>&1 &
|
|
```
|
|
|
|
## 🔧 Configuration
|
|
|
|
### Domain Configuration (st.vish.gg)
|
|
|
|
The following subdomains need to be configured in Cloudflare:
|
|
|
|
| Subdomain | Purpose | Local Port | SSL Required |
|
|
|-----------|---------|------------|--------------|
|
|
| `st.vish.gg` | Main web app | - | Yes |
|
|
| `api.st.vish.gg` | REST API | 14702 | Yes |
|
|
| `events.st.vish.gg` | WebSocket events | 14703 | Yes |
|
|
| `files.st.vish.gg` | File uploads/downloads | 14704 | Yes |
|
|
| `proxy.st.vish.gg` | Media proxy | 14705 | Yes |
|
|
| `voice.st.vish.gg` | Voice chat (LiveKit) | - | Yes |
|
|
|
|
### Cloudflare Tunnel Configuration
|
|
|
|
Add these entries to your Cloudflare Tunnel configuration:
|
|
|
|
```yaml
|
|
tunnel: your-tunnel-id
|
|
credentials-file: /path/to/credentials.json
|
|
|
|
ingress:
|
|
- hostname: api.st.vish.gg
|
|
service: http://localhost:14702
|
|
- hostname: events.st.vish.gg
|
|
service: http://localhost:14703
|
|
- hostname: files.st.vish.gg
|
|
service: http://localhost:14704
|
|
- hostname: proxy.st.vish.gg
|
|
service: http://localhost:14705
|
|
- hostname: st.vish.gg
|
|
service: https://app.revolt.chat
|
|
- service: http_status:404
|
|
```
|
|
|
|
### Email Configuration
|
|
|
|
Stoatchat uses Gmail SMTP for email notifications:
|
|
|
|
```toml
|
|
[email]
|
|
smtp_host = "smtp.gmail.com"
|
|
smtp_port = 587
|
|
smtp_username = "your-email@example.com"
|
|
smtp_password = "REDACTED_PASSWORD"
|
|
from_address = "your-email@example.com"
|
|
smtp_tls = true
|
|
```
|
|
|
|
**Note**: You'll need to generate a Gmail App Password:
|
|
1. Go to Google Account settings
|
|
2. Enable 2-Factor Authentication
|
|
3. Generate an App Password for "Mail"
|
|
4. Use this App Password in the configuration
|
|
|
|
### Environment Variables
|
|
|
|
Key environment variables in `Revolt.overrides.toml`:
|
|
|
|
```toml
|
|
[database]
|
|
mongodb = "mongodb://localhost:27017/revolt"
|
|
|
|
[redis]
|
|
url = "redis://localhost:6380"
|
|
|
|
[s3]
|
|
endpoint = "http://localhost:14009"
|
|
access_key_id = "minioadmin"
|
|
secret_access_key = "minioadmin"
|
|
bucket = "revolt-files"
|
|
region = "us-east-1"
|
|
|
|
[rabbitmq]
|
|
url = "amqp://guest:guest@localhost:5672"
|
|
```
|
|
|
|
## 🌐 Service Ports
|
|
|
|
### Stoatchat Services
|
|
| Service | Port | Purpose |
|
|
|---------|------|---------|
|
|
| revolt-delta (API) | 14702 | REST API endpoints |
|
|
| revolt-bonfire (Events) | 14703 | WebSocket connections |
|
|
| revolt-autumn (Files) | 14704 | File upload/download |
|
|
| revolt-january (Proxy) | 14705 | Media proxy |
|
|
| revolt-gifbox | 14706 | GIF processing |
|
|
|
|
### Supporting Services
|
|
| Service | Port | Purpose |
|
|
|---------|------|---------|
|
|
| MongoDB | 27017 | Database |
|
|
| Redis/KeyDB | 6380 | Cache |
|
|
| MinIO API | 14009 | Object storage API |
|
|
| MinIO Console | 14010 | Storage management |
|
|
| RabbitMQ | 5672 | Message queue |
|
|
| RabbitMQ Management | 15672 | Queue management |
|
|
| MailDev Web | 14080 | Email testing |
|
|
| MailDev SMTP | 14025 | Email relay |
|
|
|
|
## 🔒 Security Considerations
|
|
|
|
### Firewall Configuration
|
|
```bash
|
|
# Allow only necessary ports
|
|
sudo ufw allow 22/tcp # SSH
|
|
sudo ufw allow 80/tcp # HTTP (redirect)
|
|
sudo ufw allow 443/tcp # HTTPS
|
|
sudo ufw enable
|
|
```
|
|
|
|
### SSL/TLS
|
|
- All external traffic must use HTTPS/WSS
|
|
- Cloudflare provides SSL termination
|
|
- Internal services communicate over HTTP (behind proxy)
|
|
|
|
### Authentication
|
|
- Configure user registration settings in `Revolt.overrides.toml`
|
|
- Set up admin accounts after deployment
|
|
- Consider enabling invite-only mode for private instances
|
|
|
|
## 📊 Resource Requirements
|
|
|
|
### Minimum Requirements
|
|
- **CPU**: 4 cores
|
|
- **RAM**: 4GB
|
|
- **Storage**: 20GB SSD
|
|
- **Network**: 100Mbps
|
|
|
|
### Recommended Production
|
|
- **CPU**: 8 cores
|
|
- **RAM**: 8GB+
|
|
- **Storage**: 100GB+ SSD
|
|
- **Network**: 1Gbps
|
|
|
|
### Resource Monitoring
|
|
```bash
|
|
# Monitor all services
|
|
docker stats
|
|
htop
|
|
|
|
# Check service logs
|
|
tail -f api.log events.log files.log
|
|
|
|
# Monitor disk usage
|
|
df -h
|
|
du -sh /var/lib/docker/
|
|
```
|
|
|
|
## 🔍 Health Monitoring
|
|
|
|
### Service Status Checks
|
|
```bash
|
|
# Check if services are running
|
|
ss -tlnp | grep revolt
|
|
|
|
# Test API endpoint
|
|
curl -s http://localhost:14702/0.8/ | jq
|
|
|
|
# Test file service
|
|
curl -s http://localhost:14704/ | jq
|
|
|
|
# Check WebSocket (requires wscat)
|
|
wscat -c ws://localhost:14703/
|
|
```
|
|
|
|
### Log Monitoring
|
|
```bash
|
|
# View real-time logs
|
|
tail -f *.log
|
|
|
|
# Check for errors
|
|
grep -i error *.log
|
|
|
|
# Monitor resource usage
|
|
docker stats --no-stream
|
|
```
|
|
|
|
## 🚨 Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
**Services won't start**
|
|
```bash
|
|
# Check dependencies
|
|
docker-compose ps
|
|
|
|
# Verify build
|
|
mise run build
|
|
|
|
# Check logs
|
|
tail -f api.log
|
|
```
|
|
|
|
**Database connection issues**
|
|
```bash
|
|
# Test MongoDB connection
|
|
docker exec -it stoatchat-database-1 mongosh
|
|
|
|
# Check Redis connection
|
|
docker exec -it stoatchat-redis-1 redis-cli ping
|
|
```
|
|
|
|
**File upload problems**
|
|
```bash
|
|
# Check MinIO status
|
|
curl http://localhost:14009/minio/health/live
|
|
|
|
# Verify bucket exists
|
|
docker exec -it stoatchat-minio-1 mc ls local/
|
|
```
|
|
|
|
**WebSocket connection failures**
|
|
```bash
|
|
# Check events service
|
|
curl -I http://localhost:14703/
|
|
|
|
# Verify proxy configuration
|
|
curl -H "Upgrade: websocket" http://localhost:14703/
|
|
```
|
|
|
|
### Performance Issues
|
|
```bash
|
|
# Monitor resource usage
|
|
htop
|
|
iotop
|
|
nethogs
|
|
|
|
# Check database performance
|
|
docker exec -it stoatchat-database-1 mongosh --eval "db.stats()"
|
|
|
|
# Analyze slow queries
|
|
docker logs stoatchat-database-1 | grep slow
|
|
```
|
|
|
|
## 🔄 Maintenance
|
|
|
|
### Regular Tasks
|
|
```bash
|
|
# Update services
|
|
git pull
|
|
mise run build
|
|
# Restart services
|
|
|
|
# Clean up logs
|
|
find . -name "*.log" -size +100M -delete
|
|
|
|
# Database maintenance
|
|
docker exec -it stoatchat-database-1 mongosh --eval "db.runCommand({compact: 'messages'})"
|
|
```
|
|
|
|
### Backup Procedures
|
|
```bash
|
|
# Backup database
|
|
docker exec stoatchat-database-1 mongodump --out /backup/$(date +%Y%m%d)
|
|
|
|
# Backup files
|
|
rsync -av /var/lib/docker/volumes/stoatchat_minio_data/ /backup/files/
|
|
|
|
# Backup configuration
|
|
cp Revolt.overrides.toml /backup/config/
|
|
```
|
|
|
|
### Updates
|
|
```bash
|
|
# Update stoatchat
|
|
git pull origin main
|
|
mise run build
|
|
|
|
# Restart services (zero-downtime)
|
|
# Stop services one by one and restart
|
|
pkill -f revolt-delta
|
|
mise service:api > api.log 2>&1 &
|
|
# Repeat for other services
|
|
```
|
|
|
|
## 📚 Additional Resources
|
|
|
|
- **Official Documentation**: https://developers.revolt.chat/
|
|
- **GitHub Repository**: https://github.com/stoatchat/stoatchat
|
|
- **Community Discord**: https://revolt.chat/invite/01F7ZSBSFHQ8TA81725KQCSDDP
|
|
- **API Documentation**: https://developers.revolt.chat/api/
|
|
- **Self-hosting Guide**: https://developers.revolt.chat/self-hosting/
|
|
|
|
## 🔗 Related Services
|
|
|
|
- **Gmail SMTP**: Email integration
|
|
- **Cloudflare Tunnel**: External access
|
|
- **Nginx Proxy Manager**: Alternative reverse proxy
|
|
- **Authentik**: SSO integration (future)
|
|
|
|
---
|
|
|
|
*This documentation covers the complete setup and maintenance of Stoatchat for the st.vish.gg domain.*
|
|
|
|
**Last Updated**: $(date +%Y-%m-%d)
|
|
**Configuration**: Production setup with ProtonMail integration |