HomeStart / GuidesAnleitungen / Self-hosting FreshRSS on a VPS/ FreshRSS selbst hosten auf einem VPS

Self-hosting FreshRSS on a VPS: Docker Compose, the cron refresh, and the Fever/GReader catchFreshRSS selbst hosten auf einem VPS: Docker Compose, der Cron-Refresh und die Fever/GReader-Falle

FreshRSS is what an RSS reader looks like when the project cares more about the reading experience than the operator's convenience: a PHP app with an embedded SQLite database by default, a scheduler inside its own container, and two legacy sync APIs bolted on so your existing mobile app never has to change.FreshRSS zeigt, wie ein RSS-Reader aussieht, wenn dem Projekt die Leseerfahrung wichtiger ist als die Bequemlichkeit des Betreibers: eine PHP-App mit standardmäßig eingebetteter SQLite-Datenbank, ein Scheduler im eigenen Container und zwei altehrwürdige Sync-APIs, die drangeschraubt wurden, damit deine bestehende mobile App sich nie ändern muss.

Why this is a Starter questionWarum das eine Starter-Frage ist

FreshRSS itself is light. It's a PHP application served by Apache inside the official container, and with the default SQLite backend it idles well under 200 MiB of RAM. The work it actually does — fetching a few hundred feed URLs on a schedule, parsing the XML, storing new items — is bursty network and disk I/O, not sustained CPU load. That's exactly what our vps-starter tier (1 vCPU, 1 GiB RAM, 25 GB disk) was sized for, and hundreds of feeds refresh on it without the box breaking a sweat. What actually pushes you off Starter isn't the reader itself: a feed count in the low thousands, several people reading on a shared Postgres backend at once, or full-text extraction running on every article instead of the summary FreshRSS already pulled from the feed.FreshRSS selbst ist leichtgewichtig. Es ist eine PHP-Anwendung, die Apache im offiziellen Container ausliefert, und mit dem SQLite-Backend als Standard liegt es im Leerlauf deutlich unter 200 MiB RAM. Die eigentliche Arbeit — ein paar Hundert Feed-URLs nach Zeitplan abrufen, das XML parsen, neue Einträge speichern — ist stoßweise Netzwerk- und Festplatten-I/O, keine dauerhafte CPU-Last. Genau dafür ist unser vps-starter-Tarif (1 vCPU, 1 GiB RAM, 25 GB Speicher) dimensioniert, und Hunderte Feeds aktualisieren sich darauf, ohne dass die Kiste ins Schwitzen kommt. Was dich tatsächlich vom Starter wegtreibt, ist nicht der Reader selbst: eine Feed-Zahl im niedrigen vierstelligen Bereich, mehrere Leute, die gleichzeitig auf einem gemeinsamen Postgres-Backend lesen, oder Volltextextraktion, die bei jedem Artikel läuft, statt der Zusammenfassung, die FreshRSS aus dem Feed schon mitbringt.

The compose fileDie Compose-Datei

services:
  freshrss:
    image: freshrss/freshrss:1.24.2   # check hub.docker.com/r/freshrss/freshrss/tags for the current release
    restart: unless-stopped
    environment:
      - TZ=Europe/Berlin
      - CRON_MIN=3,33
    volumes:
      - freshrss_data:/var/www/FreshRSS/data
      - freshrss_extensions:/var/www/FreshRSS/extensions
    ports:
      - "127.0.0.1:8080:80"

volumes:
  freshrss_data:
    name: freshrss_data
  freshrss_extensions:
    name: freshrss_extensions

/data holds the SQLite database (if you use it), your feed list, and every user's configuration — the one directory that actually matters for a backup. /extensions is where third-party extension folders live, kept as a separate volume so an image update never touches them. The port is bound to 127.0.0.1, the pattern this whole series uses: only Caddy on the same host talks to FreshRSS directly, nothing reaches port 8080 from outside./data enthält die SQLite-Datenbank (falls du sie nutzt), deine Feed-Liste und die Konfiguration jedes Nutzers — das eine Verzeichnis, auf das es beim Backup wirklich ankommt. /extensions ist der Ort, an dem Ordner von Drittanbieter-Erweiterungen liegen, als eigenes Volume gehalten, damit ein Image-Update sie nie berührt. Der Port ist an 127.0.0.1 gebunden, das Muster, das diese ganze Serie verwendet: Nur Caddy auf demselben Host spricht direkt mit FreshRSS, von außen erreicht nichts Port 8080.

