From 1fdaaa8890bf1cf237fc434d1eb8b3a8d74ce792 Mon Sep 17 00:00:00 2001 From: Stille Date: Wed, 26 May 2021 21:56:40 +0800 Subject: [PATCH] Create rssforever --- .env | 31 ++++++ 01.jpg | Bin 0 -> 12473 bytes README.md | 190 ++++++++++++++++++++++++++++++++++- docker-compose.yml | 130 ++++++++++++++++++++++++ nginx/conf/nginx.conf | 33 ++++++ nginx/conf/nginx.sh | 4 + nginx/html/index.html | 11 ++ nginx/ssl/yourdomain.com.cer | 20 ++++ nginx/ssl/yourdomain.com.key | 27 +++++ nginx/vhost/rss.conf | 59 +++++++++++ nginx/vhost/rsshub.conf | 59 +++++++++++ 11 files changed, 563 insertions(+), 1 deletion(-) create mode 100644 .env create mode 100644 01.jpg create mode 100644 docker-compose.yml create mode 100644 nginx/conf/nginx.conf create mode 100755 nginx/conf/nginx.sh create mode 100644 nginx/html/index.html create mode 100644 nginx/ssl/yourdomain.com.cer create mode 100644 nginx/ssl/yourdomain.com.key create mode 100644 nginx/vhost/rss.conf create mode 100644 nginx/vhost/rsshub.conf 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 0000000000000000000000000000000000000000..d60e11b3cfc2a9bc331f85feb4e54538480f4943 GIT binary patch literal 12473 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 literal 0 HcmV?d00001 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 @@ + + + + + + Document + + + Hello World + + \ No newline at end of file diff --git a/nginx/ssl/yourdomain.com.cer b/nginx/ssl/yourdomain.com.cer new file mode 100644 index 0000000..675c586 --- /dev/null +++ b/nginx/ssl/yourdomain.com.cer @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDPDCCAiQCCQCgDNdxnY2O+zANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJD +TjELMAkGA1UECAwCQkoxCzAJBgNVBAcMAkJKMRwwGgYDVQQKDBNEZWZhdWx0IENv +bXBhbnkgTHRkMRkwFwYDVQQDDBAqLnlvdXJkb21haW4uY29tMB4XDTIxMDUyNTA2 +MTEyN1oXDTMxMDUyMzA2MTEyN1owYDELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkJK +MQswCQYDVQQHDAJCSjEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEZMBcG +A1UEAwwQKi55b3VyZG9tYWluLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAPWLjqI18FYtRbH9z1V/zvkL/TTJQoobUcs7mOYVGQoS+kiyDFkV/xz3 +B0UZLTzrgjNgsClsyrYp8iQFAxVu5xkPhwu9HjBaF5F3yMJEbImOtcFC5gT2Ymd1 +qLcRTsXmzGC34g/mTbc/9lvdQ2SXBWo8OPxcuguA/WBEykU99olcnHefqOgcdLmN +FRZE5mKmFZuF523GMfYGtRSbS0AKRB4Zom56VOf3wlSwYYqf7fL8/OKIdBujH6U7 +j3mIWSO6/Vz2esFMX6zAL+PV0lrpiNpW59PHftreYcB1LVQTLwmxFw1Y6YKs/3Ow +a07H18ZAnbMDmpJ82bm9xmRS/5uvu/MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA +AG/kegcZhCowJwR5lSe0hCdYXsWQsOlNnVUKcA1y4uPQni/LbpsgnKH8VH3ATAOQ +0aseom71ZhDaxhaTQYGcOeH6y5TlLh/Izx9S9NbxF33JOED6/KnM1uDtZTHc8G9x +R6RNEwts4fSybwixlV6bKp/LoLCbNymcBnmUEZb+rGb3quz2VYjqZjTjGU4YZKmu +7eQynvD1TihxZ0QBX4ByIl7YfYswNGfJDlOzvijZhLhCniKfHZFNsVZArdorM1XH +Dkb5Ec4ycKEINmFc7FxsnwPZxxgx4AiCl1NGOtzN/cPs8tKdPYddBOh9yuV9DWPf +P876ey9hKc5/GrCgT181MA== +-----END CERTIFICATE----- diff --git a/nginx/ssl/yourdomain.com.key b/nginx/ssl/yourdomain.com.key new file mode 100644 index 0000000..df78181 --- /dev/null +++ b/nginx/ssl/yourdomain.com.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEA9YuOojXwVi1Fsf3PVX/O+Qv9NMlCihtRyzuY5hUZChL6SLIM +WRX/HPcHRRktPOuCM2CwKWzKtinyJAUDFW7nGQ+HC70eMFoXkXfIwkRsiY61wULm +BPZiZ3WotxFOxebMYLfiD+ZNtz/2W91DZJcFajw4/Fy6C4D9YETKRT32iVycd5+o +6Bx0uY0VFkTmYqYVm4XnbcYx9ga1FJtLQApEHhmibnpU5/fCVLBhip/t8vz84oh0 +G6MfpTuPeYhZI7r9XPZ6wUxfrMAv49XSWumI2lbn08d+2t5hwHUtVBMvCbEXDVjp +gqz/c7BrTsfXxkCdswOaknzZub3GZFL/m6+78wIDAQABAoIBAFnNxcfb1F+gRSo4 ++rh5exgo412H8jcSkNK0pFIaC0Nc937Y5505Z0mPq3ABKkNqmv7xcNxltqnzI2U7 +FAqlug23WRvY+g6TFKWWWq16WvvgXuck8X2FIy5VoPP7d4T3yW3iMuK/x1KrKQ4m +GXzTox5ckjbyLvUAIysvXY7/f4hyyDxT28edpl797uQrWqtvBS1B3i62LgL6q6VM +/Q3cl3OmFLH8BzpgwHu83dJhFjwq6KPmlMwgBT7IB0Pruk77jRXD7QvUs/Yft45Y +5RJ9CIBRB4CZEW9Hts9EZypWta3s4AMlsm4nN9bu/XL32tlcPTO508LbS0yDa5g8 +WqMQ2CECgYEA/PEnzt/IgvMTroXFy9ZzpTGNnG3pn5N65i1Xk5GFG3aMdCgDcyQO +dcUFUht4ElI5TbDSuWduBNkmgulpaNfE5HNwTXBSvHS5NrSe5J0jx1HD6kF4pEx7 +n98tgu5KjwbGjWF4jJxstNLM1O5qqVd/Xzj5j7E+GeKmVeMDKAj248MCgYEA+IOC +OKVLSGBVbhqPahvSDVbJjPHzp76CIALYavRy7IVbjj/Kw5P0zawNmloznE0BtTWV +o0Nx78dF6WSLbagKAUXgwpFT3ktaBHOePH60Bsrk6V45V8qkspM5kBKw506wKLbD +Tk0C+Z2Uc6eZdAN3+xKb/F5Vh3XI7R4k82FtNBECgYBlg2tUjV9tnpyhiDKP0itr +eu24gCwozQmf40aohNiE4xkPbRelWC0terrd7wRLZhB1a6fGnQn8jCH2nDKfzyjH +/sRtb8zksXu7xtWWLrKzRc947nm6hq9+xBUB3RyzNibtitbUp9rA33Exa9YGzITj +9HvD/YBM5zeWdJtJr/9V/QKBgGYgBP+qTcmsbO8WUyFT1XpN0/3r4ClrDKaDBNTP +J/sywnEunfDJeKycq+pmbxcoPi9tmdTB/qx+w6gp/XJOv+3N/ZN3jXOom5GAweIy +X2D7OB7+7am6SPxprBoc1D36BEJ2+MPQugxCSaNNmK4oTsIK37dSPOux56Qp4x1x +SCNBAoGAD8a2vEMuaaQM78aXLGgOkmlYRRSwxgmAcrkMC4mZtIbQ+5Cwvjowdgme +/g5NRGf4rGfQ6RKEQFpi4nMChFEc+m8EQcCptwt/cIE5csZn8Xcys/Y9K4S1BkI4 +EBE+a9py654NEiFfV/KS5KfA+9syRJKHGLCBVzf7gx0cm2AqGJY= +-----END RSA PRIVATE KEY----- diff --git a/nginx/vhost/rss.conf b/nginx/vhost/rss.conf new file mode 100644 index 0000000..fc73387 --- /dev/null +++ b/nginx/vhost/rss.conf @@ -0,0 +1,59 @@ +upstream rssforever-rss { + server service.rss; +} + +server { + listen 80; + server_name rss.yourdomain.com; + +# return 301 https://rss.yourdomain.com$request_uri; + + location / { + proxy_redirect off; + proxy_pass http://rssforever-rss; + + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Ssl on; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Frame-Options SAMEORIGIN; + + client_max_body_size 100m; + client_body_buffer_size 128k; + + proxy_buffer_size 4k; + proxy_buffers 4 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 64k; + } +} + +server { + listen 443 ssl; + server_name rss.yourdomain.com; + gzip on; + + ssl_certificate /etc/nginx/ssl/yourdomain.com.cer; + ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; + + location / { + proxy_redirect off; + proxy_pass http://rssforever-rss; + + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Ssl on; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Frame-Options SAMEORIGIN; + + client_max_body_size 100m; + client_body_buffer_size 128k; + + proxy_buffer_size 4k; + proxy_buffers 4 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 64k; + } +} diff --git a/nginx/vhost/rsshub.conf b/nginx/vhost/rsshub.conf new file mode 100644 index 0000000..53c64fc --- /dev/null +++ b/nginx/vhost/rsshub.conf @@ -0,0 +1,59 @@ +upstream rssforever-rsshub { + server rsshub:1200; +} + +server { + listen 80; + server_name rsshub.yourdomain.com; + +# return 301 https://rsshub.yourdomain.com$request_uri; + + location / { + proxy_redirect off; + proxy_pass http://rssforever-rsshub; + + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Ssl on; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Frame-Options SAMEORIGIN; + + client_max_body_size 100m; + client_body_buffer_size 128k; + + proxy_buffer_size 4k; + proxy_buffers 4 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 64k; + } +} + +server { + listen 443 ssl; + server_name rsshub.yourdomain.com; + gzip on; + + ssl_certificate /etc/nginx/ssl/yourdomain.com.cer; + ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; + + location / { + proxy_redirect off; + proxy_pass http://rssforever-rsshub; + + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Ssl on; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Frame-Options SAMEORIGIN; + + client_max_body_size 100m; + client_body_buffer_size 128k; + + proxy_buffer_size 4k; + proxy_buffers 4 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 64k; + } +}