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-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 之外的数据库,或者其目录并非自包含,移动会被拒绝并显示原因:存在表空间、通过联接点重定位的 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 中重新对齐端口和 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 检查集群已在新路径上处于在线状态。