Deploy FreshRSS trên Docker: Tự host RSS Reader và Làm Chủ Nguồn Tin của Bạn

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Khởi Động Nhanh: Chạy FreshRSS Trong 5 Phút

Tự chạy RSS reader là một trong những niềm vui nho nhỏ của homelab — âm thầm cải thiện từng ngày. Tôi đã tự host FreshRSS hơn hai năm, và đây là dịch vụ tôi sẽ tiếc nhất nếu nó biến mất. Không thuật toán, không quảng cáo, không bị giới hạn feed — chỉ đúng nội dung bạn đã đăng ký, delivered đúng lúc được xuất bản.

Đây là con đường nhanh nhất để có một instance FreshRSS hoạt động:

mkdir -p ~/freshrss/{data,extensions}

docker run -d \
  --name freshrss \
  -p 8080:80 \
  -e TZ=Asia/Tokyo \
  -e CRON_MIN='*/15' \
  -v ~/freshrss/data:/var/www/FreshRSS/data \
  -v ~/freshrss/extensions:/var/www/FreshRSS/extensions \
  --restart unless-stopped \
  freshrss/freshrss:latest

Mở http://<your-server-ip>:8080 và bạn sẽ thấy wizard cài đặt. Chọn database (SQLite dùng tốt cho cá nhân), tạo tài khoản admin, và bạn đã sẵn sàng.

Chỉ một lệnh duy nhất là đủ để bắt đầu. Nhưng nếu bạn muốn production-grade — bền vững, có reverse proxy, đồng bộ trên tất cả thiết bị — hãy đọc tiếp.

Tìm Hiểu Sâu: Cài Đặt Docker Compose với PostgreSQL

SQLite chạy ổn khi dùng một mình, nhưng khi bạn có hàng trăm feed hoặc cần hỗ trợ nhiều người dùng, PostgreSQL là lựa chọn khôn ngoan hơn. Đây là file compose tôi đã tinh chỉnh qua thực tế sử dụng:

version: '3.8'

services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    restart: unless-stopped
    ports:
      - '8080:80'
    environment:
      TZ: Asia/Tokyo
      CRON_MIN: '*/15'
      FRESHRSS_ENV: production
    volumes:
      - ./data:/var/www/FreshRSS/data
      - ./extensions:/var/www/FreshRSS/extensions
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    container_name: freshrss-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: freshrss
      POSTGRES_USER: freshrss
      POSTGRES_PASSWORD: your_strong_password_here
    volumes:
      - ./db:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U freshrss']
      interval: 10s
      timeout: 5s
      retries: 5
docker compose up -d

Trong wizard cài đặt, chọn PostgreSQL làm loại database và điền thông tin xác thực khớp với file compose của bạn. FreshRSS tự động tạo schema trong lần chạy đầu tiên — không cần làm gì thêm.

Đặt Sau Reverse Proxy

Port 8080 ổn cho việc thử nghiệm. Khi bạn truy cập FreshRSS từ bên ngoài mạng LAN, bạn cần HTTPS. Nếu Nginx Proxy Manager hoặc Traefik đã chạy trong homelab của bạn, trỏ subdomain như rss.yourdomain.com vào port 8080 trên Docker host.

Nginx Proxy Manager chỉ cần vài cú click: thêm proxy host, đặt forward hostname là IP Docker host, port 8080, bật SSL qua Let’s Encrypt, bắt buộc HTTPS. Xong trong chưa đầy hai phút.

Người dùng Traefik có thể thêm các label này vào service freshrss:

labels:
  - 'traefik.enable=true'
  - 'traefik.http.routers.freshrss.rule=Host(`rss.yourdomain.com`)'
  - 'traefik.http.routers.freshrss.entrypoints=websecure'
  - 'traefik.http.routers.freshrss.tls.certresolver=letsencrypt'
  - 'traefik.http.services.freshrss.loadbalancer.server.port=80'

Cấu Hình Tần Suất Làm Mới Feed

Biến CRON_MIN kiểm soát tần suất FreshRSS polling feed. */15 nghĩa là cứ 15 phút một lần — cân bằng hợp lý giữa độ tươi mới và tải server. Trên VPS hạn chế tài nguyên, tăng lên */30 và bạn sẽ hầu như không nhận ra sự khác biệt trong thực tế.

Bạn cũng có thể kích hoạt làm mới thủ công từ Administration → Archiving, hoặc gọi trực tiếp qua CLI:

docker exec -it freshrss php /var/www/FreshRSS/app/actualize_script.php

Truy Cập API và Đồng Bộ Trên Mobile

Hầu hết công cụ RSS tự host chỉ dừng lại ở truy cập web. FreshRSS đi xa hơn — nó triển khai Google Reader API (cộng thêm Fever API qua extension), tương thích với hầu hết mọi RSS client hỗ trợ Google Reader backend. Đó là một hệ sinh thái đáng ngạc nhiên về quy mô.

Bật API

Vào User settings → Profile và đặt mật khẩu API. Có thể trùng với mật khẩu đăng nhập, nhưng dùng riêng sẽ gọn hơn. Sau đó vào Administration → Authentication và tích chọn Allow API access.

Endpoint API của bạn sẽ là:

https://rss.yourdomain.com/api/greader.php

Cài Đặt Client Mobile

Setup hàng ngày của tôi: NetNewsWire trên iOS và Reeder 5 trên macOS — cả hai đều hỗ trợ Google Reader API natively. Trỏ chúng vào URL FreshRSS với username và mật khẩu API của bạn. Đồng bộ gần như tức thì qua cả WiFi lẫn LTE.

