一、部署环境
服务器系统:Ubuntu 面板:1Panel v2.2.3 容器工具:Docker Web服务:OpenResty 程序:Koodo Reader 1.6.6 容器内部端口:8860 访问域名:bobkoodo.netapitest.com
二、完整部署步骤
1. 应用商店安装Koodo Reader
1Panel → 应用商店,搜索
koodo-reader基础参数填写
- 名称:koodo-reader
- 端口:8860
- ⚠️ 取消勾选【端口外部访问】(安全策略,不直接暴露容器端口到公网)
- 重启策略:一直重启
点击确认安装
安装完成后,仅能本地
127.0.0.1:8860访问,外网无法直接打开,需要反向代理。
2. 创建网站、解析域名
- 域名服务商添加A记录:
bobkoodo.netapitest.com指向服务器公网IP - 1Panel → 网站 → 添加站点,域名填入
bobkoodo.netapitest.com,运行环境选择【纯静态】
3. 申请SSL证书
- 网站 → 证书 → 申请证书
- 主域名:
bobkoodo.netapitest.com - ACME账户:Let’s Encrypt
- 验证方式:HTTP
- 勾选【自动续签】
- 主域名:
- 申请前提:服务器安全组放行 TCP 80、443端口
4. Nginx反向代理配置(最终稳定方案)
核心冲突点:不要同时混用【面板可视化HTTPS】+【完整手写server配置】,二选一! 本次最终选用:完整手写Nginx配置,关闭面板HTTPS可视化开关 最终可用配置:
server {
listen 80;
server_name bobkoodo.netapitest.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name bobkoodo.netapitest.com;
ssl_certificate /www/sites/bobkoodo.netapitest.com/ssl/fullchain.pem;
ssl_certificate_key /www/sites/bobkoodo.netapitest.com/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
proxy_pass http://127.0.0.1:8860;
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;
# WebSocket 核心配置,保证跨设备阅读进度同步
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
操作规范:
- 网站【配置文件】粘贴完整代码
- 切换到网站【HTTPS】页面,关闭【启用HTTPS】,防止面板自动生成配置造成冲突覆盖
- 保存并重载OpenResty
5. 持久化与电子书目录挂载(可选推荐)
- 终端执行创建电子书文件夹
mkdir -p /opt/ebook
- koodo-reader → 参数 → 容器设置 → 添加挂载
- 宿主机路径:
/opt/ebook - 容器路径:
/books
- 宿主机路径:
- 重启容器,网页端Koodo新增书库,路径填写
/books,支持服务器直接存放电子书,无需网页逐个上传。
三、部署全程遇到的问题 + 解决方案
问题1:手动填写宝塔风格证书路径,Nginx启动报错
报错信息:cannot load certificate xxx/fullchain.pem: No such file or directory 原因:/www/server/panel/vhost/cert/ 是宝塔面板路径,1Panel证书目录不一样,直接复制网上通用宝塔配置导致路径失效。 解决: 方式A:使用1Panel证书真实路径; 方式B:不要手动硬编码证书路径,交给面板自动管理(图形化方案)。
问题2:修改配置文件后,网站HTTPS开关自动消失
原因: 1Panel两套机制冲突: ① 面板HTTPS可视化开关:自动生成ssl证书相关代码 ② 手动全量覆盖配置文件,会删除面板自动生成的代码;面板检测不到自动生成SSL代码,界面HTTPS开关自动取消勾选。 ✅ 铁律:两种模式只能选一种
- 模式1(图形化):配置文件只追加location参数,不手写完整server块,HTTPS全部面板界面操作
- 模式2(手写配置):完整编写所有server、ssl、跳转代码,网站HTTPS页面开关必须关闭,不要再点击保存
问题3:网页报错 ERR_TOO_MANY_REDIRECTS 重定向死循环
错误配置示范:单个server同时监听80和443,统一强制跳转https,https访问进来也会继续跳转,无限循环。 解决:拆分两个server块
- server1:仅listen 80,负责http跳转https
- server2:仅listen 443 ssl,处理反向代理业务
问题4:Firefox访问正常,Chrome浏览器一直标记「不安全」
现象:证书本身合法有效(Let’s Encrypt、域名匹配、未过期),新浏览器无痕窗口访问正常,主力Chrome提示不安全。 根因:调试阶段多次SSL配置报错,Chrome缓存了历史错误安全标记,不会自动刷新。 解决方案:
- 页面地址栏不安全图标 → 网站设置 → 清除该站点数据
- 完全退出Chrome进程,重启浏览器; 临时方案:
Ctrl+Shift+R强制刷新页面。
问题5:跨设备阅读进度无法同步
原因:缺少WebSocket代理配置。 解决:location内部必须增加三行核心代码
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
四、重要避坑清单(长期维护参考)
- 容器安装时,永远不要勾选「端口外部访问」,依靠反向代理访问,提升安全;
- 不要网上随便复制宝塔Nginx配置直接粘贴进1Panel,目录结构不通用;
- 不要同时开启「面板HTTPS可视化」+「手写完整Nginx ssl配置」,二者互斥;
- Let’s Encrypt证书依赖80端口做HTTP验证,安全组务必长期放行TCP 80、443;
- Koodo务必设置登录密码,禁止无密码外网访问;
- 调整Nginx配置后,记得重载OpenResty,修改不重载不会生效。
五、部署完成验证清单
✅ HTTPS正常访问,地址栏显示安全小锁 ✅ HTTP访问自动跳转到HTTPS ✅ 多设备登录同一账号,阅读进度实时同步 ✅ 电子书目录挂载生效,可读取服务器本地书籍 ✅ 服务器重启后,Koodo容器自动启动
