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, FeedMe và Read 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ự.

