Goals

The operation of a local FreshRSS server is actually quite simple and once this part is complete, a complete FreshRSS server can be accessed on the local network. Basically it is a classic web server, PHP application.

NEW: For the very impatient I have a "console only" section. There are only commands, no explanations.

Last update:

  • 18.01.2026: Removing the external directories. This is explained here, but it is only for advanced administrators.
  • 30.11.2024: Revision. Removal of TrueNAS and rewrite to pure FreeBSD. Jails with Bastille
  • 07.09.2024: Initial document

Requirements

Generally, such service should be set up in its own environment. This makes not only security, but also maintenance much easier. Jails can be backed up relatively easily and only the packages that are absolutely necessary are installed.

Diagram

The setup including all optional possibilities looks like this:

                   ┌────────────────────────┐
                   │  FreeBSD               │
                   │ ┌────────────────────┐ │
                   │ │ bastille/jails/web │ │
                   │ │   freshrss (php)   │ │
                   │ │     ▲              │ │
LAN: 0.0.0.0:443 ──┼─┼─► nginx            │ │
                   │ └────────────────────┘ │
                   └────────────────────────┘

Create jail

You need your own jail. Here we take rss as jail name.

Set up jail

Either use bastile console web to start a console in the created jail, or log in via SSH (if activated) with ssh USERNAME@IP or ssh USERNAME@HOSTNAME to then gain root rights with su.

Customize package source

Package sources should be customized, see separate article!

Nginx

Nginx and PHP must already be installed, see separate article!

Create configuration

The Nginx configuration is created in a separate file for better administration:

  • /usr/local/etc/nginx/conf.d/freshrss.conf = FreshRSS configuration for Nginx
cat > /usr/local/etc/nginx/conf.d/freshrss.conf <<'EOF'
server {
 listen 443 ssl;
 http2 on;
 root /usr/local/www/FreshRSS;
 index index.php index.html;
 location ~ \.php$ {
  include fastcgi_params;
  set $path_info $fastcgi_path_info;
  fastcgi_split_path_info ^(/.+\.php)(/.*)?$;
  fastcgi_param SCRIPT_FILENAME $request_filename;
  fastcgi_param PATH_INFO $path_info;
  fastcgi_pass php-handler;
 }
}
EOF

FreshRSS

Install packages & activate services

Now update the package source with pkg update and install further PHP modules required by FreshRSS: pkg install -y git php84-curl php84-fileinfo php84-zip php84-intl php84-mbstring

Customize path

Optional: Set symlink to point to the complete FreshRSS directory in /mnt/data/: ln -sf /mnt/data/FreshRSS /usr/local/www/FreshRSS

Installation

cd /usr/local/www/FreshRSS
git init && git remote add origin https://github.com/FreshRSS/FreshRSS.git && git pull origin edge
chown -R www:www /usr/local/www/FreshRSS/

Start services

We have now reached the end of the preparations and all services can now be started with service php_fpm restart && service nginx restart.

The "FreshRSS" website can now be opened.
The installation wizard is run through the first time. This is largely self-explanatory, it is only important to select SQLITE as the database.

Console

Voilá