Skip to main content

Installing iii

iii runs as a single binary that orchestrates your backend functions and triggers. Choose your preferred installation method below. The fastest way to get started is with the installation script:
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

1

Create a config file (optional)

If you need custom module configuration, create a config.yaml file:
config.yaml
modules:
  - class: modules::rest_api::RestApiCoreModule
    config:
      host: 0.0.0.0
      port: 3111
  - class: modules::observability::OtelModule
    config:
      enabled: true
      level: info
2

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.
3

Verify the engine is running

The engine exposes several ports:
PortService
49134WebSocket (worker connections)
3111HTTP API
3112Stream API
9464Prometheus 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:
1

Create docker-compose.yml

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:
2

Start the stack

docker compose up -d
3

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:
1

Install Rust toolchain

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2

Clone the repository

git clone https://github.com/iii-hq/iii.git
cd iii
3

Build the binary

cargo build --release
The binary will be at target/release/iii.
4

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:
config.yaml
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.

Build docs developers (and LLMs) love