시작하며
그동안 Inoreader를 RSS 서비스로 사용해왔는데, 최근 접속이 불안정하고 일부 RSS 소스의 내용이 제대로 표시되지 않는 문제가 발생했습니다. 마침 Docker와 Traefik v2로 RSS 서비스 구축하기 - Suyang 블로그에서 Docker와 Miniflux를 사용해 RSS 서비스를 구축한 글을 보게 되었습니다. 마침 놀고 있는 클라우드 서버(오라클 클라우드)가 하나 있어서 직접 구축해보기로 했습니다.
관련 도구 및 서비스:
Miniflux: Frédéric Guillot가 Go 언어로 개발 및 유지 관리하는 오픈소스 미니멀 스타일 RSS 서비스입니다. 브라우저 접속을 지원하며, Telegram 푸시 알림, Fever API를 통한 Reeder(macOS), FeedMe(Android) 등 클라이언트와의 구독 동기화를 지원합니다.
RSSHub: DIYGod가 개발 및 유지 관리하는 RSS 생성기입니다. 여러 웹사이트의 콘텐츠를 RSS 피드로 변환해주며, Miniflux와 함께 사용하면 더욱 좋습니다.
RSSHub Radar: 역시 DIYGod가 개발 및 유지 관리하는 Chrome 확장 프로그램입니다. RSSHub의 보완 도구로, 현재 페이지의 RSS 피드를 감지하여 Miniflux에 한 번에 추가할 수 있습니다.
Telegram Bot: Telegram의 봇 서비스로, Telegram Bot API를 통해 Telegram과 상호작용할 수 있습니다.
중국어 독립 블로그 목록: timqian이 유지 관리하는 GitHub 저장소로, 우수한 중국어 독립 블로그의 RSS 피드를 모아놓았습니다.
Kill the Newsletter: 이메일 뉴스레터를 RSS 피드로 변환해주는 서비스입니다.
FeedMe - Android: Android RSS 앱
Reeder - macOS: macOS RSS 앱
준비 사항
- 도메인 (HTTPS 접속 지원용, 서브도메인 사용 가능)
- 서버 1대 (본 글에서는 오라클 x86 VPS, 사양 1C1G 사용)
시스템 환경
- Ubuntu Server 24.04 LTS (x86_64)
Docker & Docker Compose 설치
관리를 편하게 하기 위해 Docker & Docker Compose를 사용하여 Miniflux와 RSSHub 서비스를 배포합니다.
먼저 Docker와 Docker Compose를 설치해야 합니다.
패키지 업데이트
sudo apt update && sudo apt full-upgrade -y
Docker 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Docker Compose 설치
sudo apt install docker-compose-plugin -y
설치 확인
# Docker 버전 확인
docker --version
# - 출력 예시
Docker version 27.0.0, build e92dd87
# Docker Compose 버전 확인
docker compose --version
# - 출력 예시
Docker Compose version v2.27.0
현재 사용자를 docker 그룹에 추가 (sudo 생략)
# 현재 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER
# 도커 데몬 소켓 권한 변경 (docker 그룹 접근 허용)
sudo chmod a+rw /var/run/docker.sock
# Docker 서비스 재시작
sudo systemctl restart docker
# 정상 작동 확인
docker info
# 권한 오류가 없으면 성공
Docker 부팅 시 자동 시작 설정
sudo systemctl enable docker
Docker & Docker Compose 설치가 완료되면 Miniflux를 설치할 차례입니다.
Miniflux 설치
Miniflux를 설치하기 전에, 같은 디렉토리에 환경 변수를 저장할 .env 파일을 생성해야 합니다.
예: Miniflux 사용자 이름, 비밀번호, 데이터베이스 사용자 이름, 비밀번호 등.
# 디렉토리 생성
mkdir -p ~/docker/miniflux
# env 파일 생성
vim ~/docker/miniflux/.env
# Esc + :wq 로 vim 저장 후 종료
참고: 아래 설정 정보를 자신의 환경에 맞게 변경하세요.
# .env
# 데이터베이스 사용자 이름
POSTGRES_USER=erica
# 데이터베이스 비밀번호
POSTGRES_PASSWORD=erica1234
# Miniflux 사용자 이름
MINIFLUX_USERNAME=erica
# Miniflux 비밀번호
MINIFLUX_PASSWORD=rss1234
# Miniflux 접속 주소
MINIFLUX_BASE_URL=https://miniflux.domain.com
.env 파일을 생성한 후, Miniflux를 실행할 compose.yml 파일을 생성합니다.
# 설정 파일 생성
vim ~/docker/miniflux/compose.yml
# compose.yml
services:
miniflux:
image: miniflux/miniflux:latest
container_name: miniflux
restart: always
ports:
- "17025:8080"
depends_on:
- db
environment:
- POLLING_FREQUENCY=15
- DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/$miniflux?sslmode=disable
- BASE_URL=${MINIFLUX_BASE_URL}
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=${MINIFLUX_USERNAME}
- ADMIN_PASSWORD=${MINIFLUX_PASSWORD}
healthcheck:
test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
db:
image: postgres:latest
container_name: postgres
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
# Esc + :wq 로 vim 저장 후 종료
여기서 주의할 점:
ports:17025는 컨테이너 외부 포트,8080은 컨테이너 내부 포트입니다. 필요에 따라 변경 가능합니다.POLLING_FREQUENCY=15: Miniflux의 폴링 주기로, 여기서는 15분으로 설정했습니다.
자체 데이터베이스를 사용하려면 db 서비스를 주석 처리하고 DATABASE_URL 값을 자신의 데이터베이스 주소로 변경하면 됩니다.
Miniflux 컨테이너 실행
docker compose up -d
설치 확인
브라우저에서 Miniflux 주소로 접속하여 정상적으로 접속되면 설치 성공입니다.
# 서버 IP 확인
curl -s https://icanhazip.com
브라우저에서 http://<IP>:17025로 접속하여 정상적으로 접속되면 설치 성공입니다.

