Documentation Index
Fetch the complete documentation index at: https://mintlify.com/sockudo/sockudo/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Sockudo provides production-ready Docker images with multi-stage builds for optimal performance and security. Deploy as a single container or scale horizontally with Docker Compose.
Quick Start
# Clone and start with Docker Compose
git clone https://github.com/sockudo/sockudo.git
cd sockudo
make up
# Server runs on http://localhost:6001
# Metrics on http://localhost:9601/metrics
Dockerfile Structure
Sockudo uses a multi-stage Docker build for minimal runtime images:
Build Stage
FROM rust:1.93-bookworm AS builder
# Install dependencies for all features
RUN apt-get update && apt-get install -y \
pkg-config \
libpq-dev \
libmariadb-dev \
cmake \
libclang-dev \
clang
# Build with full feature set
RUN cargo build --release --features full
RUN strip target/release/sockudo
Runtime Stage
FROM debian:bookworm-slim AS runtime
# Install only runtime dependencies
RUN apt-get update && apt-get install -y \
ca-certificates \
libpq5 \
curl
# Non-root user for security
RUN groupadd -r sockudo && useradd -r -g sockudo sockudo
Basic Docker Compose
Minimal configuration for development:
services:
sockudo:
build:
context: .
dockerfile: Dockerfile
target: runtime
container_name: sockudo-server
restart: unless-stopped
environment:
RUST_LOG: "info,sockudo=debug"
DEBUG: "false"
HOST: "0.0.0.0"
PORT: "6001"
METRICS_PORT: "9601"
# Database Configuration
DATABASE_REDIS_HOST: "redis"
DATABASE_REDIS_PORT: "6379"
DATABASE_REDIS_PASSWORD: "${REDIS_PASSWORD:-}"
# Driver Configuration
ADAPTER_DRIVER: "redis"
CACHE_DRIVER: "redis"
QUEUE_DRIVER: "redis"
METRICS_DRIVER: "prometheus"
# Default App Configuration
SOCKUDO_DEFAULT_APP_ID: "demo-app"
SOCKUDO_DEFAULT_APP_KEY: "demo-key"
SOCKUDO_DEFAULT_APP_SECRET: "demo-secret"
SOCKUDO_DEFAULT_APP_MAX_CONNECTIONS: "1000"
ports:
- "6001:6001" # WebSocket/HTTP API
- "9601:9601" # Metrics
volumes:
- ./config:/app/config:ro
- ./logs:/app/logs
depends_on:
redis:
condition: service_healthy
redis:
image: redis:7-alpine
container_name: sockudo-redis
restart: unless-stopped
command: >
sh -c "
if [ -n \"$${REDIS_PASSWORD}\" ]; then
redis-server --requirepass $${REDIS_PASSWORD} --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
else
redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
fi
"
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
volumes:
redis-data:
driver: local
networks:
sockudo-network:
driver: bridge
Volume Mounts
Configuration Directory
Mount your config files as read-only:
volumes:
- ./config:/app/config:ro
The config directory should contain:
config.json - Main configuration file
apps.json - Application definitions (if using file-based app manager)
Log Directory
Persist logs to host:
volumes:
- ./logs:/app/logs
SSL Certificates
Mount certificates for production SSL:
volumes:
- ./ssl:/app/ssl:ro
# Or use Let's Encrypt
- /etc/letsencrypt/live/${DOMAIN}:/app/ssl:ro
Then configure SSL in environment:
environment:
SSL_ENABLED: "true"
SSL_CERT_PATH: "/app/ssl/fullchain.pem"
SSL_KEY_PATH: "/app/ssl/privkey.pem"
Environment Variables
Core Settings
environment:
# Server Configuration
HOST: "0.0.0.0"
PORT: "6001"
DEBUG: "false"
RUST_LOG: "info,sockudo=info"
# Instance Identity
INSTANCE_PROCESS_ID: "${HOSTNAME:-sockudo-1}"
SHUTDOWN_GRACE_PERIOD: "10"
Driver Configuration
environment:
# Horizontal Scaling
ADAPTER_DRIVER: "redis" # local, redis, redis-cluster, nats
# Caching
CACHE_DRIVER: "redis" # memory, redis, redis-cluster, none
# Background Jobs
QUEUE_DRIVER: "redis" # memory, redis, redis-cluster, sqs, none
# App Storage
APP_MANAGER_DRIVER: "memory" # memory, mysql, postgres, dynamodb
# Rate Limiting
RATE_LIMITER_DRIVER: "redis" # memory, redis, redis-cluster
# Metrics
METRICS_DRIVER: "prometheus"
METRICS_ENABLED: "true"
METRICS_HOST: "0.0.0.0"
METRICS_PORT: "9601"
METRICS_PROMETHEUS_PREFIX: "sockudo_"
Redis Configuration
environment:
# Redis Connection
DATABASE_REDIS_HOST: "redis"
DATABASE_REDIS_PORT: "6379"
DATABASE_REDIS_PASSWORD: "${REDIS_PASSWORD:-}"
DATABASE_REDIS_DB: "0"
DATABASE_REDIS_KEY_PREFIX: "sockudo:"
Or use a single connection string:
environment:
REDIS_URL: "redis://:password@redis:6379/0"
Default App Configuration
environment:
SOCKUDO_DEFAULT_APP_ID: "my-app"
SOCKUDO_DEFAULT_APP_KEY: "app-key-12345"
SOCKUDO_DEFAULT_APP_SECRET: "app-secret-67890"
SOCKUDO_DEFAULT_APP_ENABLED: "true"
SOCKUDO_DEFAULT_APP_MAX_CONNECTIONS: "10000"
SOCKUDO_DEFAULT_APP_MAX_CLIENT_EVENTS_PER_SECOND: "100"
SOCKUDO_DEFAULT_APP_MAX_READ_REQUESTS_PER_SECOND: "100"
SOCKUDO_ENABLE_CLIENT_MESSAGES: "true"
SOCKUDO_DEFAULT_APP_ENABLE_USER_AUTHENTICATION: "false"
SOCKUDO_DEFAULT_APP_ALLOWED_ORIGINS: "https://app.example.com,https://admin.example.com"
Health Checks
Sockudo Health Check
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:6001/up/demo-app"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
Change /up/demo-app to match your app ID, or use /up for general health check.
Redis Health Check
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
With password authentication:
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
Resource Limits
Set CPU and memory limits for production:
deploy:
resources:
limits:
memory: 512M
cpus: '1.0'
reservations:
memory: 256M
cpus: '0.5'
Adjust based on your deployment scenario (see Production page).
Logging Configuration
JSON Logs (for production)
environment:
LOG_OUTPUT_FORMAT: "json" # Must be environment variable
LOG_INCLUDE_TARGET: "true"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Human-Readable Logs (for development)
environment:
LOG_OUTPUT_FORMAT: "human"
LOG_COLORS_ENABLED: "true"
LOG_INCLUDE_TARGET: "true"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Multi-Container Setup
Include additional services:
services:
sockudo:
# ... sockudo config
redis:
# ... redis config
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: sockudo
MYSQL_USER: sockudo
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql-data:/var/lib/mysql
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
volumes:
- grafana-data:/var/lib/grafana
volumes:
redis-data:
mysql-data:
prometheus-data:
grafana-data:
Building Custom Images
Build with Specific Features
# Build stage with Redis only
RUN cargo build --release --features "redis"
# Build with Redis Cluster and PostgreSQL
RUN cargo build --release --features "redis-cluster,postgres"
# Full production build
RUN cargo build --release --features full
Custom Entrypoint
# Copy custom entrypoint script
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["sockudo", "--config", "/app/config/config.json"]
Docker Commands
# Start services
docker-compose up -d
# View logs
docker-compose logs -f sockudo
# Check health
docker-compose ps
# Scale instances (requires load balancer)
docker-compose up -d --scale sockudo=3
# Stop services
docker-compose down
# Remove volumes (careful!)
docker-compose down -v
# Rebuild after code changes
docker-compose up -d --build
Next Steps