Documentation

Get Hub running in minutes

Spin up your own instance with Docker Compose and start managing domains and deploys through the API.

Quick start

Run Hub with Docker Compose

A single docker-compose.yml with MySQL, MinIO, and the official bewayio/hostcontrol image.

Recommended

Run the installer

Automatically generate your docker-compose.yml with strong passwords and get Hostcontrol running in seconds.

curl -fsSL https://beway.io/install.sh | bash

At the end, the script prints the INSTALL_TOKEN — save it, you'll need it to finish setup at /install.

or set it up manually
docker-compose.yml
services:

  mysql:
    image: mysql:8.0
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?set MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: hostcontrol
    volumes:
      - mysql_data:/var/lib/mysql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      - default
      - beway_host_edge

  minio:
    image: minio/minio:latest
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:?set MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?set MINIO_ROOT_PASSWORD}
      MINIO_API_REQUESTS_MAX: 10000
    volumes:
      - minio_data:/data
    networks:
      - default
      - beway_host_edge

  hostcontrol:
    image: ${HUB_IMAGE:-bewayio/hostcontrol:latest}
    restart: unless-stopped
    ports:
      - "8081:8081"
    environment:
      MYSQL_HOST: mysql
      MYSQL_PORT: "3306"
      MYSQL_USER: root
      MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:?set MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: hostcontrol
      MINIO_ENDPOINT: minio:9000
      MINIO_USE_SSL: "false"
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:?set MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?set MINIO_ROOT_PASSWORD}
      CREDENTIALS_ENCRYPTION_KEY: ${CREDENTIALS_ENCRYPTION_KEY:?set CREDENTIALS_ENCRYPTION_KEY}
      APP_URL: ${APP_URL:?set APP_URL}
      ADMIN_UPSTREAM: http://hostcontrol:8081
      DOCKER_HOST: unix:///var/run/docker.sock
      JWT_SECRET: ${JWT_SECRET:-}
      ACME_EMAIL: ${ACME_EMAIL:-}
      INSTALL_TOKEN: ${INSTALL_TOKEN:-}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - hostplatform_traefik_dynamic:/app/config/traefik-dynamic
    networks:
      - default
      - beway_host_edge
    depends_on:
      - mysql
      - minio

networks:
  beway_host_edge:
    name: beway_host_edge

volumes:
  mysql_data:
  minio_data:
  hostplatform_traefik_dynamic:
    name: hostplatform_traefik_dynamic
  hostplatform_traefik_acme:
    name: hostplatform_traefik_acme
  1. 1

    Save the file above as docker-compose.yml

  2. 2

    Fill in the environment variables marked as required (passwords, CREDENTIALS_ENCRYPTION_KEY, APP_URL)

  3. 3

    Bring up the containers

  4. 4

    Open the panel — since no admin exists yet, you'll be redirected to /install to create the initial admin there

docker compose up -d