Llomiriby hyprr

Установка

Запуск lomiri через Docker Compose с готовым HTTPS.

lomiri поставляется в виде Docker-образов. Compose-файл ниже запускает всё необходимое: Postgres, API, веб-интерфейс и Caddy, который автоматически получает TLS-сертификат для вашего домена.

Требования

  • Linux-сервер с Docker и Docker Compose 2.23 или новее.
  • Домен для панели (например, panel.example.com), DNS которого указывает на сервер.
  • Порты 80 и 443, доступные из интернета, чтобы Caddy мог выпустить сертификат.

Скачайте compose-файл

mkdir lomiri && cd lomiri
curl -fsSLO https://panel.hyprr.space/install/docker-compose.yml
curl -fsSL https://panel.hyprr.space/install/env.example -o .env

Заполните .env

Укажите публичный адрес панели и сгенерируйте два секрета:

sed -i "s#^APP_URL=.*#APP_URL=https://panel.example.com#" .env
sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$(openssl rand -hex 24)/" .env
sed -i "s/^OAUTH_STATE_SECRET=.*/OAUTH_STATE_SECRET=$(openssl rand -hex 32)/" .env

Или откройте .env в редакторе. Все параметры описаны в разделе Настройка.

Запустите lomiri

docker compose up -d

При первом запуске скачиваются образы и создаётся база данных. При следующих запусках обновления базы применяются автоматически.

Создайте аккаунт администратора

docker compose exec api bun run create:admin you@example.com 'a-strong-password' admin

Аргументы: email, пароль и имя пользователя.

Войдите

Откройте https://panel.example.com и войдите под только что созданным аккаунтом. Затем подключите первую ноду и создайте сервер.

Файлы

# lomiri — Postgres, API, web UI and Caddy (automatic HTTPS) in one stack.
#
#   1. Put this file and .env (from env.example) in an empty directory, fill in .env
#   2. docker compose up -d
#   3. docker compose exec api bun run create:admin you@example.com 'a-strong-password' admin
#
# Docs: https://panel.hyprr.space/docs
services:
  postgres:
    image: postgres:17-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: lomiri
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
      POSTGRES_DB: lomiri
    volumes:
      - postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U lomiri -d lomiri"]
      interval: 5s
      timeout: 5s
      retries: 10

  # Runs database migrations on start, then serves the API. Raise scale to run more replicas; Caddy
  # spreads requests across all of them.
  api:
    image: ghcr.io/hyprrspace/lomiri-api:${LOMIRI_TAG:-latest}
    restart: unless-stopped
    scale: 1
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      APP_URL: ${APP_URL:?set APP_URL in .env}
      APP_NAME: ${APP_NAME:-}
      DATABASE_URL: postgres://lomiri:${POSTGRES_PASSWORD}@postgres:5432/lomiri
      OAUTH_STATE_SECRET: ${OAUTH_STATE_SECRET:?set OAUTH_STATE_SECRET in .env}
      LOG_LEVEL: ${LOG_LEVEL:-info}
      TRUSTED_PROXIES: ${TRUSTED_PROXIES:-}

  web:
    image: ghcr.io/hyprrspace/lomiri-web:${LOMIRI_TAG:-latest}
    restart: unless-stopped
    scale: 1
    depends_on:
      - api
    environment:
      LOMIRI_API_URL: http://api:3000
      TRUSTED_PROXIES: ${TRUSTED_PROXIES:-}

  # Terminates TLS for APP_URL (certificates are issued automatically) and routes /api/* to the API,
  # everything else to the web UI. Remove it if you already run your own reverse proxy.
  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    depends_on:
      - api
      - web
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    environment:
      APP_URL: ${APP_URL}
    configs:
      - source: caddyfile
        target: /etc/caddy/Caddyfile
    volumes:
      - caddy-data:/data
      - caddy-config:/config

configs:
  caddyfile:
    content: |
      {$$APP_URL} {
        encode zstd gzip
        # "dynamic a" re-resolves the service name, so every replica gets traffic.
        handle /api/* {
          reverse_proxy {
            dynamic a api 3000
          }
        }
        handle {
          reverse_proxy {
            dynamic a web 3000
          }
        }
      }

volumes:
  postgres:
  caddy-data:
  caddy-config:

На этой странице