Skip to content

Buying guide

Docker Home Server: Choose Hardware and Run Your First Service

Start a Docker home server on an existing PC or mini PC. Run FreshRSS with persistent storage, private access, and a backup, restore and update rollback plan.

By thisPING EditorialUpdated November 3, 20267 min read1 pick

On this page · Our picks at a glance

Our picks at a glance

  1. UGREEN NASync DXP2800 2-Bay NAS
    1

    UGREEN DXP2800

    Choose for: Storage-first alternative or separate backup target

    Limit: Diskless: plan compatible drives separately; UGOS is a different setup path

For your first Docker home server, use a suitable computer you already own and run FreshRSS with SQLite, persistent storage and a rehearsed restore. If you need a dedicated host, our pick is the Beelink EQ14 N150, 16GB/500GB, dual-2.5GbE kit, subject to its pre-order timing; choose the UGREEN NASync DXP2800 when shared storage is the main job.

Official documentation checked November 2, 2026. These are research-based recommendations; no performance measurements are claimed.

Quick picks: buy for the job

Compare specifications and all conditions

Existing computer

Choose it for
Our default: learn before buying
Relevant hardware
Check its own RAM, SSD and Ethernet specifications
Configuration trap
Meet the supported-OS requirements below

Beelink EQ14 N150

Choose it for
Dedicated starter host
Relevant hardware
16GB DDR4, 500GB SATA SSD, dual 2.5GbE
Configuration trap
Selected kit is a pre-order; memory ceiling is 16GB

UGREEN NASync DXP2800

Choose it for
Storage-first alternative or separate backup target
Relevant hardware
Intel N100; two SATA bays and two M.2 NVMe slots; 8 GB DDR5, maximum 16 GB; 2.5GbE
Configuration trap
Diskless: plan compatible drives separately; UGOS is a different setup path

Minisforum MS-A2 9955HX barebone

Choose it for
Expansion-led homelab
Relevant hardware
Up to 96GB DDR5; dual 10G SFP+ and dual 2.5GbE RJ45
Configuration trap
Barebone includes no RAM, SSD or OS
Full comparison table

Swipe to compare. Row labels stay visible.

PickChoose it forRelevant hardwareConfiguration trap
Existing computerOur default: learn before buyingCheck its own RAM, SSD and Ethernet specificationsMeet the supported-OS requirements below
Beelink EQ14 N150Dedicated starter host16GB DDR4, 500GB SATA SSD, dual 2.5GbESelected kit is a pre-order; memory ceiling is 16GB
UGREEN NASync DXP2800Storage-first alternative or separate backup targetIntel N100; two SATA bays and two M.2 NVMe slots; 8 GB DDR5, maximum 16 GB; 2.5GbEDiskless: plan compatible drives separately; UGOS is a different setup path
Minisforum MS-A2 9955HX bareboneExpansion-led homelabUp to 96GB DDR5; dual 10G SFP+ and dual 2.5GbE RJ45Barebone includes no RAM, SSD or OS
PickChoose it forRelevant hardwareConfiguration trap
Existing computerOur default: learn before buyingCheck its own RAM, SSD and Ethernet specificationsMeet the supported-OS requirements below
Beelink EQ14 N150Dedicated starter host16GB DDR4, 500GB SATA SSD, dual 2.5GbESelected kit is a pre-order; memory ceiling is 16GB
UGREEN NASync DXP2800Storage-first alternative or separate backup targetIntel N100; two SATA bays and two M.2 NVMe slots; 8 GB DDR5, maximum 16 GB; 2.5GbEDiskless: plan compatible drives separately; UGOS is a different setup path
Minisforum MS-A2 9955HX bareboneExpansion-led homelabUp to 96GB DDR5; dual 10G SFP+ and dual 2.5GbE RJ45Barebone includes no RAM, SSD or OS

The makers' linked specification tables supply these figures. For the broader platform decision, use our home-server guide.

Choose the exact 16GB DDR4 / 500GB / dual-2.5G selection and your regional power option. Beelink distinguishes the supplied SATA III SSD from the PCIe-capable M.2 slots; slot shape does not establish the installed SSD's interface. Its page lists Windows 11 Home, so Ubuntu installation and hardware checks are separate work. Confirm delivery timing before scheduling a migration. Check configuration at Beelink.

Best storage-first alternative: UGREEN NASync DXP2800

UGREEN NASync DXP2800 2-Bay NAS

UGREEN

UGREEN DXP2800