Pin both volume names with the name: line. Compose otherwise prefixes a named volume with the project directory's name, so the volume actually created is not literally freshrss_data unless you pin it — and the backup command further down assumes that exact literal name. Skip the pin and that command quietly tars a brand-new empty volume instead of the one FreshRSS is using, with no error to tell you it happened. That's the thing that bites later.Pinne beide Volume-Namen mit der name:-Zeile. Sonst stellt Compose einem benannten Volume den Namen des Projektverzeichnisses voran, sodass das tatsächlich angelegte Volume nicht wortwörtlich freshrss_data heißt, wenn du es nicht pinnst — und der Backup-Befehl weiter unten setzt genau diesen wortwörtlichen Namen voraus. Lässt du das Pinnen weg, tart dieser Befehl klaglos ein brandneues, leeres Volume statt desjenigen, das FreshRSS tatsächlich benutzt, ohne dass ein Fehler dir sagt, dass es passiert ist. Das ist das, was dich später beißt.

SQLite vs PostgresSQLite vs. Postgres

FreshRSS ships with SQLite as its default storage and it is a real option for one or a handful of users, not a placeholder to be replaced later — the database file lives in the freshrss_data volume above and needs nothing extra to run. Move to Postgres when several accounts are reading and marking items at once, since SQLite serializes writes and a shared multi-user instance is exactly the write-contention pattern it wasn't built for.FreshRSS liefert SQLite als Standardspeicher aus, und das ist eine echte Option für einen einzelnen oder eine Handvoll Nutzer, kein Platzhalter, der später ersetzt werden muss — die Datenbankdatei liegt im oben genannten Volume freshrss_data und braucht nichts Zusätzliches, um zu laufen. Wechsle zu Postgres, wenn mehrere Accounts gleichzeitig lesen und Einträge markieren, denn SQLite serialisiert Schreibzugriffe, und eine gemeinsam genutzte Mehrbenutzer-Instanz ist genau das Muster an Schreibkonkurrenz, für das es nicht gebaut wurde.

Adding Postgres means one more service in the same compose file:Postgres hinzuzufügen bedeutet einen weiteren Service in derselben Compose-Datei:

  db:
    image: postgres:16-alpine   # check hub.docker.com/_/postgres/tags for the current release
    restart: unless-stopped
    environment:
      - POSTGRES_DB=freshrss
      - POSTGRES_USER=freshrss
      - POSTGRES_PASSWORD=<a long, random password>
    volumes:
      - freshrss_db:/var/lib/postgresql/data

Add freshrss_db: (also pinned with name:) to the volumes: block. Add depends_on: [db] to the freshrss service too, so Compose starts Postgres before FreshRSS tries to talk to it — without it both containers start at the same moment, and the setup wizard's connection test can fail for no obvious reason if you reach it before Postgres has finished initializing. FreshRSS's own setup wizard, covered next, asks for the database type and connection details — point it at host db, port 5432, and the credentials above; Compose's default network resolves the service name for you, no extra networking config needed. run a database on your VPS has more on running a database alongside an app like this on one VPS, including what to watch for on memory.Füge freshrss_db: (ebenfalls mit name: gepinnt) zum volumes:-Block hinzu. Füge auch depends_on: [db] zum freshrss-Service hinzu, damit Compose Postgres startet, bevor FreshRSS versucht, mit ihm zu sprechen — ohne das starten beide Container im selben Moment, und der Verbindungstest des Einrichtungsassistenten kann aus scheinbar keinem Grund fehlschlagen, wenn du ihn erreichst, bevor Postgres die Initialisierung abgeschlossen hat. FreshRSS' eigener Einrichtungsassistent, gleich im nächsten Abschnitt, fragt nach dem Datenbanktyp und den Verbindungsdetails — trag Host db, Port 5432 und die obigen Zugangsdaten ein; das Standardnetzwerk von Compose löst den Servicenamen für dich auf, keine zusätzliche Netzwerkkonfiguration nötig. Eine Datenbank auf deinem VPS betreiben geht genauer darauf ein, wie du eine Datenbank neben einer App wie dieser auf einem VPS betreibst, einschließlich worauf beim Arbeitsspeicher zu achten ist.

