uVersion
简体中文
下载 →

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:请保持这样。

数据存放在哪里

三个不同的位置,这正是最让人意外的地方。第三个,即配置,也是备份时最容易被遗忘的:

什么在哪里
文件内容(chunk,文件的分片:占用空间的就是它)/var/lib/uversion/data/chunks
TLS 证书、服务器指纹/var/lib/uversion/data/tls
服务器身份、许可证锚点/var/lib/uversion/server-idlast-validated-at
元数据(文件、修订、用户、锁、权限、任务)PostgreSQL/var/lib/postgresql/16/main
配置:许可证密钥、会话签名密钥、数据库密码/etc/uversion/config.toml/etc/uversion/licence-key
数据库不会跟随数据目录 更改数据目录会移动 chunk 和证书,但不会移动数据库。而数据库通过指纹引用 chunk:如果您只移动其中一个,服务器就会去寻找找不到的 chunk。两者都移动,或者都不移动。

移动数据目录

这是常见的情形:内容不断增大,而系统分区很小。数据库本身则保持很小(它随修订数量增长,而不是随文件大小增长)。

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 步是必须的。等一切检查完毕、服务器在新路径上运行后,您就可以删除旧文件夹。
切勿放在 /home 或 /root 之下 服务以加固过的系统用户运行(ProtectHome=true,而个人目录无法被系统账户遍历)。位于 /home/root 之下的路径会阻止启动(226/NAMESPACE200/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 之外的数据库,或者其目录并非自包含,移动会被拒绝并显示原因:存在表空间、通过联接点重定位的 pg_wal,或写入 postgresql.conf 的绝对路径。任何东西都绝不会被删除:安装程序会复制、校验、在新副本上启动服务,然后才重命名旧目录。

与 Linux 的两点不同 Windows 无法让服务等待磁盘:不存在 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 会被更新以指向它。系统集群不受影响:它可以继续托管其他数据库。

两点代价,在说“是”之前要知道 一个 PostgreSQL 数据目录只能用创建它的主版本打开:三年后的恢复可能需要显式安装 PostgreSQL 16。而且磁盘如今还承载着许可证密钥、为会话签名的密钥以及数据库密码,位于一个仅 root 可访问的目录中:请把这块磁盘当作一份凭据来对待。
数据库已有数据:安装程序拒绝移动它 如果您的服务器已经带着数据在运行,启用该选项不会移动任何东西:一次在软件包升级中途被中断的搬迁,会比根本不搬迁更糟。安装程序会让您保持原状,并打印手动步骤(停止、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 中重新对齐端口和 chunk 路径。如果磁盘挂载到了与之前不同的挂载点,只需回答新路径即可。

完整的步骤,包括无需重新安装的变体,都写在磁盘本身上: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. 恢复数据

把 chunk 放回,并赋予正确的权限:

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 检查集群已在新路径上处于在线状态。