DriversRecommendedOutdated drivers can make a good PC feel brokenScan driver issues before chasing fixes manually.Scan NowHalloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan Now×
Skip to content
VGSources
Blog

How to Self-Host Tiny Tiny RSS With Nginx on a VPS

A Docker-first guide to running Tiny Tiny RSS behind Nginx on a VPS, including subdomain and subpath routing, HTTPS, persistence, upgrades, and fixes for redirects, 502 errors, and missing assets.
Length11 min Posted Quest giverVGSources Team

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The most reliable setup is the official Docker Compose stack for Tiny Tiny RSS (TT-RSS), bound to localhost and published through an Nginx reverse proxy on your VPS. Set TTRSS_SELF_URL_PATH to the exact public HTTPS URL, forward X-Forwarded-Proto, keep PostgreSQL and application volumes persistent, and take a tested backup before upgrades.

What you are building

TT-RSS is a free, GPLv3-licensed, self-hosted web reader and RSS/Atom aggregator. The project’s recommended deployment method is Docker. Its current Compose example separates the application into PostgreSQL, a TT-RSS app/FPM service, an updater service, and a web-Nginx service. Your VPS’s host Nginx terminates public HTTP/HTTPS traffic and forwards requests to the web container over a loopback port.

As an Amazon Associate I earn from qualifying purchases.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The resulting request path is:

  • Visitor’s browser connects to https://rss.example.com or https://example.com/tt-rss/.
  • Host Nginx handles DNS-facing HTTP and HTTPS, certificates, and proxy headers.
  • The TT-RSS web-Nginx container listens on a port bound only to 127.0.0.1.
  • The app, updater, and PostgreSQL communicate on Docker’s private network.
  • Named or host-mounted volumes retain the database and application data when containers are recreated.

Do not publish the container directly on a public interface when host Nginx is available. A loopback binding such as 127.0.0.1:8280 leaves only the host proxy exposed to the Internet.

Prerequisites and choices

VPS requirements

  • A current Linux distribution with a supported Docker Engine and Docker Compose plugin.
  • A hostname, for example rss.example.com, with an A or AAAA record pointing to the VPS.
  • Inbound TCP access for ports 80 and 443. Keep the TT-RSS published port private to the host.
  • Administrative access to install packages, edit Nginx configuration, and run Docker commands.
  • A modern browser for the TT-RSS web interface.

Use the current TT-RSS installation instructions to obtain its official Compose file and image tags. Image names, tags, and supported versions change as the project develops; copying an old tag from an unrelated tutorial can produce an unsupported stack.

#1 Best Overall
Sale
Gaoye Blue Light Blocking Glasses
  • BLUE LIGHT BLOCKING GLASSES: Our blue light glasses for women boast UV400 protection, blocking harmful blue rays from computer screens. With these bluelight glasses women, you can enjoy gaming, reading, or watching TV with no worries of eye strain.
  • EYE RELIEF: Our blue light glasses are engineered to reduce blurry vision or strain caused by prolonged screen time. These womens blue light glasses aid in better sleep by preventing blue light from disrupting your natural sleep cycle, helping you fall asleep faster and enjoy a more restful night's sleep, making them the perfect christmas present.
  • COMFORTABLE: Crafted from durable material, our trendy blue light glasses for woman or blue light glasses men ensure long-lasting comfort. The high-transmittance lenses accessories, gamer gifts for men, help keep your eyes relaxed. Perfect stocking stuffers, gifts for gamers men, christmas gifts for men, halloween costumes.
  • LIGHTWEIGHT: These clear blue light glasses feature a lightweight frame, meaning they’ll stay comfy for long-term wear. Perfect as blue blockers glasses for women or mens blue light glasses, these non-prescription fake glasses for men can be worn throughout the day. The blue light blocking glasses women feature polycarbonate HD lenses, which are anti-reflective and restore true color.
  • WORRY-FREE PURCHASE: If you experience any issues, our support team is ready to assist you quickly. These are the perfect costume glasses for cosplay dressing up.

Subpath or dedicated hostname?

Deployment Public URL Advantages Risks and extra work
Subpath https://example.com/tt-rss/ Uses an existing domain and certificate; no additional DNS record. The Nginx location and upstream URI must agree exactly. Existing PHP or application locations can intercept the path unless the TT-RSS location has sufficient priority.
Dedicated subdomain https://rss.example.com/ Simple root-relative URLs and a clean separation from other sites on the server. Requires a DNS record and a matching Nginx server block and certificate.

Either design works. A dedicated hostname usually has fewer path-rewrite problems. A subpath is appropriate when your main domain and certificate are already managed on the VPS, but every setting must retain the /tt-rss prefix.

Install Docker and prepare a private deployment directory

Install Docker Engine and the Compose plugin using your Linux distribution’s current vendor instructions. Verify both commands before creating the application:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
docker --version
docker compose version

Create a directory that is not served by Nginx and restrict access to it. The directory will contain the Compose file and the environment file with database credentials.

sudo mkdir -p /opt/tt-rss
sudo chown "$USER":"$USER" /opt/tt-rss
cd /opt/tt-rss
chmod 700 /opt/tt-rss

Place the current official TT-RSS Compose file in this directory. The example stack contains four functional services:

  • PostgreSQL: stores accounts, feed metadata, articles, and settings.
  • Application/FPM: runs TT-RSS’s PHP application code.
  • Updater: performs scheduled feed fetching.
  • Web Nginx: serves the application and communicates with the app service.

The project also documents an optional backups service. Enable it only after understanding where it writes backups and how you will copy those backups off the VPS.

Configure the environment file

TT-RSS’s Docker setup prefers environment-based configuration. Edit the .env file supplied with the current Compose example and set the database values, loopback binding, and public URL. A subpath deployment has the following critical values:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Windex Gaming Cleaning Wipes, Pre-Moistened Wipes to Instantly Clean all Gaming Gear and Electronics, Resealable Packaging for a Freshness Lock, 25 count (Pack of 1)
  • WINDEX GAMING WIPES: effortlessly clean all your gaming gear and gaming electronics in one easy step with our new Windex Gaming Wipes
  • AMMONIA FREE: our ammonia-free formula is safe to use on all of your favorite gaming equipment like consoles, headsets, controllers, screens, keyboards, and more
  • PRE-MOISTENED WIPES: each wipe instantly removes dust, dirt, and stubborn smudges and fingerprints leaving a streak-free shine
  • ANTI-STATIC: great for cleaning and wiping down your gaming gear and electronics leaving behind no visible residue
  • COMPACT RESEALABLE PACKAGE: store your pack of Windex Gaming Wipes anywhere in your home for whenever a quick and easy wipedown is needed
HTTP_PORT=127.0.0.1:8280
TTRSS_SELF_URL_PATH=https://example.com/tt-rss

For a dedicated hostname, use the hostname at the root instead:

HTTP_PORT=127.0.0.1:8280
TTRSS_SELF_URL_PATH=https://rss.example.com

Set a long, unique PostgreSQL password and the database name, user, and password variables expected by the current Compose file. Do not commit .env to a public repository or paste its password into support requests. Restrict the file after editing:

chmod 600 /opt/tt-rss/.env

Why the self URL must be exact

TTRSS_SELF_URL_PATH is a fully qualified public URL, not merely a hostname and not an internal Docker address. TT-RSS uses it when generating links, redirects, API endpoints, and asset URLs. Include the scheme and, for a subpath installation, the path. Do not add a trailing slash unless the project’s current example specifically requires one for your chosen configuration.

These values are not interchangeable:

Public arrangement Correct value Incorrect value
Subpath https://example.com/tt-rss https://example.com (drops the path)
Dedicated hostname https://rss.example.com http://127.0.0.1:8280 (internal address and wrong scheme)

Start and validate the Compose stack

  1. Change to the deployment directory: cd /opt/tt-rss.
  2. Review the Compose file and environment values, especially the database volume and published port.
  3. Start all services in detached mode: docker compose up -d.
  4. List service state: docker compose ps.
  5. Inspect startup output if a service is restarting: docker compose logs --tail=200.
  6. Confirm that the web service is listening on the loopback address: ss -ltnp | grep 8280.

The expected listening address is 127.0.0.1:8280, not 0.0.0.0:8280. If the port is bound publicly, stop the stack, correct HTTP_PORT, and recreate the services before proceeding.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Wait until PostgreSQL, the app, updater, and web-Nginx services have completed their initial startup. A web container can be running while the database is still initializing, so check individual logs rather than relying only on a green container status.

Configure host Nginx as the reverse proxy

Install Nginx from your distribution and create a server block for the selected hostname. The proxy must set the original host, client address, and protocol explicitly. The protocol header is especially important: TT-RSS needs to know that the browser used HTTPS even though the internal hop from host Nginx to Docker is plain HTTP.

Rank #3
Sale
LISEN Cell Phone Stand Phone Holder for Desk, Office Decor Gadgets for Men
  • Ergonomic & Adjustable Design: Fight "text neck" and improve your posture. Designed for comfort, it offers an adjustable height (7.1in-8.5in) (1.4in adjustable range) and angle (5°-85°) Please note: cell phone stand is only 9 inches tall—the length of a standard pencil
  • Without blocking subtitles Perfect for office desk Tiktok Face Time Zoom video—this is the ultimate kitchen desk essential for phones! Perfect viewing experience while reducing neck back strain, A must-have for gamers streamers desk, and anyone who values both style and support!
  • Sleek & Stable Design fits Otterbox Case: Say goodbye to bent cables, tangles, and tip-overs! LISEN’s stylish adjustable desk phone holder features a built-in charging hole and smart cable management, keeping your phone secure and your workspace clutter-free cool gadgets for men
  • ANTI-SLIP DESIGN free hands: The under 10.00 items easy gadgets back and the bottom of this kitchen essentials for women are fully covered by anti-skid silicone, which LISEN stand up desk decor can provide maximum protection device from any scratches and slides
  • Your Perfect Viewing Companion:If your product arrives damaged or breaks within 365 days, reach out to LISEN for a quick and hassle-free solution. Struggling with assembly, like tightening the screw? We’ve got your back! Your experience matters to us. (Product including: phone Holder stand*1, screw*1, hexagon screwdriver*1, specification*1)

Dedicated hostname configuration

For https://rss.example.com/, use a root location:

server {
    listen 80;
    server_name rss.example.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://127.0.0.1:8280/;
        break;
    }
}

The trailing slash in this root proxy target keeps the upstream request rooted at /. Keep the public hostname in server_name and the same hostname in TTRSS_SELF_URL_PATH.

Subpath configuration

For https://example.com/tt-rss/, add a higher-priority location to the appropriate HTTPS server block:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
location ^~ /tt-rss/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://127.0.0.1:8280/tt-rss/;
    break;
}

Here the public location and the URI portion of proxy_pass both contain /tt-rss/. The ^~ modifier prevents a broader regular-expression location, such as a generic PHP handler, from taking precedence. Do not combine a subpath TTRSS_SELF_URL_PATH with a root proxy target or vice versa.

Test and reload Nginx

sudo nginx -t
sudo systemctl reload nginx

If the test reports an error, fix the indicated server block before reloading. Test from the VPS and from an external browser. A local request confirms that Nginx can reach the container; an external request confirms DNS, firewall, and the public server block:

curl -I http://127.0.0.1:8280/
curl -I https://rss.example.com/

Enable HTTPS with Certbot

First make sure DNS resolves to the VPS and that an HTTP server block for the hostname exists. On Ubuntu, the documented route is to install Certbot through Snap and use its Nginx plugin:

sudo snap install --classic certbot
sudo certbot --nginx -d rss.example.com

The Nginx plugin finds the matching server block, adds the TLS directives, and reloads Nginx. Nginx’s HTTPS configuration requires an SSL listener and readable certificate and key files. Keep the private key protected; it must be readable by the Nginx master process but should not be generally readable by unprivileged users.

Rank #4
Ledagic IC+RGBW USB Powered Led Light Bar with App & Remote Control, 2 Pack
  • Easy Installation: Our gaming lights have been designed to enhance your entertainment experience. Simply position the led light bar next to your TV or game console to create a game room environment with ease. They come with USB power and a 60 inch cord for direct mounting and mobility
  • Audio Syncing & Extensive Mode: The built-in high-sensitivity music sensor allows you to sync the TV led lights to your favorite music. Lights react and move to the beat of music, film and game audio, creating an incredible immersive sound and light experience – and all without the need for an additional hub. You can choose from 64+ patterns, including strobe, illusion, jump, energy, gradient, running, chasing, fluttering mode etc. Each mode can be applied to different scenes
  • 64+ Chasing IC+RGB & W Effect: The independent control design of IC+RGB and white all-in-one multifunctional rgbw led bar lights monitor backlight allows you to easily switch the led lights for desk between IC+RGB and white to enjoy a variety of lighting effects, you can choose white lighting mode with high brightness for better illumination when working, etc. Choose IC+RGB lighting mode when you need to create an entertaining atmosphere for the light show, 16 million colours of Color changing rgb light bar let you dance to the beat and create a dynamic party atmosphere
  • Dynamic and Dimmable Lights: 1%-full brightness free brightness adjustment gives you the flexibility to adjust dimmable led light bar for room decorations or a variety of occasions
  • USB Powered: USB light bars for room can be powered by powernank, usb charger, TV, Monitor, laptop PC mainframe, making behind TV led lighting bar easy to install in any location.TV led lights are powered by the TV usb interface / PC mainframe, can be turned on/off synchronously with TV / PC

After issuance, verify both layers:

  • Open the exact public TT-RSS URL in a browser and confirm the certificate hostname matches.
  • Run sudo nginx -t after any certificate or proxy edit.
  • Check that generated links and redirects remain HTTPS.
  • Confirm that the certificate renewal mechanism is installed and perform a renewal dry run using your distribution’s current Certbot procedure.

Persistence and backup design

Container recreation is normal during updates; data loss is not. Ensure the PostgreSQL service has a named or host-mounted volume and that the TT-RSS application volume specified by the official Compose file is also persistent. Run:

docker compose config
 docker volume ls

Inspect the rendered configuration for volume declarations and verify that the database service actually mounts the intended volume. Remove the accidental leading space before docker if your shell treats it as a separate command.

A backup is useful only if it can be restored. At minimum, establish a routine that includes:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • A PostgreSQL dump made while the database service is available.
  • Copies of any application data that the Compose file stores outside PostgreSQL.
  • Storage outside the VPS, protected with access controls and encryption appropriate to your feeds and account data.
  • A periodic restore test on a disposable instance.

The official Compose example includes an optional backups container. Whether you use that service or an external scheduler, document the destination, retention period, encryption, and restore command. Never assume that a Docker volume alone is a backup.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Updates without losing the database

TT-RSS follows continuous development and recommends staying current with recent Docker images or the project’s main branch. Update deliberately rather than running an unattended image replacement:

  1. Read the current TT-RSS installation and migration notes and record the image versions you intend to run.
  2. Confirm that the latest database backup can be read and, ideally, restore it in a test environment.
  3. Save a copy of .env and the Compose file, keeping secrets out of public version control.
  4. Pull the selected images with docker compose pull.
  5. Recreate services with docker compose up -d.
  6. Watch logs and check docker compose ps until the database, app, updater, and web services are healthy.
  7. Open the public URL and verify login, feed refresh, article display, and scheduled updates.

PostgreSQL major-version changes

Do not change the PostgreSQL major version merely by editing an image tag. Official PostgreSQL containers do not migrate an existing data directory between major versions automatically. The project notes that PostgreSQL 18 also changes the default data-volume path. Follow the current upstream migration procedure, which may require a logical dump and restore or another explicitly supported conversion. Keep the old volume until the new instance has been validated and the backup has been tested.

Best Value
Sale
HUANUO FlowLift™ Dual Monitor Stand, Fully Adjustable Gaming Monitor Desk Mount for 13–32″ Computer Screens, Full Motion VESA 75x75/100x100 with C-Clamp & Grommet Base, Each Arm Holds 4.4 to 19.8 lbs
  • Compatible with Wide Screens - To ensure compatibility with the dual monitor mount, your each monitor must meet three conditions at the same time: First, computer screens size range: 13 to 32 inches. Second, screen weight range: 4.4 to 19.8 lbs. Third, the back of the monitor screen must have VESA mounting holes with a pitch of 75x75mm or 100x100mm.
  • Regarding the compatibility with desks - Your desk must meet three conditions at the same time: First, desk material: Only wooden desks are recommended, plastic or glass desks cannot be used. Second, desk thickness range: 0.59" - 3.54". Third, the bottom of the desk should not have any cross beams or panels, as this will interfere with installation. We recommend carefully checking that your desk and monitors meets all above conditions before purchasing.
  • Dual C-Clamp Hold - Worried your dual monitors might wobble or slip? Our upgraded base uses a larger platform plus a dual C-clamp structure to lock the dual monitor arm firmly to your desk. Each arm safely keeps your screens steady while you type, click and game—no shaking, no sliding, just a clean and secure setup you can trust every day. It also provides Grommet Mounting installation choice, both options ensure stable and secure fixation for your 0.59" - 3.54" desk.
  • Full-Motion Adjustment For Comfortable View - Pull the screen closer when you’re deep in a spreadsheet, push it back to watch videos, or rotate to portrait for coding — moving everything smoothly with just one hand. The monitor stand offers +85°/-50° tilt, ±90° swivel and 360° rotation. Raise your monitor up to 15.75″ to support a healthy sitting posture. Whether you’re working from home, gaming through the night, or switching between video calls and documents, getting the screens to your natural line of sight helps relieve neck, shoulder and back strain so you can stay focused longer with less fatigue.
  • Keep Your Desk Organized: By lifting both screens off the desktop, this dual monitor stand opens up valuable space for your keyboard, notebook, docking station or a simple, clutter-free work area. Built-in cable management guides wires along the arms, keeping cords out of sight and out of the way. Enjoy a tidy, modern workstation that looks as good as it feels to use.

