Перейти к содержимому

Production-deploy

GetOLT поставляется как готовый Docker-образ. Установка на чистый VPS — одна команда, под минуту-две до работающего веб-интерфейса (зависит от скорости канала).

Требования

  • Linux x86_64 (проверено на Debian 12 и Ubuntu 22.04, должно работать на Debian 11+, Ubuntu 20.04+, RHEL 8+).
  • Docker 20.10+ с плагином docker-compose v2 (см. docs.docker.com/engine/install).
  • Доступ от root (sudo на машине).
  • Открытый исходящий HTTPS — образ и регистрация ознакомительного периода идут через сеть.
  • 4 vCPU / 8 GB RAM / 50+ GB SSD на старте. Для крупных сетей — пропорционально числу OLT и абонентов.

Подробнее — Системные требования.

Установка одной командой

Окно терминала
curl -A "getolt-installer/1.0" -fsSL https://get.getolt.online/install.sh | sudo bash

Флаг -A "getolt-installer/1.0" обязателен: на стороне инфраструктуры включён общий anti-scanner фильтр, который отбивает запросы с дефолтным User-Agent: curl/X.Y. Тот же UA используется и для внутренних загрузок установщика.

Скрипт прозрачный — посмотреть содержимое перед запуском:

Окно терминала
curl -A "getolt-installer/1.0" -fsSL https://get.getolt.online/install.sh | less

Что произойдёт

  1. Проверка наличия Docker, docker-compose, sha256sum/shasum, openssl, прав root и того что порты 80/443 свободны.
  2. Проверка CPU baseline (флаги cx16, lahf_lm) — на очень старых KVM-CPU свежие MySQL-образы падают с Fatal glibc error; установщик предупредит заранее.
  3. Создание каталога /opt/getolt/ (для конфига, базы данных, файла лицензии, логов, TLS-сертификата) с правильным владельцем под учётную запись приложения.
  4. Генерация self-signed TLS-сертификата (RSA 2048, 10 лет, SAN на localhost + 127.0.0.1 + публичный IP сервера) в /opt/getolt/certs/.
  5. Скачивание docker-compose.yml и Caddyfile, генерация уникального .env с паролями MySQL и админ-учётной записью.
  6. docker compose pull — Docker-образ публичный, дополнительная авторизация не требуется.
  7. Запуск контейнеров: MySQL, приложение, Caddy reverse-proxy и sidecar-обновлятор. Регистрация экземпляра в сервисе лицензирования — выдаётся ознакомительный период, в течение которого доступна вся функциональность.
  8. Скрипт ждёт пока приложение поднимется и печатает URL + одноразовый пароль администратора.

Типичное время — 1–2 минуты на быстром канале, дольше на медленном (Docker-образ ~200 MB).

Первый вход

  • URL: https://<ip-сервера>/ (порт 443, перед приложением — Caddy reverse-proxy с self-signed TLS)
  • Логин: admin
  • Пароль: печатается скриптом в конце установки и сохранён в /opt/getolt/.env (поле GETOLT_ADMIN_PASSWORD)

При первом заходе браузер покажет предупреждение «Соединение не защищено» / «Not secure» — это ожидаемо, сертификат самоподписан и не входит в публично-доверенные. Subject Alternative Name включает IP сервера, так что после согласия браузера соединение валидно по TLS. Кликните «Дополнительно → Перейти всё равно». Чтобы предупреждение исчезло — поставьте свой сертификат, см. секцию HTTPS ниже.

Если на сервере уже заняты порты 80 и/или 443 (apache/nginx/traefik на хосте) — установщик это поймает заранее и попросит освободить порты. Альтернатива — встроить GetOLT за свой существующий reverse-proxy (см. ниже).

После входа поменяйте пароль в профиле. Учётная запись локальная — никакого корпоративного каталога настраивать не нужно.

Структура /opt/getolt/