First run: the setup wizardErster Start: der Einrichtungsassistent

Bring the stack up:Fahre den Stack hoch:

docker compose up -d

Reach the setup wizard over an SSH tunnel rather than opening the port publicly: ssh -L 8080:127.0.0.1:8080 user@your-vps-ip, then browse to http://127.0.0.1:8080 on your own machine. The compose file's 127.0.0.1:8080:80 binding from earlier is deliberate — never rebind it to a public interface before authentication exists, since the setup wizard itself has no login until you finish it.Erreiche den Einrichtungsassistenten über einen SSH-Tunnel, statt den Port öffentlich zu öffnen: ssh -L 8080:127.0.0.1:8080 user@your-vps-ip, dann rufe auf deiner eigenen Maschine http://127.0.0.1:8080 auf. Die 127.0.0.1:8080:80-Bindung der Compose-Datei von weiter oben ist Absicht — binde sie niemals an ein öffentliches Interface, bevor Authentifizierung existiert, denn der Einrichtungsassistent selbst hat kein Login, bis du ihn abgeschlossen hast.

FreshRSS has no unauthenticated first-account trick the way some of these apps do — visiting the site for the first time drops you straight into a setup wizard. It asks for the storage backend (SQLite or the Postgres/MySQL connection details above), the instance's own base URL, and the admin account you're creating. Get the base URL right the first time: FreshRSS uses it to build the links inside feed exports and the API endpoints covered below, and it's the address you're about to put behind HTTPS, not 127.0.0.1:8080.FreshRSS hat keinen unauthentifizierten Erst-Account-Trick, wie ihn manche dieser Apps haben — besuchst du die Seite zum ersten Mal, landest du direkt im Einrichtungsassistenten. Er fragt nach dem Speicher-Backend (SQLite oder den obigen Postgres-/MySQL-Verbindungsdetails), der eigenen Basis-URL der Instanz und dem Admin-Account, den du gerade anlegst. Bring die Basis-URL gleich beim ersten Mal richtig hin: FreshRSS baut damit die Links in Feed-Exporten und die weiter unten behandelten API-Endpunkte, und es ist die Adresse, die du gleich hinter HTTPS legst, nicht 127.0.0.1:8080.

HTTPS with Caddy, and the NAT catch every guide in this series hitsHTTPS mit Caddy, und die NAT-Falle, in die jede Anleitung dieser Serie tappt

rss.example.com {
    reverse_proxy 127.0.0.1:8080
}

That's the whole file. Caddy requests and renews the certificate itself the first time it sees a request for that hostname, as long as the domain's A record already points at the box.Das ist die ganze Datei. Caddy fordert das Zertifikat selbst an und erneuert es, sobald es zum ersten Mal eine Anfrage für diesen Hostnamen sieht, vorausgesetzt der A-Eintrag der Domain zeigt schon auf die Maschine.

Read this before you buy: the NAT IPv4 catch for 443. Our VPS plans forward a small number of ports besides the dedicated SSH port, and whether 80 and 443 are among them depends on the plan — check what your specific plan actually forwards before you point a domain at the box: NAT IPv4, ports and forwarding. If 443 is forwarded, the Caddyfile above works unchanged. If it isn't, Caddy has nothing to answer the ACME challenge on and will sit there retrying instead of serving anything; a forwarded high port doesn't help with certificate issuance even though FreshRSS itself would work fine on it. A dedicated IPv4, where 443 is genuinely yours, is the alternative — on our plans that's arranged by e-mail.Lies das, bevor du kaufst: die NAT-IPv4-Falle bei 443. Unsere VPS-Pläne leiten eine kleine Anzahl von Ports zusätzlich zum dedizierten SSH-Port weiter, und ob 80 und 443 dazugehören, hängt vom Plan ab — prüfe, was dein konkreter Plan tatsächlich weiterleitet, bevor du eine Domain auf die Maschine zeigen lässt: NAT IPv4, Ports und Weiterleitung. Ist 443 weitergeleitet, funktioniert die Caddyfile oben unverändert. Ist es das nicht, hat Caddy nichts, worauf es die ACME-Challenge beantworten kann, und bleibt beim Wiederholen hängen, statt irgendetwas auszuliefern; ein weitergeleiteter hoher Port hilft bei der Zertifikatsausstellung nicht, selbst wenn FreshRSS selbst darauf problemlos liefe. Eine dedizierte IPv4, bei der 443 wirklich dir gehört, ist die Alternative — bei unseren Plänen wird das per E-Mail geregelt.

