Wiki
Настройка и миграция сервера
Редактирование config.toml, перенос каталога данных, использование базы данных PostgreSQL в другом месте, резервное копирование и восстановление.
Всё настраивается в одном файле, /etc/uversion/config.toml. Установщик создаёт его; затем вы можете свободно его редактировать.
Файл конфигурации
Отредактируйте, затем перезапустите: сервер читает свою конфигурацию только при запуске.
sudo nano /etc/uversion/config.toml
sudo systemctl restart uversion-server
Вот поля, которые вам придётся трогать. Это частичная выдержка: файл содержит и другие, а некоторые обязательные поля ниже не показаны. Никогда не перезаписывайте свой файл этим блоком, редактируйте только соответствующие строки.
# EXTRAIT PARTIEL : le fichier contient d'autres sections.
# N'ecrasez jamais votre fichier avec ce bloc, editez les lignes concernees.
[server]
bind_address = "0.0.0.0"
port = 8080
[database]
# Ou toute base PostgreSQL accessible : autre disque, autre machine, service manage.
url = "postgres://uversion:MOTDEPASSE@127.0.0.1:5432/uversion"
[security]
# Le secret qui signe les sessions. Obligatoire et SANS valeur par defaut :
# absent ou plus court que 32 caracteres, le serveur refuse de demarrer.
# L'installateur en genere un. Le remplacer deconnecte tout le monde une fois.
jwt_secret = "..."
[storage]
# Le contenu des fichiers (les chunks, morceaux de fichiers). C'est ce qui grossit.
path = "/var/lib/uversion/data/chunks"
[tls]
disabled = false
https_port = 8443
[licence]
key = "..."
0640 root:uversion: сохраните его таким.
Где живут данные
Три разных места, и это то, что удивляет больше всего. Третье, конфигурация, к тому же чаще всего забывается при резервном копировании:
| Что | Где |
|---|---|
| Содержимое файлов (чанки, куски файлов: именно это занимает место) | /var/lib/uversion/data/chunks |
| TLS-сертификат, отпечаток сервера | /var/lib/uversion/data/tls |
| Идентичность сервера, якорь лицензии | /var/lib/uversion/server-id, last-validated-at |
| Метаданные (файлы, ревизии, пользователи, блокировки, права, задачи) | PostgreSQL: /var/lib/postgresql/16/main |
| Конфигурация: лицензионный ключ, секрет подписи сессий, пароль базы данных | /etc/uversion/config.toml, /etc/uversion/licence-key |
Перенос каталога данных
Это обычный случай: содержимое растёт, системный раздел мал. База же данных остаётся маленькой (она растёт с числом ревизий, а не с размером файлов).
1. Остановить службу
sudo systemctl stop uversion-server
2. Скопировать каталог
Именно -a сохраняет права и владельцев. Копирование, а не перемещение, оставляет вам возможность отката вплоть до финальной проверки.
sudo mkdir -p /srv/uversion
sudo rsync -a /var/lib/uversion/ /srv/uversion/
sudo chown -R uversion:uversion /srv/uversion
sudo chmod 0750 /srv/uversion
3. Указать конфигурации новый путь
Этот шаг обязателен и идёт перед следующим: см. врезку «Порядок важен» ниже.
sudo sed -i 's#/var/lib/uversion#/srv/uversion#g' /etc/uversion/config.toml
4. Сообщить новый путь установщику
Ответьте новый путь на вопрос «Data directory». Установщик перезаписывает systemd-юнит на основе этого ответа, затем перезапускает службу.
sudo dpkg-reconfigure uversion-server
# Data directory : /srv/uversion
5. Убедиться, что юнит действительно указывает туда
systemctl cat uversion-server | grep -E 'WorkingDirectory|ReadWritePaths'
systemctl status uversion-server
dpkg-reconfigure, не пишите systemd-юнит сами
Установщик сам пишет /etc/systemd/system/uversion-server.service.d/10-data-dir.conf и переписывает его при каждой настройке на основе данного вами ответа. Положенный вручную файл переживает всё до следующего обновления, включая то, что запускает кнопка Update now: тогда юнит снова указывает на старую папку, пока конфигурация пишет в новую. Усиленная служба (ProtectSystem=strict) запускается нормально и ломается при первой же отправке файла, недели спустя.
config.toml
Одного dpkg-reconfigure недостаточно. Установщик исправляет [storage].path только если найденная там папка больше не существует: всё ещё присутствующий пользовательский путь считается осознанным выбором и остаётся как есть. Поскольку вы скопировали, а не переместили, старая папка ещё существует, и потому шаг 2 выше обязателен. Проверив всё и убедившись, что сервер работает по новому пути, вы можете удалить старую папку.
ProtectHome=true, а домашний каталог непроходим для системной учётной записи). Путь под /home или /root мешает запуску (226/NAMESPACE или 200/CHDIR). Выберите системный путь: /srv, /opt или смонтированный диск.
Разместить базу данных в другом месте
Установщик создаёт локальную базу данных, но ничто вас к ней не привязывает. Направьте url на любую доступную базу данных PostgreSQL: другой диск, смонтированный как отдельный кластер, другую машину или управляемый сервис.
[database]
url = "postgres://UTILISATEUR:MOTDEPASSE@HOTE:5432/BASE"
Затем перезапустите. Сервер применяет свои миграции при запуске: он сам обновляет структуру своей базы данных. Пустая база данных инициализируется, более старая обновляется, вам не нужно ничего запускать вручную.
Требуется лишь, чтобы указанная роль могла создавать таблицы в целевой базе данных.
База данных на диске данных
Предыдущий раздел предполагает базу данных, которой вы управляете в другом месте. Если ваша цель иная: чтобы одного уцелевшего диска хватило для восстановления сервера, когда машина умирает, тогда установщик может разместить базу данных внутри каталога данных, в виде выделенного кластера PostgreSQL: отдельного экземпляра PostgreSQL, со своей папкой и своим портом, независимого от системного.
Вопрос задаётся при установке. Чтобы включить это на уже работающем сервере Debian:
sudo dpkg-reconfigure uversion-server
# Data directory : /srv/uversion
# Put the database on the data directory too? Yes
В Windows
То же обещание, иная механика. В Windows нет именованных кластеров: установщик перемещает сам экземпляр PostgreSQL в каталог данных, переориентируя службу. Этот выбор делается в момент установки, добавлением -DbOnDataDir к параметрам скрипта. Он не предлагается вопросом: скрипт спрашивает лишь код активации, поэтому, если вы не передадите этот параметр, база данных останется в своём расположении по умолчанию. Точную форму команды см. в Установка в Windows, учитывая, что однострочная команда не может принять ни одного параметра.
# PowerShell en administrateur, installation en ligne de commande
& ([scriptblock]::Create((iwr https://uversion.io/downloads/server/install.ps1 -UseBasicParsing).Content)) `
-LicenceKey "UV-XXXX-XXXX-XXXX" -DataDir "D:\uVersion" -DbOnDataDir
# verifier ensuite ou pointe le service PostgreSQL
(Get-CimInstance Win32_Service -Filter "Name='postgresql-x64-16'").PathName
Перенос отклоняется, с выводом причины, если экземпляр размещает другие базы данных, кроме базы uVersion, или если его каталог не самодостаточен: наличие табличного пространства, перемещённый через соединение (junction) pg_wal или абсолютный путь, записанный в postgresql.conf. Ничего никогда не удаляется: установщик копирует, проверяет, запускает службу на новой копии и только затем переименовывает старый каталог.
RequiresMountsFor не существует. Опоздавший внешний диск поэтому подхватывается действиями восстановления службы, а не зависимостью. И PostgreSQL в Windows не проверяет никаких прав на своём каталоге: ограничивает их установщик, страховки на стороне сервера нет.
Тогда диск содержит всё:
/srv/uversion/
├── data/chunks contenu des fichiers
├── data/tls certificat, empreinte
├── pgdata/16 LA BASE (cluster PostgreSQL dedie)
└── recovery/ procedure + fichiers necessaires a la reprise
├── RESTORE.md
├── pgconf/ postgresql.conf, pg_hba.conf, pg_ident.conf
├── etc/ copie de config.toml et du mot de passe
└── cluster.env
Кластер получает свой собственный порт, назначаемый автоматически (5433, если он свободен), и config.toml обновляется, чтобы указывать на него. Системный кластер не затрагивается: он может продолжать размещать другие базы данных.
pg_dump, создание кластера, восстановление, обновление url).
Восстановить сервер на новой машине
Диск не содержит программ: приготовьте PostgreSQL и пакет uVersion, копия которых, хранимая рядом с диском, избавит от неприятного сюрприза в нужный день.
# sur la machine neuve
sudo apt install postgresql-16
# montez le disque, par exemple sur /srv/uversion
sudo apt install ./uversion-server_*.deb
# dossier de donnees : le point de montage du disque
# base sur le dossier de donnees : oui
Установщик находит базу данных на диске, возвращает на место конфигурационные файлы PostgreSQL (которые pg_createcluster вынес из каталога, на системный диск), регистрирует кластер, исправляет владельцев, затем заново выравнивает порт и путь к чанкам в config.toml. Если диск монтируется в иной точке монтирования, чем прежде, просто укажите новый путь.
Полная процедура, включая вариант без переустановки, записана на самом диске: recovery/RESTORE.md.
Резервное копирование и восстановление
Полная резервная копия это три элемента: экспорт базы данных (dump), каталог данных и каталог конфигурации.
Сделать резервную копию базы данных
Метаданные: файлы, ревизии, пользователи, блокировки.
sudo -u postgres pg_dump uversion > uversion-$(date +%F).sql
Сделать резервную копию каталога данных
Содержимое файлов, то есть то, что занимает место.
sudo tar -C /var/lib/uversion -czf uversion-data-$(date +%F).tar.gz .
Сделать резервную копию конфигурации
Лицензионный ключ, секрет подписи сессий, пароль базы данных. Она не живёт в каталоге данных.
sudo tar -C /etc -czf uversion-etc-$(date +%F).tar.gz uversion
/etc/uversion
Это третий элемент, и его легче всего забыть: он не живёт в каталоге данных. /etc/uversion/config.toml несёт лицензионный ключ, секрет, которым подписываются сессии, и пароль базы данных; /etc/uversion/licence-key несёт саму лицензию. Без них восстановление на новой машине стартует с новым секретом, и вся команда отключается разом, и приходится заново запрашивать лицензию: код активации, полученный при регистрации, одноразовый и уже израсходован, повторно используется только лицензионный ключ, который он породил.
Чтобы восстановить на новой машине: установите пакет, затем верните три элемента на место, в этом порядке.
1. Восстановить базу данных
sudo -u postgres createdb -O uversion uversion # seulement si elle n'existe pas
sudo -u postgres psql uversion < sauvegarde.sql
2. Восстановить данные
Вернуть чанки, с правильными правами:
sudo rsync -a /mnt/backup/uversion/ /var/lib/uversion/
sudo chown -R uversion:uversion /var/lib/uversion
sudo chmod 0750 /var/lib/uversion
3. Перенести две строки конфигурации
Не весь файл: тот, что установщик только что записал, несёт пароль базы данных, который он сам переопределил.
# N'ECRASEZ PAS le fichier neuf : ouvrez l'ancien a cote et recopiez-en
# deux lignes, et deux seulement.
# [security] jwt_secret -> sinon toute l'equipe est deconnectee
# [licence] key -> sinon il faut redemander une licence
# Gardez le [database] url que l'installateur vient d'ecrire : il porte le
# mot de passe qu'il a lui-meme redefini.
sudo nano /etc/uversion/config.toml
4. Перезапустить
sudo systemctl restart uversion-server
uversion, он повторно использует её как есть и лишь сбрасывает пароль роли. Поэтому вы можете сначала восстановить свой dump, а установить потом.
Перенос кластера PostgreSQL
Требуется редко: база данных мала. Если вы настаиваете, это стандартная операция PostgreSQL, а не то, чем управляет установщик uVersion. Внимание: этот кластер (системный экземпляр PostgreSQL, со своей папкой и своим портом) может размещать другие базы данных, кроме базы uVersion.
sudo systemctl stop uversion-server
sudo pg_ctlcluster 16 main stop
sudo mkdir -p /srv/pgdata
sudo rsync -a /var/lib/postgresql/16/main/ /srv/pgdata/16/main/
sudo chown -R postgres:postgres /srv/pgdata
sudo sed -i "s#^data_directory =.*#data_directory = '/srv/pgdata/16/main'#" \
/etc/postgresql/16/main/postgresql.conf
sudo pg_ctlcluster 16 main start
sudo systemctl start uversion-server
Затем проверьте с помощью pg_lsclusters, что кластер в сети по новому пути.