Этот документ описывает запуск Berkut SCC с OnlyOffice через nginx на HTTPS.
Если нужен простой запуск через reverse-proxy (в том числе для Portainer), используйте готовый стек:
docs/ru/docker-compose.https.yml
Примечание: passkeys (WebAuthn) также требуют HTTPS (или localhost), поэтому этот режим рекомендуется, если вы хотите использовать вход по ключу доступа.
Особенности примера:
nginxиonlyofficeв отдельных контейнерах;- маршрут
GET /office/*проксируется вonlyoffice; - в примере нет привязки к конкретной пользовательской сети;
- секреты в compose заданы как безопасные placeholders (
change-me-*), перед запуском задайте их в.env.
Запуск:
docker compose -f docs/ru/docker-compose.https.yml up -dПосле запуска открывайте приложение через адрес nginx (обычно https://<host>), а не напрямую через berkut:8080.
Примечание: в примере есть сервис certgen — он создаёт self-signed сертификаты в TLS_CERTS_PATH (файлы fullchain.pem и privkey.pem), если их ещё нет. Вы можете заменить эти файлы своими сертификатами.
Важно: если вы откроете SCC напрямую на http://localhost:8080, путь /office/* на этом origin не будет проксироваться в OnlyOffice, и редактор не загрузится (404).
Если браузер не доверяет сертификату, OnlyOffice не может зарегистрировать ServiceWorker внутри iframe:
Registration failed with SecurityError ... SSL certificate error- далее возможны
404по путямEditor.binиз cache-пайплайна.
Это не критическая ошибка backend, это проблема доверия к TLS-сертификату.
Обязательные параметры:
BERKUT_DOCS_ONLYOFFICE_ENABLED=trueBERKUT_DOCS_ONLYOFFICE_PUBLIC_URL=/office/BERKUT_DOCS_ONLYOFFICE_INTERNAL_URL=http://onlyoffice/BERKUT_DOCS_ONLYOFFICE_APP_INTERNAL_URL=http://berkut:8080BERKUT_DOCS_ONLYOFFICE_JWT_SECRET=<secret>ONLYOFFICE_JWT_SECRET=<тот_же_secret>ONLYOFFICE_JWT_ENABLED=truePROXY_HTTP_PORT=80PROXY_HTTPS_PORT=443TLS_CERTS_PATH=./docker/certs
Security notes:
BERKUT_DOCS_ONLYOFFICE_INTERNAL_URLдолжен указывать на OnlyOffice, доступный SCC (из контейнера/сервера), и не должен быть link-local/metadata адресом.- Callback download URL от OnlyOffice принимается только если host совпадает с настроенным
Public URLилиInternal URL(уменьшение SSRF-рисков).
Из корня проекта:
Примечание: при запуске docker compose --profile proxy ... сервис certgen создаёт self-signed сертификаты автоматически (в TLS_CERTS_PATH), так что ручная генерация ниже — опциональна (полезно, если хотите контролировать CN/SAN).
cd C:\Users\chape\Desktop\SCC
New-Item -ItemType Directory -Path .\docker\certs -Force
docker run --rm -v "${PWD}\docker\certs:/certs" alpine:3.20 sh -lc "apk add --no-cache openssl >/dev/null && openssl req -x509 -nodes -newkey rsa:2048 -days 365 -subj '/CN=localhost' -keyout /certs/privkey.pem -out /certs/fullchain.pem"Должны появиться:
docker/certs/fullchain.pemdocker/certs/privkey.pem
docker compose --profile proxy down
docker compose --profile proxy up -d --buildВажно для ServiceWorker в OnlyOffice: просто "принять риск" в браузере недостаточно.
Импортируйте сертификат в Trusted Root Certification Authorities:
Win + R->certlm.mscTrusted Root Certification Authorities->CertificatesImport...-> выберите сертификат (можно экспортировать.crtизfullchain.pem).
После импорта:
- полностью закройте браузер;
- откройте
https://localhostзаново; - сделайте hard reload (
Ctrl+F5).
Используйте те же параметры, что в Windows-варианте:
BERKUT_DOCS_ONLYOFFICE_ENABLED=trueBERKUT_DOCS_ONLYOFFICE_PUBLIC_URL=/office/BERKUT_DOCS_ONLYOFFICE_INTERNAL_URL=http://onlyoffice/BERKUT_DOCS_ONLYOFFICE_APP_INTERNAL_URL=http://berkut:8080BERKUT_DOCS_ONLYOFFICE_JWT_SECRET=<secret>ONLYOFFICE_JWT_SECRET=<тот_же_secret>ONLYOFFICE_JWT_ENABLED=truePROXY_HTTP_PORT=80PROXY_HTTPS_PORT=443TLS_CERTS_PATH=./docker/certs
Из корня проекта:
Примечание: при запуске docker compose --profile proxy ... сервис certgen создаёт self-signed сертификаты автоматически (в TLS_CERTS_PATH), так что ручная генерация ниже — опциональна (полезно, если хотите контролировать CN/SAN).
cd ~/path/to/SCC
mkdir -p docker/certs
docker run --rm -v "$(pwd)/docker/certs:/certs" alpine:3.20 sh -lc "apk add --no-cache openssl >/dev/null && openssl req -x509 -nodes -newkey rsa:2048 -days 365 -subj '/CN=localhost' -keyout /certs/privkey.pem -out /certs/fullchain.pem"docker compose --profile proxy down
docker compose --profile proxy up -d --buildOnlyOffice требует валидный TLS для ServiceWorker, поэтому сертификат нужно добавить в доверенные.
Ubuntu / Debian:
sudo cp docker/certs/fullchain.pem /usr/local/share/ca-certificates/localhost-onlyoffice.crt
sudo update-ca-certificatesFedora / RHEL:
sudo cp docker/certs/fullchain.pem /etc/pki/ca-trust/source/anchors/localhost-onlyoffice.crt
sudo update-ca-trust extractArch:
sudo trust anchor docker/certs/fullchain.pemПосле этого:
- перезапустите браузер полностью;
- откройте
https://localhost; - выполните hard reload.
Рекомендуется использовать сертификаты от доверенного CA (например Let's Encrypt) и доменное имя.
Требования:
BERKUT_DOCS_ONLYOFFICE_PUBLIC_URL=/office/(или полный URL в том же origin),BERKUT_DOCS_ONLYOFFICE_INTERNAL_URL=http://onlyoffice/,BERKUT_DOCS_ONLYOFFICE_APP_INTERNAL_URL=http://berkut:8080,- одинаковый JWT секрет для Berkut и OnlyOffice,
- доступ пользователей к приложению только через
https://<domain>.
docker compose --profile proxy ps
docker compose --profile proxy logs -f nginx
docker compose --profile proxy logs -f onlyoffice
docker compose --profile proxy logs -f berkutКлючевые признаки:
nginxдолжен бытьUp, неRestarting.- Не должно быть
cannot load certificate "/etc/nginx/certs/fullchain.pem". - В browser devtools не должно быть
ServiceWorker ... SSL certificate error.
- Новая версия DOCX создаётся только через кнопку
Сохранитьв модальном окне документа. - Для сохранения версии обязательна причина изменения.
- Сохранение внутри OnlyOffice (
Ctrl+S/ встроенная кнопка) не создаёт версию SCC. - При каждом открытии/переключении View/Edit используется новая сессия OnlyOffice (новый session key), чтобы исключить залипшее состояние редактора.