uVersion
简体中文
下载 →

Wiki

使用 Docker 部署

uVersion 服务器与 PostgreSQL 以容器方式一站式运行:下载镜像、加载、配置 .env、启动。数据与数据库的位置可配置。

.deb 软件包的替代方案:uVersion 服务器及其 PostgreSQL 数据库以容器方式运行, 由单条 docker compose up 启动。如果你偏好容器化部署,或想快速试用,这很理想。

前置条件:带 Compose v2 插件的 Docker Engine 20.10+ (docker compose version),以及一枚 uVersion 许可证密钥。没有有效且已签名的 密钥,服务器会拒绝启动:请从你的账户获取(或从 注册页面申领一枚)。

Podman 同样可用 把本页所有命令中的 docker 换成 podmanpodman compose pullpodman load -ipodman 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. 获取镜像

在线时,registry 就够了:

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 个字符),请在 .env 中填写 UVERSION_SECURITY__JWT_SECRET: 它确实会传给容器,容器随后使用它而不再自行生成。

这个密码一次定好 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):服务器在 8443 端口提供自签名 HTTPS,每个客户端在首次连接时予以确认。请与你的团队共享(见 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,请在 .env 中填写 UVERSION_DATABASE__URL,然后删除 docker-compose.yml 中的 db 服务和 depends_on 块。

# 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 指定的两个宿主机 目录里。downdown -v 都不会碰它们。要真正从零开始,你得自己删掉 这些目录。这一点务必知晓:认证失败之后的本能反应,是先 down -vup,而那会用同一个数据库和同一个密码,精确地绕回到同样的错误。