FreshRSS installed on Alpine Linux, with auto-generated configuration.
50K+
Docker Hub - Quay.io - bfren ecosystem
FreshRSS - a self-hosted RSS and Atom feed reader - installed and set up automatically.
It is Nginx + PHP (PHP 8.5) with:
It is designed to run behind a reverse proxy that handles SSL, such as Caddy Proxy.
With a MariaDB database (e.g. bfren/mariadb):
services:
freshrss:
image: quay.io/bfren/freshrss:5.2
environment:
- BF_FR_BASE_URL=https://rss.example.com
- BF_FR_USER_NAME=ben
- BF_FR_USER_PASS=change-me
- BF_FR_DB_HOST=db
- BF_FR_DB_USER=freshrss
- BF_FR_DB_PASS=change-me-too
ports:
- "8080:80"
volumes:
- ./v/data:/data
Or, without a database server, set BF_FR_DB_TYPE=sqlite (the database is then kept in /data).
On first start FreshRSS is installed and your user created. Open the site and log in.
Images are published to Docker Hub (bfren/freshrss) and Quay.io (quay.io/bfren/freshrss) for linux/amd64, linux/arm/v7 and linux/arm64. There is one build, on PHP 8.5.
| Tag | Example | Use when |
|---|---|---|
latest | You always want the newest image | |
MAJOR | 5 | You want updates, but not breaking changes |
MINOR | 5.2 | You want fixes only - recommended |
VERSION | 5.2.0 | You want to pin this image exactly |
freshrssA, freshrssA.B | freshrss1, freshrss1.30 | You want to stay on a FreshRSS version |
freshrssA.B.C | freshrss1.30.1 | You want an exact FreshRSS release |
freshrssA-VERSION, freshrssA.B-VERSION | freshrss1.30-5.2.0 | You want to pin both |
| Port | Purpose |
|---|---|
80 | HTTP - put a reverse proxy in front of it for SSL. |
| Volume | Purpose |
|---|---|
/data | FreshRSS's data - config.php, users, caches, and the database if you use SQLite. Back it up. |
These are used only on first start, to install FreshRSS. After that, change settings in FreshRSS itself.
| Variable | Values | Description | Default |
|---|---|---|---|
BF_FR_BASE_URL | URL | Required. The address you use to open FreshRSS, e.g. https://rss.example.com. | blank |
BF_FR_USER_NAME | text | Required. The first user's name. | blank |
BF_FR_USER_PASS | text | Required. The first user's password. | blank |
BF_FR_DB_TYPE | mysql, pgsql, sqlite | Database type. | mysql |
BF_FR_DB_HOST | host name | Database server - not needed for SQLite. | blank |
BF_FR_DB_USER | text | Database user - not needed for SQLite. | blank |
BF_FR_DB_PASS | text | Database password - not needed for SQLite. | blank |
BF_FR_DB_NAME | text | Database name. | freshrss |
BF_FR_DB_PREFIX | text | Table prefix - an underscore is added (e.g. fr_). | fr |
BF_FR_LANGUAGE | e.g. en, fr, de | Default language. | en |
BF_FR_ENVIRONMENT | production, development | development gives more detailed logging. | production |
Nginx + PHP adds the PHP settings, and Nginx the nginx ones.
When the container starts, Nginx + PHP sets up nginx and PHP, then this image:
p (public) folder instead of /www/public, and links FreshRSS's data folder to /data/data/config.php exists, treats FreshRSS as installed and does nothing moreIf the installation fails, the container stops - check docker logs for the reason.
Every 15 minutes, cron runs fr-actualize, which runs FreshRSS's actualize_script.php to fetch new articles for every user. You can run it yourself:
docker exec <container> fr-actualize
./test.nu # builds the image and runs /test
/test runs this image's tests alongside the base images' tests, and fails if tests don't execute. They check how the first user's name and password are read (including the older BF_FR_USER / BF_FR_PASS names), that installation is recorded, that FreshRSS matches the version in the build log, the required PHP extensions are loaded, and nginx accepts the configuration.
The installation failed. The usual causes are a missing BF_FR_BASE_URL, BF_FR_USER_NAME or BF_FR_USER_PASS, or a database that can't be reached - check docker logs and fix the variables. If /data/config.php was created before it failed, empty /data (and the database) before starting again - otherwise FreshRSS will be treated as installed.
The variables are only used on first start. Change the setting in FreshRSS instead, or (to start completely afresh) empty /data and the database.
Yes - set BF_FR_DB_TYPE=sqlite before the first start. The database is then kept in /data.
Pull a newer tag and recreate the container. FreshRSS's own updater is turned off, because FreshRSS is read-only inside the image.
Copyright (c) 2021-2026 bfren (unless otherwise stated)
Content type
Image
Digest
sha256:b0be1aed7…
Size
55.9 MB
Last updated
6 minutes ago
docker pull bfren/freshrss