서비스에 접속할 수 없다면 방화벽 설정과 클라우드 호스트 보안 그룹 설정을 확인하세요.
참고 자료: 오라클 클라우드 네트워크 보안 그룹 설정 - EN
#
RSSHub 설치
이제 RSSHub를 설치하고, 마지막으로 Nginx를 사용하여 RSSHub와 Miniflux 서비스를 리버스 프록시로 연결하겠습니다.
# 디렉토리 생성
mkdir -p ~/docker/rsshub && cd ~/docker/rsshub
# compose.yml 파일 다운로드
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/compose.yml
# 수정할 설정 확인
vim compose.yml
# Redis 캐시 영구 저장을 위한 볼륨 생성
docker volume create redis-data
# RSSHub 실행 (-d 옵션 없이 실행하면 로그를 확인할 수 있음)
docker compose up -d
# RSSHub 로그 확인
docker compose logs -f
설치 확인
브라우저에서 RSSHub 주소로 접속하여 정상적으로 접속되면 설치 성공입니다.
# IP 주소 확인
curl -s https://icanhazip.com
브라우저에서 http://<IP>:1200으로 접속하여 정상적으로 접속되면 설치 성공입니다.

Nginx Proxy Manager (NPM) 설치
Miniflux와 RSSHub를 설치하고 실행한 후, Nginx를 사용하여 이 두 서비스를 리버스 프록시로 연결해야 합니다. 이렇게 하면 도메인을 통해 서비스에 접속하고 SSL 암호화도 적용할 수 있습니다.
# 디렉토리 생성
mkdir -p ~/docker/npm && cd ~/docker/npm
# 설정 파일 생성
vim ~/docker/npm/compose.yml
compose.yml 파일 편집
# compose.yml
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Nginx Proxy Manager 컨테이너 실행
docker compose up -d
설치 확인
브라우저에서 NPM 주소로 접속하여 정상적으로 접속되면 설치 성공입니다.
# IP 주소 확인
curl -s https://icanhazip.com
브라우저에서 http://<IP>:81로 접속하여 정상적으로 접속되면 설치 성공입니다.