A two-bay NAS with an Intel N100, 8 GB DDR5, a 2.5GbE port, two M.2 NVMe slots and 4K HDMI output.

Check package and model options

  • 2.5 Gbps port
  • 2 bays

Choose this for shared files or as a separate destination for the backup archive below. The DXP2800 has an Intel N100, 8 GB DDR5 expandable to 16 GB, two SATA bays, two M.2 NVMe slots and a 2.5GbE port. It is sold diskless, so plan compatible drives separately. This Ubuntu walkthrough targets a PC; follow UGREEN's setup instructions for its UGOS operating system instead of applying the Ubuntu commands to the NAS. Compare alternatives in our NAS buying guide.

Check specifications and setup at UGREEN.

Best when expansion is already required: Minisforum MS-A2

The Ryzen 9 9955HX barebone is our conditional upgrade pick for its memory ceiling and networking. Add RAM, an SSD and an OS; distinguish it from the configured bundles and other processors on the same page. The advertised 10G connections are SFP+, so plan matching link equipment. We would not buy it just for this walkthrough. Check the exact kit at Minisforum.

How we choose

We use maker specifications and official OS, Docker and application documentation. Our declared workload is a personal FreshRSS feed reader using SQLite, with no added extensions or public publishing. This is a sizing exercise, not a promise about container counts, media streams, Linux certification or idle power. FreshRSS supplies its own Docker image and describes SQLite as the easiest database option. Full method: How we choose.

Before installation: OS, storage and addressing

This recipe chooses Ubuntu Server 24.04 LTS on amd64. Docker currently lists Ubuntu 26.10, 26.04 LTS, 24.04 LTS and 22.04 LTS; Ubuntu derivatives are not officially supported. Canonical's 24.04 amd64 requirements distinguish the 1.5 GB RAM / 5 GB storage ISO minimum from its suggested 3 GB RAM / 25 GB storage or more. Those are OS figures: leave additional room for images, application data and backups.

Use local SSD storage for this exercise. Check the actual host against its manual, preserve existing files before changing OS, and confirm Ethernet works. Record its LAN address; if your router supports address reservations, reserve that host's address there. TP-Link's reservation example illustrates the IP/MAC relationship; use your own router's instructions.

  1. Choose the workload

    Start with the personal feed reader described above.

  2. Check the host

    Confirm supported OS, memory, storage and Ethernet before ordering hardware.

  3. Plan recovery

    Identify a separate backup destination before starting the service.

Follow Docker's current Ubuntu apt-repository installation, including its conflicting-package check, signing key and repository setup. Install its Engine and Compose plugin packages, then verify:

sudo docker run hello-world
sudo docker version
sudo docker compose version

Require Engine 28.0.0 or newer for this recipe: Docker documents a localhost-publishing exposure issue in older releases. Keep using sudo here; Docker warns that membership of the docker group grants root-level privileges.

Bring FreshRSS online with persistent storage

Run these on the server, in a new project directory. Stop if any command fails. The official image documentation defines the paths, timezone and refresh setting used below.

mkdir -p ~/services/freshrss
cd ~/services/freshrss
mkdir data extensions
sudo docker pull freshrss/freshrss:latest
fr_image=$(sudo docker image inspect --format '{{index .RepoDigests 0}}' freshrss/freshrss:latest)
printf 'FRESHRSS_IMAGE=%s\n' "$fr_image" > .env

FreshRSS's latest means its latest versioned release; edge is rolling development, and -alpine selects a different base image. We select the default Debian variant, then record its immutable image digest in .env. The official image supports linux/amd64, linux/arm64 and linux/arm/v7; an Arm host still needs its own supported OS/Docker check.

Save this as compose.yaml in that directory:

services:
  freshrss:
    image: ${FRESHRSS_IMAGE:?set FRESHRSS_IMAGE in .env}
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    environment:
      TZ: UTC
      CRON_MIN: "1,31"
      TRUSTED_PROXY: "0"
    volumes:
      - ./data:/var/www/FreshRSS/data
      - ./extensions:/var/www/FreshRSS/extensions
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Here, host port 8080 maps to container port 80, bound only to server loopback. CRON_MIN schedules refreshes at minutes 1 and 31; proxy-header trust is disabled. Docker's logging options rotate logs at the configured 10m threshold, retaining at most 3 files.

The bind mounts keep data on the host; relative paths resolve beside the Compose file. FreshRSS stores configuration and SQLite databases in data; extensions have their own directory. Keep these paths consistent. If using a separate disk later, verify it is mounted before startup rather than accepting an empty directory at the same path.

sudo docker compose config
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs

