Развёртывание через Docker Compose
Панель работает за Nginx с HTTPS и управляет Samba по SSH. Используйте отдельную production-конфигурацию:
Compose в корне проекта без суффикса production предназначен для разработки.
Варианты
| Конфигурация | Назначение |
|---|---|
docker-compose.production.yml |
Панель и Nginx; Samba уже установлена на другом сервере. |
Оба файла: production и samba |
Дополнительно изолированный Samba/SSH-узел с постоянными томами. |
HTTP-порт приложения и SSH-порт Samba-узла не публикуются на хосте. Снаружи доступен только
HTTPS и, во втором варианте, SMB на выбранном адресе. По умолчанию оба порта привязаны к
127.0.0.1. Для доступа из LAN явно задайте адрес сервера в .env и настройте сетевой доступ.
Панель и Nginx запускаются без root, с read-only корневой файловой системой и без capabilities.
Включён no-new-privileges. Samba-узел работает от root внутри контейнера: это необходимо для
создания системных пользователей, изменения владельцев файлов и работы Samba. Он не использует
privileged, Docker socket, host network или каталоги хоста с системной конфигурацией.
Требования
- Docker Engine и Docker Compose с поддержкой
up --waitи Compose secrets; Git для получения файлов поставки. - Опубликованный Docker-образ Sambryx с конкретным тегом версии или digest.
- TLS-сертификат с полной цепочкой и приватный ключ для имени панели.
- Непривилегированный пользователь с доступом к Docker; Bash для скрипта запуска.
- Для встроенного Samba-узла: доступ к Ubuntu-репозиториям при первой сборке и отдельная пара SSH-ключей.
JDK и npm на сервере установки не требуются. Автоматическое получение и продление сертификата в этот Compose не входит. Передавайте сертификаты из вашего существующего процесса управления TLS.
Настройка
Справочник настроек разделяет переменные Compose, свойства панели и пути на Samba-сервере.
Получите файлы Compose, Nginx и скрипт запуска вместе. Для новой установки:
Команда получает текущий исходный код и файлы установки; приложение запускается из
опубликованного образа, сборка исходников не нужна. Файлы master могут быть новее
выбранного образа. Изменения приложения после его тега попадут пользователям только с
последующим релизом. Для воспроизводимой установки сохраняйте выбранный commit файлов
и тег/digest образа.
Далее все команды выполняйте из этого каталога. При обновлении используйте существующий
каталог и сохраните .env, ключи и имя Compose-проекта; повторно их не создавайте.
umask 077
mkdir -p deploy/production/secrets
cp deploy/production/.env.example deploy/production/.env
id -u
id -g
Поместите сертификат и ключ в выбранные файлы и отредактируйте .env.
Список опубликованных версий есть в Releases;
например, для версии v0.15.0 тег образа — andreyvorobevaqa/sambryx:0.15.0.
Не оставляйте REPLACE_WITH_RELEASE_TAG и не используйте latest.
Подготовьте SSH_KNOWN_HOSTS_FILE по инструкции доверия
до запуска: файл должен существовать и читаться UID 10001.
| Переменная | Настройка |
|---|---|
COMPOSE_PROJECT_NAME |
Имя нового проекта: sambryx-production; для существующего стека сохраните прежнее имя, см. переход. |
SAMBRYX_IMAGE |
Конкретный опубликованный тег или digest. Замените REPLACE_WITH_RELEASE_TAG; latest не используется. |
PROXY_UID, PROXY_GID |
Ненулевые UID/GID владельца TLS-ключа; значения id -u и id -g. |
TLS_CERT_FILE |
Путь к полной цепочке сертификата. |
TLS_KEY_FILE |
Путь к приватному ключу с правами 0600, доступному PROXY_UID. |
HTTPS_BIND_IP, HTTPS_PORT |
Адрес и порт HTTPS; по умолчанию 127.0.0.1:8443. |
SSH_KNOWN_HOSTS_FILE |
Файл независимо проверенных SSH-ключей сервера, read-only; см. инструкцию. |
SSH_AUTHORIZED_KEYS_FILE |
Только для встроенного узла: файл публичного SSH-ключа управления. |
SAMBA_BIND_IP, SAMBA_PORT |
Только для встроенного узла: адрес и порт SMB; по умолчанию 127.0.0.1:445. |
Относительные пути разрешаются от корня репозитория. .env и каталог secrets исключены из Git.
Приватный TLS-ключ не должен быть доступен всем пользователям. Если ключ принадлежит другому
служебному пользователю, настройте UID/GID Nginx и права доступа соответственно.
Compose secrets здесь являются read-only файловыми подключениями, а не зашифрованным хранилищем секретов. Защищайте исходные файлы и резервные копии на хосте.
Панель для существующего сервера
Перед запуском проверьте модель Compose и загрузите выбранные образы:
docker compose --env-file deploy/production/.env \
-f docker-compose.production.yml config --quiet
docker compose --env-file deploy/production/.env \
-f docker-compose.production.yml pull web nginx
bash scripts/production/run.sh
docker compose --env-file deploy/production/.env \
-f docker-compose.production.yml ps
Ожидаемый результат: web и nginx имеют состояние healthy. Это подтверждает готовность
HTTP/HTTPS, но ещё не SSH-доступ и не права на удалённом сервере.
Скрипт проверяет модель Compose и теги образов до запуска контейнеров. Ошибка получения
списка образов, пустой список, latest или незаполненный тег останавливают запуск.
Исправьте конфигурацию или причину ошибки Compose и повторите команду.
Эквивалентная команда без скрипта:
Откройте https://<имя-панели>:<HTTPS_PORT>/ui/ и укажите SSH-адрес Samba-сервера и его реквизиты.
SSH-сервер должен разрешать необходимые административные команды; см. настройку сервера.
Пароли и SSH-ключи для входа не задаются через Compose environment.
Nginx заменяет входящие forwarded-заголовки. В приложении включена обработка forwarded-заголовков
и защищённая сессионная cookie. Не публикуйте web:8080 напрямую и не подключайте посторонние
контейнеры к сети proxy: приложение доверяет заголовкам обратного прокси.
TLS защищает браузерное соединение. Подлинность SSH-сервера проверяется по read-only known_hosts; неизвестный или изменившийся ключ запрещает вход. Перед запуском настройте доверенные ключи.
Адреса и проверка первого подключения
| Где используется адрес | Что указывать |
|---|---|
| URL в браузере | Имя панели из TLS-сертификата и HTTPS_PORT, например https://panel.example.org:8443/ui/. Имя должно разрешаться на Docker-хост. |
| «Хост / IP» в форме входа | Адрес Samba-сервера, разрешаемый и достижимый из контейнера web, например files.example.org. Не URL панели и не SMB-путь. |
known_hosts |
Точно тот же SSH-хост; для порта 22 — files.example.org, для 2222 — [files.example.org]:2222. |
| Встроенный Samba-узел | В форме — samba-node, порт 22; в known_hosts — samba-node. Это имя доступно внутри Compose-сети. |
localhost / 127.0.0.1 в форме относятся к контейнеру web. Даже если Samba работает
на Docker-хосте, укажите его адрес, доступный из контейнера. Наличие SSH-доступа из
терминала оператора само по себе не доказывает доступность из Docker-сети.
При HTTPS_BIND_IP=127.0.0.1 браузер должен работать на Docker-хосте либо использовать
заранее настроенный защищённый туннель к нему. Для LAN-доступа задайте конкретный LAN-IP
Docker-хоста в HTTPS_BIND_IP, настройте DNS и разрешите HTTPS-порт в существующем firewall.
TLS-сертификат должен соответствовать имени в браузере. Не обходите проверку сертификата.
Вход выполняется SSH-пользователем сервера. Укажите SSH-порт через кнопку «Порт: 22», выберите пароль или SSH-ключ и нажмите «Подключиться». Успех — открывается обзор сервера; проверьте статус Samba и список общих папок. Наличие пустого списка не является ошибкой подключения. У отдельного нового Samba-узла ещё нет пользовательских ресурсов.
| Результат | Действие администратора |
|---|---|
Контейнеры не healthy |
Проверьте ps, наличие файлов и права UID, тег образа, соответствие TLS-ключа сертификату. Не передавайте приватные ключи или пароли в отчётах. |
| Браузер не открывает HTTPS | Проверьте bind-адрес, порт, DNS, доверие цепочке и имя сертификата. |
| Неизвестный SSH-ключ | Сверьте отпечаток через доверенную консоль, добавьте ключ с точным host/port в known_hosts, затем пересоздайте только панель. |
| Изменённый SSH-ключ | Остановите попытки, выясните причину и независимо подтвердите новый ключ; порядок действий — в инструкции. |
| Файл доверия недоступен | Проверьте SSH_KNOWN_HOSTS_FILE, файловое подключение и чтение UID 10001; файл не должен быть каталогом. |
| Ошибка SSH-аутентификации или соединения | Проверьте контейнерный адрес/порт, пользователя, выбранный способ входа и настройки SSH-сервера; не меняйте доверенный ключ для исправления пароля или сетевой ошибки. |
После подтверждённого изменения файла доверия примените файловое подключение заново:
docker compose --env-file deploy/production/.env \
-f docker-compose.production.yml up -d --no-deps --force-recreate --wait web
Для полного стека добавьте -f docker-compose.samba.yml перед up. Пересоздание web
завершает текущие сессии панели, но не удаляет данные Samba.
Полный стек с Samba
Создайте отдельный ключ управления. Приватный ключ хранится у оператора и не подключается к контейнерам; публичный передаётся через Compose secret:
Не перезаписывайте существующий ключ. Пример создаёт отдельный ключ без passphrase,
поддерживаемый текущей формой входа; храните приватный файл с правами 0600.
Затем выполните первый запуск узла и проверку его SSH-ключа:
сначала пустой файл доверия и только samba-node, затем сверка fingerprint и запись ключа.
После этого запустите панель:
Эквивалент запуска:
docker compose --env-file deploy/production/.env \
-f docker-compose.production.yml -f docker-compose.samba.yml \
up -d --build --wait
В форме входа укажите:
- host:
samba-node; - SSH port:
22; - username:
root; - способ: SSH-ключ; содержимое приватного файла
management.
Парольный SSH-вход выключен. SSH root-доступ ограничен изолированным Samba-контейнером;
это административный доступ ко всему узлу, не разграничение ролей внутри приложения.
Публичный ключ копируется в /run с владельцем root для проверки OpenSSH StrictModes.
Ключи SSH-хоста создаются при первом запуске и сохраняются в томе состояния.
Общие папки и Samba-пользователи изначально отсутствуют: создайте их через панель.
Пути общих папок в этом варианте ограничены /srv/samba. Подключение SMB-клиентов выполняется
к адресу Docker-хоста, заданному в SAMBA_BIND_IP, а не к имени samba-node.
Поддерживается прямой SMB на TCP 445; legacy NetBIOS-порты наружу не открыты.
Samba, SSH и опциональный winbind управляются Supervisor. Команды systemctl, используемые
панелью, направляются совместимым скриптом к известным службам; полноценного systemd в узле нет.
Проверка этого стека не подтверждает AD-присоединение, аудит ОС или совместимость с Astra Linux.
Данные и обновление
Именованные тома создаются с префиксом проекта sambryx-production:
| Том | Содержимое |
|---|---|
node-identity |
/etc: пользователи, UID/GID, shadow, группы, SSH-ключи хоста, Samba-конфигурация и её копии. |
samba-state |
/var/lib/samba: база Samba-паролей, SID и постоянное состояние Samba. |
samba-data |
/srv/samba: файлы общих папок и их владельцы. |
samba-home |
/home: домашние каталоги созданных пользователей. |
samba-logs |
/var/log/samba: журналы Samba. |
Все эти тома составляют один набор для резервного копирования. Папка с файлами без базы пользователей и SID недостаточна для восстановления доступа. Используйте согласованную резервную копию с остановленным Samba-узлом, защищайте её как содержащую пароли и ключи. При изменении имени Compose-проекта будут созданы новые тома: сохраняйте имя проекта или переносите данные явно.
Для обновления панели задайте новый SAMBRYX_IMAGE и выполните:
docker compose --env-file deploy/production/.env \
-f docker-compose.production.yml pull web nginx
bash scripts/production/run.sh
Для полного стека последнюю команду выполняйте с --with-samba. После пересоздания приложения
нужно войти заново: HTTP/SSH-сессии не являются постоянными данными.
Samba-образ собирается отдельно. Том /etc при пересоздании сохраняется целиком, поэтому новые
package defaults из обновлённого Ubuntu-образа автоматически туда не попадут. Обновление Samba-образа
требует резервной копии, проверки изменений конфигураций/PAM/NSS на стенде и контролируемой миграции.
Не подключайте к этому тому другую версию ОС и не заменяйте его содержимое вслепую.
Остановка без удаления данных:
docker compose --env-file deploy/production/.env \
-f docker-compose.production.yml -f docker-compose.samba.yml down
Не используйте down -v для рабочего стека: эта команда удаляет постоянные тома.
При ротации сертификата или публичного SSH-ключа пересоздайте соответствующий контейнер, чтобы
обновились файловые подключения secrets. Nginx ограничивает тело запроса 64 MiB; отдельные лимиты
загрузки Spring Boot настраиваются независимо и могут быть ниже.
Проверка конфигурации и smoke-тест
Проверки модели используют Docker Compose CLI без запуска контейнеров. Сквозной тест требует JDK 21, OpenSSL, ssh-keygen, Docker и локально подготовленные образы:
./mvnw clean package
docker build -t sambryx-ci:production .
docker pull nginx:1.30.6-alpine
docker build -t sambryx-samba-node:ubuntu24.04 deploy/production/samba
./mvnw -B -f tools/smoke/pom.xml -Pproduction-smoke verify \
-Dsmoke.image=sambryx-ci:production
Тест создаёт уникальный Compose-проект с временными ключами и случайными loopback-портами.
Он проверяет TLS, вход через настоящий SSH, CSRF, защищённую cookie, создание пользователя/ресурса,
запись и чтение по SMB, перезапуск службы и сохранность данных после пересоздания.
Затем через API создаётся backup конфигурации, меняется server string и выполняется restore:
байты /etc/samba/smb.conf сверяются с копией, результат чтения API — с файлом, проверяется SMB.
Проверяются оба публичных варианта restore endpoint. Для копии с недопустимым значением security
настоящий testparm должен завершиться с ошибкой; restore должен вернуть HTTP 500 с success=false,
сохранить байты действующего файла и PID smbd. После отказа повторяется чтение SMB.
Restore проверяет выбранную копию через testparm до safety backup, замены конфигурации и restart.
Это проверка синтаксиса Samba, а не гарантия правильности любых настроек или восстановления всех томов.
На стенде созданная API копия получает фиксированное синтетическое имя допустимого формата через
docker compose exec: это исключает совпадение с именем safety backup с точностью до секунды.
Коллизии имён при одновременных операциях и внешнее изменение файла между проверкой и копированием
этот сценарий не проверяет.
В конце удаляются только контейнеры, сети и тома этого тестового проекта. Образы остаются в кэше.
Сертификат smoke-теста самоподписанный, доверие задаётся только локальному тестовому клиенту.