
如何在服务器上安装OriginSNS
OriginSNS 安装部署说明
本文说明如何在服务器上安装与运维 OriginSNS。
同目录还有纯文本版:部署说明.txt(内容一致,方便在服务器终端直接 cat / less)。
默认部署目录: /www/wwwroot/origin 若你改了目录名,请把文中路径全部换成实际路径,并同步修改 .env 里的 ORIGIN_HOST_DEPLOY_DIR。
命令在哪执行(重要)
- 凡写「在部署目录执行」:先进入含
docker-compose.yml的目录,再敲命令。 - 推荐用 SSH,或宝塔面板 → 终端(不要只靠编排面板点「重建」排错)。
- 多数示例都以这两行开头,复制时请一起执行:
```bash cd /www/wwwroot/origin
然后才是具体命令
```
- 未执行
./ode install时:即使在部署目录,也要写./ode …(前面的./不能省)。 - 已执行
sudo ./ode install后:可在任意目录直接敲ode …。
默认端口: 宿主机 9620 → 容器内 3000 对外只开 80 / 443(及 SSH 22);不要把 9620、5432、6379 暴露到公网。 建议关闭宝塔「系统防火墙」,入站安全用云厂商安全组即可(详见文末错误说明)。
本目录主要文件
| 文件 | 说明 | |------|------| | docker-compose.yml | 国内机默认 Compose | | docker-compose.us.yml | 美国/海外完整 Compose(需手动 -f) | | .env.example / .env.us.example | 环境变量模板 | | ode | 运维命令行 | | 宝塔编排路径.txt | 宝塔 Compose 路径说明(必读) | | nginx-hsts.example.conf | 反代层 HSTS 示例(可选) | | scripts/ | 部署与运维脚本 |
---
首次部署:步骤总览
1. [第一步:准备服务器与 Docker](#第一步准备服务器与-docker) 2. [第二步:上传并解压部署包](#第二步上传并解压部署包) 3. [第三步:配置 .env(必做)](#第三步配置-env必做) 4. [第四步:启动服务](#第四步启动服务) 5. [第五步:验收容器与健康检查](#第五步验收容器与健康检查) 6. [第六步:宝塔网站 + 反向代理 + HTTPS](#第六步宝塔网站--反向代理--https) 7. [第七步:注册管理员并进入后台](#第七步注册管理员并进入后台)
美国/海外机在第三、四步改用 US 模板(见 [美国 / 海外服务器](#美国--海外服务器us))。 装好后的升级、ode 运维、错误对照见文后章节。
---
第一步:准备服务器与 Docker
需要:
- Linux + 宝塔
- 内存建议 2GB+,磁盘建议 20GB+
- 域名已解析到本机(国内站需备案)
安装 Docker: 宝塔 → 软件商店 → 搜索 Docker → 安装「Docker 管理器」→ 状态为运行中
在任意目录验证:
``bash docker --version docker compose version ``
两条都有版本号输出 → 进入第二步。
---
第二步:上传并解压部署包
1. 把收到的 origin-deploy-*.zip 上传到服务器,例如 /www/wwwroot/
2. 在终端执行(文件名换成你实际的 zip):
``bash cd /www/wwwroot unzip origin-deploy-x.x.x.zip mv deploy-package origin cd origin ls ``
应能看到:docker-compose.yml、.env.example、ode、scripts/ 等。
若解压后没有 deploy-package 这一层(文件直接散落):
```bash cd /www/wwwroot mkdir -p origin
把解压出的文件全部移进 origin 后:
cd origin ```
确认当前目录正确后 → 进入第三步。
---
第三步:配置 .env(必做)
工作目录: 部署目录
``bash cd /www/wwwroot/origin ``
3.1 复制模板
国内机:
``bash cp .env.example .env ``
美国/海外机:
``bash cp .env.us.example .env ``
(第四步启动时必须带 -f docker-compose.us.yml,见 [美国 / 海外](#美国--海外服务器us))
3.2 生成两个密钥(各执行一次,两次结果不要相同)
``bash openssl rand -base64 32 ``
终端会打印一长串,再执行一次同样命令,得到第二串。
编辑 .env(宝塔「文件」打开,或 nano .env),填入(不要带引号、不要首尾空格):
``env SESSION_SECRET=第一次生成的那串 ORIGIN_LICENSE_ENCRYPTION_KEY=第二次生成的那串 ``
注意:
- 两个值必须不同
- 上线后不要随意改
SESSION_SECRET(已登录用户会全部掉线) - 若提示没有 openssl:宝塔终端一般自带;或用系统包管理器安装 openssl
3.3 填写站点地址
``env NEXT_PUBLIC_APP_URL=https://你的域名 ``
必须带 https://,不要末尾斜杠(例:https://bbs.example.com)
3.4 数据库密码(新站强烈建议改掉默认值)
下面四项必须一致(用户名/库名若改也要四处对齐):
``env POSTGRES_USER=postgres POSTGRES_PASSWORD=你的强密码 POSTGRES_DB=origin DATABASE_URL=postgresql://postgres:你的强密码@db:5432/origin?schema=public ``
注意:
POSTGRES_PASSWORD与DATABASE_URL里的密码要相同- 密码尽量用字母数字;含
@ # : % /时,DATABASE_URL需做 URL 编码 - 必须在第一次启动之前改好;启动后只改
.env不会改掉库里已有密码
3.5 确认版本三行与本 zip 一致
一般与 .env.example 相同即可,不要擅自改高:
``env ORIGIN_VERSION=… ORIGIN_DOCKER_IMAGE=…/origin-web:… ORIGIN_MIGRATE_DOCKER_IMAGE=…/origin-migrate:… ``
3.6 部署路径(目录不是默认路径时必改)
``env ORIGIN_HOST_DEPLOY_DIR=/www/wwwroot/origin ``
3.7 建议保留的默认项(一般不用改)
``env ORIGIN_PORT=9620 INTERNAL_APP_ORIGIN=http://127.0.0.1:3000 REDIS_URL=redis://redis:6379 ``
注意:INTERNAL_APP_ORIGIN 填容器内端口 3000,不是宿主机 9620。
保存 .env → 进入第四步。
---
第四步:启动服务
工作目录: 部署目录
``bash cd /www/wwwroot/origin ``
国内机(推荐一键):
``bash chmod +x ode scripts/*.sh sh scripts/first-deploy.sh ``
脚本会:检查配置 → 处理宝塔路径 / Docker config → 拉镜像 → 启动 → 打印状态。
一键失败时可手动(仍在同一目录):
``bash sudo sh scripts/ensure-docker-config.sh sudo sh scripts/ensure-baota-compose-paths.sh docker compose pull docker compose up -d ``
美国/海外机:不要用上面国内一键时的默认 compose,改用文中 [美国 / 海外](#美国--海外服务器us) 一节的命令。
启动完成后 → 进入第五步。
---
第五步:验收容器与健康检查
工作目录: 部署目录
``bash cd /www/wwwroot/origin docker compose ps ``
正常大致为:
| 服务 | 期望状态 | |------|----------| | db / redis | running (healthy) | | web / updater | running | | migrate | exited (0) ← 一次性任务,退出码 0 表示迁移成功(不是故障) |
健康检查:
``bash curl -sS http://127.0.0.1:9620/api/health ``
期望看到类似 status ok、database connected,且 version 与 .env 中 ORIGIN_VERSION 一致。 (不要在公网直接访问 9620。)
出问题再看日志:
``bash docker compose logs --tail=80 web docker compose logs --tail=80 migrate ``
验收通过 → 进入第六步。 新站一般不需要单独再跑 migrate 或 recover-update。
---
第六步:宝塔网站 + 反向代理 + HTTPS
6.1 添加站点
1. 宝塔 → 网站 → 添加站点 2. 域名填你的实际域名 3. PHP 可选「纯静态」(页面由 Docker 提供)
6.2 反向代理
1. 进入该站点 → 反向代理 → 添加反向代理 2. 目标 URL:http://127.0.0.1:9620 3. 发送域名建议:$host
高级/自定义配置中建议包含:
``nginx proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; ``
6.3 发帖图片不显示时(推荐一并配置)
若图片 URL 为 /uploads/... 但浏览器 404,在站点「配置文件」里、其它静态图片规则之前增加:
``nginx location ^~ /uploads/ { proxy_pass http://127.0.0.1:9620; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ``
保存后重载 Nginx。
6.4 申请 SSL
站点 → SSL → Let's Encrypt(或上传证书)→ 开启「强制 HTTPS」。 务必用 https://域名 访问,不要用 http://IP:9620 登录(Cookie 可能失效)。
6.5 若使用宝塔「Docker → 容器编排」
Compose 文件路径只填一行(不要逗号拼两段):
``text /www/wwwroot/origin/docker-compose.yml ``
核对:
```bash cd /www/wwwroot/origin sh scripts/print-baota-path.sh
或
cat baota-compose.path ```
报「文件不存在 / 双路径」:
``bash cd /www/wwwroot/origin sudo sh scripts/ensure-baota-compose-paths.sh ``
面板「暂无容器」但 docker compose ps 正常 → 以命令行为准。 详见同目录:宝塔编排路径.txt
完成后 → 进入第七步。
---
第七步:注册管理员并进入后台
1. 浏览器打开:https://你的域名/register 2. 注册第一个「真人」账号 → 自动成为管理员 3. 再进入后台管理
忘记用户名或密码时,在部署目录:
``bash cd /www/wwwroot/origin ./ode list-admins ./ode reset-admin-password ``
若注册后仍是普通用户,可在部署目录提权(把用户名换成你的):
``bash cd /www/wwwroot/origin docker compose exec db psql -U postgres -d origin -c \ "UPDATE \"User\" SET role = 'ADMIN' WHERE username = '你的用户名';" ``
然后重新登录再进后台。
---
部署完成检查清单
- [ ] 已解压到
/www/wwwroot/origin(或自定路径,且ORIGIN_HOST_DEPLOY_DIR一致) - [ ] Docker / Compose 已安装并运行;建议关闭宝塔系统防火墙
- [ ] 已 cp 模板为
.env,并改好两个密钥与NEXT_PUBLIC_APP_URL - [ ] 已改
POSTGRES_PASSWORD,并与DATABASE_URL密码一致(首次启动前) - [ ]
ORIGIN_VERSION与两个镜像 tag 一致,且与本 zip 一致 - [ ]
INTERNAL_APP_ORIGIN=http://127.0.0.1:3000 - [ ] 已执行 first-deploy(或手动
up -d) - [ ]
docker compose ps:db/redis healthy,web/updater running,migrate exited (0) - [ ]
curl 127.0.0.1:9620/api/health正常 - [ ] 宝塔反代 →
127.0.0.1:9620,SSL 已开;(推荐)已配/uploads/代理 - [ ]
https://域名/register可注册,并可进入后台
---
美国 / 海外服务器(US)
在「第三步」用:
``bash cd /www/wwwroot/origin cp .env.us.example .env ``
按第三步改密钥、域名、数据库密码后,用下面代替「第四步」的国内一键:
``bash docker compose -f docker-compose.us.yml pull docker compose -f docker-compose.us.yml up -d ``
宝塔编排路径可填:
``text /www/wwwroot/origin/docker-compose.us.yml ``
之后凡 docker compose 命令,请同样加上:
``bash -f docker-compose.us.yml ``
---
已上线站点如何升级
正常:登录后台 → 系统 → 一键更新。一般不必改 .env。
卡住或失败时(部署目录):
```bash cd /www/wwwroot/origin ./ode diagnose ./ode migrate ./ode maintenance off
或
sh scripts/recover-update.sh ```
---
日常运维(ode)
工作目录: 部署目录(未 install 时)
``bash cd /www/wwwroot/origin chmod +x ode ./ode origin # 打开菜单(推荐) ``
常用子命令
| 命令 | 说明 | |------|------| | ./ode diagnose | 一键诊断(状态 + web/migrate 日志) | | ./ode status | 状态 / 健康检查 | | ./ode logs | 跟随 web 日志(Ctrl+C 退出) | | ./ode migrate | 重试数据库迁移 | | ./ode migrate-logs | 看 migrate 日志 | | ./ode maintenance on\|off | 开/关维护模式 | | ./ode restart-web | 只重启 web | | ./ode pull | 只拉镜像 | | ./ode upgrade [版本] | 手动升级 | | ./ode backup | 备份 | | ./ode backup --archive | 备份并打成 .tar.gz | | ./ode recover [版本] | 修复更新中断 | | ./ode list-admins | 列出管理员 | | ./ode reset-admin-password | 重置管理员密码 | | ./ode unlock-user | 解封用户 / 允许登录 | | ./ode prune | 清理旧版镜像 / 悬空层 | | ./ode cleanup | 清理残留 migrate 容器 | | ./ode baota-fix | 修复宝塔路径 / Docker 配置 | | ./ode install | 装到 PATH(需 root) | | ./ode help | 帮助 |
迁移失败建议顺序:
``bash cd /www/wwwroot/origin ./ode diagnose ./ode migrate ./ode maintenance off ./ode status ``
可选装到系统 PATH(之后任意目录可直接 ode origin):
``bash cd /www/wwwroot/origin sudo ./ode install ``
---
常见错误说明(对照表)
以下命令如无特殊说明,均先执行:
``bash cd /www/wwwroot/origin ``
拉镜像 / 网络
1. pull access denied(origin-web / origin-migrate) - 现象:docker compose pull 失败,提示 access denied / not found - 处理:核对 .env 版本三行是否与本包一致;不要改成尚未提供的高版本。联系给你包的一方确认该版本镜像是否已发布。
2. registry-1.docker.io 超时(国内机) - 现象:拉 postgres/redis/docker-cli 卡住或超时 - 处理:确认用的是默认 docker-compose.yml(基础镜像走国内代理);或在 Docker 配置 registry-mirrors 后重试 docker compose pull。
3. DaoCloud / 国内代理超时(美国机) - 现象:国内代理镜像反而拉不动 - 处理:改用 [美国 / 海外](#美国--海外服务器us) 模板(.env.us.example + docker-compose.us.yml)。
Docker 配置 / 数据库起不来
4. config.json is a directory / Error loading config file … config.json
``bash sudo sh scripts/ensure-docker-config.sh docker compose up -d updater ``
5. postmaster.pid / pg_wal … Operation not permitted;db unhealthy - 确认 docker-compose.yml 的 db 含 security_opt: seccomp:unconfined - 检查云主机安全软件是否拦截 Docker - 新站且无重要数据时,可停栈后清 Postgres 数据卷再重新 first-deploy(会清空库,慎用)
6. dependency failed … origin-db-1 is unhealthy 先按第 5 条修好 db,再:
``bash docker compose up -d ``
7. web 一直 Waiting / Restarting 看 db、redis 是否 healthy;确认 REDIS_URL=redis://redis:6379;
``bash docker compose logs --tail=100 web ``
迁移 migrate
8. migrate 失败 / password authentication failed 核对 POSTGRES_* 与 DATABASE_URL 是否一致;若数据卷已初始化过,只改 .env 无效,需进库改密码或按备份流程处理。
9. migrate 失败(其它)/ prisma 相关报错 确认 ORIGIN_MIGRATE_DOCKER_IMAGE 指向 origin-migrate(不要填成 web 镜像):
``bash docker compose logs --tail=120 migrate ./ode migrate ``
10. 一键更新后登录提示「数据库未就绪」或功能异常
``bash ./ode diagnose ./ode migrate ./ode maintenance off ./ode restart-web ``
宝塔编排 / 面板
11. 宝塔提示 compose 文件不存在(双路径)
``bash sudo sh scripts/ensure-baota-compose-paths.sh ``
面板只填一行:/www/wwwroot/origin/docker-compose.yml 勿删除编排项目(可能停栈或清卷);以 docker compose ps 为准。详见 宝塔编排路径.txt。
12. 宝塔编排显示「运行中」但「暂无容器」 以 SSH 里 docker compose ps 为准;面板常不同步命令行拉起的栈,不必为此反复点删除重建。
网站访问 / 登录 / 图片
13. 502 Bad Gateway
``bash docker compose ps curl -sS http://127.0.0.1:9620/api/health ``
确认反代目标是 http://127.0.0.1:9620。
14. 登录后跳回登录页 / Cookie 无效 必须用 https://域名 访问;不要用 http://IP:9620;确认已开强制 HTTPS,且 NEXT_PUBLIC_APP_URL 与访问域名一致。
15. 发帖图片 404 按第六步 6.3 配置 /uploads/ 反代到 9620;本机可先测:
``bash curl -I http://127.0.0.1:9620/api/health ``
16. 健康检查失败 / 域名打不开站
``bash docker compose ps docker compose logs --tail=100 web docker compose logs --tail=100 migrate ``
确认 DNS、SSL、反代均指向本机 9620。
维护模式 / 更新卡住
17. 整站提示维护中、关不掉
```bash ./ode maintenance off
或编辑 .env 将 MAINTENANCE_MODE=false 后:
docker compose up -d web ```
18. 一键更新失败 / 卡在更新中
``bash ./ode diagnose ./ode migrate ./ode maintenance off sh scripts/recover-update.sh ``
防火墙 / 容器反复退出
19. web 反复 Restarting (137);或日志出现 No chain/target/match 关闭宝塔「系统防火墙」后:
``bash sudo systemctl restart docker cd /www/wwwroot/origin && docker compose up -d ``
入站只靠云安全组开放 80、443、22。
20. 检查更新 / 拉取更新说明失败 确认服务器能访问更新源(.env 中 ORIGIN_RELEASES_URL);不要把更新源与本站配成「域名解析回本机公网 IP」的死循环(Hairpin NAT)。
账号
21. 忘记管理员密码
``bash ./ode list-admins ./ode reset-admin-password ``
22. 账号被封 / 无法登录
``bash ./ode unlock-user ``
---
常用 Docker 命令备忘
工作目录: 部署目录
```bash cd /www/wwwroot/origin
docker compose ps docker compose logs -f web docker compose logs --tail=50 db docker compose restart web docker compose pull docker compose up -d ```
美国/海外把上面的 docker compose 换成:
``bash docker compose -f docker-compose.us.yml … ``