Appearance
Informat x86 Kubernetes 单组件部署
本方案适用于 linux/amd64(x86_64)架构的 Kubernetes 单组件部署。部署内容包含 PostgreSQL、Redis、RabbitMQ、SeaweedFS、Elasticsearch、Account、Biz、OnlyOffice 和 Nginx。本文以 2.41 安装包为准,安装包 VERSION 为 {"main":"2.41","db":"83"}。
组件清单
| 组件 | 镜像 | 离线文件 | 集群内端口 |
|---|---|---|---|
| Account | cornerstone365/informat-account:2.41 | informat-account-2.41.tar.gz | 9881 |
| Biz | cornerstone365/informat-biz:2.41 | informat-biz-2.41.tar.gz | 8881 |
| PostgreSQL 13.5 | cornerstone365/informat-postgresql:1.0 | informat-postgresql-1.0.tar.gz | 5432 |
| Redis 7 | cornerstone365/informat-redis:1.0 | informat-redis-1.0.tar.gz | 6379 |
| RabbitMQ 3.9.16 | cornerstone365/informat-rabbitmq:1.0 | informat-rabbitmq-1.0.tar.gz | 5672、15672 |
| SeaweedFS | cornerstone365/informat-seaweedfs:1.0 | informat-seaweedfs-1.0.tar.gz | S3 19000、master 19002、volume 19003、filer 19011 |
| Elasticsearch 7.15.2 | cornerstone365/informat-elasticsearch:7.15.2 | informat-elasticsearch-7.15.2.tar.gz | 9200 |
| OnlyOffice 8.1 | cornerstone365/informat-onlyoffice:8.1 | informat-onlyoffice-8.1.tar.gz | 80 |
| Nginx | cornerstone365/informat-nginx:1.0 | informat-nginx-1.0.tar.gz | 80、19881 |
1.0 是组件包装镜像版本,不代表 Redis、PostgreSQL 等上游软件版本。镜像离线包与 YAML 编排文件必须配套使用,不能替换为 ARM 包。Secret、SSH 密码和 OnlyOffice 许可文件不放入部署归档。OnlyOffice 镜像本身包含服务器参考工程的许可,仅供授权环境使用,不应公开分发。
| 离线包 | 约大小 |
|---|---|
informat-account-2.41.tar.gz | 4.6 GiB |
informat-biz-2.41.tar.gz | 5.6 GiB |
informat-onlyoffice-8.1.tar.gz | 1.3 GiB |
informat-postgresql-1.0.tar.gz | 334 MiB |
informat-redis-1.0.tar.gz | 16 MiB |
informat-rabbitmq-1.0.tar.gz | 105 MiB |
informat-seaweedfs-1.0.tar.gz | 126 MiB |
informat-elasticsearch-7.15.2.tar.gz | 430 MiB |
informat-nginx-1.0.tar.gz | 25 MiB |
一、前置要求
| 项 | 要求 |
|---|---|
| 节点架构 | x86_64 / amd64 |
| Kubernetes | 已安装 K3s 或其他 Kubernetes,kubectl 可用 |
| 容器运行时 | K3s containerd;构建、加载和导出镜像时需要 Docker |
| 特权 | Biz 需要使用特权容器运行内置 InformatClaw Docker-in-Docker |
| 存储 | 默认使用 K3s local-path StorageClass,单副本 PVC |
| 内核参数 | Elasticsearch 需要 vm.max_map_count=262144 |
| 入口端口 | 当前模板使用 Nginx hostPort 80,并保留 NodePort 30080 |
单节点参考服务器规格为 4 核、约 30 GiB 内存、约 492 GiB 根分区。该配置适合单节点验证和当前服务器部署,不是高可用集群方案。其他集群部署前,应先调整 StorageClass、资源配额、节点选择和入口策略。
bash
uname -m
kubectl get nodes -o wide
kubectl get storageclass
sudo sysctl -w vm.max_map_count=262144
sudo install -m 644 k8s/90-informat.conf /etc/sysctl.d/90-informat.confregistries.yaml 是 K3s 节点镜像源配置,不是 Kubernetes API 资源。请按数字前缀逐步应用 YAML,不要对整个 k8s/ 目录执行 kubectl apply -f。
二、获取部署模板与镜像
部署文件位于仓库 k8s/。离线交付另外提供 manifests/、informat-k8s-yaml.tar.gz、MANIFESTS_SHA256SUMS 和 9 个镜像包。归档只打包明确列出的文件,不递归收集构建目录或用户后来放入 manifests/ 的其他文件。
在离线包目录执行校验和导入;校验失败时不要继续部署:
bash
cd /opt/informat-images/x86
sha256sum -c SHA256SUMS
sha256sum -c MANIFESTS_SHA256SUMS
tar -xzf informat-k8s-yaml.tar.gz
while read -r checksum file; do
gzip -t "$file"
gzip -dc "$file" | sudo k3s ctr images import -
done < SHA256SUMS
sudo k3s ctr images ls | grep 'cornerstone365/informat-'多节点集群需要在每个可能调度 Pod 的节点导入镜像,或上传到自己的私有镜像仓库并修改 YAML。需要同时写入 Docker 镜像库时,再执行 docker load -i <文件.tar.gz>。非 K3s 的 containerd 节点可使用 ctr -n k8s.io images import,实际 socket 以集群配置为准。
WARNING
K3s 使用独立 containerd 镜像库。只执行 docker load 不会让 K3s 自动获得镜像。
三、配置
3.1 地址与入口
部署前先编辑 k8s/01-configmap.yaml 的 PUBLIC_URL,设置为浏览器真实访问地址,不能使用集群内 Service 地址。当前服务器配置为:
yaml
data:
PUBLIC_URL: 'http://115.29.226.26'当前网关通过单节点 hostPort 80 对外提供服务,并保留 NodePort 30080 作为备用入口。节点 80 端口必须空闲。正式环境建议配置域名和 HTTPS,并在安全组限制来源。
Nginx 包含两个入口:
| 入口 | 用途 |
|---|---|
| 80 | 外部浏览器访问入口 |
| 19881 | 集群内部入口,供应用内部回调使用 |
修改 PUBLIC_URL 或 S3、内网地址后,可执行配置更新 Job:
bash
kubectl apply -f k8s/22-account-config-update.yaml
kubectl -n informat wait --for=condition=complete job/informat-account-config-update --timeout=120s该 Job 只执行外置配置 SQL,不重新执行数据库版本迁移。若同名 Job 已完成,重复更新时先删除此 Job 再创建,不删除数据库或 PVC;有配置缓存的应用还需按实际情况重启刷新。
3.2 密码与 Secret
首次部署使用 create-secret.sh 自动生成 PostgreSQL、Redis、RabbitMQ、S3 随机密码。已有 Secret 不会被覆盖。原始凭据只保存在服务器 /opt/informat-x86/secrets/,目录权限 700、文件权限 600。
bash
kubectl apply -f k8s/00-namespace.yaml
kubectl apply -f k8s/01-configmap.yaml
bash k8s/create-secret.sh
kubectl -n informat create configmap informat-nginx-config \
--from-file=informat-next.conf=k8s/nginx/informat-next.conf \
--dry-run=client -o yaml | kubectl apply -f -需要查看 Redis 密码时,由授权管理员在服务器执行:
bash
sudo cat /opt/informat-x86/secrets/REDIS_PASSWORD不要把密码贴入日志、聊天或 Git。更改 Secret 不会自动同步已有数据库或消息服务的认证。已有业务部署必须先备份并人工确认密码变更、版本升级和数据库迁移,不要重新生成 Secret 或删除 PVC。
四、部署
4.1 部署中间件
bash
kubectl apply -f k8s/10-postgresql.yaml -f k8s/11-redis.yaml \
-f k8s/12-rabbitmq.yaml -f k8s/13-seaweedfs.yaml \
-f k8s/14-elasticsearch.yaml
for name in postgresql redis rabbitmq seaweedfs elasticsearch; do
kubectl -n informat rollout status statefulset/informat-$name --timeout=900s
done
kubectl -n informat get pods,pvc,svcPostgreSQL 首次启动创建 Account/Biz 数据库;SeaweedFS 首次启动创建 informat-next 桶。所有中间件只使用集群内 Service,不应把数据库、Redis、S3 或 Elasticsearch 直接暴露到公网。
4.2 初始化 2.41 数据库
仅全新数据库执行初始化 Job。失败后立即查看日志,不要忽略 SQL 错误继续启动应用。迁移记录使用独立管理表,同一成功版本再次运行时会跳过;这不能代替已有业务数据库的升级评估。
bash
kubectl apply -f k8s/20-account-db-init.yaml
kubectl -n informat wait --for=condition=complete job/informat-account-db-init --timeout=900s
kubectl -n informat logs job/informat-account-db-init
kubectl apply -f k8s/21-biz-db-init.yaml
kubectl -n informat wait --for=condition=complete job/informat-biz-db-init --timeout=900s
kubectl -n informat logs job/informat-biz-db-initJob 从 2.41 镜像内的安装包读取基础 SQL、版本 SQL 和知识库 SQL,最高数据库版本为 83。S3 地址、内部网关地址及 OnlyOffice 预览地址由 ConfigMap/Secret 渲染,不使用旧 Docker 固定 IP。
4.3 启动应用和网关
bash
kubectl apply -f k8s/30-account.yaml -f k8s/31-biz.yaml \
-f k8s/40-onlyoffice.yaml -f k8s/50-nginx.yaml
# 首次安装先在 Account 管理页面导入有效部署许可证,再等待 Biz 就绪。
# 未导入有效许可证时,Biz readinessState 会保持 OUT_OF_SERVICE。
for name in account biz nginx; do
kubectl -n informat rollout status deployment/informat-$name --timeout=900s
done
kubectl -n informat rollout status deployment/onlyoffice --timeout=900s
kubectl -n informat get pods,pvc,svc
curl -I http://127.0.0.1/
curl -fsS http://127.0.0.1/onlyoffice/healthcheckAccount/Biz 使用 /actuator/health 探针,OnlyOffice 使用 /healthcheck。单节点 Nginx 更新使用 Recreate,避免两个 Pod 争用 hostPort。Biz 因参考工程的 InformatClaw Docker-in-Docker 功能使用特权容器,未挂宿主 Docker socket;上生产前必须评估该权限。OnlyOffice 的 JWT 配置沿用参考工程关闭,仅由内网 Service 和网关提供服务;不应独立开放公网端口。
当前模板沿用参考工程的监控配置。正式公网部署前须核查 Actuator/Druid 访问权限、跨域策略及网关认证,并通过安全组限制来源。涉及既有兼容行为的变更应先由用户确认,不在部署中绕过或删除应用的授权校验。
五、验证与访问
bash
kubectl -n informat get pods,pvc,svc
kubectl -n informat logs job/informat-account-db-init --tail=200
kubectl -n informat logs job/informat-biz-db-init --tail=200
curl -s -o /dev/null -w 'HTTP=%{http_code}\n' http://127.0.0.1/
curl -fsS http://127.0.0.1/onlyoffice/healthcheck当前服务器入口:
text
http://115.29.226.26/
http://115.29.226.26:30080/若公网访问不通,但服务器本机访问正常,可先检查云安全组和防火墙。管理员也可临时使用 SSH 本地转发访问后台,该命令不修改安全组:
bash
ssh -N -L 127.0.0.1:18080:127.0.0.1:80 root@115.29.226.26
# 本机浏览器访问 http://127.0.0.1:18080/adminWARNING
Biz 需要导入有效部署许可证后才能进入就绪状态。未导入许可证时,外部依赖健康检查可以全部 UP,但总体仍可能是 OUT_OF_SERVICE,日志可能出现 checkMachineCode failed机器码错误0。这不是 2.41 包错误,也不能通过关闭探针或跳过校验解决。
六、故障排查与备份
PostgreSQL、Redis、RabbitMQ、SeaweedFS、Elasticsearch、应用文件及 OnlyOffice 文件均由 PVC 保存。local-path 数据在当前节点,不能把修改副本数视为高可用;节点故障需要独立备份恢复。不要删除 Namespace/PVC 来“重启”。
bash
kubectl -n informat get pods,pvc,events --sort-by=.metadata.creationTimestamp
kubectl -n informat describe pod <Pod名称>
kubectl -n informat logs <Pod名称> --tail=200
kubectl -n informat logs <Pod名称> --previous --tail=200
kubectl -n informat rollout restart deployment/informat-account deployment/informat-biz| 现象 | 处理 |
|---|---|
| 镜像拉取失败 | 检查镜像是否为 amd64,确认镜像已导入 K3s containerd 镜像库 |
| PVC Pending | 检查 StorageClass、节点磁盘和 local-path provisioner 状态 |
| 数据库初始化失败 | 立即查看初始化 Job 日志,确认 SQL 错误和数据库状态后再处理 |
| OnlyOffice 预览失败 | 检查 PUBLIC_URL、preview.url、Nginx 转发头和 /onlyoffice/healthcheck |
| Elasticsearch 启动失败 | 确认节点已设置 vm.max_map_count=262144 |
| Biz 就绪失败 | 先确认部署许可证,再检查数据库、Redis、RabbitMQ、S3、Elasticsearch 健康状态 |
备份需同时包含数据库逻辑备份、S3 文件、应用 PVC、配置及受控保存的 Secret,不能仅备份镜像。已有系统升级不得直接执行本指南的首部署初始化,需备份并由用户手工确认兼容性。
七、从源码构建与导出
以下为服务器实际目录约定,默认构建架构为 amd64。应用基础镜像 2.38 仅提供 Ubuntu/JDK/Node/Claw 等依赖,最终应用 JAR、SQL 和 VERSION 来自 2.41 安装包,不以旧应用作为最终镜像。
bash
cp /informat_next_2.41.zip /opt/informat-x86/k8s/app-runtime/informat_next_1.0.zip
bash /opt/informat-x86/k8s/build-middleware.sh
for component in account biz; do
docker build --platform linux/amd64 --progress=plain \
--build-arg UBUNTU_MIRROR=http://mirrors.cloud.aliyuncs.com \
--build-arg APP_BASE_IMAGE=cornerstone365/informat-${component}-ubuntu22:2.38-20260814 \
--build-arg INFORMAT_COMPONENT="$component" \
-t cornerstone365/informat-${component}:2.41 /opt/informat-x86/k8s/app-runtime
done
# 许可应由授权管理员在服务器准备,不纳入源码或部署包。
docker build --platform linux/amd64 -t cornerstone365/informat-onlyoffice:8.1 \
/opt/informat-x86/k8s/onlyoffice
bash /opt/informat-x86/k8s/export-images.sh
bash /opt/informat-x86/k8s/package-manifests.sh阿里云内网 Ubuntu 源只适用于可访问该源的服务器,其他环境将 UBUNTU_MIRROR 改为可达的公网源。OnlyOffice 构建前必须在构建上下文中准备授权许可 license.lic。离线输出使用 .partial 临时文件,全部完成后才生成 SHA256SUMS。
构建和导出后的校验要求:
- 9 个镜像全部检查为
amd64。 - 每个导出文件均通过
gzip -t。 sha256sum -c SHA256SUMS全部 OK。sha256sum -c MANIFESTS_SHA256SUMS全部 OK。- Account/Biz 镜像
VERSION都是 2.41/83。 - Account/Biz JAR 与
/informat_next_2.41.zip内容 SHA256 一致。
实际校验中,Account JAR SHA256 为 6310bd4bbece296364bad2ea85f31417a3ca573017f79ab376ab90173114afaf,Biz JAR SHA256 为 89a70e226de5ea9ae1a4080a6b7e822aa98ad446636ab2a3bb00e02a85e33306。
八、实际部署记录
本节记录 2026-10-09 在 115.29.226.26 上的实际部署过程。SSH 密码、集群令牌、Secret 实际值、许可证和完整部署密钥不写入文档或仓库。
8.1 环境检查
bash
ssh root@115.29.226.26
uname -m
nproc
free -h
df -h /
command -v docker kubectl k3s containerd git
systemctl is-active docker containerd k3s kubelet
ss -lntp
ls -la /opt /data /root检查结果:Ubuntu 24.04.5 LTS,内核 6.8.0-139-generic,架构 x86_64,4 核 CPU,约 30 GiB 内存,根分区约 492 GiB、可用约 460 GiB,无 Swap。初始仅 SSH 和系统 DNS 监听,未发现已部署业务或数据;Docker/Kubernetes 初始均未安装。
8.2 源码和下载目录核对
服务器已存在 ARM 参考源码 /root/compile/informat-k8s-arm。用户确认 x86 源码下载到 /root/compile/informat-docker,HEAD 为 c935532,以该目录为准,没有覆盖 Git 下载。
下载站不存在 /installer/k8s/x86/ 或 /installer/k8s/amd64/ 成套目录。informat-next/ 下有 Ubuntu 22 的 account/biz x86 镜像;ARM 成套 tar 不作为 x86 镜像导入。
8.3 安装单节点 Kubernetes
采用 K3s 官方中国镜像安装方式。禁用暂不需要的 Traefik 和 ServiceLB,入口后续使用 Nginx hostPort 80,并保留 NodePort 30080。
bash
curl -fsSL --max-time 30 \
https://rancher-mirror.rancher.cn/k3s/k3s-install.sh \
-o /tmp/informat-k3s-install.sh
INSTALL_K3S_MIRROR=cn INSTALL_K3S_CHANNEL=stable \
sh /tmp/informat-k3s-install.sh \
--disable traefik --disable servicelb --write-kubeconfig-mode 600
kubectl get nodes
kubectl get pods -A
kubectl get storageclass实际安装版本为 v1.36.5+k3s1。节点 izbp1ar9xqpn7ggc7juaklz 已 Ready。自动提供 local-path 默认 StorageClass,卷绑定模式为 WaitForFirstConsumer。服务和 kubeconfig 位于 /etc/systemd/system/k3s.service、/etc/rancher/k3s/k3s.yaml。
8.4 处理公共镜像拉取
初始系统 Pod 卡在 ContainerCreating。通过事件确认 Docker Hub 连接超时:
bash
kubectl get events -A --sort-by=.lastTimestamp | tail -15曾尝试下载 k3s-airgap-images-amd64.tar.zst,中国镜像的对应版本路径返回 404,因此没有导入该文件。随后改为配置可达的公共镜像代理;配置源文件为本仓库 k8s/registries.yaml:
yaml
mirrors:
docker.io:
endpoint:
- 'https://docker.m.daocloud.io'
- 'https://docker.1ms.run'将该文件复制到服务器 /etc/rancher/k3s/registries.yaml 后执行:
bash
systemctl restart k3s
k3s ctr images pull docker.m.daocloud.io/rancher/mirrored-pause:3.10.2
kubectl get pods -A代理测试成功拉取 pause 镜像。随后 CoreDNS、local-path-provisioner、metrics-server 全部达到 1/1 Running。
8.5 安装 Docker
安装 Docker 时服务器已有其他会话占用 dpkg 锁。用户明确授权接手后,确认原进程已退出,未实际终止该进程。继续执行:
bash
dpkg --configure -a
DEBIAN_FRONTEND=noninteractive apt-get \
-o DPkg::Lock::Timeout=60 -o Acquire::https::Timeout=15 \
-o Acquire::Retries=2 install -y \
docker-ce docker-ce-cli containerd.io docker-buildx-plugin \
docker-compose-plugin unzip jq
systemctl enable --now docker
docker versiondocker version 确认 Client/Server 均为 29.9.0。Docker 公共镜像代理和日志轮转配置放在 /etc/docker/daemon.json,来源为本仓库 k8s/docker-daemon.json;复制前已确认该路径没有既有配置,没有覆盖用户配置。
8.6 x86 编排适配
本次部署依据实际镜像适配以下差异:
- PostgreSQL 数据路径
/data/pgsql,首启创建两个业务库和扩展。 - Redis 数据路径
/data,认证方式与当前配置一致。 - RabbitMQ 官方镜像使用
RABBITMQ_DEFAULT_USER/RABBITMQ_DEFAULT_PASS。 - SeaweedFS 数据路径
/data/seaweedfs_home,S3 端口 19000,并创建默认桶。 - Account/Biz 旧入口并非 ARM 参考版的配置渲染、数据库初始化入口,因此使用独立初始化 Job。
- Nginx upstream 指向 Kubernetes Service,而不是固定 IP。
- 全部镜像验证
linux/amd64,应用和中间件密码与 Secret 一致。
地址集中在 01-configmap.yaml,中间件为 5 个单副本 StatefulSet;默认动态 PVC 使用本机 local-path,全部显式限制调度到 amd64。应用使用独立数据库初始化 Job,后续业务 Deployment 不再执行建表。
源码缺少应用 Dockerfile 要求的 informat_next_1.0.zip、informatclaw 额外产物,因此使用匹配的 Ubuntu 22 account/biz 2.38 发行镜像作为应用基础镜像,通过 k8s/app-runtime/Dockerfile 添加配置渲染和前台 Java 入口。配置模板参考 ARM 工程,并保留发行镜像的 x86 JDK 和应用 jar。此适配用于新的 Kubernetes 部署,不修改既有业务数据。
下载的 Ubuntu 基础镜像 VERSION 为 {"main":"2.38","db":"80"},不是最终应用版本。最终应用已覆盖为 2.41。Biz 的 Deployment 使用特权运行内置 DinD,Docker data-root 使用独立 emptyDir,不挂宿主 Docker socket;业务和 CodeStudio 工作目录保存在 PVC。
8.7 构建和服务端校验
构建脚本以 /root/compile/informat-docker 为构建上下文,显式指定 linux/amd64,验证 .Architecture=amd64 后通过 docker save | k3s ctr images import - 导入 Kubernetes 使用的镜像库。日志保存在 /opt/informat-x86/logs/<组件>-build.log。
bash
bash /opt/informat-x86/k8s/build-middleware.sh
for component in account biz; do
docker build --platform linux/amd64 --progress=plain \
--build-arg UBUNTU_MIRROR=http://mirrors.cloud.aliyuncs.com \
--build-arg APP_BASE_IMAGE=cornerstone365/informat-${component}-ubuntu22:2.38-20260814 \
--build-arg INFORMAT_COMPONENT="$component" \
-t cornerstone365/informat-${component}:2.41 \
/opt/informat-x86/k8s/app-runtime \
> /opt/informat-x86/${component}-build.log 2>&1
docker save cornerstone365/informat-${component}:2.41 | k3s ctr images import -
doneOnlyOffice 构建前,使用用户指定参考工程内已有许可,不记录许可内容:
bash
cp /root/compile/informat-k8s-arm/onlyoffice/license.lic \
/opt/informat-x86/k8s/onlyoffice/license.lic
chmod 600 /opt/informat-x86/k8s/onlyoffice/license.lic
docker build --platform linux/amd64 --progress=plain \
-t cornerstone365/informat-onlyoffice:8.1-x86 \
/opt/informat-x86/k8s/onlyoffice \
> /opt/informat-x86/onlyoffice-build.log 2>&1
docker save cornerstone365/informat-onlyoffice:8.1-x86 | k3s ctr images import -全部 Kubernetes 资源通过服务端 dry-run:
bash
kubectl apply --dry-run=server \
-f /opt/informat-x86/k8s/10-postgresql.yaml \
-f /opt/informat-x86/k8s/11-redis.yaml \
-f /opt/informat-x86/k8s/12-rabbitmq.yaml \
-f /opt/informat-x86/k8s/13-seaweedfs.yaml \
-f /opt/informat-x86/k8s/14-elasticsearch.yaml \
-f /opt/informat-x86/k8s/20-account-db-init.yaml \
-f /opt/informat-x86/k8s/21-biz-db-init.yaml \
-f /opt/informat-x86/k8s/30-account.yaml \
-f /opt/informat-x86/k8s/31-biz.yaml \
-f /opt/informat-x86/k8s/40-onlyoffice.yaml \
-f /opt/informat-x86/k8s/50-nginx.yaml8.8 初始化和组件验证
PostgreSQL、Redis 与 Account 初始化:
bash
kubectl apply -f /opt/informat-x86/k8s/10-postgresql.yaml
k3s ctr images tag docker.io/cornerstone365/informat-redis:2.23 \
docker.io/cornerstone365/informat-redis:1.0
kubectl apply -f /opt/informat-x86/k8s/11-redis.yaml
kubectl apply -f /opt/informat-x86/k8s/20-account-db-init.yaml
kubectl -n informat wait --for=condition=complete job/informat-account-db-init --timeout=180sPostgreSQL 13.5 与 Redis 均 1/1 Running。PostgreSQL 日志确认 x86_64 架构、数据库可接受连接。Account 初始化 Job 15 秒完成,日志结尾为 [db-init] Completed account schema initialization。发行 SQL 自带 BEGIN/COMMIT,与 psql 外层事务产生警告但本次无 SQL 错误;版本脚本内的显式提交意味着不能对任意失败版本保证自动整体回滚,失败必须检查日志和数据库状态,不能盲目重跑。
Biz 初始化和其余组件部署:
bash
kubectl apply -f /opt/informat-x86/k8s/21-biz-db-init.yaml
kubectl -n informat wait --for=condition=complete job/informat-biz-db-init --timeout=180s
kubectl apply -f /opt/informat-x86/k8s/13-seaweedfs.yaml \
-f /opt/informat-x86/k8s/14-elasticsearch.yaml \
-f /opt/informat-x86/k8s/40-onlyoffice.yaml
docker tag cornerstone365/informat-onlyoffice:8.1-x86 cornerstone365/informat-onlyoffice:8.1
docker save cornerstone365/informat-onlyoffice:8.1 | k3s ctr images import -
kubectl -n informat create service clusterip informat-rabbitmq --tcp=5672:5672 \
--dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f /opt/informat-x86/k8s/30-account.yaml \
-f /opt/informat-x86/k8s/31-biz.yaml -f /opt/informat-x86/k8s/50-nginx.yaml
kubectl apply -f /opt/informat-x86/k8s/12-rabbitmq.yamlBiz 初始化 12 秒完成,包含 db/knowledgebase/83_biz.sql。SeaweedFS 日志确认 Bucket informat-next ready。OnlyOffice Pod 1/1 Running,/onlyoffice/healthcheck 返回 true。Biz 的内置 Docker 成功加载 informatclaw:2.38。
RabbitMQ 首个 Pod 创建时镜像导入尚未完成,尝试公共镜像代理遇到 403,出现 ErrImagePull。确认镜像已在 K3s 本地库后,仅重建尚未启动的 Pod,不删除数据卷:
bash
k3s ctr images ls | grep informat-rabbitmq
kubectl -n informat delete pod informat-rabbitmq-0 --wait=false重建后日志确认使用节点已有镜像,RabbitMQ 1/1 Running。Account 健康检查为 UP,数据库、Redis(实际 7.4.11)和 RabbitMQ(3.9.16)均 UP。Elasticsearch 集群状态 green。
8.9 公网入口和功能验收
重新 SSH 登录后确认 UFW inactive、INPUT 默认 ACCEPT,宿主机 80 未被其他服务占用。先做 25 秒临时转发测试,不安装额外 Nginx、不修改安全组:
bash
timeout 25s kubectl -n informat port-forward --address=0.0.0.0 service/informat-nginx 80:80
curl --connect-timeout 5 --max-time 8 -s -o /dev/null \
-w 'public_http80=%{http_code}\n' http://115.29.226.26/公网 80 返回 HTTP 200。临时转发超时退出后,将 Nginx Deployment 的 containerPort 80 增加 hostPort 80,使用 Recreate 避免端口争用。保留 30080,内部 19881 仍只在 ClusterIP 暴露。将 PUBLIC_URL 更新为 http://115.29.226.26,新增仅更新配置的 Job,不重跑数据库迁移:
bash
kubectl apply -f /opt/informat-x86/k8s/01-configmap.yaml \
-f /opt/informat-x86/k8s/22-account-config-update.yaml \
-f /opt/informat-x86/k8s/50-nginx.yaml
kubectl -n informat wait --for=condition=complete job/informat-account-config-update --timeout=120s
kubectl -n informat rollout status deployment/informat-nginx --timeout=120s
kubectl -n informat rollout restart deployment/informat-account
kubectl -n informat rollout status deployment/informat-account --timeout=180s配置 Job 和两个 rollout 均成功。重启 Account 是为刷新配置缓存,不更改数据;期间网关短暂 502,服务就绪后恢复。再次从本地验证公网首页和 /onlyoffice/web-apps/apps/api/documents/api.js,均 HTTP 200;OnlyOffice 健康仍为 true。
进行了带 S3 认证的写入、读回校验、删除测试,仅操作本次新建的临时对象,未修改已有对象,也未输出凭据:
bash
set -e
ip=$(kubectl -n informat get service informat-seaweedfs -o jsonpath='{.spec.clusterIP}')
key=$(cat /opt/informat-x86/secrets/S3_ACCESS_KEY)
secret=$(cat /opt/informat-x86/secrets/S3_SECRET_KEY)
object="deployment-check-$(date +%s)"
url="http://$ip:19000/informat-next/$object"
curl -fsS --aws-sigv4 'aws:amz:us-east-1:s3' -u "$key:$secret" \
-X PUT --data-binary 'informat-x86-s3-check' "$url" >/dev/null
body=$(curl -fsS --aws-sigv4 'aws:amz:us-east-1:s3' -u "$key:$secret" "$url")
test "$body" = informat-x86-s3-check
curl -fsS --aws-sigv4 'aws:amz:us-east-1:s3' -u "$key:$secret" -X DELETE "$url" >/dev/null
unset key secret bodyS3 PUT/GET/DELETE 全部通过。Redis 使用 REDISCLI_AUTH 环境变量认证后返回 PONG,RabbitMQ diagnostics ping 成功。PostgreSQL 事务内创建 oracle_fdw、验证向量距离与中文分词,两个布尔结果均 true,最后 ROLLBACK,未保留测试 DDL。
8.10 授权输入准备及待确认事项
进一步只查询部署密钥是否为空,不读取或输出密钥值,结果为 missing。服务器既有文件只找到 OnlyOffice 许可,没有找到 Informat 部署许可证。官方激活说明要求通过部署密钥激活;不能用其他服务器的许可证、伪造密钥或跳过应用校验代替。
浏览器直接访问公网 IP 超时,与本机 curl 网络路径不同。使用本机 SSH 转发后,浏览器已加载企业级后台及“使用部署秘钥登录”输入页:
bash
ssh -N -L 127.0.0.1:18080:127.0.0.1:80 root@115.29.226.26
# 本机浏览器:http://127.0.0.1:18080/admin源码 MachineCodeUtils 支持读取 /host-machine-id 与 /host-product-uuid;当前两个 Pod 未挂载,后台显示两个不同的容器机器码,Pod 重建可能改变机器码。建议将宿主机 /etc/machine-id、/sys/class/dmi/id/product_uuid 只读挂入 Account/Biz,生成稳定一致的宿主机身份后再激活。因会改变当前机器码,已经请求用户手工确认,未擅自实施。
另已请求确认公网 Nginx 是否禁止 /actuator、/druid,保留内部健康探针和监控。此安全策略可能影响外部诊断访问,按用户兼容性要求等待确认。9 个 2.41 配套镜像及其校验文件未因入口配置更新而改变,部署归档会同步最新 YAML 和本文。