The cron refresh: CRON_MINDer Cron-Refresh: CRON_MIN

FreshRSS doesn't fetch new items the moment you open the page — something has to trigger the refresh, and the official image handles that with the CRON_MIN environment variable set above. It takes a comma-separated list of minutes within the hour: CRON_MIN=3,33 runs the refresh at :03 and :33 of every hour, twice an hour, without needing a cron job outside the container at all. Leave it unset and nothing refreshes on a schedule — you'd have to trigger updates by hand or wire up an external cron job calling FreshRSS's own update script inside the container, which is more moving parts for no real benefit over just setting the variable.FreshRSS holt neue Einträge nicht in dem Moment, in dem du die Seite öffnest — irgendetwas muss den Refresh auslösen, und das offizielle Image erledigt das mit der oben gesetzten Umgebungsvariable CRON_MIN. Sie nimmt eine kommagetrennte Liste von Minuten innerhalb der Stunde: CRON_MIN=3,33 lässt den Refresh um :03 und :33 jeder Stunde laufen, zweimal pro Stunde, ganz ohne einen Cron-Job außerhalb des Containers zu brauchen. Lässt du sie ungesetzt, aktualisiert sich nichts nach Zeitplan — du müsstest Updates von Hand auslösen oder einen externen Cron-Job verdrahten, der FreshRSS' eigenes Update-Skript im Container aufruft, was mehr bewegliche Teile sind für keinen echten Vorteil gegenüber dem einfachen Setzen der Variable.

Twice an hour is a reasonable default for a personal reader. Add more minutes to the list if a few feeds post constantly and you want them sooner; each run is cheap on a Starter box, since it's HTTP requests and XML parsing, not anything CPU-bound.Zweimal pro Stunde ist ein vernünftiger Standard für einen persönlichen Reader. Füge der Liste weitere Minuten hinzu, wenn ein paar Feeds ständig posten und du sie schneller sehen willst; jeder Lauf ist auf einer Starter-Box billig, da es HTTP-Requests und XML-Parsing sind, nichts CPU-Gebundenes.

The Fever and Google Reader APIs, for mobile readersDie Fever- und Google-Reader-APIs, für mobile Reader

FreshRSS's own web UI is only half the point — most people read feeds from a phone, and FreshRSS gets there by speaking two older sync protocols instead of inventing its own: the Fever API, originally built for the long-discontinued Fever app, and the Google Reader API (often called GReader), the protocol Google Reader exposed before it shut down in 2013. Neither service exists anymore, but plenty of mobile and desktop RSS clients were built against one of those two APIs years ago and never had a reason to stop supporting it — pointing that same client at your FreshRSS instance instead of the dead service it originally talked to just works.Die eigene Web-UI von FreshRSS ist nur die halbe Wahrheit — die meisten Leute lesen Feeds vom Handy, und FreshRSS erreicht sie, indem es zwei ältere Sync-Protokolle spricht, statt ein eigenes zu erfinden: die Fever-API, ursprünglich für die längst eingestellte Fever-App gebaut, und die Google-Reader-API (oft GReader genannt), das Protokoll, das Google Reader offenlegte, bevor es 2013 abgeschaltet wurde. Keiner der beiden Dienste existiert mehr, aber jede Menge mobiler und Desktop-RSS-Clients wurden vor Jahren gegen eine dieser beiden APIs gebaut und hatten nie einen Grund, die Unterstützung dafür einzustellen — denselben Client stattdessen auf deine FreshRSS-Instanz zeigen zu lassen, statt auf den toten Dienst, mit dem er ursprünglich sprach, funktioniert einfach.