/opt/getolt/
├── docker-compose.yml ← скачан с get.getolt.online
├── Caddyfile ← конфиг reverse-proxy (TLS, редиректы) — редактируйте при смене cert
├── .env ← локально сгенерированные пароли (chmod 600)
├── certs/
│ ├── cert.pem ← self-signed TLS-сертификат (SAN на IP сервера)
│ └── key.pem ← приватный ключ (chmod 600)
├── data/mysql/ ← том MySQL
├── license/license.jwt ← файл лицензии (создаётся автоматически)
├── update.sh ← утилита ручного обновления + используется sidecar-обновлятором
├── updater-loop.sh ← скрипт sidecar-контейнера (polling запросов на обновление)
└── logs/ ← логи приложения

HTTPS

Из коробки GetOLT доступен по https://<ip>/ через встроенный Caddy reverse-proxy:

  • Порт :443 — HTTPS, сертификат self-signed (RSA 2048, 10 лет, SAN на localhost, 127.0.0.1 и публичный IP сервера). Сгенерирован установщиком в /opt/getolt/certs/.
  • Порт :80 — 301-редирект на https://.
  • Cookies session/JWT с флагом Secure (так как трафик всегда зашифрован).
  • Между Caddy и приложением — X-Forwarded-Proto: https, X-Forwarded-Host. Spring видит реальный scheme и host.
  • Внутренний порт приложения :8088 наружу не выставлен — доступ только через Caddy.

Cert на 10 лет, ротация не нужна. При смене публичного IP сервера — rm -rf /opt/getolt/certs && bash install.sh либо повторный запуск install.sh перегенерирует cert с новым SAN.

Свой сертификат (Let’s Encrypt)

Если у сервера есть доменное имя, направленное на его публичный IP, отредактируйте /opt/getolt/Caddyfile:

my-getolt.example.com {
reverse_proxy app:8088 {
header_up X-Real-IP {remote_host}
}
}

Затем cd /opt/getolt && docker compose restart caddy. Caddy сам получит ACME-сертификат при первом запросе на 80/443 — никаких certbot, cron-ротаций и certs/-каталога не нужно.

Свой коммерческий сертификат

Каталог /opt/getolt/certs/ уже смонтирован в Caddy /etc/caddy/certs:ro. Замените файлы в нём на свои:

Окно терминала
# Положить свой cert+key (например, fullchain.pem от выпускающего CA)
cp fullchain.pem /opt/getolt/certs/cert.pem
cp privkey.pem /opt/getolt/certs/key.pem
chmod 600 /opt/getolt/certs/key.pem
cd /opt/getolt && docker compose restart caddy

Если cert на доменное имя — также пропишите его в Caddyfile вместо :443:

my-getolt.example.com {
tls /etc/caddy/certs/cert.pem /etc/caddy/certs/key.pem
reverse_proxy app:8088 {
header_up X-Real-IP {remote_host}
}
}

За существующим reverse-proxy

Если на хосте уже работает свой nginx/traefik и держит 80/443 — отключите Caddy в /opt/getolt/docker-compose.yml (закомментировать секцию caddy: и тома caddy_data/caddy_config), пропишите app наружу на нестандартный порт:

app:
# ...
ports:
- "127.0.0.1:8088:8088" # только loopback, наружу не торчит

И настройте upstream в своём reverse-proxy на http://127.0.0.1:8088, обязательно с пробросом X-Forwarded-Proto: https (иначе Spring не выставит правильные redirect URL).

Обновление

Окно терминала
curl -A "getolt-installer/1.0" -fsSL https://get.getolt.online/update.sh | sudo bash

Скрипт идемпотентный: снимает онлайн-бэкап БД, тегает текущий образ как :rollback-prev для отката одной командой, делает docker compose pull и up -d app, ждёт health-check на /login. Если образ актуальный — выходит без побочных эффектов. При failure — автоматически откатывается на :rollback-prev. Подробности и ручной режим — Обновление версий.

