# Docker Deployment Guide ## Quick Start ### 1. Basic Relay Setup ```bash # Build and start the relay docker-compose up -d # View logs docker-compose logs -f orly-relay # Stop the relay docker-compose down ``` ### 2. With Nginx Proxy (for SSL/domain setup) ```bash # Start relay with nginx proxy docker-compose --profile proxy up -d # Configure SSL certificates in nginx/ssl/ # Then update nginx/nginx.conf to enable HTTPS ``` ## Configuration ### Environment Variables Copy `env.example` to `.env` and customize: ```bash cp env.example .env # Edit .env with your settings ``` Key settings: - `ORLY_OWNERS`: Owner npubs (comma-separated, full control) - `ORLY_ADMINS`: Admin npubs (comma-separated, deletion permissions) - `ORLY_PORT`: Port to listen on (default: 7777) - `ORLY_MAX_CONNECTIONS`: Max concurrent connections - `ORLY_CONCURRENT_WORKERS`: CPU cores for concurrent processing (0 = auto) ### Data Persistence The relay data is stored in `./data` directory which is mounted as a volume. ### Performance Tuning Based on the v0.4.8 optimizations: - Concurrent event publishing using all CPU cores - Optimized BadgerDB access patterns - Configurable batch sizes and cache settings ## Development ### Local Build ```bash # Pull the latest image (recommended) docker pull silberengel/orly-relay:latest # Or build locally if needed docker build -t silberengel/orly-relay:latest . # Run with custom settings docker run -p 7777:7777 -v $(pwd)/data:/data silberengel/orly-relay:latest ``` ### Testing ```bash # Test WebSocket connection websocat ws://localhost:7777 # Run stress tests (if available in cmd/stresstest) go run ./cmd/stresstest -relay ws://localhost:7777 ``` ## Production Deployment ### SSL Setup 1. Get SSL certificates (Let's Encrypt recommended) 2. Place certificates in `nginx/ssl/` 3. Update `nginx/nginx.conf` to enable HTTPS 4. Start with proxy profile: `docker-compose --profile proxy up -d` ### Monitoring - Health checks are configured for both services - Logs are rotated (max 10MB, 3 files) - Resource limits are set to prevent runaway processes ### Security - Runs as non-root user (uid 1000) - Rate limiting configured in nginx - Configurable authentication and event size limits ## Troubleshooting ### Common Issues (Real-World Experience) #### **Container Issues:** 1. **Port already in use**: Change `ORLY_PORT` in docker-compose.yml 2. **Permission denied**: Ensure `./data` directory is writable 3. **Container won't start**: Check logs with `docker logs container-name` #### **WebSocket Issues:** 4. **HTTP 426 instead of WebSocket upgrade**: - Use `ws://127.0.0.1:7777` in proxy config, not `http://` - Ensure `proxy_wstunnel` module is enabled 5. **Connection refused in browser but works with websocat**: - Clear browser cache and service workers - Try incognito mode - Add CORS headers to Apache/nginx config #### **Plesk-Specific Issues:** 6. **Plesk not applying Apache directives**: - Check if config appears in `/etc/apache2/plesk.conf.d/vhosts/domain.conf` - Use direct Apache override if Plesk interface fails 7. **Virtual host conflicts**: - Check precedence with `apache2ctl -S` - Remove conflicting Plesk configs if needed #### **SSL Certificate Issues:** 8. **Self-signed certificate after Let's Encrypt**: - Plesk might not be using the correct certificate - Import Let's Encrypt certs into Plesk or use direct Apache config ### Debug Commands ```bash # Container debugging docker ps | grep relay docker logs orly-relay curl -I http://127.0.0.1:7777 # Should return HTTP 426 # WebSocket testing echo '["REQ","test",{}]' | websocat wss://domain.com/ echo '["REQ","test",{}]' | websocat wss://domain.com/ws/ # Apache debugging (for reverse proxy issues) apache2ctl -S | grep domain.com apache2ctl -M | grep -E "(proxy|rewrite)" grep ProxyPass /etc/apache2/plesk.conf.d/vhosts/domain.conf ``` ### Logs ```bash # View relay logs docker-compose logs -f orly-relay # View nginx logs (if using proxy) docker-compose logs -f nginx # Apache logs (for reverse proxy debugging) sudo tail -f /var/log/apache2/error.log sudo tail -f /var/log/apache2/domain-error.log ``` ### Working Reverse Proxy Config **For Apache (direct config file):** ```apache ServerName domain.com SSLEngine on SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem # Direct WebSocket proxy for Nostr relay ProxyRequests Off ProxyPreserveHost On ProxyPass / ws://127.0.0.1:7777/ ProxyPassReverse / ws://127.0.0.1:7777/ Header always set Access-Control-Allow-Origin "*" ``` --- *Crafted for Stella's digital forest* 🌲