[{"data":1,"prerenderedAt":197},["ShallowReactive",2],{"seo-verification":3,"blog-host-freshrss-on-your-own-vps-ma-en":6,"promo-bar-likely":196},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-host-freshrss-on-your-own-vps-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":137,"ctaBody":138,"ctaButton":139,"ctaUrl":140,"relatedPosts":141},86,"host-freshrss-on-your-own-vps",{"fr":12,"en":10,"ar":13,"es":14},"heberger-freshrss","استضافة-freshrss-على-خادمك-الافتراضي-الخاص-vps","alojar-freshrss-en-un-vps","Host FreshRSS on Your Own VPS","Take back control of your news monitoring: deploy FreshRSS on your VPS with Docker, SSL and mobile access. Complete self-hosting guide.",10,2,false,"2026-03-26T00:00:00+00:00","2026-10-13T14:10:29+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-freshrss-poster.svg",{"categorySlug":25,"appSlug":34},"freshrss","Commercial RSS aggregators shut down, change pricing or resell your interests. FreshRSS reverses the logic: a lightweight, multi-user feed reader that you host yourself. Here is how to deploy it cleanly on a VPS, with a database, reverse proxy and HTTPS certificate.",[37,41,51,54,85,88,91,94,128,131,134],{"type":38,"title":39,"body":40},"h2","Why self-host FreshRSS on a VPS","FreshRSS is an RSS\u002FAtom feed aggregator written in PHP, designed to be light on resources while handling thousands of articles. Self-hosting on a VPS solves three problems that closed services do not address: durability (your monitoring does not vanish overnight), privacy (nobody profiles your subscriptions) and freshness (you set the refresh frequency via cron, with no imposed quota). A VPS, unlike shared hosting, gives you full SSH access, the right to run a Docker container and to schedule tasks — exactly what FreshRSS needs to refresh feeds in the background.",{"type":42,"title":43,"items":44},"ul","Concrete benefits of a self-hosted FreshRSS",[45,46,47,48,49,50],"Native API compatible with Fever and Google Reader: synchronize with Reeder, FeedMe or Fluent Reader on mobile.","GReader \u002F scraping extension: retrieve the full content of truncated articles thanks to XPath filters.","Multi-user with per-account quotas: ideal for sharing an instance within an agency.","Minimal memory footprint (200 to 300 MB): runs on the smallest of VPSes without flinching.","Cron-driven refresh: you decide whether the feeds update every 5 minutes or every hour.","Trivial backup: a SQLite\u002FMySQL database and a data folder are enough to restore everything.",{"type":38,"title":52,"body":53},"Technical requirements","FreshRSS is one of the most frugal self-hosting applications. Plan for 1 vCPU and 1 GB of RAM for a personal instance with a few users; 10 GB of disk is amply sufficient, the bulk of it taken up by the article history. On the software side: Docker and the Docker Compose plugin installed on the VPS, a domain name (or a subdomain like `rss.yourdomain.com`) pointed with an A record to the server's IP, and port 80\u002F443 open for the reverse proxy. PHP does not need to be installed on the host: the official `freshrss\u002Ffreshrss` image bundles everything.",{"type":55,"title":56,"steps":57},"steps","Deploy FreshRSS step by step",[58,61,64,67,70,73,76,79,82],{"title":59,"body":60},"Prepare the VPS and Docker","Connect via SSH, update the system (`apt update && apt upgrade -y`), then install Docker: `curl -fsSL https:\u002F\u002Fget.docker.com | sh`. Add your user to the docker group: `usermod -aG docker $USER`. Check with `docker compose version`. Create the project folder: `mkdir -p \u002Fopt\u002Ffreshrss && cd \u002Fopt\u002Ffreshrss`.",{"title":62,"body":63},"Write the docker-compose.yml","Create `docker-compose.yml` with the following content:\n\n```yaml\nservices:\n  freshrss:\n    image: freshrss\u002Ffreshrss:latest\n    container_name: freshrss\n    restart: unless-stopped\n    environment:\n      CRON_MIN: \"*\u002F20\"\n      TZ: \"Europe\u002FParis\"\n    volumes:\n      - .\u002Fdata:\u002Fvar\u002Fwww\u002FFreshRSS\u002Fdata\n      - .\u002Fextensions:\u002Fvar\u002Fwww\u002FFreshRSS\u002Fextensions\n    ports:\n      - \"127.0.0.1:8080:80\"\n```\n\nThe port is bound to `127.0.0.1` only: solely the local reverse proxy can reach it.",{"title":65,"body":66},"Configure nginx as reverse proxy","Install nginx: `apt install -y nginx`. Create `\u002Fetc\u002Fnginx\u002Fsites-available\u002Ffreshrss`:\n\n```nginx\nserver {\n    listen 80;\n    server_name rss.yourdomain.com;\n\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8080;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n```\n\nEnable the vhost: `ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Ffreshrss \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F && nginx -t && systemctl reload nginx`.",{"title":68,"body":69},"Obtain the TLS certificate with Certbot","Install Certbot and the nginx plugin: `apt install -y certbot python3-certbot-nginx`. Issue the certificate: `certbot --nginx -d rss.yourdomain.com`. Certbot automatically modifies the nginx vhost to listen on 443 and redirect HTTP to HTTPS. Automatic renewal is enabled by default via the certbot systemd timer.",{"title":71,"body":72},"Launch the container","Start the stack from `\u002Fopt\u002Ffreshrss`: `docker compose up -d`. Follow the initialization: `docker compose logs -f`. The container applies migrations and creates the data tree on first startup. Then verify FreshRSS responds: `curl -I https:\u002F\u002Frss.yourdomain.com`.",{"title":74,"body":75},"Complete the web installation","Open `https:\u002F\u002Frss.yourdomain.com` in your browser. The wizard asks you to choose the database backend: select **SQLite** for personal use (single file, no service to manage), or **MySQL** if dozens of users are expected. Create the administrator account with a strong password.",{"title":77,"body":78},"Enable the API","Go to **Profile → API Management**. Check \"Enable GReader\u002FFever API\" and set an API password separate from your main password (it will be transmitted in clear text by some clients). Note the API base URL: `https:\u002F\u002Frss.yourdomain.com\u002Fapi\u002Fgreader.php`. You can test immediately with `curl -X POST https:\u002F\u002Frss.yourdomain.com\u002Fapi\u002Fgreader.php\u002Faccounts\u002FClientLogin -d Email=admin@yourdomain.com&Passwd=\u003Capipass>`.",{"title":80,"body":81},"Import your OPML","Export your subscriptions from your old reader (Feedly, Inoreader…) in OPML format. In FreshRSS, go to **Subscriptions → Import\u002FExport → Import an OPML file**. Your categories and feeds are recreated within seconds. Verify the first manual refresh: `docker compose exec freshrss php .\u002Fcli\u002Factualize.php`.",{"title":83,"body":84},"Verify the automatic cron","The `CRON_MIN=*\u002F20` variable configures the container's internal cron to refresh all feeds every 20 minutes. Confirm it is running: `docker compose exec freshrss crontab -l`. If you prefer to control it from the host, disable the internal cron (`CRON_MIN=` empty) and add a system crontab: `*\u002F15 * * * * docker exec freshrss php \u002Fvar\u002Fwww\u002FFreshRSS\u002Fapp\u002Factualize_script.php 2>&1 | logger -t freshrss`.",{"type":86,"body":87},"tip","For sites that publish only an excerpt in their feed, install the official \"FreshRSS Content Selector\" extension: configure a CSS selector (e.g. `article.post-content`) per subscription and FreshRSS will fetch the full text on each refresh. Combine it with the filters extension to automatically hide sponsored articles detected by keyword.",{"type":38,"title":89,"body":90},"Advanced FreshRSS configuration","Once the base instance is running, three optimization areas turn FreshRSS from a simple reader into a proper monitoring tool:\n\n**Extensions: RSS-Bridge and FullTextRss.** Copy the extension into `\u002Fopt\u002Ffreshrss\u002Fextensions\u002F`, then enable it in the **Extensions** section of the interface. RSS-Bridge generates an RSS feed for sites that do not provide one (public Twitter\u002FX, Instagram, LinkedIn), running as a bridge on your VPS. FullTextRss (self-hosted version of the FiveFilters library) completes truncated articles by extracting the HTML body according to pre-defined site rules — over 2,000 sites are already configured in the community rule base.\n\n**Refresh frequency.** The `CRON_MIN=*\u002F20` value suits most monitoring needs. For critical sources (security alerts, stock prices), go down to `*\u002F5`. To reduce load on your VPS with many inactive subscriptions, go up to `*\u002F60`. FreshRSS also respects `ETag` and `Last-Modified` HTTP headers: if a feed has not changed, the refresh costs almost nothing in bandwidth.\n\n**SQLite vs MySQL.** SQLite handles up to a few hundred thousand articles and a handful of users; its simplicity (single file) makes it a solid option for personal use. Beyond 5 simultaneous users or 500,000 articles, MySQL (or MariaDB) offers better read query performance. Migration from SQLite to MySQL is possible via the `convert-db.php` CLI tool included in the container.",{"type":38,"title":92,"body":93},"The FreshRSS API for your AI agents and automations","FreshRSS is one of the few self-hosted aggregators that implements two standard APIs: the **Google Reader API** (`\u002Fapi\u002Fgreader.php`) and the **Fever API** (`\u002Fapi\u002Ffever.php`). These publicly documented APIs enable frictionless integration with dozens of automation tools.\n\n**n8n integration.** In an n8n workflow, use the HTTP Request node with Basic authentication (FreshRSS API credentials). Trigger the workflow on new unread articles by polling the GReader endpoint: `GET \u002Fapi\u002Fgreader.php\u002Freader\u002Fapi\u002F0\u002Fstream\u002Fcontents\u002Fuser\u002F-\u002Fstate\u002Fcom.google\u002Freading-list?n=20&xt=user\u002F-\u002Fstate\u002Fcom.google\u002Fread`. Chain with an OpenAI node to summarize each article, then send the summary to Slack or by email. All within your own infrastructure.\n\n**Make (ex-Integromat) integration.** Make's HTTP module allows the same REST calls. A typical scenario: every hour, fetch starred articles, enrich them with an LLM via a webhook, and push them into Notion or Airtable to build a structured knowledge base.\n\n**AI agents.** Frameworks like LangChain or LlamaIndex can query the FreshRSS API directly to feed a RAG (Retrieval-Augmented Generation) pipeline on your personal monitoring. Your instance becomes a private, structured, fresh data source, inaccessible to public models.",{"type":95,"title":96,"rows":97,"headers":123},"comparison","FreshRSS vs Miniflux vs Tiny Tiny RSS",[98,103,108,113,118],[99,100,101,102],"Language \u002F stack","PHP + SQLite\u002FMySQL","Go (single binary)","PHP + PostgreSQL",[104,105,106,107],"Minimum RAM","~50 MB (without Docker)","~20 MB","~100 MB",[109,110,111,112],"Standard API","Google Reader + Fever","Miniflux REST + Fever","Google Reader (plugin)",[114,115,116,117],"Extensions \u002F plugins","Rich (30+ official)","Limited (native filters)","Many third-party plugins",[119,120,121,122],"License","AGPL-3.0","Apache-2.0","GPL-3.0",[124,125,126,127],"Criterion","FreshRSS","Miniflux","Tiny Tiny RSS",{"type":38,"title":129,"body":130},"Backing up and migrating FreshRSS","One of the advantages of self-hosting is complete control over your data. Two backup levels cover all scenarios:\n\n**OPML export (subscriptions).** From **Subscriptions → Import\u002FExport → Export as OPML**, you generate an XML file containing all your feeds and categories. This is the minimal backup: it lets you reimport your feed list on any FreshRSS instance or any other compatible RSS reader. Automate it with a crontab: `0 3 * * * docker exec freshrss php \u002Fvar\u002Fwww\u002FFreshRSS\u002Fcli\u002Fexport-opml-file.php > \u002Fopt\u002Fbackups\u002Ffreshrss-opml-$(date +%F).xml`.\n\n**Full backup (database + data).** To also retain the reading history and stars, back up the entire Docker volume: `rsync -a \u002Fopt\u002Ffreshrss\u002Fdata\u002F \u002Fopt\u002Fbackups\u002Ffreshrss-data-$(date +%F)\u002F`. If using SQLite, the database is in `data\u002Fusers\u002F\u003Cuser>\u002Fnon_default_feeds.sqlite`. For MySQL, a `mysqldump` is sufficient.\n\n**Migration between VPSes.** The process is linear: (1) stop the source container (`docker compose stop`); (2) copy the `data\u002F` folder to the new VPS via rsync or scp; (3) deploy the same `docker-compose.yml` on the new VPS and start it; (4) update the DNS A record to the new IP. Total time for a personal instance: under 10 minutes, zero data loss.",{"type":38,"title":132,"body":133},"Troubleshooting: 4 common errors","**1. Inactive cron — feeds no longer update.** Symptom: the \"Last updated\" column remains frozen. First check that the internal cron is running: `docker compose exec freshrss crontab -l`. If the output is empty, the `CRON_MIN` variable is missing or empty in your `docker-compose.yml`. Add `CRON_MIN: \"*\u002F20\"` under `environment:` and recreate the container (`docker compose up -d --force-recreate`).\n\n**2. Feed that never updates despite an active cron.** Most common cause: the feed consistently returns HTTP 429 (rate-limit) or 403. Check under **Subscriptions → Manage → Last error**. For a site that blocks requests without a User-Agent, add an explicit User-Agent in the feed's advanced settings (e.g. `FreshRSS\u002F1.24 (+https:\u002F\u002Frss.yourdomain.com)`). For a feed behind Cloudflare, RSS-Bridge with the `CloudFlare` bridge bypasses the JS challenge.\n\n**3. SSL error \"certificate verify failed\".** Occurs when the FreshRSS container tries to reach an HTTPS feed with a self-signed or expired certificate. Two options: disable SSL verification for that specific feed (checkbox to uncheck in the subscription's advanced options), or update the container's CA store if the entire SSL stack is broken (`docker compose exec freshrss update-ca-certificates`).\n\n**4. FullTextRss extension silent — content remains truncated.** Check that the extension is enabled in **Extensions** and that the FullTextRss service URL is correct in its configuration. If using the self-hosted version, test the URL directly in the browser: `https:\u002F\u002Fyour-ftr.domain.com\u002Fextract.php?url=\u003Carticle_url>`. An empty JSON response indicates the site's selector is not in the rule base — create a custom rule file in `site_patterns\u002F` and mount it as a Docker volume.",{"type":38,"title":135,"body":136},"Use case: developer tech-watch feed","Add GitHub release feeds for every dependency in your project (`https:\u002F\u002Fgithub.com\u002F\u003Cowner>\u002F\u003Crepo>\u002Freleases.atom`), the Hacker News feed (`https:\u002F\u002Fnews.ycombinator.com\u002Frss`), the blogs of key maintainers in your ecosystem, and CVE feeds for your runtime and OS.\n\nFreshRSS delivers the raw chronological timeline — no algorithmic sorting, no promoted posts. Create an auto-star rule: any article containing 'security advisory' or 'breaking change' gets starred and triggers an ntfy notification to your phone. You get the signal, without the noise of social platforms.","Launch your news monitoring in minutes","The ServOrbit Cloud VPS comes with Docker preinstalled and a ready-to-use reverse proxy: deploy your FreshRSS template and take back control of your feeds, without depending on any third-party service.","Deploy on Cloud VPS","\u002Fvps-cloud",[142,161,178],{"id":143,"slug":144,"slugs":145,"title":149,"excerpt":150,"readTime":151,"views":152,"isPinned":19,"noindex":19,"publishedAt":153,"updatedAt":154,"category":155,"categories":156,"featuredImage":30,"bgImage":31,"posterImage":158,"relatedSolution":159},71,"hosting-nextcloud-on-your-own-vps",{"fr":146,"en":144,"ar":147,"es":148},"heberger-nextcloud","استضافة-nextcloud-على-خادمك-الـvps-الخاص","alojar-nextcloud-en-su-propio-vps","Self-Host Nextcloud on VPS: NC 35, PHP 8.3 and MariaDB 11 Guide","Host Nextcloud on a VPS: Docker Compose, Redis, MariaDB backup, uploads over 40 GB behind Cloudflare and an alternative to Office 2021.",20,1,"2026-04-10T00:00:00+00:00","2026-11-08T16:32:50+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[157],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":25,"appSlug":160},"nextcloud",{"id":162,"slug":163,"slugs":164,"title":168,"excerpt":169,"readTime":17,"views":152,"isPinned":19,"noindex":19,"publishedAt":170,"updatedAt":171,"category":172,"categories":173,"featuredImage":30,"bgImage":31,"posterImage":175,"relatedSolution":176},72,"hosting-ghost-on-your-own-vps",{"fr":165,"en":163,"ar":166,"es":167},"heberger-ghost","استضافة-ghost-على-خادمك-الـvps-الخاص","alojar-ghost-en-un-vps","Hosting Ghost on your own VPS: complete 2026 guide","Deploy Ghost v6 on your VPS with Caddy, MySQL, Ghost CLI and Stripe Tax: installation, TLS reverse proxy, updates and troubleshooting common startup errors.","2026-04-09T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[174],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-ghost-poster.svg",{"categorySlug":25,"appSlug":177},"ghost",{"id":179,"slug":180,"slugs":181,"title":185,"excerpt":186,"readTime":23,"views":187,"isPinned":19,"noindex":19,"publishedAt":188,"updatedAt":189,"category":190,"categories":191,"featuredImage":30,"bgImage":31,"posterImage":193,"relatedSolution":194},73,"host-wordpress-on-your-own-vps",{"fr":182,"en":180,"ar":183,"es":184},"heberger-wordpress","استضافة-wordpress-على-خادم-vps-الخاص-بك","alojar-wordpress-en-un-vps","Host WordPress on your own VPS","Host WordPress on your VPS for maximum performance and control: Docker, MariaDB, caching, reverse proxy and SSL.",0,"2026-04-08T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[192],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-wordpress-poster.svg",{"categorySlug":25,"appSlug":195},"wordpress",true,1794270409059]