Никаких миграций баз данных вручную — приложение само добавит недостающие таблицы и колонки при старте.

Бэкап

Минимальный набор для восстановления:

Окно терминала
# Снимок БД
docker compose -f /opt/getolt/docker-compose.yml exec mysql mysqldump \
--single-transaction -uroot -p"$MYSQL_ROOT_PASSWORD" \
getolt_db > /backup/getolt-$(date +%F).sql
# Каталог лицензии (содержит JWT — без него экземпляр пере-регистрируется)
tar czf /backup/getolt-license-$(date +%F).tgz /opt/getolt/license/
# .env (паролей нет смысла бэкапить отдельно, но удобно держать рядом)
cp /opt/getolt/.env /backup/getolt-env-$(date +%F).bak

Где MYSQL_ROOT_PASSWORD — из /opt/getolt/.env.

Остановка и удаление

Окно терминала
cd /opt/getolt && docker compose down # остановить
cd /opt/getolt && docker compose down -v && rm -rf /opt/getolt # полное удаление

Где ловить ошибки

Окно терминала
docker compose -f /opt/getolt/docker-compose.yml logs -f app
docker compose -f /opt/getolt/docker-compose.yml logs -f mysql

Установщик проверяет готовность через https://127.0.0.1/login (этот URL всегда отдаёт 200 анонимному запросу — удобный health-индикатор за Caddy). Если он не отвечает за 3 минуты — установщик умрёт с подсказкой, какие логи смотреть.

Можно проверить вручную:

Окно терминала
curl -kI https://<ip>/login # 200 — приложение и Caddy живы
curl -k https://<ip>/actuator/health # 302 на /login — это норма, Spring Security редиректит анонимов

Если приложение не отвечает за 3 минуты — обычно проблема в недоступности реестра образов или сервиса лицензирования. Проверьте исходящий HTTPS.

Частые ошибки

СимптомПричинаРешение
Fatal glibc error: CPU does not support x86-64-v2 в docker compose logs mysqlОчень старый KVM-CPU (без sse4_2/popcnt/ssse3).Использовать VPS с обычным современным CPU — большинство хостеров уже выдают подходящие. Если хостер закрывает CPU-флаги (cpu=qemu64), попросить переключить на cpu=host или взять другой план.
Connection refused при docker compose pullИсходящий HTTPS заблокирован у хостера.Открыть registry.getolt.online, license.getolt.online, get.getolt.online, registry-1.docker.io (для mysql:8.0.32) на 443.
Состояние лицензии NO_LICENSE после установкиНе удалось дотянуться до сервиса лицензирования при первом запуске.Проверить исходящий HTTPS, перезапустить docker compose restart app. Лицензия выдаётся при первом успешном вызове, повторные попытки идут по расписанию.
Браузер: «Соединение не защищено», NET::ERR_CERT_AUTHORITY_INVALIDSelf-signed cert не доверен публично.Один раз кликнуть «Дополнительно → Перейти всё равно» — TLS-соединение валидно, просто CA локальный. Чтобы убрать предупреждение — поставить Let’s Encrypt по доменному имени (см. секцию HTTPS).
Браузер: NET::ERR_CERT_COMMON_NAME_INVALID после смены IP сервераCert выпущен с SAN на старый IP.rm -rf /opt/getolt/certs && bash <(curl -A "getolt-installer/1.0" -fsSL https://get.getolt.online/install.sh) — установщик перевыпустит cert с новым SAN.
manifest digest mismatch при docker compose pullКэш Docker рассинхронизирован с реестром.docker rmi registry.getolt.online/getolt/getolt-grade:latest && docker compose pull.

Что дальше

По вопросам внедрения — sale@getolt.online.

Нашли ошибку или нужно что-то дополнить? Напишите нам или в Telegram @getolt_pub.

Разработка: gmasich.ru

Политика конфиденциальности · Пользовательское соглашение