From 4b1224ac1acf87e4521c7e44a057213fecfeb623 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Tue, 7 May 2024 20:38:29 +0200 Subject: [PATCH] fix(rsshub): multiple config adjustments --- apps/rsshub/config.json | 5 +- apps/rsshub/data/app.env | 6 +- apps/rsshub/docker-compose.yml | 118 ++++++++++++++-------------- apps/rsshub/metadata/description.md | 7 +- apps/rsshub/metadata/logo.jpg | Bin 7854 -> 12223 bytes 5 files changed, 65 insertions(+), 71 deletions(-) diff --git a/apps/rsshub/config.json b/apps/rsshub/config.json index e602e699..01afa34e 100644 --- a/apps/rsshub/config.json +++ b/apps/rsshub/config.json @@ -1,7 +1,7 @@ { "name": "RSSHub", "available": true, - "port": 8220, + "port": 8223, "exposable": true, "id": "rsshub", "description": "RSSHub is an open source, easy to use, and extensible RSS feed generator. It's capable of generating RSS feeds from pretty much everything.", @@ -22,5 +22,6 @@ "required": false, "env_variable": "ACCESS_KEY" } - ] + ], + "supported_architectures": ["amd64", "arm64"] } diff --git a/apps/rsshub/data/app.env b/apps/rsshub/data/app.env index 3b27c726..84bee255 100644 --- a/apps/rsshub/data/app.env +++ b/apps/rsshub/data/app.env @@ -30,7 +30,7 @@ CACHE_TYPE="redis" #CACHE_REQUEST_TIMEOUT=60 #CACHE_EXPIRE=300 #CACHE_CONTENT_EXPIRE=3600 -REDIS_URL="redis://redis:6379/" +REDIS_URL="redis://rsshub_redis:6379/" #MEMORY_MAX=256 ################################# @@ -88,7 +88,7 @@ REDIS_URL="redis://redis:6379/" #ENABLE_CLUSTER=false NODE_ENV="production" #NODE_NAME="" -PUPPETEER_WS_ENDPOINT="ws://browserless:3000" +PUPPETEER_WS_ENDPOINT="ws://rsshub_browserless:3000" #CHROMIUM_EXECUTABLE_PATH="" #TITLE_LENGTH_LIMIT=150 #OPENAI_API_KEY="" @@ -328,4 +328,4 @@ PUPPETEER_WS_ENDPOINT="ws://browserless:3000" #ZHIHU_COOKIES="" # ## Zodgame ## -#ZODGAME_COOKIE="" \ No newline at end of file +#ZODGAME_COOKIE="" diff --git a/apps/rsshub/docker-compose.yml b/apps/rsshub/docker-compose.yml index cfe0325f..aef67f5b 100644 --- a/apps/rsshub/docker-compose.yml +++ b/apps/rsshub/docker-compose.yml @@ -1,63 +1,61 @@ -version: '3.9' - services: - rsshub: - image: diygod/rsshub:2024-04-17 - container_name: rsshub_main - restart: unless-stopped - ports: - - ${APP_PORT}:1200 - environment: - TZ: ${TZ} - env_file: - - /app-data/rsshub/data/app.env - networks: - - tipi_main_network - depends_on: - - redis - - browserless - labels: - # Main - traefik.enable: true - traefik.http.middlewares.rss-web-redirect.redirectscheme.scheme: https - traefik.http.services.rsshub.loadbalancer.server.port: 1200 - # Web - traefik.http.routers.rss-insecure.rule: Host(`${APP_DOMAIN}`) - traefik.http.routers.rss-insecure.entrypoints: web - traefik.http.routers.rss-insecure.service: rsshub - traefik.http.routers.rss-insecure.middlewares: rss-web-redirect - # Websecure - traefik.http.routers.rss.rule: Host(`${APP_DOMAIN}`) - traefik.http.routers.rss.entrypoints: websecure - traefik.http.routers.rss.service: rsshub - traefik.http.routers.rss.tls.certresolver: myresolver - # Local domain - traefik.http.routers.rss-local-insecure.rule: Host(`rsshub.${LOCAL_DOMAIN}`) - traefik.http.routers.rss-local-insecure.entrypoints: web - traefik.http.routers.rss-local-insecure.service: rsshub - traefik.http.routers.rss-local-insecure.middlewares: rss-web-redirect - # Local domain secure - traefik.http.routers.rss-local.rule: Host(`rsshub.${LOCAL_DOMAIN}`) - traefik.http.routers.rss-local.entrypoints: websecure - traefik.http.routers.rss-local.service: rsshub - traefik.http.routers.rss-local.tls: true + rsshub: + image: diygod/rsshub:2024-04-17 + container_name: rsshub + restart: unless-stopped + ports: + - ${APP_PORT}:1200 + environment: + TZ: ${TZ} + env_file: + - ${APP_DATA_DIR}/data/app.env + networks: + - tipi_main_network + depends_on: + - redis + - browserless + labels: + # Main + traefik.enable: true + traefik.http.middlewares.rsshub-web-redirect.redirectscheme.scheme: https + traefik.http.services.rsshub.loadbalancer.server.port: 1200 + # Web + traefik.http.routers.rsshub-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.rsshub-insecure.entrypoints: web + traefik.http.routers.rsshub-insecure.service: rsshub + traefik.http.routers.rsshub-insecure.middlewares: rsshub-web-redirect + # Websecure + traefik.http.routers.rsshub.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.rsshub.entrypoints: websecure + traefik.http.routers.rsshub.service: rsshub + traefik.http.routers.rsshub.tls.certresolver: myresolver + # Local domain + traefik.http.routers.rsshub-local-insecure.rule: Host(`rsshub.${LOCAL_DOMAIN}`) + traefik.http.routers.rsshub-local-insecure.entrypoints: web + traefik.http.routers.rsshub-local-insecure.service: rsshub + traefik.http.routers.rsshub-local-insecure.middlewares: rsshub-web-redirect + # Local domain secure + traefik.http.routers.rsshub-local.rule: Host(`rsshub.${LOCAL_DOMAIN}`) + traefik.http.routers.rsshub-local.entrypoints: websecure + traefik.http.routers.rsshub-local.service: rsshub + traefik.http.routers.rsshub-local.tls: true - browserless: - image: browserless/chrome - container_name: rsshub_browserless - restart: unless-stopped - ulimits: - core: - hard: 0 - soft: 0 - networks: - - tipi_main_network + browserless: + image: browserless/chrome + container_name: rsshub_browserless + restart: unless-stopped + ulimits: + core: + hard: 0 + soft: 0 + networks: + - tipi_main_network - redis: - image: redis:alpine - container_name: rsshub_redis - restart: unless-stopped - volumes: - - ${APP_DATA_DIR}/data/redis:/data - networks: - - tipi_main_network + redis: + image: redis:alpine + container_name: rsshub_redis + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/redis:/data + networks: + - tipi_main_network diff --git a/apps/rsshub/metadata/description.md b/apps/rsshub/metadata/description.md index 015418eb..9ae17905 100644 --- a/apps/rsshub/metadata/description.md +++ b/apps/rsshub/metadata/description.md @@ -1,7 +1,3 @@ -# RSSHub - -![](https://camo.githubusercontent.com/ceaf8f7b5c2b0f5b71013f5553cd4e71dfbc47787928a2ec1cfe0e41a7a0b99c/68747470733a2f2f646f63732e7273736875622e6170702f696d672f6c6f676f2e706e67) - ## Introduction Introduction @@ -14,7 +10,6 @@ RSSHub can be used with browser extension [RSSHub Radar](https://github.com/DIYg [English docs](https://docs.rsshub.app/) | [Telegram Group](https://t.me/rsshub) | [Telegram Channel](https://t.me/awesomeRSSHub) | [Twitter](https://twitter.com/intent/follow?screen_name=_RSSHub) | [中文文档](https://docs.rsshub.app/zh/) - ## Usage In order to generate a feed, a valid URL with parameters has to be appended to the main domain for your RSSHub instance, varying with each different app. More on the how-to's for each supported service or app can be found on [https://docs.rsshub.app/guide/](https://docs.rsshub.app/guide/), and on [https://docs.rsshub.app/guide/parameters](https://docs.rsshub.app/guide/parameters) for filtering/sorting/limiting your feed in a given URL. @@ -29,7 +24,7 @@ More info related to available configuration envvars for RSSHub can be found on RSSHub provides an access control feature for restricting which user generates a feed within your instance. This can be enabled with the envvar `ACCESS_KEY`, which can be configured either at the installation step through Runtipi's App Store or via the envvars at `docker-compose.yml` or `app.env` for the RSSHub app. Default value is empty (`""`), which means no extra key is required in order to access a feed through the URLs. -Note that `ACCESS_KEY` is enabled **globally**, but access can be controlled granularly on an app-by-app basis by only giving the specific app *access code* to a user, as explained through the diagram found on [https://docs.rsshub.app/deploy/config#access-control-configurations](https://docs.rsshub.app/deploy/config#access-control-configurations). +Note that `ACCESS_KEY` is enabled **globally**, but access can be controlled granularly on an app-by-app basis by only giving the specific app _access code_ to a user, as explained through the diagram found on [https://docs.rsshub.app/deploy/config#access-control-configurations](https://docs.rsshub.app/deploy/config#access-control-configurations). ``` + -----------------------------------------------------------------------------------------------------------------+ diff --git a/apps/rsshub/metadata/logo.jpg b/apps/rsshub/metadata/logo.jpg index 2ba142fea671138b9b6b2c237058b924c375a782..ad9fc46441b87fd4c6d16a7e5ec88c96909edc11 100644 GIT binary patch literal 12223 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 P1w#I=%G1Z+{qTPPjl2ss literal 7854 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 Cb5SP%