The GReader endpoint is the one most current apps expect first — Reeder, for one, lists FreshRSS directly as a service it can sync against over that API. The Fever endpoint exists for older or more niche clients that were only ever built against the original Fever protocol. Either one is enabled per FreshRSS user account from the Profile page in the web UI, where you also set a separate API password — deliberately not your login password, since it's the credential you're about to type into a third-party app rather than keep in your own head.Den GReader-Endpunkt erwarten die meisten aktuellen Apps zuerst — Reeder etwa führt FreshRSS direkt als Dienst, mit dem es sich über diese API synchronisieren kann. Der Fever-Endpunkt existiert für ältere oder nischigere Clients, die ausschließlich gegen das ursprüngliche Fever-Protokoll gebaut wurden. Beides wird pro FreshRSS-Benutzerkonto auf der Profil-Seite in der Web-UI aktiviert, wo du auch ein separates API-Passwort setzt — bewusst nicht dein Login-Passwort, denn das sind die Zugangsdaten, die du gleich in eine Drittanbieter-App eintippst, statt sie im eigenen Kopf zu behalten.

ExtensionsErweiterungen

The freshrss_extensions volume mounted above is where FreshRSS looks for extensions beyond the ones bundled with the image. Drop an extension's folder into that volume — over docker cp, a bind-mounted path, or however you prefer to get files onto the box — and it shows up for the admin to enable under Configuration → Extensions in the web UI, per user. Keeping extensions on their own named volume, separate from freshrss_data, means a version bump to the FreshRSS image never touches what you've installed there.Im oben eingebundenen Volume freshrss_extensions sucht FreshRSS nach Erweiterungen jenseits der im Image mitgelieferten. Leg den Ordner einer Erweiterung in dieses Volume — über docker cp, einen bind-gemounteten Pfad, oder wie auch immer du Dateien am liebsten auf die Maschine bekommst — und sie taucht für den Admin zum Aktivieren unter Konfiguration → Erweiterungen in der Web-UI auf, pro Nutzer. Erweiterungen auf ihrem eigenen benannten Volume zu halten, getrennt von freshrss_data, bedeutet, dass ein Versionssprung des FreshRSS-Images nie anfasst, was du dort installiert hast.

Backups: the data volume, and the database if it's PostgresBackups: das Daten-Volume, und die Datenbank, falls es Postgres ist

If you're running the SQLite default, the whole state worth protecting is the freshrss_data volume — the database file, your feed subscriptions, and every user's settings and API passwords. Stop the container first, since a plain file copy of a live SQLite database isn't guaranteed consistent mid-write, and the few seconds this takes on a small volume is cheap insurance:Läuft bei dir der SQLite-Standard, ist der gesamte schützenswerte Zustand das Volume freshrss_data — die Datenbankdatei, deine Feed-Abonnements und die Einstellungen und API-Passwörter jedes Nutzers. Stoppe zuerst den Container, denn eine reine Dateikopie einer laufenden SQLite-Datenbank ist mitten im Schreibvorgang nicht garantiert konsistent, und die paar Sekunden, die das bei einem kleinen Volume dauert, sind billige Versicherung:

docker compose stop freshrss
# check hub.docker.com/_/alpine/tags for the current release
docker run --rm \
  -v freshrss_data:/data:ro \
  -v "$PWD":/backup \
  alpine:3.21 tar czf /backup/freshrss-data-$(date +%F).tar.gz -C /data .
docker compose start freshrss

Running Postgres instead means the database itself lives outside that volume, so back it up with pg_dump rather than a filesystem copy:Läuft stattdessen Postgres, lebt die Datenbank selbst außerhalb dieses Volumes, also sicherst du sie mit pg_dump statt mit einer Dateisystemkopie:

docker compose exec -T db pg_dump -U freshrss freshrss > freshrss-db-$(date +%F).sql

Either way, copy the result off the VPS on a schedule. A backup sitting on the same disk as the service it protects doesn't survive that disk failing. back up your VPS covers what off-machine backup means in practice on any provider.So oder so: Kopiere das Ergebnis nach Zeitplan vom VPS herunter. Ein Backup, das auf derselben Platte liegt wie der Dienst, den es schützt, überlebt es nicht, wenn genau diese Platte ausfällt. Backup deines VPS beschreibt, was Backup abseits der Maschine bei jedem Provider in der Praxis bedeutet.

UpdatesUpdates

docker compose pull
docker compose up -d