NPM 리버스 프록시 설정
http://<IP>:81에 로그인합니다. 기본 사용자 이름은 admin@example.com, 비밀번호는 changeme입니다.
로그인 후에는 반드시 기본 이메일과 비밀번호를 변경하세요. 이메일은 SSL 인증서 갱신 알림을 받는 데 사용됩니다.
Docker 컨테이너 IP 확인
리버스 프록시를 설정하기 전에 Docker 컨테이너의 IP를 확인해야 합니다.
터미널에서 다음 명령어를 입력하여 Docker 컨테이너 IP를 확인합니다.
# 다음 명령어 입력
ip addr show docker0
# 출력 결과 예시
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:a6:c8:15:72 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
위의 172.17.0.1이 Docker 컨테이너 IP입니다.
이제 NPM 리버스 프록시를 설정합니다.
Miniflux 리버스 프록시 추가
- Dashboard 페이지에서
0 Proxy Host카드를 클릭하여 리버스 프록시를 추가합니다. Proxy Host페이지에서Add Proxy Host버튼을 클릭하면New Proxy Host창이 나타납니다.New Proxy Host창에서 다음 내용을 입력합니다.Domain Names: 도메인 입력 (예:miniflux.domain.com)Scheme: 기본값HTTP선택Forward Hostname / IP: Docker 컨테이너 IP 입력 (예:172.17.0.1)Forward Port:17025입력
SSL탭으로 이동하여SSL Certificate옵션에서Request a new SSL Certificate with Let's Encrypt를 선택합니다.Force SSL옵션 활성화HTTP/2 Support옵션 활성화Let's Encrypt Terms of Service동의
Save버튼을 클릭하여 설정을 저장합니다. (인증서 생성에 시간이 걸릴 수 있습니다.)- 마지막으로 방금 추가한
miniflux.domain.com링크를 클릭하여 정상적으로 접속되면 NPM 리버스 프록시 설정이 완료된 것입니다.
RSSHub 리버스 프록시 추가
위 단계를 반복하여 RSSHub 리버스 프록시를 추가하고 다음 내용을 입력합니다.
Domain Names: 도메인 입력 (예:rsshub.domain.com)Scheme: 기본값HTTP선택Forward Hostname / IP: 'Docker 컨테이너 IP' 입력Forward Port:1200입력SSL탭으로 이동하여SSL Certificate옵션에서Request a new SSL Certificate with Let's Encrypt를 선택합니다.Force SSL옵션 활성화HTTP/2 Support옵션 활성화Email Address for Let's Encrypt: 이메일 주소 입력Let's Encrypt Terms of Service동의
Save버튼을 클릭하여 설정을 저장합니다. (인증서 생성에 시간이 걸릴 수 있습니다.)- 마지막으로 방금 추가한
rsshub.domain.com링크를 클릭하여 정상적으로 접속되면 NPM 리버스 프록시 설정이 완료된 것입니다.
리버스 프록시 설정 확인
✅ https://miniflux.domain.com으로 Miniflux에 접속하여 정상적으로 접속되면 NPM 리버스 프록시 설정이 성공한 것입니다.
✅ https://rsshub.domain.com으로 RSSHub에 접속하여 정상적으로 접속되면 NPM 리버스 프록시 설정이 성공한 것입니다.
✅ NPM 리버스 프록시를 설정한 후에는 클라우드 호스트 보안 그룹에서 해당 포트의 접근 권한을 닫아 악의적인 접근을 방지하는 것이 좋습니다.
(선택 사항) Caddy 리버스 프록시 사용
NPM을 사용하지 않으려면 Caddy를 사용하여 리버스 프록시를 설정할 수도 있습니다.
설정 파일은 다음과 같습니다.
vim caddyfile
miniflux.example.org
reverse_proxy miniflux:17025
services:
caddy:
image: caddy:2
container_name: caddy
depends_on:
- miniflux
ports:
- "80:80"
- "443:443"
volumes:
- $PWD/Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
miniflux:
image: ${MINIFLUX_IMAGE:-miniflux/miniflux:latest}
container_name: miniflux
depends_on:
- db
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
- BASE_URL=https://miniflux.example.org
db:
image: postgres:15
container_name: postgres
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
caddy_data:
caddy_config:
(선택 사항) Traefik 리버스 프록시 사용
NPM을 사용하지 않으려면 traefik도 좋은 선택입니다.
설정 파일은 다음과 같습니다.
services:
traefik:
image: "traefik:v2.3"
container_name: traefik
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=postmaster@example.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
depends_on:
- miniflux
ports:
- "443:443"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
miniflux:
image: ${MINIFLUX_IMAGE:-miniflux/miniflux:latest}
container_name: miniflux
depends_on:
- db
expose:
- "8080"
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
- BASE_URL=https://miniflux.example.org
labels:
- "traefik.enable=true"
- "traefik.http.routers.miniflux.rule=Host(`miniflux.example.org`)"
- "traefik.http.routers.miniflux.entrypoints=websecure"
- "traefik.http.routers.miniflux.tls.certresolver=myresolver"
db:
image: postgres:15
container_name: postgres
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
Miniflux로 RSS 구독하기
언어 설정: Miniflux에 로그인한 후 Settings를 클릭하고 Language 옵션에서 简体中文을 선택한 후 페이지 하단의 Save 버튼을 클릭하여 설정을 저장합니다.
글 정렬: 같은 페이지에서 글 정렬 레이블 아래에서 새로운 것 -> 오래된 것을 선택하고 페이지 하단의 Save 버튼을 클릭하여 설정을 저장합니다.
새 소스 추가: 웹 페이지 상단에서 소스(+) 레이블을 찾아 + 레이블을 클릭하고 https://pinw.ca/zhs/index.xml을 입력한 후 파란색 소스 찾기 버튼을 클릭합니다. 잠시 기다리면 Miniflux가 자동으로 해당 RSS 정보를 가져와 구독 목록에 추가합니다.
참고: 위의 https://pinw.ca/zhs/index.xml은 제 블로그의 RSS 주소입니다. 구독해 주시면 감사하겠습니다.
RSSHub로 RSS 구독하기
Miniflux의 사용자 경험은 훌륭하지만, RSS 피드만 구독할 수 있고 Bilibili, YouTube 등 다른 유형의 콘텐츠는 구독할 수 없습니다. 이럴 때 RSSHub가 필요합니다.
Bilibili 구독
RSSHub를 열고 검색창에 bilibili를 입력한 후 Bilibili->UP主动态를 클릭합니다.
YouTube 구독
RSSHub를 열고 검색창에 youtube를 입력한 후 YouTube->用户를 클릭합니다.
rsshub.domain.com을 방금 설정한 리버스 프록시 도메인으로 변경하는 것을 잊지 마세요.
RSSHub Radar로 RSS 구독하기
RSSHub는 다양한 라우팅 규칙을 제공하지만, 매번 RSSHub를 열어서 해당 라우트를 검색하는 것은 불편합니다. 이럴 때 RSSHub가 제공하는 라우트를 쉽게 찾을 수 있는 도구가 필요합니다.
RSSHub Radar는 RSSHub 제작자 DIYgod가 개발한 Chrome 확장 프로그램으로, 현재 웹사이트의 RSS 라우팅 규칙을 빠르게 찾을 수 있도록 도와줍니다.
- RSSHub Radar - Chrome Extension을 클릭하여 RSSHub Radar 확장 프로그램을 다운로드하여 설치합니다.
- RSSHub Radar 확장 프로그램 아이콘을 클릭하고
설정버튼을 클릭하여 설정 페이지로 이동합니다. 일반설정에서사용자 정의 RSSHub 도메인에rsshub.domain.com을 입력합니다.원클릭 구독설정에서활성화를 체크하고사용자 정의 Miniflux 도메인에miniflux.domain.com을 입력합니다.

