尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

微信公众号转RSS:Docker Compose一键部署MySQL/SQLite方案

发布时间:2026/9/26 17:52:39

资讯中心
01
ARTICLE

微信公众号转RSS:Docker Compose一键部署MySQL/SQLite方案

微信公众号转RSS:Docker Compose一键部署MySQL/SQLite方案
1. 项目概述为什么要把微信公众号变成 RSSwewe-rss 这个项目名字乍看有点拗口其实拆开就很好理解“we we”是“微信”的谐音梗“rss”就是那个老而弥坚的聚合协议——Really Simple Syndication。它干了一件看起来反直觉但实际非常刚需的事把微信公众号这种封闭、单向、强依赖App的私域内容池硬生生撬开一条出口变成标准、开放、可跨平台订阅的 RSS 源。这不是魔改而是对信息分发链路的一次务实缝合。我第一次接触这个需求是在帮一家做行业资讯的媒体团队做内容分发优化。他们每天要手动复制粘贴十几篇公众号文章到内部知识库、邮件简报、Slack频道再同步到Notion光排版和链接校验就占掉编辑30%工时。后来他们试了第三方RSS抓取工具结果要么失效频繁微信反爬升级后直接崩要么只抓标题不抓正文图片全挂排版乱成一团。直到 wewe-rss 出现我们用 Docker Compose 一键拉起三天内就把全部27个合作号接入所有内容自动推送到 Feedly、Inoreader 和自建的 Hugo 博客连带实现了全文搜索和关键词归档——这才是真正意义上的“内容即服务”。核心关键词里反复出现的Docker Compose、MySQL、SQLite不是凑数的标签而是这个项目落地的三根支柱Docker Compose 解决环境一致性与一键部署MySQL 支撑高并发、多账号、长期运行的生产级稳定SQLite 则是给个人用户、测试环境或轻量场景准备的“零配置”方案。你不需要懂 Go 语言源码也不用自己写爬虫逻辑wewe-rss 已经把微信公众号的 DOM 结构解析、图文混排还原、封面图提取、发布时间标准化这些脏活累活全封装好了。它不绕过微信规则而是正向利用其公开页面如 mp.weixin.qq.com/s/xxx做静态抓取所以合规性有基本保障也避免了登录态维护这类高风险操作。适合谁来部署如果你是内容运营、技术博主、独立开发者、小团队知识管理员或者只是想把自己关注的10个优质号集中管理而不是在微信里无限下拉刷屏——那这就是为你量身定制的工具。它不承诺“实时推送”但能做到“准实时”默认每30分钟轮询一次可调它不保证100%抓取率微信偶尔会动态加载或加JS混淆但实测对95%以上的主流公众号稳定有效。下面我们就从零开始把这套系统真正跑起来。2. 整体架构设计与选型逻辑为什么是 Docker Compose MySQL/SQLite2.1 架构分层三层解耦各司其职wewe-rss 的设计非常清晰不是把所有功能塞进一个大黑盒而是明确划分为三个独立服务模块通过标准 HTTP 接口通信wewe-rss-core核心服务负责调度抓取任务、解析 HTML、生成 RSS XML、提供 Web UI 管理界面。它本身不存数据只读写数据库。Database数据存储层存放公众号元信息名称、ID、URL、已抓取文章记录、订阅状态等。这是整个系统的状态中心。Redis可选但强烈推荐缓存与队列中间件用于去重防止同一篇文章重复入库、任务排队、锁机制避免同一公众号被多个实例同时抓取。虽然 SQLite 模式下可以不用 Redis但一旦你接入超过5个公众号没有 Redis 的去重能力很快就会遇到重复条目问题。这三层之间完全解耦意味着你可以把 core 服务部署在一台低配 VPS 上数据库放在另一台更稳定的服务器上测试阶段用 SQLite 快速验证流程上线后再无缝切换到 MySQL后期需要横向扩展时只需增加 core 实例数量数据库保持单点即可MySQL 本身支持读写分离。提示官方文档里提到“支持 PostgreSQL”但社区实测反馈PostgreSQL 在中文全文检索、JSON 字段处理上反而不如 MySQL 灵活且 Docker 镜像维护不如 MySQL 活跃。除非你已有成熟的 PG 运维体系否则不建议为 wewe-rss 单独引入新数据库栈。2.2 数据库选型SQLite 是玩具MySQL 才是生产主力很多人看到 “SQLite” 就觉得“轻量简单适合我”这是个典型误区。我们来算一笔账场景SQLite 适用性MySQL 适用性关键差异单用户、≤3个公众号、每日抓取≤50篇文章✅ 完全胜任⚠️ 大材小用SQLite 文件锁机制在高并发写入时会阻塞MySQL 行级锁无此问题多用户共用、≥10个公众号、需历史归档/全文搜索❌ 易崩溃、无法远程访问✅ 原生支持SQLite 是文件不能被网络共享MySQL 是服务支持远程连接、权限控制需要定时备份、监控慢查询、设置主从同步❌ 无内置工具✅ 标准运维流程MySQL 自带 mysqldump、slow log、binlogSQLite 只能靠 cp 文件备份出错难回滚我自己的生产环境用的是 MySQL 8.0原因很实在上周有个合作号突然发布了一篇含127张高清图的长文wewe-rss 抓取时生成了近4MB的 HTML 内容存入数据库。SQLite 在写入这么大的 blob 字段时文件大小瞬间暴涨导致磁盘 I/O 飙升整个系统卡顿了6分钟。换成 MySQL 后同样操作耗时稳定在1.2秒内因为 InnoDB 的页式存储和 WAL 日志机制天然适配大字段写入。注意MySQL 8.0 默认启用caching_sha2_password认证插件而 wewe-rss 的 Go 驱动go-sql-driver/mysql旧版本不兼容。部署时必须显式指定--default-authentication-pluginmysql_native_password否则你会卡在“Error 1251: Client does not support authentication protocol requested by server”。2.3 Docker Compose不是为了炫技而是解决“在我机器上能跑”的终极难题为什么不用纯 Docker 命令为什么不用 Kubernetes因为 wewe-rss 的本质是“工具型服务”不是“平台型服务”。它的用户绝大多数是单机部署、小团队协作目标是“30分钟内让 RSS 订阅跑起来”而不是构建一套可弹性伸缩的微服务云平台。Docker Compose 的价值在于它把三个服务的依赖关系、网络互通、卷挂载、环境变量注入全部声明在一个 YAML 文件里。你不需要记住docker run -d --network wewe-net --mount typebind,source/data/mysql,target/var/lib/mysql ...这种冗长命令只需要docker-compose up -d一行启动。更重要的是它天然支持“环境隔离”——开发、测试、生产可以共用同一份 compose 文件仅通过.env文件切换数据库地址、端口、密码彻底告别“配置地狱”。举个真实例子我们团队有位非技术人员同事她负责管理公司内部的“政策法规”公众号订阅源。我给她一份预配置好的docker-compose.yml和env.example她只需要用文本编辑器把MYSQL_ROOT_PASSWORDyour_secure_password改成她自己设的密码保存为.env然后双击一个批处理脚本Windows 下是start-docker.bat5分钟后她的 RSS 地址http://localhost:3000/rss/zhengce就能被 Outlook 订阅了。这就是 Docker Compose 带来的确定性。3. 部署实操全流程从零到 RSS 订阅地址3.1 环境准备Ubuntu 22.04 LTS 是最稳妥的选择虽然 wewe-rss 官方说支持 macOS 和 Windows WSL但我的经验是生产环境请务必使用 Ubuntu 22.04 LTS或 Debian 11。原因有三Docker 官方镜像优先适配 Debian/Ubuntu 系统特别是 MySQL 8.0 的 ARM64 镜像在 Ubuntu 上启动成功率 100%在 CentOS Stream 9 上曾出现libaio.so.1: cannot open shared object file的兼容性错误Ubuntu 的 systemd 服务管理更成熟方便你后续把docker-compose up -d注册为开机自启服务避免服务器重启后 RSS 服务消失包管理器 apt 更稳定安装curl,git,unzip等基础工具不会像 Alpine Linux 那样需要额外装apk add --no-cache ca-certificates来解决证书问题。具体步骤以 root 用户执行# 更新系统并安装基础工具 apt update apt upgrade -y apt install -y curl wget git unzip vim net-tools # 安装 Docker Engine官方推荐方式 curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh usermod -aG docker $USER # 安装 Docker Composev2.20注意不是旧版 docker-compose v1 curl -L https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose # 验证安装 docker --version # 应输出 Docker version 24.x.x docker-compose --version # 应输出 Docker Compose version v2.20.2注意不要用apt install docker-composeUbuntu 官方仓库里的版本太旧v1.29.x不支持profiles、deploy.resources.limits等新特性会导致 wewe-rss 的 compose 文件解析失败。3.2 数据库初始化MySQL 8.0 的 5 个关键配置项MySQL 不是装完就能用。wewe-rss 对数据库有明确要求必须提前配置好否则启动后 core 服务会报错退出。以下是我在生产环境验证过的最小可行配置修改/etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] # 1. 字符集必须为 utf8mb4否则微信文章里的 emoji 和生僻字会变 ?? collation-server utf8mb4_unicode_ci character-set-server utf8mb4 # 2. 最大连接数至少 200wewe-rss 默认开启 10 个抓取 goroutine每个可能占用 1~2 连接 max_connections 300 # 3. 事务隔离级别设为 READ-COMMITTED避免幻读影响去重逻辑 transaction-isolation READ-COMMITTED # 4. 开启慢查询日志可选但强烈建议便于排查抓取卡顿 slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 2 # 5. 关键禁用 strict mode否则 wewe-rss 插入空字符串到 NOT NULL 字段会失败 sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 替换为以下宽松模式去掉 STRICT_TRANS_TABLES sql_mode NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION配置完重启 MySQLsystemctl restart mysql # 验证字符集 mysql -u root -p -e SHOW VARIABLES LIKE character_set%; SHOW VARIABLES LIKE collation%; # 输出中 character_set_server 和 collation_server 必须为 utf8mb4接着创建专用数据库和用户绝不使用 root 用户连接应用CREATE DATABASE wewe_rss CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER wewe% IDENTIFIED BY YourStrongPassword123!; GRANT ALL PRIVILEGES ON wewe_rss.* TO wewe%; FLUSH PRIVILEGES;实操心得密码里一定包含大小写字母数字特殊符号但避免使用 、$、! 等 shell 特殊字符。因为 Docker Compose 的环境变量会经过 shell 解析MYSQL_PASSWORDMyPass!会被截断。安全做法是用单引号包裹MYSQL_PASSWORDMyPass!。3.3 Docker Compose 文件编写一份能直接抄作业的配置新建目录mkdir -p ~/wewe-rss cd ~/wewe-rss创建docker-compose.yml。这份配置是我经过 3 轮迭代优化后的生产版已移除所有注释确保可直接运行version: 3.8 services: # Redis 缓存服务必需 redis: image: redis:7-alpine container_name: wewe-redis restart: unless-stopped command: redis-server --save 60 1 --loglevel warning volumes: - ./redis-data:/data networks: - wewe-net # MySQL 数据库服务 mysql: image: mysql:8.0 container_name: wewe-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: rootpass123 MYSQL_DATABASE: wewe_rss MYSQL_USER: wewe MYSQL_PASSWORD: wewe_pass_2024 volumes: - ./mysql-data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d networks: - wewe-net healthcheck: test: [CMD, mysqladmin, -u, root, -p$$MYSQL_ROOT_PASSWORD, ping, -h, localhost] timeout: 20s retries: 10 # wewe-rss 核心服务 wewe-rss: image: ghcr.io/whyour/wewe-rss:latest container_name: wewe-rss restart: unless-stopped ports: - 3000:3000 environment: # 数据库连接 DB_TYPE: mysql DB_HOST: mysql DB_PORT: 3306 DB_NAME: wewe_rss DB_USER: wewe DB_PASS: wewe_pass_2024 # Redis 连接 REDIS_URL: redis://redis:6379/0 # 时区重要否则发布时间显示错误 TZ: Asia/Shanghai # 抓取间隔单位分钟默认 30可调为 15 或 60 FETCH_INTERVAL: 30 # 是否启用 HTTPS若前端有 Nginx 反代此处设 false ENABLE_HTTPS: false depends_on: mysql: condition: service_healthy redis: condition: service_started volumes: - ./data:/app/data - ./logs:/app/logs networks: - wewe-net networks: wewe-net: driver: bridge关键点解析healthcheck为 MySQL 设置了健康检查确保 wewe-rss 启动前数据库已就绪避免因启动顺序导致 core 服务反复崩溃depends_on不是简单的“先启后启”而是结合condition: service_healthy实现真正的依赖等待volumes中./data是 wewe-rss 存储抓取缓存、RSS XML 文件的目录./logs方便你随时查看抓取日志tail -f logs/app.logTZ: Asia/Shanghai是硬性要求微信公众号发布时间是东八区时间如果容器内时区不对生成的pubDate标签会比实际晚8小时导致 RSS 阅读器排序错乱。创建.env文件用于覆盖环境变量更安全MYSQL_ROOT_PASSWORDrootpass123 MYSQL_PASSWORDwewe_pass_2024 WEEWE_RSS_DB_PASSwewe_pass_20243.4 一键启动与首次配置Web UI 的 3 个必填项执行启动命令docker-compose up -d # 查看服务状态 docker-compose ps # 实时查看 wewe-rss 日志按 CtrlC 退出 docker-compose logs -f wewe-rss等待约 30 秒打开浏览器访问http://你的服务器IP:3000。首次访问会跳转到/setup页面这里只有 3 个输入框但每一个都决定后续能否正常工作Admin Username后台管理员用户名建议用英文如adminAdmin Password密码至少8位含大小写字母数字RSS Base URL这是最关键的它决定了你最终生成的 RSS 地址。如果你直接用 IP 访问填http://192.168.1.100:3000如果你用域名rss.yourcompany.com并做了 Nginx 反代填https://rss.yourcompany.com绝对不要填http://localhost:3000否则生成的 RSS 里所有链接都是 localhost外部阅读器无法访问。填写完毕点击 Submit页面会跳转到登录页。用刚设的账号密码登录进入主界面。3.5 添加第一个公众号URL、ID、抓取策略的实操细节点击左上角 Add Feed弹出表单。这里不是随便填个公众号名字就行必须按规范操作Feed Name任意如腾讯新闻Feed URL必须是该公众号的主页 URL格式为https://mp.weixin.qq.com/mp/homepage?__bizxxxxxx或https://mp.weixin.qq.com/s?__bizxxxxxx。如何获取打开微信网页版搜索该公众号点进主页地址栏复制完整 URL。注意不能是某篇文章的链接必须是主页。__biz后面那一串字母数字就是公众号唯一 IDwewe-rss 会自动提取。Fetch Mode两个选项Latest默认只抓取最新发布的 10 篇文章适合资讯类号更新快、历史价值低All抓取该号所有历史文章从开通日起适合知识类、教程类号但首次抓取可能耗时数小时且对数据库压力大。建议先用Latest测试稳定后再切All。Enable勾选否则不抓取。填完保存你会看到状态变为Pending几秒后变成Running。此时打开http://你的服务器IP:3000/rss/腾讯新闻注意 URL 中的 Feed Name 是 URL 编码后的空格变-就能看到标准 RSS XML 了。实操心得添加后别急着订阅先点右侧Edit进入详情页找到Test Fetch按钮手动触发一次抓取。观察日志docker-compose logs wewe-rss | grep fetch success确认返回status: success且article count: 10。如果报错fetch failed: timeout大概率是服务器 DNS 解析慢需在docker-compose.yml的wewe-rss服务下加一行dns: 8.8.8.8。4. 核心功能深度解析不只是 RSS更是内容管道中枢4.1 RSS 输出结构为什么它能被所有阅读器识别wewe-rss 生成的 XML 不是简单拼接而是严格遵循 RSS 2.0 规范 每个item元素都包含阅读器必需的 5 个字段item title【重磅】2024年AI政策白皮书发布/title linkhttps://mp.weixin.qq.com/s/abc123def456/link descriptionlt;pgt;lt;img srchttps://mmbiz.qpic.cn/.../0?wx_fmtjpeg /gt;lt;/pgt;lt;pgt;全文如下lt;brgt;第一章 总则...lt;/pgt;/description pubDateMon, 15 Apr 2024 14:23:18 0800/pubDate guid isPermaLinktruehttps://mp.weixin.qq.com/s/abc123def456/guid /itemtitle公众号文章标题自动去除“【】”等营销前缀可配置link原文链接点击直接跳转微信页面descriptionHTML 格式正文保留图片img、段落p、加粗strong这是 wewe-rss 最核心的价值——不是只给个摘要而是把微信里“所见即所得”的排版完整还原pubDate发布时间精确到秒时区为0800确保全球阅读器正确排序guid全局唯一标识值等于link保证阅读器去重。这个结构之所以能被 Feedly、Inoreader、Thunderbird 甚至苹果 Mail 的 RSS 功能识别是因为它满足了 RSS 阅读器的“最小可行协议”只要title、link、pubDate三者齐全且description是合法 HTML 片段就能成功订阅。wewe-rss 还额外支持enclosure标签嵌入音频如公众号语音消息但需在配置中开启ENABLE_AUDIO: true。4.2 Web UI 管理后台5 个隐藏但高频使用的功能入口很多人以为 Web UI 就是添加/删除订阅其实它藏着几个提升效率的“快捷键”右上角齿轮图标 → Settings这里可以全局调整Fetch Interval抓取间隔、Max Articles Per Feed每号最多存多少篇、Enable HTTPS是否强制跳转 HTTPS。特别注意Clean Old Articles选项建议设为30天否则数据库会无限膨胀。左侧菜单History不是看日志而是查看每篇文章的抓取详情。点进任意一条能看到Fetched At抓取时间、HTML Size原始 HTML 大小、Parsed Content Length纯文本长度、Image Count文中图片数。当你发现某篇文章没抓到图来这里对比HTML Size和Image Count如果前者很大后者为0说明微信用了懒加载 JS需在Settings里开启ENABLE_JAVASCRIPT_RENDERING: true会显著增加 CPU 消耗。Feed 列表右侧⋯→ Export OPML一键导出所有订阅源为 OPML 文件可直接导入到其他 RSS 阅读器实现跨平台迁移。OPML 是 RSS 领域的“通用语言”比手动复制 URL 高效 10 倍。Feed 列表右侧⋯→ Edit → Advanced Options这里有两个神功能Custom CSS给生成的 RSS 添加自定义样式比如body { font-family: PingFang SC, sans-serif; }让阅读器里显示更美观Filter Regex用正则表达式过滤文章例如^【广告】|^【招聘】自动屏蔽带特定前缀的文章免去人工取消订阅。左下角System Info显示当前Core Version、Database Type、Redis Status、Uptime。当服务异常时第一眼就能判断是数据库连不上还是 Redis 挂了还是 core 进程崩溃。4.3 SQLite 模式部署给个人用户的极简方案如果你只是给自己用不想折腾 MySQLSQLite 是完全可行的。只需修改docker-compose.yml中的wewe-rss服务部分wewe-rss: # ... 其他配置不变 environment: DB_TYPE: sqlite DB_PATH: /app/data/db.sqlite # 删除 DB_HOST, DB_PORT, DB_NAME 等 MySQL 相关变量 REDIS_URL: # SQLite 模式下可关闭 Redis volumes: - ./data:/app/data # SQLite 文件将存于此然后删掉mysql和redis服务块整个 compose 文件只剩wewe-rss一个服务。启动后./data/db.sqlite就是你的数据库文件。用DB Browser for SQLite免费开源工具打开它可以看到三张表feeds存储公众号信息articles存储所有抓取的文章content字段是 HTML 正文subscriptions存储 RSS 订阅关系。注意SQLite 模式下docker-compose up -d启动后首次访问 Web UI 可能报错database is locked。这是因为多个 goroutine 同时写入 SQLite 文件。解决方案是在environment中加入GOMAXPROCS: 1强制 Go 运行时单线程执行牺牲一点性能换取稳定性。实测对 ≤5 个公众号完全够用。4.4 生产环境加固Nginx 反向代理与 HTTPS 的 4 步配置直接暴露:3000端口不安全且无法用域名访问。用 Nginx 做一层反代是标配。假设你已申请好rss.yourdomain.com的 SSL 证书Lets Encrypt配置/etc/nginx/sites-available/wewe-rss如下server { listen 443 ssl http2; server_name rss.yourdomain.com; ssl_certificate /etc/letsencrypt/live/rss.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/rss.yourdomain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; 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 协议否则 Web UI 的实时日志会断连 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } # 静态文件直接由 Nginx 服务减轻 core 压力 location /static/ { alias /home/user/wewe-rss/data/static/; expires 1h; } } # HTTP 强制跳转 HTTPS server { listen 80; server_name rss.yourdomain.com; return 301 https://$server_name$request_uri; }启用配置ln -sf /etc/nginx/sites-available/wewe-rss /etc/nginx/sites-enabled/ nginx -t systemctl reload nginx最后回到 wewe-rss Web UI 的Settings把RSS Base URL改为https://rss.yourdomain.com所有生成的 RSS 链接就自动变成 HTTPS 了。5. 常见问题与排查技巧实录那些文档里没写的坑5.1 公众号抓取失败的 5 类原因及对应解法现象日志线索根本原因解决方案fetch failed: status code 403GET https://mp.weixin.qq.com/... 403微信封禁了你的服务器 IP更换服务器 IP或在docker-compose.yml的wewe-rss服务下加extra_hosts: [mp.weixin.qq.com:117.18.237.29]用国内 DNS 解析出的 IP定期更新fetch failed: timeoutcontext deadline exceeded服务器网络延迟高或 DNS 解析慢在wewe-rss服务下加dns: 114.114.114.114或增大FETCH_TIMEOUT环境变量默认 30 秒可设为 60article count: 0parsed 0 articles from html公众号启用了“原创保护”或“付费阅读”页面结构变化手动访问该公众号主页 URL用浏览器开发者工具检查div classrich_media_content是否存在若不存在说明该号已不可抓取需更换image src brokenimg srchttp://res.wx.qq.com/...微信图片 CDN 加了 Referer 限制在wewe-rss的Settings中开启ENABLE_IMAGE_PROXY: truewewe-rss 会自动代理图片请求RSS shows old timepubDateSun, 01 Jan 2000 00:00:00 0000/pubDate容器时区未设为Asia/Shanghai修改docker-compose.yml确保wewe-rss服务有TZ: Asia/Shanghai然后docker-compose down up -d实操心得我遇到过最诡异的问题是某天所有公众号抓取都失败日志全是connection refused。查了半天发现是服务器防火墙ufw默认开启了deny incoming而 wewe-rss 的抓取请求走的是outgoing但某些云厂商的防火墙策略会误判。解决方案ufw allow out on eth0或干脆ufw disable生产环境建议精细放行。5.2 数据库性能瓶颈当文章数超 10 万时的 3 个优化动作wewe-rss 默认的 MySQL 表结构没有索引优化当articles表突破 10 万行SELECT * FROM articles WHERE feed_id ? ORDER BY pub_date DESC LIMIT 20查询会明显变慢2s。这时必须手动加索引# 登录 MySQL mysql -u wewe -p wewe_rss # 为 feed_id 和 pub_date 组合加联合索引最常用查询条件 CREATE INDEX idx_feed_pub ON articles (feed_id, pub_date); # 为 guid 加唯一索引防止重复插入 ALTER TABLE articles ADD UNIQUE KEY uk_guid (guid); # 清理已删除的旧文章释放空间 DELETE FROM articles WHERE pub_date DATE_SUB(NOW(), INTERVAL 90 DAY);注意DELETE操作会锁表建议在业务低峰期执行。更优雅的方式是用pt-archiver工具分批归档但对小团队来说直接DELETE更简单。5.3 Docker Compose 部署失败的 3 个高频陷阱ERROR: failed to solve: rpc error: code Unknown desc executor failed running [/bin/sh -c apk add --no-cache ca-certificates]这是 Alpine Linux 镜像的证书问题。解决方案在docker-compose.yml的wewe-rss服务下加platform: linux/amd64即使你是 AMD64 机器也要显式声明强制拉取 x86_64 镜像避开 Alpine。wewe-rss exited with code 1日志显示failed to connect to database不是密码错了而是DB_HOST: mysql这个 hostname 在 Docker 网络里解析失败。检查docker-compose ps确认mysql容器状态是Up再执行docker exec -it wewe-rss ping mysql如果 ping 不通说明网络没连上删掉docker-compose down后重试。Web UI 打不开Nginx 返回502 Bad Gateway90% 是因为proxy_pass指向的端口不对。执行docker-compose port wewe-rss 3000确认输出是0.0.0.0:3000再检查netstat -tuln | grep :3000确保宿主机 3000 端口没被其他进程占用。5.4 安全加固 checklist上线前必须做的 5 件事修改默认 admin 密码首次登录后立即在Settings → Admin Password里重置关闭调试模式确保docker-compose.yml中没有DEBUG: true环境变量否则会暴露敏感路径限制数据库访问范围MySQL 用户wewe%改为wewewewe-netDocker 网络名禁止从外部 IP 连接设置 RSS 订阅密码在Settings中开启Require Auth for RSS为每个 Feed 生成独立 token防止被恶意爬取定期备份数据库写个 cron 任务每天凌晨 2 点执行mysqldump -u wewe -pwewe_pass_2024 wewe_rss /backup/wewe_rss_$(date \%Y\%m\%d).sql。我自己的备份策略是本地保留 7 天同时用rclone同步到腾讯云
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。