Установка
Запуск 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: