This is an old revision of the document!
Table of Contents
NewsBlur Installation on Ubuntu Server
This article documents the working NewsBlur installation on the Ubuntu server.
It intentionally describes the final working configuration, rather than every failed command or troubleshooting attempt made during the original installation.
NewsBlur is running as a collection of Docker containers. The NewsBlur application/source files live on the server's internal Linux filesystem, while the large persistent database and search-engine data directories are stored on the external SSD mounted at:
/mnt/media8
Installation Layout
The main NewsBlur working directory is:
/home/mike/docker/newsblur
or, when logged in as mike:
~/docker/newsblur
The NewsBlur Docker configuration bind-mounts this directory into the applicable containers as:
/srv/newsblur
This is important because changes made to files under:
/srv/newsblur
inside the NewsBlur containers are actually changes to:
/home/mike/docker/newsblur
on the host.
For example:
/srv/newsblur/utils/feed_fetcher.py
inside newsblur_web corresponds to:
~/docker/newsblur/utils/feed_fetcher.py
on the Ubuntu host.
This also means local source-code modifications generally survive Docker container recreation.
However, a future Git update to the NewsBlur source can overwrite or conflict with locally modified files.
External SSD Storage
The NewsBlur source code remains under:
~/docker/newsblur
The persistent database/search data is stored on the external SSD mounted at:
/mnt/media8
NewsBlur-specific persistent data is kept under:
/mnt/media8/docker/newsblur/
The major directories are:
/mnt/media8/docker/newsblur/postgres /mnt/media8/docker/newsblur/redis /mnt/media8/docker/newsblur/mongo /mnt/media8/docker/newsblur/elasticsearch
This keeps large and frequently changing application data off the server's main Linux filesystem.
It also means that /mnt/media8 must be mounted before NewsBlur is expected to operate normally.
Important Server-Specific Mount Policy
External/data drives on this server are configured so that a missing or failed external drive does not prevent Ubuntu from booting.
When configuring the mount in /etc/fstab, use the server's normal nofail policy.
The general philosophy is:
* Ubuntu must remain bootable even if an external drive fails. * Docker may subsequently have services that fail because their data is unavailable. * A failed Docker service is preferable to a server that cannot boot.
Do not remove nofail from external-drive mounts without a specific reason.
NewsBlur Data Directory Permissions
During installation, the persistent NewsBlur directories required ownership matching the users used inside the respective containers.
The working ownership configuration used during setup was:
sudo chown -R 999:999 /mnt/media8/docker/newsblur/postgres sudo chown -R 999:999 /mnt/media8/docker/newsblur/redis sudo chown -R 999:999 /mnt/media8/docker/newsblur/mongo sudo chown -R 1000:0 /mnt/media8/docker/newsblur/elasticsearch
The directories were also restricted with:
sudo chmod 750 /mnt/media8/docker/newsblur/postgres sudo chmod 750 /mnt/media8/docker/newsblur/redis sudo chmod 750 /mnt/media8/docker/newsblur/mongo sudo chmod 750 /mnt/media8/docker/newsblur/elasticsearch
These permissions are intentionally different from the normal shared-media configuration used elsewhere on the server.
Do not automatically change these NewsBlur application-data directories to mike:media or 2775 simply because that convention is used for media storage.
The database containers expect their own UID/GID ownership.
Main Docker Services
The NewsBlur Docker Compose installation contains several cooperating services.
Important containers include:
* newsblur_web — main NewsBlur Python/Django application
* newsblur_celery — background jobs and scheduled feed fetching
* newsblur_node — NewsBlur Node service
* newsblur_nginx — internal Nginx frontend
* newsblur_db_postgres — PostgreSQL database
* newsblur_db_redis — Redis
* newsblur_db_mongo — MongoDB
* newsblur_db_elasticsearch — Elasticsearch
* newsblur_imageproxy — image proxy
* newsblur_mcp — NewsBlur MCP service
* HAProxy — internal NewsBlur proxy/load-balancing component
Most services use:
restart: unless-stopped
This allows the NewsBlur stack to return automatically after a normal server or Docker restart.
Important Bind Mounts
The main NewsBlur source tree is mounted into several containers.
For example:
/home/mike/docker/newsblur -> /srv/newsblur
This is used by at least the web application and the Celery/background-worker infrastructure.
Consequently, when modifying NewsBlur Python code, restarting only newsblur_web may not be sufficient.
If the changed code is also used for background jobs or feed fetching, restart Celery as well:
docker restart newsblur_web docker restart newsblur_celery
Local Service Ports
Several NewsBlur services publish ports only to 127.0.0.1.
Examples from the working configuration include:
newsblur_web 127.0.0.1:8000 newsblur_nginx 127.0.0.1:8181 newsblur_node 127.0.0.1:8008 imageproxy 127.0.0.1:8088 PostgreSQL 127.0.0.1:5434 Redis 127.0.0.1:6579 MongoDB 127.0.0.1:29019 Elasticsearch 127.0.0.1:9200 / 9300
HAProxy exposes the NewsBlur HTTP/HTTPS frontend using the ports configured in the Compose stack.
Binding most internal services to 127.0.0.1 prevents the database and internal application services from being directly exposed to the LAN or Internet.
Starting NewsBlur
Go to the NewsBlur directory:
cd ~/docker/newsblur
Start or update the existing containers with:
docker compose start
Check their status with:
docker compose ps
Restarting NewsBlur
A single service can be restarted without bringing down the entire installation.
For example:
docker restart newsblur_web
For changes affecting background feed processing:
docker restart newsblur_celery
To restart both:
docker restart newsblur_web newsblur_celery
Viewing Logs
Standard Docker logs can be viewed with:
docker logs newsblur_web
or:
docker logs newsblur_celery
Follow a log live with:
docker logs -f newsblur_web
NewsBlur also maintains its own application log within the bind-mounted source tree:
~/docker/newsblur/logs/newsblur.log
This can be useful for diagnosing individual feed failures.
For example:
grep -i "failed" ~/docker/newsblur/logs/newsblur.log
Inspecting the Actual Docker Configuration
Because NewsBlur has many services and mounts, docker compose config is useful for seeing the final configuration after Compose processing.
From:
cd ~/docker/newsblur
run:
docker compose config
To inspect the mounts of an individual container:
docker inspect newsblur_web --format '{{range .Mounts}}{{println .Type "|" .Source "|" .Destination}}{{end}}'
For this installation, this confirms:
bind | /home/mike/docker/newsblur | /srv/newsblur
Updating NewsBlur
Because this installation uses the NewsBlur source repository directly, remember that local source modifications can appear in Git.
Before updating, check for local changes:
cd ~/docker/newsblur git status git diff
A git pull may refuse to proceed or create a conflict if upstream NewsBlur modifies a file that has also been modified locally.
Do not blindly discard local changes before determining what they are.
Next, check whether upstream NewsBlur has changed:
git fetch git status
git fetch checks for upstream changes without modifying the local NewsBlur files.
If Git reports that the local branch is behind the upstream branch, and any local modifications are understood and safe, update the source with:
git pull
Then update the Docker images and containers:
docker compose pull docker compose up -d docker compose ps
Only prune unused Docker images when desired:
docker image prune
Backup Considerations
The NewsBlur installation is split between two important locations.
Application/configuration/source:
/home/mike/docker/newsblur
Persistent database/search data:
/mnt/media8/docker/newsblur
A complete NewsBlur backup strategy therefore needs to account for both locations.
Backing up only ~/docker/newsblur does not back up the PostgreSQL, Redis, MongoDB, or Elasticsearch data stored on the external SSD.
Likewise, backing up only /mnt/media8/docker/newsblur does not preserve the Compose configuration and locally modified NewsBlur source tree.
Known Local Modification
As of September 2026, this NewsBlur installation contains a small local modification that allows official YouTube RSS feeds to bypass NewsBlur's YouTube Data API fetcher.
This was necessary because valid YouTube RSS feeds were returning:
YouTube fetch failed (404)
inside NewsBlur even though the same RSS URLs worked normally in a browser.
See:
