Installing iii
iii runs as a single binary that orchestrates your backend functions and triggers. Choose your preferred installation method below.
Quick Install (Recommended)
The fastest way to get started is with the installation script:
Default
Custom Directory
Specific Version
curl -fsSL https://install.iii.dev/iii/main/install.sh | sh
The installation script automatically detects your platform (Linux, macOS, Windows) and architecture (x86_64, ARM64).
Verify Installation
After installation, verify that iii is available:
command -v iii && iii --version
Expected output:
/usr/local/bin/iii
iii v0.7.0
Docker Installation
iii is available as a Docker image for containerized deployments.
Pull the Image
docker pull iiidev/iii:latest
Run with Docker
Create a config file (optional)
If you need custom module configuration, create a config.yaml file: modules :
- class : modules::rest_api::RestApiCoreModule
config :
host : 0.0.0.0
port : 3111
- class : modules::observability::OtelModule
config :
enabled : true
level : info
Run the container
docker run -p 3111:3111 -p 49134:49134 \
-v ./config.yaml:/app/config.yaml:ro \
iiidev/iii:latest
If you don’t provide a config file, iii loads default modules: HTTP, Queue, Cron, Stream, and Observability.
Verify the engine is running
The engine exposes several ports: Port Service 49134 WebSocket (worker connections) 3111 HTTP API 3112 Stream API 9464 Prometheus metrics
Production Docker Deployment
For production environments, use a hardened configuration:
docker run --read-only --tmpfs /tmp \
--cap-drop=ALL --cap-add=NET_BIND_SERVICE \
--security-opt=no-new-privileges:true \
-v ./config.yaml:/app/config.yaml:ro \
-p 3111:3111 -p 49134:49134 -p 3112:3112 -p 9464:9464 \
iiidev/iii:latest
Production images use distroless runtime (no shell, minimal attack surface) and run as non-root user.
Docker Compose
For a complete stack with Redis and RabbitMQ:
Create docker-compose.yml
services :
iii :
image : iiidev/iii:latest
ports :
- "49134:49134" # WebSocket
- "3111:3111" # REST API
- "3112:3112" # Stream API
- "9464:9464" # Metrics
volumes :
- ./config.yaml:/app/config.yaml:ro
environment :
- RUST_LOG=info
depends_on :
redis :
condition : service_healthy
restart : unless-stopped
redis :
image : redis:7-alpine
ports :
- "6379:6379"
volumes :
- redis_data:/data
healthcheck :
test : [ "CMD" , "redis-cli" , "ping" ]
interval : 5s
timeout : 3s
retries : 5
restart : unless-stopped
volumes :
redis_data :
Check status
docker compose ps
docker compose logs iii
Queue and Stream modules require Redis at redis://localhost:6379 by default. Override with environment variables in your config.
Build from Source
For development or custom builds:
Install Rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Clone the repository
git clone https://github.com/iii-hq/iii.git
cd iii
Build the binary
The binary will be at target/release/iii.
Run the engine
cargo run
# Or with config:
cargo run -- --config config.yaml
Development Commands
# Watch mode (requires cargo-watch)
make watch
# Lint and format
cargo fmt && cargo clippy -- -D warnings
# Run tests
cargo test
# Build Docker images locally
docker build -t iii:local . # production
docker build -f Dockerfile.debug -t iii:debug . # debug
Environment Configuration
iii supports environment variable expansion in config files:
modules :
- class : modules::queue::QueueModule
config :
adapter :
class : modules::queue::RedisAdapter
config :
redis_url : ${REDIS_URL:redis://localhost:6379}
The syntax ${VAR:default} reads from environment or uses the default value.
Next Steps
Start the Engine Learn how to start iii and connect your first worker
Install an SDK Install the Node.js, Python, or Rust SDK to write functions
Configure Modules Customize HTTP, Queue, Cron, Stream, and other modules
Production Setup Hardening, monitoring, and scaling for production
Default Modules : Without a config file, iii loads HTTP, Queue, Cron, Stream, and Observability modules. Queue and Stream expect Redis at redis://localhost:6379.