Diagnose common failures

502 Bad Gateway

  • Run docker compose ps and confirm the web-Nginx service is running.
  • Check docker compose logs web-nginx (use the exact service name in your Compose file).
  • Verify the loopback listener with ss -ltnp | grep 8280.
  • From the host, request http://127.0.0.1:8280/. If it fails, the issue is Docker or the container, not public Nginx.
  • Confirm that host Nginx uses the same port and address as HTTP_PORT.

Redirects to HTTP or mixed-content warnings

Set TTRSS_SELF_URL_PATH to the public HTTPS URL and ensure every relevant location sends X-Forwarded-Proto $scheme. If the proxy is HTTPS but the header is missing, TT-RSS can generate plain-HTTP links and redirects. Reload Nginx after editing and clear a cached redirect in the browser before retesting.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Subpath loads a blank page or missing assets

Compare the public location, proxy_pass URI, and TTRSS_SELF_URL_PATH character by character. All three must agree on /tt-rss. Retain the trailing slash pattern shown in the working location and use location ^~ /tt-rss/ if another PHP or regular-expression location is capturing requests.

Database appears empty after recreation

Check the database service’s volume mount in docker compose config. If the database was started without the intended persistent volume, a replacement container can initialize a new empty cluster. Stop before deleting anything, locate the original volume with docker volume ls, and restore from a known backup if the original data cannot be reattached safely.

Feed updates do not run

Confirm that the updater service is running rather than only the web service. Review updater logs, verify that the database is reachable on the Compose network, and check the VPS clock and outbound network policy. A successful browser login does not prove that the scheduled updater is healthy.

Upgrade fails after a PostgreSQL image change

Revert to the previously working image only if your backup and rollback plan permit it, then consult the current PostgreSQL major-version migration instructions. Do not repeatedly restart containers against a data directory created by a different major version; that can complicate recovery.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Host Nginx versus a containerized reverse proxy

Consideration Host Nginx Containerized proxy
Operational ownership Managed with the VPS operating system, systemd, and host configuration. Managed as another container with its own networks, volumes, and update cycle.
Network layout TT-RSS can bind to loopback; only host Nginx is internet-facing. Requires deliberate Docker network and port exposure rules.
Certificates Certbot’s Nginx plugin can edit the host server block and reload Nginx. Certificate automation belongs to the proxy stack and must be integrated with its volumes.
Isolation clarity Easy to see that the TT-RSS web port is private on 127.0.0.1. Can be clean, but public and private networks must be reviewed in Compose.

For a single VPS already using Nginx, the host-proxy arrangement minimizes moving parts and makes the security boundary explicit. A containerized proxy is reasonable when the entire server is already operated as a Compose-based platform, but it is not required for TT-RSS.

Security and maintenance checklist

  • Use a unique, high-entropy PostgreSQL password and protect .env.
  • Expose only ports 80 and 443 publicly; keep 127.0.0.1:8280 private.
  • Keep the VPS operating system, Docker Engine, Compose plugin, Nginx, and TT-RSS images updated.
  • Use HTTPS for the public URL and verify certificate renewal.
  • Forward the original host and protocol headers exactly as configured.
  • Back up PostgreSQL and application data before every image or database upgrade.
  • Test a restore, not just the creation of a backup file.
  • Review logs after updates and monitor disk space for the database, article cache, and backups.

Final verification

Before considering the deployment complete, work through this request from a clean browser session:

  1. DNS resolves the chosen hostname to the VPS.
  2. The browser receives a valid certificate and stays on HTTPS.
  3. The TT-RSS login page loads at the exact URL represented by TTRSS_SELF_URL_PATH.
  4. Static assets, navigation, and redirects retain the correct hostname and (if used) /tt-rss/ prefix.
  5. The updater fetches a feed and the new article appears after refresh.
  6. Recreating a non-database container leaves accounts and feeds intact.
  7. A recent database backup exists off the VPS and its restore procedure is documented.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More quests from Patch Notes

  1. How to Set Up a RedM (RDR2) Server in 2026: License Key, txAdmin and server.cfg, Step by StepBlog11min
  2. Best RedM (RDR2) Server Hosting in 2026: Comparing Four Hosts on Slots, Memory and PriceBlog10min
  3. How to Host a Mindustry Server in 2026: server-release.jar, Port 6567 and the Commands That MatterBlog7min
Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Crashes, No Sound, or Screen Glitches?Free driver scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.