Bump the pinned tag deliberately rather than tracking latest, and take the backup above first. FreshRSS runs its own database migrations on startup after an upgrade, and a migration you can roll back from is one where the backup came from ten minutes earlier, not from after something looked wrong.Erhöhe den gepinnten Tag bewusst, statt latest zu verfolgen, und mach vorher das Backup von oben. FreshRSS führt beim Start nach einem Upgrade seine eigenen Datenbankmigrationen aus, und eine Migration, von der du zurückrollen kannst, ist eine, bei der das Backup zehn Minuten vorher entstanden ist, nicht eine, die du machst, nachdem schon etwas falsch aussah.

On overnight.hostBei overnight.host

Full disclosure: this is what we sell. A vps-starter (1 vCPU / 1 GiB / 25 GB) refreshes hundreds of feeds comfortably on FreshRSS's default SQLite backend; the reasons to move up are a feed count in the thousands, several people reading concurrently on Postgres, or full-text extraction running on every article, not FreshRSS's own idle footprint.Zur vollen Transparenz: Das ist, was wir verkaufen. Ein vps-starter (1 vCPU / 1 GiB / 25 GB) aktualisiert Hunderte Feeds komfortabel auf FreshRSS' SQLite-Standard-Backend; die Gründe, eine Stufe höher zu steigen, sind eine Feed-Zahl im Tausenderbereich, mehrere Leute, die gleichzeitig auf Postgres lesen, oder Volltextextraktion, die bei jedem Artikel läuft — nicht FreshRSS' eigener Leerlauf-Fußabdruck.

Linux KVM VPS — EUR 4.99 to EUR 59.99 a month, on our own single-tenant bare metal in Dallas, TX and Charlotte, NC. Full hardware virtualisation (KVM), your own kernel, full root. Six tiers, vps-starter to vps-ultra. Starter is 1 vCPU, 1 GiB RAM, 25 GB disk.Linux-KVM-VPS — 4,99 bis 59,99 EUR im Monat, auf unserer eigenen Single-Tenant-Bare-Metal-Hardware in Dallas, TX und Charlotte, NC. Vollständige Hardware-Virtualisierung (KVM), eigener Kernel, volles Root. Sechs Tarife, vps-starter bis vps-ultra. Starter hat 1 vCPU, 1 GiB RAM, 25 GB Speicher.

You order in the shop, pay by card (Stripe) or SEPA bank transfer, and your login details are e-mailed to you once the service is set up. Support is e-mail, run by one person, with no guaranteed response time. All prices are final totals under the German small-business rule (§19 UStG); no VAT is added or shown.Du bestellst im Shop, zahlst per Karte (Stripe) oder SEPA-Überweisung, und deine Zugangsdaten werden dir per E-Mail zugeschickt, sobald der Dienst eingerichtet ist. Support läuft per E-Mail, von einer einzelnen Person betrieben, ohne garantierte Reaktionszeit. Alle Preise sind Endpreise. Gemäß § 19 UStG wird keine Umsatzsteuer ausgewiesen.

Order vps-starter → · Linux KVM VPS overviewvps-starter bestellen → · Übersicht Linux-KVM-VPS

Written by the person who runs overnight.host: a small, honest hosting company on dedicated bare metal — Linux VPS, game servers, web hosting. Live status at up.overnight.host.Geschrieben von der Person, die overnight.host betreibt: ein kleines, ehrliches Hosting-Unternehmen auf dedizierter Bare-Metal-Hardware — Linux-VPS, Gameserver, Webhosting. Live-Status unter up.overnight.host.

Technical guidance is informational. Plans, specifications and final prices are listed in the shop and can be ordered directly; VPS, game server, web hosting, one-click app and automation plans are provisioned automatically after payment. Custom configurations are still arranged by e-mail.Technische Hinweise dienen der Information. Pläne, Spezifikationen und Endpreise stehen im Shop und können direkt bestellt werden; VPS-, Gameserver-, Webhosting-, One-Click-App- und Automatisierungs-Pläne werden nach der Zahlung automatisch bereitgestellt. Sonderkonfigurationen werden weiterhin per E-Mail vereinbart.

FAQFAQ

Do I need Postgres, or is SQLite fine to start with?Brauche ich Postgres, oder reicht SQLite zum Start?

