RSSHub provides a painless deployment process if you are equipped with basic programming knowledge, you may open an issue (opens new window) if you believe you have encountered a problem not listed here (opens new window), the community will try to sort it out asap.

The deployment may involve the followings:

  1. Command line interface
  2. Git (opens new window)
  3. Node.js (opens new window)
  4. npm (opens new window) or yarn (opens new window)

Deploy for public access may require:

  1. Nginx (opens new window)
  2. Docker (opens new window) or docker-compose (opens new window)
  3. Redis (opens new window)
  4. Heroku (opens new window)
  5. Google App Engine (opens new window)

# Docker Image

We recommend using the latest version of the docker image.
When the latest version is unavailable , you can use image with date tag. For example :

$ docker pull diygod/rsshub:2021-06-18

Your can back to the latest version when code has been fixed and rebuild the image.

# Docker Compose Deployment

# Install

Download docker-compose.yml (opens new window)


Create a docker volume to persist Redis caches

$ docker volume create redis-data


$ docker-compose up -d

# Update

Remove old containers

$ docker-compose down

Repull the latest image if you have downloaded the image before. It is helpful to resolve some issues.

$ docker pull diygod/rsshub

Then repeat the installation steps

# Configuration

Edit environment in docker-compose.yml (opens new window)

# Docker Deployment

# Install

Execute the following command to pull RSSHub's docker image.

$ docker pull diygod/rsshub

Start a RSSHub container

$ docker run -d --name rsshub -p 1200:1200 diygod/rsshub

Visit (opens new window), and enjoy it! ✅

Execute the following command to stop RSSHub.

$ docker stop rsshub

# Update

Remove old container

$ docker stop rsshub
$ docker rm rsshub

Then repeat the installation steps

# Configuration

The simplest way to configure RSSHub container is via system environment variables.

For example, adding -e CACHE_EXPIRE=3600 will set the cache time to 1 hour.

$ docker run -d --name rsshub -p 1200:1200 -e CACHE_EXPIRE=3600 -e GITHUB_ACCESS_TOKEN=example diygod/rsshub

To configure more options please refer to Configuration.

Ansible Deployment

This Ansible playbook includes RSSHub, Redis, browserless (uses Docker) and Caddy 2

Currently only support Ubuntu 20.04

Requires sudo privilege and virtualization capability (Docker will be automatically installed)

# Install

sudo apt update
sudo apt install ansible
git clone ~/RSSHub
cd ~/RSSHub/scripts/ansible
sudo ansible-playbook rsshub.yaml
# When prompt to enter a domain name, enter the domain name that this machine/VM will use
# For example, if your users use to access your RSSHub instance, enter (remove the https://)

# Update

cd ~/RSSHub/scripts/ansible
sudo ansible-playbook rsshub.yaml
# When prompt to enter a domain name, enter the domain name that this machine/VM will use
# For example, if your users use to access your RSSHub instance, enter (remove the https://)

# Manual Deployment

The most direct way to deploy RSSHub, you can follow the steps below to deployRSSHub on your computer, server or anywhere.

# Install

Execute the following commands to download the source code

$ git clone
$ cd RSSHub

Execute the following commands to install dependencies

Using npm

$ npm ci

Or yarnv1 (not recommended)

$ yarn

# Launch

Under RSSHub's root directory, execute the following commands to launch

$ npm start


$ yarn start

Or use PM2 (opens new window)

$ pm2 start lib/index.js --name rsshub

Visit (opens new window), and enjoy it! ✅

Refer to our Guide (opens new window) for usage. Replace with http://localhost:1200 in any route example to see the effect.

# Configuration

RSSHub can be configured by setting environment variables.

Create a .env file in the root directory of your project. Add environment-specific variables on new lines in the form of NAME=VALUE. For example:


Please notice that it will not override already existed environment variables, more rules please refer to dotenv (opens new window)