Trên Android, FeedMeRead You (hoàn toàn open source) đều hoạt động tốt với cùng endpoint đó.

Import Feed Hiện Có

Đang chuyển từ Feedly, Inoreader, hay bất kỳ dịch vụ nào khác? Export danh sách đăng ký dưới dạng OPML, sau đó import tại Subscription management → Import/Export. Tôi đã import 340 feed từ Feedly trong khoảng 8 giây — FreshRSS không hề hấn gì.

Tự Động Backup

Tất cả dữ liệu nằm trong ./data: feed, trạng thái đã đọc, cài đặt, dữ liệu người dùng. Một script backup đơn giản chạy hàng đêm là đủ:

#!/bin/bash
BACKUP_DIR="/mnt/nas/backups/freshrss"
DATE=$(date +%Y%m%d)
tar -czf "${BACKUP_DIR}/freshrss-${DATE}.tar.gz" ~/freshrss/data ~/freshrss/db
find "${BACKUP_DIR}" -name '*.tar.gz' -mtime +30 -delete

Thêm vào cron (crontab -e) để chạy lúc 3 giờ sáng:

0 3 * * * /home/user/scripts/backup-freshrss.sh

Mẹo Thực Tế Từ Kinh Nghiệm Hàng Ngày

Những điều tôi học được sau hai năm thực sự vận hành — bỏ qua những mục này và bạn sẽ va vào đúng những bức tường tôi đã từng gặp.

1. Chú Ý Đến Số Lượng Feed

FreshRSS xử lý hàng trăm feed trên phần cứng khiêm tốn. VPS 1 core, 1GB RAM chạy ổn không than phiền. Nút thắt cổ chai thực sự là các nguồn tần suất cao — một số trang tin tức đẩy hơn 50 bài mỗi ngày. Giới hạn lưu trữ theo từng feed trong Subscription management. Tôi giữ 200 bài cho hầu hết feed, không giới hạn cho một vài feed quan trọng. Cách đó giữ database gọn nhẹ.

2. Hệ Thống Label Bị Đánh Giá Thấp

Hầu hết mọi người bỏ qua hệ thống label của FreshRSS. Đừng làm vậy. Tạo các label như Đọc Sau, DevOps, hay Newsletters, rồi thiết lập quy tắc lọc để tự động gán chúng dựa trên nguồn feed hoặc từ khóa trong tiêu đề. Cách đó biến FreshRSS từ một reader thụ động thành một lớp curation nội dung nhẹ — không cần công cụ bên thứ ba.

3. Dùng Tính Năng Chia Sẻ Tích Hợp

Trong User settings → Sharing, bạn có thể kết nối lưu một click vào Pocket, Wallabag, hoặc bất kỳ URL tùy chỉnh nào. Của tôi trỏ đến instance Wallabag tự host. Bài dài được lưu chỉ với một click, không cần juggling tab.

4. Debug Lỗi Fetch Feed

Khi một feed ngừng cập nhật, kiểm tra trạng thái của nó trong Subscription management — feed có lỗi sẽ được đánh dấu ở đó. Chín trong mười trường hợp là do URL RSS đã thay đổi, site bị down, hoặc feed giờ yêu cầu xác thực. Kiểm tra bất kỳ URL nào trực tiếp từ bên trong container:

docker exec -it freshrss curl -I 'https://example.com/feed.xml'

5. Tinh Chỉnh Mức Sử Dụng Bộ Nhớ

Trên VPS ít RAM, thêm giới hạn tài nguyên để tránh tình trạng dùng quá mức:

services:
  freshrss:
    # ... cấu hình khác
    deploy:
      resources:
        limits:
          memory: 256M

FreshRSS với SQLite thoải mái dưới 100MB trong điều kiện sử dụng bình thường. PostgreSQL thêm một chút overhead, nhưng vẫn dưới 256MB cho workload cá nhân.

6. Các Extension Đáng Cài

Volume ./extensions tồn tại có lý do của nó. Ba extension tôi thực sự dùng hàng ngày:

  • xExtension-CustomCSS — tinh chỉnh giao diện mà không cần chạm vào file core
  • cn-metrics — hữu ích nếu bạn theo dõi các feed công nghệ tiếng Trung
  • Fever API extension — bật khả năng tương thích Fever protocol cho Reeder

Đặt extension vào ~/freshrss/extensions/ và kích hoạt trong Administration → Extensions.

7. Giữ Image Luôn Được Cập Nhật

FreshRSS ra bản cập nhật thường xuyên. Quy trình nâng cấp với Docker Compose chỉ cần hai lệnh:

docker compose pull
docker compose up -d

Migration database chạy tự động khi khởi động. Dù vậy, hãy backup trước mỗi lần nâng cấp phiên bản lớn. Chỉ mất 30 giây và bạn sẽ mừng vì đã làm nếu có gì đó xảy ra.

Sau hơn hai năm chạy FreshRSS hàng ngày, nó đã trở thành hạ tầng tôi không cần nghĩ đến — đó là lời khen cao nhất dành cho một dịch vụ tự host. Nhẹ, API vững chắc, tương thích với mọi mobile client tôi đã thử. Nếu bạn đang xây dựng homelab, một RSS reader bạn thực sự kiểm soát là điều đáng có. FreshRSS là cái tôi sẽ giới thiệu không chút do dự.

Share: