This guide covers deploying Kurpod using Docker with support for both x86_64 and ARM64 (Raspberry Pi) platforms.
# Pull latest image and run with docker-compose
docker compose pull
docker compose up -d# Build from this repository checkout
docker build -t kurpod:local .
# Run local image
docker run -p 3000:3000 -e BLOB_DIR=/data -v "$(pwd)/data:/data" kurpod:local- Base Image:
scratch(minimal, secure) - Final Size: ~39MB
- Architecture Support: x86_64, ARM64 (aarch64)
- Frontend: Embedded via
rust-embed(no separate serving needed)
The docker-compose.yml includes:
- Main Service: Kurpod server
- Nginx Proxy: Optional reverse proxy with HTTPS
- Security: Distroless container with minimal privileges
- Persistence: Named volume for encrypted data
services:
kurpod:
image: ghcr.io/srv1n/kurpod-server:latest
ports:
- "3000:3000"
volumes:
- kurpod_data:/data
environment:
- RUST_LOG=info
- BLOB_DIR=/data- Ensure you have ARM64 OS (64-bit Raspberry Pi OS)
- Use the multi-arch build script
- The image works on Pi 3B+ and newer
Standard Docker build works on all x86_64 systems.
- Build locally with
docker build -t kurpod:local . - Multi-architecture publishing is handled by GitHub Actions release workflows
- Distroless base: No shell, minimal attack surface
- Non-root execution: Runs as unprivileged user
- Read-only filesystem: Container filesystem is immutable
- Dropped capabilities: Minimal Linux capabilities
- No new privileges: Prevents privilege escalation
- Data Volume:
/data- Stores encrypted blobs - Persistence: Uses Docker named volumes
- Backup: Volume can be backed up/restored
- Port 3000: HTTP server (can be proxied)
- Health Check: Disabled (distroless has no tools)
- Reverse Proxy: Optional Nginx for HTTPS/domain
RUST_LOG: Log level (debug, info, warn, error)BLOB_DIR: Directory used for blob storage (set to/datain compose)
- No space left: Run
docker system prune -a - Buildx not available: Install Docker Desktop
- ARM64 build fails: Ensure cross-compilation tools
- Port conflicts: Change port mapping in docker-compose.yml
- Permission errors: Check volume permissions
- Memory issues: Increase Docker memory limit
For development with live reload:
# Build and run locally
cargo run --bin kurpod_server
# Frontend development
cd frontend && npm run dev-
Build multi-arch image:
docker buildx build --platform linux/amd64,linux/arm64 -t your-registry/kurpod:v1.0.0 --push . -
Deploy with docker-compose:
docker compose up -d
-
Setup reverse proxy (optional):
- Configure Nginx with SSL certificates
- Point domain to server
- Enable automatic renewal
-
Backup strategy:
# Backup data volume docker run --rm -v kurpod_data:/data -v $(pwd):/backup alpine tar czf /backup/kurpod_data.tar.gz /data
To distribute multi-arch images:
-
Build and push:
docker buildx build --platform linux/amd64,linux/arm64 -t your-registry/kurpod:v1.0.0 --push . -
Pull on target machine:
docker pull your-registry/kurpod:v1.0.0
-
Run anywhere:
docker run -p 3000:3000 -e BLOB_DIR=/data -v data:/data your-registry/kurpod:v1.0.0