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Что произойдёт
- Проверка наличия Docker, docker-compose,
sha256sum/shasum,openssl, прав root и того что порты80/443свободны. - Проверка CPU baseline (флаги
cx16,lahf_lm) — на очень старых KVM-CPU свежие MySQL-образы падают сFatal glibc error; установщик предупредит заранее. - Создание каталога
/opt/getolt/(для конфига, базы данных, файла лицензии, логов, TLS-сертификата) с правильным владельцем под учётную запись приложения. - Генерация self-signed TLS-сертификата (RSA 2048, 10 лет, SAN на
localhost+127.0.0.1+ публичный IP сервера) в/opt/getolt/certs/. - Скачивание
docker-compose.ymlиCaddyfile, генерация уникального.envс паролями MySQL и админ-учётной записью. docker compose pull— Docker-образ публичный, дополнительная авторизация не требуется.- Запуск контейнеров: MySQL, приложение, Caddy reverse-proxy и sidecar-обновлятор. Регистрация экземпляра в сервисе лицензирования — выдаётся ознакомительный период, в течение которого доступна вся функциональность.
- Скрипт ждёт пока приложение поднимется и печатает 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.pemcp privkey.pem /opt/getolt/certs/key.pemchmod 600 /opt/getolt/certs/key.pemcd /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 appdocker 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_INVALID | Self-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. |
Что дальше
- Подключение OLT — добавить первое устройство.
- Backup-стратегии — расширенные сценарии.
- Обновление — детали процесса.
По вопросам внедрения — sale@getolt.online.
Нашли ошибку или нужно что-то дополнить? Напишите нам или в Telegram @getolt_pub.
Разработка: gmasich.ru