diff --git a/.env b/.env new file mode 100644 index 0000000..a41c9ea --- /dev/null +++ b/.env @@ -0,0 +1,31 @@ +# ----------------------------------- 默认必须修改项目 ----------------------------------- # +# 需修改域名和数据库密码 +RSS_DOMAIN=rss.yourdomain.com +RSSHUB_DOMAIN=rsshub.yourdomain.com +POSTGRES_PASSWORD=rssforever.com + + +# ----------------------------------- 开启 HTTPS 支持 ----------------------------------- # +# HTTP/HTTPS 协议,默认为 http 如需使用 HTTPS 需将值改为 https +PROTOCOL=http + + +# ----------------------------------- HTTPS 证书和密钥 ---------------------------------- # +# 上传证书文件后,需修改域名证书和密钥的文件名. +# 如果 RSS 和 RSSHUB 使用不同证书,需分别修改以下证书和密钥的文件名. +# 如果 RSS 和 RSSHUB 使用同一泛域名证书,请修改为同一文件名. + +# RSS 证书和密钥文件名 +RSS_DOAMIN_CERT=yourdomain.com.cer +RSS_DOMAIN_KEY=yourdomain.com.key + +# RSSHUB 证书和密钥文件名 +RSSHUB_DOAMIN_CERT=yourdomain.com.cer +RSSHUB_DOMAIN_KEY=yourdomain.com.key + + +# ------------------------------------- 镜像和版本 ------------------------------------- # +# 镜像和版本,请勿修改删除. +NGINX_VERSION=stable +TTRSS_IMAGE=wangqiru/ttrss +TTRSS_VERSION=latest-2021-05-19 diff --git a/01.jpg b/01.jpg new file mode 100644 index 0000000..d60e11b Binary files /dev/null and b/01.jpg differ diff --git a/README.md b/README.md index d05a84e..a0eccd1 100644 --- a/README.md +++ b/README.md @@ -1 +1,189 @@ -# rssforever \ No newline at end of file +# rssforever +## 简介 +本项目为 Nginx + TTRSS + RSSHub 整合 docker 容器化快速一键部署方案. + +### 前言 +[rssforever.com](rssforever.com) 为网友提供免费的 RSS 和 RSSHub 服务已经一年有余,由于服务器压力及个人精力有限等原因已停止提供 RSS 服务.鉴于很多新手用户技术有限,特将 nginx , ttrss , rsshub 三个项目整合到 docker compose 中,实现一键部署使用. + +### 特点 +1. 本项目针对新手用户,提供整合配置,无需繁琐的设置,即使是新手用户最快也只需要几步操作,几分钟即可部署使用. +2. 使用 docker compose 编排配置,所有命令,配置及环境变量集中管理,方便维护和迁移. +3. 更换服务器也仅需打包备份一个文件夹,迁移解压后一条命令即可恢复使用. + +### 环境需求 +- 至少 1 核 1G 境外 VPS 服务器 ( 国内服务器由于网络问题,不推荐使用. ) +- 拥有自己的域名 ( 自行申请泛域名证书可使用 HTTPS 部署 ) +- 服务器未占用 80/443 端口 +- 服务器已安装 docker 和 docker compose 环境 ( 未安装可参考下文简易安装指南 ) + +> 由于此项目为新手向服务,不支持已被其他服务占用 80/443 端口的服务器.请停止相关服务或更换新服务器部署使用. +> 此项目一共会启动 9 个容器,服务器性能不足请不要部署其他应用,并且私有化个人使用.避免服务器压力过大. +> 如果服务器上已有 nginx 等占用 80/443 端口的服务,同时又有部署的需求,请联系我进行付费技术支持. + + +--- + + +## 部署 +docker 及 docker compose 必须提前安装到服务器中,相关教程网上很多,也可逐一执行以下 6 条命令安装启动: +```shell +# 安装 docker +curl -fsSL https://get.docker.com -o get-docker.sh +sudo sh get-docker.sh +sudo systemctl start docker +sudo systemctl enable docker +# 安装 docker compose +curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose +chmod +x /usr/local/bin/docker-compose +``` +安装完成并检查 +```shell +docker -v +docker-compose -v +``` + +### 配置域名解析 +分别为`RSS`和`RSSHub`两个站点配置两个二级域名,例如`rss.yourdomain.com`和`rsshub.yourdomain.com`.并设置 A 记录或 CNAME 到服务器. + +![01](./01.jpg) + +### HTTP 部署 +#### 拉取代码 +```shell +git clone https://github.com/stilleshan/rssforever.git +# 拉取代码 +cd rssforever +# 进入目录,注意不要修改目录名,否则会导致 watchtower 无法监控容器自动更新镜像. +``` + +#### 配置 .env 文件 +修改`.env`文件中`RSS`和`RSSHub`的域名以及数据库密码 +```shell +RSS_DOMAIN=rss.yourdomain.com +RSSHUB_DOMAIN=rsshub.yourdomain.com +POSTGRES_PASSWORD=rssforever.com +``` + +#### 启动 +```shell +docker-compose up -d +# 再次注意需要在 rssforever 目录下执行 +``` + +#### 完成 +访问 http://rss.yourdomain.com 使用`admin`和`password`登陆使用,请及时修改密码. +访问 http://rsshub.yourdomain.com 并参考[官方文档](https://docs.rsshub.app/)使用. + +### HTTPS 部署 +#### 拉取代码 +```shell +git clone https://github.com/stilleshan/rssforever.git +# 拉取代码 +cd rssforever +# 进入目录,注意不要修改目录名,否则会导致 watchtower 无法监控自动更新容器. +``` + +#### 配置 .env 文件 +修改`.env`文件中`RSS`和`RSSHub`的域名以及数据库密码 +```shell +RSS_DOMAIN=rss.yourdomain.com +RSSHUB_DOMAIN=rsshub.yourdomain.com +POSTGRES_PASSWORD=rssforever.com +``` + +上传`泛域名`证书和密钥文件至`nginx/ssl`目录下. +并以`yourdomain.com.cer`形式命名,证书后缀`cer`或者`crt`等均不影响使用. +修改`.env`文件中域名证书和密钥文件名 +修改`.env`文件中`PROTOCOL=https` +具体参考如下: +```shell +PROTOCOL=https +RSS_DOAMIN_CERT=yourdomain.com.cer +RSS_DOMAIN_KEY=yourdomain.com.key +RSSHUB_DOAMIN_CERT=yourdomain.com.cer +RSSHUB_DOMAIN_KEY=yourdomain.com.key +``` +**注意:如果使用单域名证书,请分别将两个域名证书上传至`nginx/ssl`中,分别修改`.env`文件中 RSS 和 RSSHub 域名证书和密钥文件名.** +```shell +# 单域名参考配置 +RSS_DOAMIN_CERT=rss.yourdomain.com.cer +RSS_DOMAIN_KEY=rss.yourdomain.com.key +RSSHUB_DOAMIN_CERT=rsshub.yourdomain.com.cer +RSSHUB_DOMAIN_KEY=rsshub.yourdomain.com.key +``` + +#### 启动 +```shell +docker-compose up -d +# 再次注意需要在 rssforever 目录下执行 +``` + +#### 完成 +访问 https://rss.yourdomain.com 使用`admin`和`password`登陆使用,请及时修改密码. +访问 https://rsshub.yourdomain.com 并参考[官方文档](https://docs.rsshub.app/)使用. + + +--- + + +## 进阶 +### 强制跳转 HTTPS +如使用`HTTPS`部署,可手动修改`nginx/vhost`目录中的`rss.conf`和`rsshub.conf`第`9`行,将`#`注释符号删除. +```nginx + return 301 https://rss.yourdomain.com$request_uri; +``` +重启 docker compose 生效 +```shell +# 建议直接停止并在次启动 +cd rssforever +# 进入目录 +docker-compose down +# 停止 +docker-compose up -d +# 启动 +``` + +### 证书更新 +本项目目前并未配置自动更新证书的功能,今后视情况加入其中. +泛域名有效期三个月,请自行续签后覆盖原有证书,执行`docker-compose down`停止服务,并在次执行`docker-compose up -d`启动即可. + +### 高级配置 +TTRSS 和 RSSHub 可以通过修改`docker-compose.yml`设置环境变量来配置高级功能,详情请参考本文末尾项目官方文档进行修改. +值得注意的是本项目的`docker-compose.yml`定制化过多,请慎重修改. +通常来说修改`volumes`和`environment`参数来挂载目录,设置一些高级配置并不会对本服务有影响.如诺出现问题请提交`issue`. + +### 备份恢复 +#### 备份 +本项目采用 docker compose 部署,所有配置及数据都在`rssforever`目录中,方便备份和迁移. +`rss`目录会在项目启动后自动生成,存放`rss`的数据库,不可删除.( 除非希望重新部署 ) +`rsshub`目录会在项目启动后自动生成,此目录为缓存数据,迁移时可以删除以免占用过大空间. +**其他所有文件及目录,如不清楚请不要随意修改和删除,否则会导致服务无法启动.** +#### 恢复 +将域名 A 记录重新指向新服务器,将备份的`rssforever`目录解压进入启动即可. +```shell +cd rssforever +# 进入目录 +docker-compose up -d +# 启动 +``` + +### 初始化 +如果误操作修改了相关参数导致无法使用,请备份`rss`目录后,删除整个`rssforever`目录.重新按照上文`git clone`拉取代码,修改`.env`文件,在将`rss`移动至`rssforever`下,执行`docker-compose up -d`重新部署. + + +--- + + +## 其他 +### 感谢 +感谢以下大神提供的项目: +- [Awesome TTRSS 官方文档](https://ttrss.henry.wang/) +- [Awesome TTRSS GitHub](https://github.com/HenryQW/Awesome-TTRSS) +- [RSSHub 官方文档](https://docs.rsshub.app/) +- [DIYgod/RSSHub GitHub](https://github.com/DIYgod/RSSHub) + +### 链接 +- [rssforever.com](https://rssforever.com) +- [RSSHub 公共服务](https://rsshub.rssforever.com) +- [泛域名证书申请相关文章](https://www.ioiox.com/tag/SSL/) +- [新手教程 Nginx + TTRSS + RSSHub 整合 docker 容器化快速一键部署方案](https://www.ioiox.com/archives/133.html) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0c9fbd2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,130 @@ +version: "3" + + +networks: + rssforever: + + +#---------------------------------------- nginx ---------------------------------------- # +services: + nginx: + image: nginx:${NGINX_VERSION} + restart: always + ports: + - 80:80 + - 443:443 + volumes: + - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf + - ./nginx/conf/nginx.sh:/nginx.sh + - ./nginx/vhost:/etc/nginx/conf.d/vhost + - ./nginx/ssl:/etc/nginx/ssl + - ./nginx/html:/usr/share/nginx/html + environment: + - RSS_DOMAIN=${RSS_DOMAIN} + - RSS_DOAMIN_CERT=${RSS_DOAMIN_CERT} + - RSS_DOMAIN_KEY=${RSS_DOMAIN_KEY} + - RSSHUB_DOMAIN=${RSSHUB_DOMAIN} + - RSSHUB_DOAMIN_CERT=${RSSHUB_DOAMIN_CERT} + - RSSHUB_DOMAIN_KEY=${RSSHUB_DOMAIN_KEY} + networks: + - rssforever + depends_on: + - service.rss + - rsshub + command: ["sh", "-c", "/nginx.sh"] + + +#---------------------------------------- ttrss ---------------------------------------- # + service.rss: + image: ${TTRSS_IMAGE}:${TTRSS_VERSION} + environment: + - SELF_URL_PATH=${PROTOCOL}://${RSS_DOMAIN} + - DB_PASS=${POSTGRES_PASSWORD} + - PUID=1000 + - PGID=1000 + - ENABLE_PLUGINS=auth_internal,remove_iframe_sandbox + networks: + - rssforever + stdin_open: true + tty: true + restart: always + + + service.mercury: + image: wangqiru/mercury-parser-api:latest + networks: + - rssforever + restart: always + + + service.opencc: + image: wangqiru/opencc-api-server:latest + environment: + - NODE_ENV=production + networks: + - rssforever + restart: always + + + database.postgres: + image: postgres:13-alpine + environment: + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + volumes: + - ./rss/postgres/data/:/var/lib/postgresql/data + networks: + - rssforever + restart: always + + +#---------------------------------------- rsshub ---------------------------------------- # + rsshub: + image: diygod/rsshub + restart: always + ports: + - 1200:1200 + environment: + NODE_ENV: production + CACHE_TYPE: redis + REDIS_URL: 'redis://redis:6379/' + PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000' + depends_on: + - redis + - browserless + networks: + - rssforever + + + browserless: + image: browserless/chrome + restart: always + networks: + - rssforever + + + redis: + image: redis:alpine + restart: always + environment: + - TZ=Asia/Shanghai + volumes: + - ./rsshub/redis-data:/data + networks: + - rssforever + + +#---------------------------------------- watchtower ---------------------------------------- # +# 每天早上 10 点定时更新 RSSHub , 如无需可注释或删除本段. + watchtower: + image: containrrr/watchtower:latest + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - TZ=Asia/Shanghai + - WATCHTOWER_CLEANUP=true + - WATCHTOWER_SCHEDULE=0 0 10 * * * + restart: always + command: rssforever_watchtower_1 rssforever_rsshub_1 rssforever_redis_1 rssforever_browserless_1 + networks: + - rssforever + diff --git a/nginx/conf/nginx.conf b/nginx/conf/nginx.conf new file mode 100644 index 0000000..988bb51 --- /dev/null +++ b/nginx/conf/nginx.conf @@ -0,0 +1,33 @@ + +user nginx; +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/conf.d/vhost/*.conf; +} diff --git a/nginx/conf/nginx.sh b/nginx/conf/nginx.sh new file mode 100755 index 0000000..4399201 --- /dev/null +++ b/nginx/conf/nginx.sh @@ -0,0 +1,4 @@ +sed -i -e "/rss.yourdomain.com/s/rss.yourdomain.com/${RSS_DOMAIN}/g" -e "/yourdomain.com.cer/s/yourdomain.com.cer/${RSS_DOAMIN_CERT}/g" -e "/yourdomain.com.key/s/yourdomain.com.key/${RSS_DOMAIN_KEY}/g" /etc/nginx/conf.d/vhost/rss.conf +sed -i -e "/rsshub.yourdomain.com/s/rsshub.yourdomain.com/${RSSHUB_DOMAIN}/g" -e "/yourdomain.com.cer/s/yourdomain.com.cer/${RSSHUB_DOAMIN_CERT}/g" -e "/yourdomain.com.key/s/yourdomain.com.key/${RSSHUB_DOMAIN_KEY}/g" /etc/nginx/conf.d/vhost/rsshub.conf +nginx -s reload +nginx -g 'daemon off;' diff --git a/nginx/html/index.html b/nginx/html/index.html new file mode 100644 index 0000000..8f2bfd0 --- /dev/null +++ b/nginx/html/index.html @@ -0,0 +1,11 @@ + + +
+ + +