이제 모든 웹사이트에서 RSSHub Radar 확장 프로그램을 사용할 수 있습니다.
Fever API로 RSS 동기화하기
Fever API는 RSS 동기화 프로토콜로, Fever API를 통해 RSS를 다른 RSS 리더(예: FeedMe 등)에 동기화(읽기 전용, 쓰기 불가)할 수 있습니다.
설정버튼을 클릭하여 설정 페이지로 이동합니다.통합버튼을 클릭하여 통합 페이지로 이동합니다.Fever API 활성화옵션을 체크하고Fever 사용자 이름과Fever 비밀번호를 입력합니다.업데이트버튼을 클릭하여 설정을 저장합니다.

Android에서 읽기
FeedMe는 Android용 RSS 리더로, Fever API를 사용하여 Miniflux의 RSS를 동기화할 수 있습니다.
Telegram Bot 푸시 설정
- Telegram에서
@BotFather를 검색하고/start를 보내 BotFather에 진입합니다. /newbot을 보내 봇 생성 절차를 시작합니다.- 봇 이름을 입력합니다 (예:
RSS Notification). - 봇 사용자 이름을 입력합니다 (예:
123wasdRSSPushbot). - 봇 토큰을 복사합니다 (예:
123456789:ABCDEF1234567890ABCDEF1234567890ABC). 나중에 사용됩니다. - Telegram에서
@getidsbot을 검색하고/start를 보내 Chat ID를 가져옵니다. - Chat ID를 복사합니다 (예:
1234567890). 나중에 사용됩니다. - Miniflux에 로그인하고
설정탭을 클릭하여 설정 페이지로 이동합니다. 통합탭을 클릭하여 통합 페이지로 이동합니다.- 페이지를 맨 아래로 스크롤하여
새 글을 Telegram으로 푸시옵션을 체크하고 방금 복사한봇 토큰과Chat ID를 입력합니다. 업데이트버튼을 클릭하여 설정을 저장합니다.
이제 Miniflux에 새 글이 있을 때마다 Telegram Bot을 통해 Telegram 계정으로 푸시 알림이 전송됩니다.
참고: 그룹이나 채널로 푸시하려면 봇을 그룹이나 채널에 추가한 후, 그룹이나 채널에서 /start를 보내 현재 Chat ID를 가져와야 합니다.
마무리
즐거운 삽질(?) 끝에 드디어 나만의 RSS 서비스를 자유롭게 사용할 수 있게 되었습니다.
enjoy it!