SQLite is fine to start with, and for one reader or a small household it's fine indefinitely — it's the default for a reason. Move to Postgres once several accounts are actively reading and refreshing at the same time, since that's the write-concurrency pattern SQLite wasn't designed to absorb.SQLite reicht zum Start, und für einen einzelnen Leser oder einen kleinen Haushalt reicht es auf unbestimmte Zeit — es ist nicht ohne Grund der Standard. Wechsle zu Postgres, sobald mehrere Accounts gleichzeitig aktiv lesen und aktualisieren, denn das ist genau das Muster an Schreibnebenläufigkeit, für dessen Abfangen SQLite nicht ausgelegt wurde.

Will vps-starter's 1 GiB actually handle hundreds of feeds?Schafft das 1 GiB von vps-starter wirklich Hunderte Feeds?

Yes — refreshing feeds is network and parsing work spread across the minutes CRON_MIN schedules it for, not a sustained CPU or memory load. What changes that math is a feed count in the thousands, several concurrent Postgres users, or full-text extraction running on every article rather than the summary the feed already provides.Ja — Feeds zu aktualisieren ist Netzwerk- und Parsing-Arbeit, verteilt auf die Minuten, für die CRON_MIN sie einplant, keine dauerhafte CPU- oder Speicherlast. Was diese Rechnung ändert, ist eine Feed-Zahl im Tausenderbereich, mehrere gleichzeitige Postgres-Nutzer, oder Volltextextraktion, die bei jedem Artikel läuft, statt bei der Zusammenfassung, die der Feed schon liefert.

What happens if I never set CRON_MIN?Was passiert, wenn ich CRON_MIN nie setze?

Nothing refreshes automatically. FreshRSS won't go fetch new items on its own schedule until you set the variable to a list of minutes, so it's worth setting from the first docker compose up rather than discovering an empty, stale reader later.Nichts aktualisiert sich automatisch. FreshRSS holt keine neuen Einträge nach eigenem Zeitplan, bis du die Variable auf eine Liste von Minuten setzt, also lohnt es sich, sie schon beim ersten docker compose up zu setzen, statt später einen leeren, veralteten Reader zu entdecken.

Which mobile apps actually work with FreshRSS?Welche mobilen Apps funktionieren tatsächlich mit FreshRSS?

Any client built against the Fever API or the Google Reader (GReader) API, since those are the two interfaces FreshRSS exposes rather than a protocol of its own. Reeder is a well-known example that talks to FreshRSS over GReader directly; older or more niche clients built only against Fever use that endpoint instead. Check the app's own settings for a "FreshRSS" or "GReader" server option before assuming it isn't supported.Jeder Client, der gegen die Fever-API oder die Google-Reader-API (GReader) gebaut wurde, denn das sind die beiden Schnittstellen, die FreshRSS anbietet, statt eines eigenen Protokolls. Reeder ist ein bekanntes Beispiel, das direkt über GReader mit FreshRSS spricht; ältere oder nischigere Clients, die nur gegen Fever gebaut wurden, nutzen stattdessen diesen Endpunkt. Prüfe in den eigenen Einstellungen der App nach einer „FreshRSS“- oder „GReader“-Serveroption, bevor du annimmst, sie werde nicht unterstützt.

Can I lose my read state and subscriptions if something goes wrong?Kann ich meinen Lesestatus und meine Abonnements verlieren, wenn etwas schiefgeht?

Yes, if you skip the backup and something happens to the freshrss_data volume — or the Postgres database, if that's what you're running — every subscription, folder, and read/unread flag lives there. The articles themselves aren't the risk; your own list and history are, which is why the backup step above is worth doing on day one, not after the first scare.Ja, wenn du das Backup auslässt und dem Volume freshrss_data etwas zustößt — oder der Postgres-Datenbank, falls du die betreibst — dort liegen jedes Abonnement, jeder Ordner und jede Gelesen/Ungelesen-Markierung. Die Artikel selbst sind nicht das Risiko; deine eigene Liste und Historie sind es, weshalb sich der Backup-Schritt von oben schon am ersten Tag lohnt, nicht erst nach dem ersten Schreck.

Ready to order?Bereit zu bestellen?

Prices are final totals; no VAT is shown (§19 UStG). Need something the shop does not list? Email us for a written offer.Alle Preise sind Endpreise ohne ausgewiesene USt. (§19 UStG). Du brauchst etwas, das nicht im Shop steht? Schreib uns für ein schriftliches Angebot.

Order now →Jetzt bestellen → Request a custom configIndividuelle Konfiguration anfragen