This deployment method does not include puppeteer and redis dependencies. Use the Docker Compose deployment method or deploy external dependencies yourself if you need it.

To configure more options please refer to Configuration.

# Update

Under RSSHub's directory, execute the following commands to pull the latest source code for RSSHub

$ git pull

Then repeat the installation steps.

# A tip for Nix users

To install nodejs, yarn and jieba (to build documentation) you can use the following nix-shell configuration script.

    pkgs = import <nixpkgs> {};
    node = pkgs.nodejs-12_x;
in pkgs.stdenv.mkDerivation {
    name = "nodejs-yarn-jieba";
    buildInputs = [node pkgs.yarn pkgs.pythonPackages.jieba];

# Deploy to Heroku

# Notice:

Heroku accounts with unverified payment methods have only 550 hours of credit per month (about 23 days), and up to 1,000 hours per month with verified payment methods.

# Instant deploy (without automatic update)

Deploy to Heroku (opens new window)

# Automatic deploy upon update

  1. Fork RSSHub (opens new window) to your GitHub account.
  2. Deploy your fork to Heroku:, where URL is your fork address (e.g.
  3. Configure automatic deploy in Heroku app to follow the changes to your fork.
  4. Install Pull (opens new window) app to keep your fork synchronized with RSSHub.

# Deploy to Vercel(Zeit Now)

Deploy to Vercel (opens new window)

# Deploy to Google App Engine(GAE)

# Before You Begin

Follow the official guide (opens new window) for completing your GCP account settings, creating a new Node project, adding billing information (required), installing git and initializing gcloud(link (opens new window)). Node.js is not required if you don't plan to debug RSSHub locally.

Please note, GAE free tier doesn't support Flexible Environment, please check the pricing plan prior to deployment.

Node.js standard environment is still under beta, unknown or unexpected errors might be encountered during the deployment.

Execute git clone to pull the latest code

# app.yaml Settings

# Deploy to Flexible Environment

Under RSSHub's root directory, create a file app.yaml with the following content:

# [START app_yaml]
runtime: custom
env: flex

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
    instances: 1
# app engine resources, adjust to suit your needs, the required disk space is 10 GB
    cpu: 1
    memory_gb: 0.5
    disk_size_gb: 10
        - 80:1200
        - 443:1200
# environment variables section, refer to Settings
    CACHE_EXPIRE: '300'
# [END app_yaml]

# Deploy to standard environment

Under RSSHub's root directory, create a file app.yaml with the following content:

# [START app_yaml]
runtime: nodejs8

        - 80:1200
        - 443:1200
# environment variables section, refer to Settings
    CACHE_EXPIRE: '300'
# [END app_yaml]

# Install

Under RSSHub's root directory, execute the following commands to launch RSSHub

gcloud app deploy

For changing the deployment project id or version id, please refer to Deploying a service section here (opens new window).

You can access your Google App Engine URL to check the deployment status

# Play with Docker

If you would like to test routes or avoid IP limits, etc., you may build your own RSSHub for free by clicking the button below.

Try in PWD (opens new window)


  • DockerHub (opens new window) account required
  • Play with Docker (opens new window) instance will last for 4 hours at most. It should only be used for testing purpose
  • If deploy success but port cannot be auto-deteced,please click the open port button on the top and type 1200
  • Sometimes PWD won't work as expected. If you encounter blank screen after Start, or some error during initialization, please retry

# Configuration

Configure RSSHub by setting environment variables

# Cache Configurations

RSSHub supports two caching methods: memory and redis

CACHE_TYPE: cache type, memory or redis, empty this value will disable caching, default to memory

CACHE_EXPIRE: route cache expiry time in seconds, default to 5 * 60

CACHE_CONTENT_EXPIRE: content cache expiry time in seconds, it will be recalculated when it is accessed, default to 1 * 60 * 60

REDIS_URL: Redis target address(invalid when CACHE_TYPE is set to memory), default to redis://localhost:6379/

# Proxy Configurations

Partial routes have a strict anti-crawler policy, and can be configured to use proxy

PROXY_PROTOCOL: Using proxy, Supports socks, socks5, socks5h, http, https, etc. See socks-proxy-agent (opens new window) NPM package page and source (opens new window) for what these protocols mean. See also cURL OOTW: SOCKS5 (opens new window) for reference.

PROXY_HOST: host or IP of the proxy

PROXY_PORT: port of the proxy

PROXY_AUTH: credentials to authenticate a user agent to proxy server, Proxy-Authorization: Basic ${process.env.PROXY_AUTH}

PROXY_URL_REGEX: regex for url of enabling proxy, default to .*

# CORS Request

RSSHub by default reject CORS requests. This behavior can be modified via setting ALLOW_ORIGIN: * or ALLOW_ORIGIN:

# User Authentication Configurations

Routes in protected_route.js will be protected using HTTP Basic Authentication.

When adding feeds using RSS readers with HTTP Basic Authentication support, authentication information is required, eg:

For readers that do not support HTTP Basic authentication, please refer to Access Control Configuration.

HTTP_BASIC_AUTH_NAME: Http basic authentication username, default to usernam3, please change asap

HTTP_BASIC_AUTH_PASS: Http basic authentication password, default to passw0rd, please change asap

# Access Control Configuration

RSSHub supports access control via access key/code, whitelisting and blacklisting, enabling any will activate access control for all routes. ALLOW_LOCALHOST: true will grant access to all localhost IP addresses.

# White/blacklisting

  • WHITELIST: the blacklist. When set, values in BLACKLIST are disregarded

  • BLACKLIST: the blacklist

White/blacklisting support IP, route and UA as values, fuzzy matching. Use , as the delimiter to separate multiple values, eg: WHITELIST=,,/qdaily/column/59

# Access Key/Code

  • ACCESS_KEY: the access key. When set, access via the key directly or the access code described above

Access code is the md5 generated based on the access key + route, eg:

Access key Route Generating access code Access code
ILoveRSSHub /qdaily/column/59 md5('/qdaily/column/59' + 'ILoveRSSHub') 0f820530128805ffc10351f22b5fd121

See the relation between access key/code and white/blacklisting.

Whitelisted Blacklisted Correct access key/code Wrong access key/code No access key/code

# Other Application Configurations

PORT: listening port, default to 1200

SOCKET: listening Unix Socket, default to null

LISTEN_INADDR_ANY: open up for external access, default to 1

TITLE_LENGTH_LIMIT: limit the length of feed title generated in bytes, an English alphabet counts as 1 byte, the rest such as Chinese, Japanese, Korean or Arabic counts as 2 bytes by design, default to 100

REQUEST_RETRY: retries allowed for failed requests, default to 2

REQUEST_TIMEOUT: milliseconds to wait for the server to end the response before aborting the request with error, default to 3000

DEBUG_INFO: display route information on homepage for debugging purpose. When set to neither true nor false, use parameter debug to enable display, eg: (opens new window) . Default to true

NODE_ENV: display error message on pages for authentication failing, default to production (i.e. no display)

LOGGER_LEVEL: specifies the maximum level (opens new window) of messages to the console and log file, default to info

NODE_NAME: node name, used for load balancing, identify current node

PUPPETEER_WS_ENDPOINT: Browser websocket endpoint which can be used as an argument to puppeteer.connect, refer to browserWSEndpoint (opens new window)

SENTRY: Sentry (opens new window) dsn, used for error tracking

SENTRY_ROUTE_TIMEOUT: Report Sentry if route execution takes more than this milliseconds, default to 3000

DISALLOW_ROBOT: prevent indexing by search engine, default to enable, set false or 0 to disable

HOTLINK_TEMPLATE: Replace image link in description to avoid anti-hotlink protection, leave blank to disable this function. Usage reference #2769 (opens new window). You may use any properity listed in URL (opens new window), format of JS template literal. e.g. ${protocol}//${host}${pathname},${host}${pathname}

# Route-specific Configurations


Configs here is incomplete.

See docs of specified route and lib/config.js for detail information.

  • pixiv: Registration (opens new window)

    • PIXIV_REFRESHTOKEN: Please refer to this article (opens new window) to get a refresh_token

    • PIXIV_BYPASS_CDN: bypass Cloudflare bot check by directly accessing Pixiv source server, defaults to disable, set true or 1 to enable

    • PIXIV_BYPASS_HOSTNAME: Pixiv source server hostname or IP address, hostname will be resolved to IPv4 address via PIXIV_BYPASS_DOH, defaults to

    • PIXIV_BYPASS_DOH: DNS over HTTPS endpoint, it must be compatible with Cloudflare or Google DoH JSON schema, defaults to

  • pixiv fanbox: Get paid content

    • FANBOX_SESSION_ID: equals to FANBOXSESSID in site cookies.
  • disqus: API Key application (opens new window)

    • DISQUS_API_KEY: Disqus API
  • twitter: Application creation (opens new window)

    • TWITTER_CONSUMER_KEY: Twitter Consumer Key, support multiple keys, split them with ,

    • TWITTER_CONSUMER_SECRET: Twitter Consumer Secret, support multiple keys, split them with ,

    • TWITTER_TOKEN_{handler}: The token generated by the corresponding Twitter handler, replace {handler} with the Twitter handler, the value is a combination of Twitter API key, Twitter API key secret, Access token, Access token secret connected by a comma ,. Eg. TWITTER_TOKEN_RSSHub=bX1zry5nG4d1RbESQbnADpVIo,2YrD8qo9sXbB8VlYfVmo1Qtw0xsexnOliU5oZofq7aPIGou0Xx,123456789-hlkUHFYmeXrRcf6SEQciP8rP4lzmRgMgwdqIN9aK,pHcPnfa28rCIKhSICUCiaw9ppuSSl7T2f3dnGYpSM0bod.

  • youtube: API Key application (opens new window)

    • YOUTUBE_KEY: YouTube API Key, support multiple keys, split them with ,
  • telegram: Bot application (opens new window)

    • TELEGRAM_TOKEN: Telegram bot token
  • github: Access Token application (opens new window)

    • GITHUB_ACCESS_TOKEN: GitHub Access Token
  • Instagram:

    • IG_USERNAME: Your Instagram username
    • IG_PASSWORD: Your Instagram password
    • IG_PROXY: Proxy URL for Instagram

    Warning: Two Factor Authentication is not supported.

  • mail:

    • EMAIL_CONFIG_{email}: Mail setting, replace {email} with the email account, replace @ in email account with ., eg. The value is in the format of password=password&host=server&port=port, eg:
      • Linux env: EMAIL_CONFIG_xxx_qq_com="password=123456&"
      • docker env: EMAIL_CONFIG_xxx_qq_com=password=123456&, please do not include quotations ',"
  • nhentai torrent: Registration (opens new window)

    • NHENTAI_USERNAME: nhentai username or email
    • NHENTAI_PASSWORD: nhentai password
  • discuz cookies

    • DISCUZ_COOKIE_{cid}: Cookie of a forum powered by discuz, cid can be anything from 00 to 99. When visiting route discuz, using cid to specify this cookie.
  • Mastodon user timeline: apply api here https://mastodon.example/settings/applications, please check scope read:search

    • MASTODON_API_HOST: api instance domain
    • MASTODON_API_ACCESS_TOKEN: user access token
    • MASTODON_API_ACCT_DOMAIN: acct domain for particular instance
  • Sci-hub for scientific journal routes:

    • SCIHUB_HOST: The Sci-hub mirror address that is accssible from your location, default to
  • Wordpress:

    • WORDPRESS_CDN: Proxy http image link with https link. Consider using:

      url backbone akamai cloudflare cloudflare cloudflare digitalocean