uVersion
Русский
Скачать →

Wiki

Развёртывание с Docker

Сервер uVersion и PostgreSQL в контейнерах, под ключ: скачать образ, загрузить его, настроить .env, запустить. Расположение данных и базы данных настраивается.

Альтернатива пакету .deb: сервер uVersion и его база данных PostgreSQL работают в контейнерах, запускаемых одной командой docker compose up. Идеально, если вы предпочитаете контейнерное развёртывание или хотите быстро попробовать.

Требования: Docker Engine 20.10+ с плагином Compose v2 (docker compose version) и лицензионный ключ uVersion. Сервер отказывается запускаться без действительного подписанного ключа: получите его в своём аккаунте (или запросите его на странице регистрации).

Podman тоже работает Замените docker на podman во всех командах этой страницы: podman compose pull, podman load -i, podman compose up -d. Поставляемый docker-compose.yml уже помечает свои монтирования для SELinux (контроль доступа, включённый по умолчанию в Red Hat, Rocky, Alma и Fedora) суффиксом :z. Без этой метки контейнеру отказывают в доступе к смонтированным каталогам, и сообщение выглядит скорее как повреждённая база данных, чем как проблема прав.

Установка

1. Получить compose и шаблон окружения

Два файла в новой папке, которая станет папкой стека: docker-compose.yml и шаблон .env.

mkdir uversion && cd uversion
wget -N -O docker-compose.yml https://uversion.io/downloads/server/docker/docker-compose.yml
wget -N -O .env https://uversion.io/downloads/server/docker/env.example

2. Получить образ

В сети достаточно реестра:

docker compose pull

Без доступа к Интернету (изолированная сеть) вместо этого скачайте архив и загрузите его: он несёт то же имя образа, что и compose, поэтому запуск находит его, ничего не скачивая.

wget -N https://uversion.io/downloads/server/docker/uversion-server_latest_docker.tar.gz
docker load -i uversion-server_latest_docker.tar.gz

3. Заполнить .env

Обязательны два значения: UVERSION_LICENCE__KEY (ваш лицензионный ключ, длинная подписанная строка, полученная по электронной почте) и POSTGRES_PASSWORD (надёжный пароль для входящей в комплект базы данных).

nano .env

Секрет, которым подписываются сессии, создаётся при первом запуске и хранится в каталоге данных. Вам ничего не нужно вводить. Он входит в резервную копию: если он исчезнет, каждому придётся войти заново один раз, ничего не теряется. Если вы предпочитаете задать свой (минимум 32 символа), заполните UVERSION_SECURITY__JWT_SECRET в .env: он действительно передаётся в контейнер, который затем использует его вместо создания нового.

Выберите этот пароль раз и навсегда POSTGRES_PASSWORD применяется только при создании базы данных, пока её каталог пуст. Изменение его впоследствии в .env ничего не меняет на стороне PostgreSQL, которая сохраняет старый, тогда как сервер предъявляет новый: соединение рвётся, а сообщение не объясняет почему. Чтобы изменить его по-настоящему, измените его с обеих сторон:
# Changer reellement le mot de passe de la base
docker compose exec db psql -U uversion -c "ALTER USER uversion PASSWORD 'nouveau-mot-de-passe'"

# Puis reporter la MEME valeur dans POSTGRES_PASSWORD (.env) et relancer
docker compose up -d
Резервируйте .env вместе с вашими данными В нём содержатся лицензионный ключ и пароль базы данных, и он живёт рядом с docker-compose.yml, а не в томах. Потеря машины при сохранении дисков с данными оставляет базу данных, к которой никто не может обратиться, и лицензию, которую нужно запрашивать заново: код активации, полученный при регистрации, одноразовый и уже израсходован, повторно используется только лицензионный ключ, который он породил, и именно он здесь. Обращайтесь с этим файлом как с секретом: chmod 600, и в той же резервной копии, что база данных и чанки (фрагменты файлов, то, что занимает место).

4. Запустить стек

docker compose up -d

После этого сервер доступен по адресу https://YOUR-HOST:8443. Не требуется ни домена, ни сертификата Let’s Encrypt: этим занимается модель TOFU, то есть доверие при первом контакте, как SSH, когда он при первом разе просит вас подтвердить отпечаток машины.

5. Считать отпечаток сервера

Он переписывается в журналы при каждом запуске:

# L'empreinte du serveur, reecrite dans les journaux a chaque demarrage
docker compose logs server | grep -i "TLS fingerprint"

Это отпечаток сервера (SHA-256 его сертификата): сервер отдаёт самоподписанный HTTPS на порту 8443, и каждый клиент подтверждает его при первом подключении. Поделитесь им со своей командой (см. Отпечаток TLS). Не путайте его с контрольной суммой, которая служит для проверки скачанного файла: этот идентифицирует ваш сервер.

6. Считать первоначальный пароль администратора

Войдите как admin с этим паролем, затем смените его. Файл удаляется, как только вы его меняете.

# Le mot de passe admin initial (le fichier disparait des que vous le changez)
docker compose exec server cat /data/initial-admin-password

Чтобы следить за запуском в реальном времени, подойдёт docker compose logs -f server, но не ставьте её в середину последовательности команд: -f следует за журналами бесконечно и никогда не возвращает управление (Ctrl + C для выхода).

