Skip to content

Deployment

Production deployment guide for Routstr Provider nodes.

All-in-One Docker Image (Preferred)

The easiest way to deploy Routstr is using the all-in-one Docker image from Docker Hub, which includes both the FastAPI backend and the Next.js admin dashboard in a single container.

Quick Start

docker run -d \
  --name routstr \
  -p 8000:8000 \
  -v routstr-data:/app/data \
  -e DATABASE_URL="sqlite:////app/data/routstr.db" \
  9qeklajc/routstr:latest

Access your node: - API & Admin Dashboard: http://localhost:8000

Docker Compose Setup

Create docker-compose.yml:

version: '3.8'

services:
  routstr:
    image: 9qeklajc/routstr:latest
    container_name: routstr
    restart: unless-stopped
    ports:
      - "8000:8000"
    volumes:
      - routstr-data:/app/data
    environment:
      DATABASE_URL: "sqlite:////app/data/routstr.db"
      ADMIN_KEY: "your-secure-admin-key"
      LOG_LEVEL: "info"

volumes:
  routstr-data:

Start it:

docker compose up -d

For production, use Docker Compose with persistent storage and optional Tor support.

Use the included compose.yml for a flexible setup that handles both the UI and the node execution. This is useful for development or when you want to manage Tor as a separate service.

docker compose up -d

This will: 1. Build the UI: Compiles the frontend and copies it to a shared volume. 2. Start Routstr: Runs the Python node, mounting the built UI. 3. Start Tor: Provides anonymous access via a .onion address.


With Tor (Anonymous Access)

Add Tor to serve your node as a hidden service—no port forwarding needed.

services:
  routstr:
    image: ghcr.io/routstr/proxy:latest
    container_name: routstr
    restart: unless-stopped
    ports:
      - "8000:8000"
    volumes:
      - ./data:/app/data
      - ./logs:/app/logs
    environment:
      - TOR_PROXY_URL=socks5://tor:9050
    depends_on:
      - tor

  tor:
    image: ghcr.io/hundehausen/tor-hidden-service:latest
    container_name: tor
    restart: unless-stopped
    volumes:
      - ./tor-data:/var/lib/tor
    environment:
      - HS_ROUTER=routstr:8000:80

After starting, find your .onion address:

docker exec tor cat /var/lib/tor/hidden_service/hostname

See Tor Support for details.


Pre-Configuration (Optional)

While everything can be configured via the dashboard, you can pre-configure settings with environment variables for automated deployments.

Using Environment Variables

services:
  routstr:
    image: ghcr.io/routstr/proxy:latest
    environment:
      # Pre-configure upstream (optional)
      - UPSTREAM_BASE_URL=https://api.openai.com/v1
      - UPSTREAM_API_KEY=sk-proj-...

      # Secure the dashboard (recommended)
      - ADMIN_PASSWORD=your-secure-password

      # Node identity
      - NAME=My Provider Node
      - DESCRIPTION=Fast GPT-4 access via Lightning

      # Lightning withdrawals
      - RECEIVE_LN_ADDRESS=me@walletofsatoshi.com
    volumes:
      - ./data:/app/data

Using an .env File

services:
  routstr:
    image: ghcr.io/routstr/proxy:latest
    env_file:
      - .env
    volumes:
      - ./data:/app/data

Example .env:

UPSTREAM_BASE_URL=https://api.openai.com/v1
UPSTREAM_API_KEY=sk-proj-...
ADMIN_PASSWORD=change-me
NAME=My Provider Node
RECEIVE_LN_ADDRESS=me@walletofsatoshi.com

See Configuration for all available options.


Persistence

Routstr stores all data in /app/data:

Path Contents
keys.db SQLite database (settings, API keys, sessions)
.wallet/ Cashu wallet data (your Bitcoin!)

Back Up Your Data

The ./data volume contains your wallet. Losing it means losing funds. Back up regularly.


Reverse Proxy (Optional)

For custom domains and SSL, use a reverse proxy like Caddy or nginx.

Caddy Example

api.yournode.com {
    reverse_proxy localhost:8000
}

nginx Example

server {
    listen 443 ssl;
    server_name api.yournode.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Updates

Pull the latest image and restart:

docker compose pull
docker compose up -d

Building from Source

Using Docker Compose

The easiest way to build everything from source:

docker compose build

Individual Components

If you prefer building the node only (requires manual UI build first):

docker build -t routstr-node .