Open it privately, then prove persistence

Enable Ubuntu's OpenSSH server if needed. From your client computer, replace youruser@SERVER_LAN_IP with your server login and recorded address:

ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 youruser@SERVER_LAN_IP

Keep that terminal open and browse to http://127.0.0.1:8080 on the client. OpenSSH's -L forwarding carries the connection through the secure channel to server loopback. Choose SQLite and Form Authentication in FreshRSS's installer, set a unique password, then add a feed and mark an article as a favorite.

  • Yes: Expected: the signed-in reader opens through the SSH tunnel
  • Yes: Expected: your feed and favorite remain after a container restart
  • No: Unexpected: the web port opens directly at the server's LAN address

Run sudo docker compose restart freshrss on the server, then verify those saved items. Check sudo docker stats --no-stream during a refresh and check host free space before expanding the workload. Reboot the host during a maintenance window and reconnect: Docker starts on boot by default on Ubuntu, and this service uses unless-stopped. A manually stopped service stays stopped until you start it again.

If access fails, check compose ps and logs first, then the SSH login, tunnel and local port availability. If FreshRSS offers a fresh installer after previously working, stop and inspect the mount paths before initializing anything. If data is unwritable, inspect directory ownership and FreshRSS's startup permission messages; avoid blanket world-write permissions.

Back up, restore and rehearse an update rollback

FreshRSS's backup instructions require data, recommend extensions, and include SQLite in the data copy. External databases need separate backups; this recipe deliberately avoids one. Stopping the container stops the web server and its refresh job during the copy.

From the project directory, use fresh archive and holding-directory names for each rehearsal. Run each command only after the preceding one succeeds:

sudo docker compose stop
sudo tar -czpf ../freshrss-baseline.tgz compose.yaml .env data extensions
sudo tar -tzf ../freshrss-baseline.tgz
sudo mv data data.before-restore
sudo mv extensions extensions.before-restore
sudo tar -xzpf ../freshrss-baseline.tgz
sudo docker compose up -d --force-recreate

The original directories remain available. Sign in, find the feed and favorite, and refresh successfully; listing an archive alone is not a restore rehearsal. Copy the archive to a separate device or protected offsite destination and verify that copy too. Protect it as private account data. It contains configuration and data, not image layers: retain the previous image locally through updates.

Update procedure: read the FreshRSS release notes, stop the service, and make a new archive named freshrss-before-update.tgz using the same files. Pull freshrss/freshrss:latest, repeat the digest-to-.env commands above, and run sudo docker compose up -d. Verify login, feed refresh and saved items before accepting the update. If a download fails, start the unchanged old configuration again.

Rollback procedure: stop the service; move its current data and extensions to new holding directories. Extract ../freshrss-before-update.tgz from the project directory, restoring compose.yaml, .env and both data directories together, then run sudo docker compose up -d --force-recreate. Repeat the acceptance checks. Restoring the old data with the old image avoids assuming database changes are backward-compatible; changes made since the backup will be absent.

Repeat backups after configuration changes and before updates, and rehearse restores periodically. For hardware continuity and shutdown planning, use our router/NAS UPS guide.

Verdict

Start on the existing computer if it passes the OS and workload checks. Choose the EQ14 for a dedicated starter, the DXP2800 for storage, and the MS-A2 only when its expansion solves a defined need. Your finish line is a private service whose saved state survives restart and restore.

Frequently asked questions

Can I use an old PC as a Docker home server?

Yes, if its architecture, memory, storage and network adapter suit a currently supported OS. This walkthrough chooses Ubuntu Server 24.04 LTS on amd64. Canonical suggests at least 3 GB RAM and 25 GB storage for that OS, before application headroom. Check your PC's own manual and try the declared FreshRSS workload before buying replacement hardware.

How much RAM does a Docker home server need?

There is no container-count formula here. Canonical's suggested minimum for Ubuntu Server 24.04 LTS on amd64 is 3 GB RAM; that is an OS baseline, not a FreshRSS capacity guarantee. Leave headroom, observe memory with docker stats during feed refreshes, and check free disk space as data grows. Our EQ14 hardware selection includes 16GB RAM, but the walkthrough does not require buying it.

Can I access this Docker service outside my home?

This setup uses a loopback port and an SSH tunnel from a computer that can already reach the server. It does not configure remote access through your router. FreshRSS recommends an HTTPS reverse proxy for production exposure; follow its deployment and access-control documentation before adding that separate project. Keep Form Authentication enabled and leave the internal-host allowlist at its default.

Related guides