Данные и база данных

Всё состояние сервера (хранилище чанков, сертификат TLS и, следовательно, отпечаток, идентичность сервера) живёт в одном каталоге хоста, а база данных PostgreSQL в другом. Оба настраиваются в .env:

# Dans .env : placer les donnees et la base sur un disque large et sauvegarde
UVERSION_DATA_DIR=/srv/uversion/data      # chunks, cert TLS, identite serveur
UVERSION_DB_DIR=/srv/uversion/db          # PostgreSQL fourni

Для настоящего развёртывания направьте UVERSION_DATA_DIR на большой резервируемый диск: двоичные чанки проекта Unreal могут быть объёмными. Контейнер сам настраивает права смонтированного каталога (он запускается от root лишь на время исправления владельца, затем понижается до непривилегированного пользователя), так что вам не нужно заранее ничего делать через chown.

Первый запуск дольше, если SELinux активен Тогда движок рекурсивно переразмечает смонтированные каталоги, один-единственный раз. На свежем развёртывании это мгновенно, но на уже объёмном репозитории рассчитывайте на несколько минут. Последующие запуски не платят эту цену снова.

Чтобы использовать уже имеющийся внешний PostgreSQL, заполните UVERSION_DATABASE__URL в .env, затем удалите службу db и блок depends_on в docker-compose.yml.

# Dans .env : brancher un PostgreSQL existant
UVERSION_DATABASE__URL=postgres://user:motdepasse@db.interne:5432/uversion

Перенос данных и базы данных

Самый простой случай, задать обе переменные до первого up: ещё ничего не существует, копировать нечего. Если стек уже работает, нужно остановить его и скопировать каталоги вручную, сохраняя владельцев.

1. Остановить стек

Во время копирования ничто не должно писать:

docker compose down

2. Скопировать два каталога

Именно -a сохраняет владельцев и права:

sudo rsync -a ./data/server/ /srv/uversion/data/
sudo rsync -a ./data/db/     /srv/uversion/db/

3. Указать .env на новое расположение

# Dans .env, LES DEUX lignes, pas une seule
UVERSION_DATA_DIR=/srv/uversion/data
UVERSION_DB_DIR=/srv/uversion/db

4. Перезапустить

docker compose up -d
Переносите оба или ни одного База данных не содержит ваших файлов: она содержит метаданные, которые обозначают чанки (фрагменты файлов) по их отпечатку. Перенос данных без базы данных, или наоборот, оставляет базу данных, которая ссылается на ненаходимые чанки. А UVERSION_DB_DIR, указывающий на пустой каталог, даёт чистую базу данных: PostgreSQL инициализирует её не моргнув глазом, и вы получаете полное хранилище чанков в паре с базой данных вовсе без метаданных.

Три ловушки путей, все встречались:

  • Относительный путь разрешается относительно файла compose, а не относительно каталога, из которого вы запускаете команду. ./data/server всегда обозначает соседа docker-compose.yml.
  • Сетевой ресурс (NFS, CIFS, общий ресурс Windows) обычно отказывает в chown, который контейнер выполняет при запуске. Тогда контейнер немедленно завершается с ошибкой прав, которая не упоминает ни uVersion, ни хранилище. Используйте локальный диск или блочный том.
  • Именно rsync -a сохраняет владельцев и права. Копия, сделанная cp без опций или из файлового проводника, сбрасывает всё на текущую учётную запись, и PostgreSQL тогда отказывается запускаться на собственном каталоге.

Эксплуатация

Резервное копирование: база данных

Она несёт метаданные: файлы, ревизии, пользователи, блокировки.

docker compose exec db pg_dump -U uversion uversion > uversion-db.sql

Резервное копирование: данные сервера

Это каталог хоста, обозначенный UVERSION_DATA_DIR. Обе резервные копии важны: одна без другой ничего не восстанавливает.

# .env n'est pas charge dans votre shell, chargez-le pour reutiliser la variable
set -a; . ./.env; set +a
DATA_DIR="$UVERSION_DATA_DIR"
[ -n "$DATA_DIR" ] || DATA_DIR=./data/server      # valeur par defaut

tar czf uversion-data.tar.gz -C "$DATA_DIR" .

Обновление

Данные и база данных не затрагиваются, миграции применяются при запуске.

docker compose pull
docker compose up -d   # les migrations s'appliquent au demarrage

В изолированной сети вместо этого загрузите более свежий архив:

wget -N https://uversion.io/downloads/server/docker/uversion-server_latest_docker.tar.gz
docker load -i uversion-server_latest_docker.tar.gz
docker compose up -d

Остановка

docker compose stop останавливает контейнеры, docker compose down удаляет их. В обоих случаях ваши данные остаются на месте.

down -v здесь ничего не стирает Опубликованный compose не использует ни одного именованного тома: ваши данные и ваша база данных находятся в двух каталогах хоста, обозначенных .env. Ни down, ни down -v их не трогает. Чтобы действительно начать с нуля, нужно удалить эти каталоги самому. Это важно знать: рефлекс после неудачной аутентификации, запустить down -v, а затем up, и это возвращает ровно к той же ошибке, с той же базой данных и тем же паролем.