Miniflux Docker 설치 가이드: 미니멀리스트를 위한 RSS 리더




개요

Miniflux는 “미니멀하고 독선적인(opinionated)” 철학을 가진 RSS 피드 리더입니다. Go 언어로 작성되어 매우 가볍고 빠르며, 단일 바이너리로 배포됩니다. 불필요한 기능을 배제하고 RSS 읽기의 본질에 충실한 것이 특징입니다.

항목내용
GitHubhttps://github.com/miniflux/v2
공식 사이트https://miniflux.app
GitHub Stars7K+
라이선스Apache 2.0
개발 언어Go
호스팅 서비스$15/년 (선택)

Miniflux란?

Miniflux는 2013년 처음 출시되어 2017년 Go 언어로 완전히 재작성된 미니멀리스트 RSS 리더입니다. “기능이 적을수록 좋다”는 철학으로, 필요한 핵심 기능만 제공하고 나머지는 과감히 생략했습니다.

핵심 철학

"미니멀하고 독선적인(Minimalist and Opinionated)"
- 단순함이 곧 강점
- 필요한 기능만 제공
- 가볍고 빠른 성능
- 프라이버시 중시

왜 “독선적”인가?

결정 사항이유
PostgreSQL만 지원최고의 성능과 전문 검색
플러그인 없음단순함 유지, 보안 강화
테마 최소화읽기에 집중
JavaScript 최소빠른 로딩, 프라이버시

주요 기능

피드 관리

기능설명
다양한 피드 형식Atom 0.3/1.0, RSS 1.0/2.0, JSON Feed 1.0/1.1
OPML 가져오기/내보내기기존 피드 마이그레이션
URL 가져오기피드 URL 직접 입력
첨부 파일 지원팟캐스트, 비디오, 이미지
YouTube 내장 재생YouTube 비디오 앱 내 재생
카테고리 분류피드 정리
북마크(스타)중요 아티클 저장

프라이버시 & 보안

기능설명
픽셀 트래커 제거추적 이미지 차단
추적 파라미터 제거utm_source, fbclid 등 자동 제거
외부 리소스 차단이미지, 스크립트 선택적 차단
HTTPS 강제보안 연결 우선
CSP 헤더콘텐츠 보안 정책

연동 기능

기능설명
Google Reader APIReeder, FeedMe 등 연동
Fever APIUnread 등 연동
Webhook외부 서비스 알림
제3자 서비스 저장Pocket, Instapaper, Wallabag 등
공유 링크개별 아티클 공개 공유

성능

특징설명
단일 바이너리외부 의존성 없음
낮은 메모리~30MB RAM
빠른 응답Go 언어의 성능
전문 검색PostgreSQL 기반

RSS 리더 비교

기능MinifluxFreshRSSTiny Tiny RSS
철학미니멀풍부한 기능파워 유저
개발 언어GoPHPPHP
데이터베이스PostgreSQL만SQLite/MySQL/PgSQLPostgreSQL/MySQL
바이너리 크기~20MB
RAM 사용~30MB~100MB+~200MB+
플러그인
테마기본 + 몇 개다양다양
설정 복잡도매우 단순중간복잡
학습 곡선낮음중간높음
모바일 앱서드파티서드파티공식 앱
호스팅 서비스✅ $15/년

선택 가이드

원하는 것추천
가벼움, 단순함Miniflux
풍부한 기능, 확장성FreshRSS
고급 커스터마이징Tiny Tiny RSS
관리 부담 최소화Miniflux 호스팅

시스템 요구 사항

최소 사양

항목최소권장
CPU1 Core1 Core
RAM64MB128MB
저장소50MB + 데이터SSD 권장
데이터베이스PostgreSQL 11+PostgreSQL 15+

매우 가벼운 리소스

Miniflux는 Raspberry Pi에서도 원활하게 실행됩니다.
- Alpine 기반 이미지
- 단일 Go 바이너리
- 최소 메모리 사용

Docker 설치

방법 1: Docker Compose (권장)

# docker-compose.yml
services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    restart: unless-stopped
    ports:
      - "8080:8080"
    depends_on:
      db:
        condition: service_healthy
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=changeme123

  db:
    image: postgres:15-alpine
    container_name: miniflux-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=miniflux
    volumes:
      - miniflux_db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

volumes:
  miniflux_db:

실행:

mkdir -p ~/miniflux && cd ~/miniflux

# docker-compose.yml 생성 후
docker compose up -d

# 로그 확인
docker compose logs -f miniflux

접속: http://localhost:8080

방법 2: 환경 변수 상세 설정

# docker-compose.yml
services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    restart: unless-stopped
    ports:
      - "8080:8080"
    depends_on:
      db:
        condition: service_healthy
    environment:
      # 데이터베이스
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      
      # 관리자 계정 (첫 실행 시에만)
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=securepassword123
      
      # 서버 설정
      - LISTEN_ADDR=0.0.0.0:8080
      - BASE_URL=https://rss.example.com
      
      # 피드 업데이트
      - POLLING_FREQUENCY=60
      - BATCH_SIZE=100
      - POLLING_SCHEDULER=entry_frequency
      
      # 보안
      - CLEANUP_ARCHIVE_UNREAD_DAYS=180
      - CLEANUP_ARCHIVE_READ_DAYS=60
      - CLEANUP_REMOVE_SESSIONS_DAYS=30
      
      # 기능
      - FETCH_YOUTUBE_WATCH_TIME=1
      - YOUTUBE_EMBED_URL_OVERRIDE=https://www.youtube-nocookie.com/embed/
      
      # 프록시 (선택)
      # - HTTP_CLIENT_PROXY=http://proxy:8080

  db:
    image: postgres:15-alpine
    container_name: miniflux-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=miniflux
    volumes:
      - miniflux_db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  miniflux_db:

방법 3: Traefik 연동

# docker-compose.yml
services:
  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=changeme123
      - BASE_URL=https://rss.${DOMAIN}
    networks:
      - internal
      - traefik_network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.miniflux.rule=Host(`rss.${DOMAIN}`)"
      - "traefik.http.routers.miniflux.entrypoints=websecure"
      - "traefik.http.routers.miniflux.tls.certresolver=letsencrypt"
      - "traefik.http.services.miniflux.loadbalancer.server.port=8080"

  db:
    image: postgres:15-alpine
    container_name: miniflux-db
    restart: unless-stopped
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=miniflux
    volumes:
      - miniflux_db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "miniflux"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - internal

volumes:
  miniflux_db:

networks:
  internal:
  traefik_network:
    external: true

환경 변수 가이드

필수 변수

변수설명예시
DATABASE_URLPostgreSQL 연결 문자열postgres://user:pass@host/db
RUN_MIGRATIONS자동 DB 마이그레이션1

관리자 계정

변수설명예시
CREATE_ADMIN관리자 생성 여부1
ADMIN_USERNAME관리자 사용자명admin
ADMIN_PASSWORD관리자 비밀번호securepass

서버 설정

변수설명기본값
LISTEN_ADDR바인딩 주소127.0.0.1:8080
BASE_URL외부 접속 URLhttp://localhost
HTTPSHTTPS 강제0
DISABLE_HSTSHSTS 비활성화0

피드 업데이트

변수설명기본값
POLLING_FREQUENCY업데이트 간격 (분)60
BATCH_SIZE한 번에 업데이트할 피드 수100
POLLING_SCHEDULER스케줄러 타입round_robin
SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL최대 업데이트 간격24h

정리 설정

변수설명기본값
CLEANUP_ARCHIVE_UNREAD_DAYS안 읽은 글 보관 일수180
CLEANUP_ARCHIVE_READ_DAYS읽은 글 보관 일수60
CLEANUP_FREQUENCY_HOURS정리 실행 간격24

프라이버시

변수설명기본값
PROXY_OPTION미디어 프록시http-only
PROXY_MEDIA_TYPES프록시할 미디어 타입image
FETCH_YOUTUBE_WATCH_TIMEYouTube 재생시간 가져오기0

초기 설정

1) 로그인

URL: http://localhost:8080
사용자명: admin (또는 설정한 값)
비밀번호: changeme123 (또는 설정한 값)

2) 설정 변경

Settings → 기본 설정:

- 시간대: Asia/Seoul
- 언어: 한국어 (지원 시)
- 테마: Light/Dark/System
- 키보드 단축키: 활성화

Settings → 통합:

- Pocket/Instapaper 연동 (선택)
- Google Reader API: 활성화
- Fever API: 활성화

3) 피드 추가

  1. 상단 Feeds 메뉴
  2. Add Subscription 클릭
  3. URL 입력 (사이트 URL 또는 피드 URL)
  4. 카테고리 선택
  5. Save 클릭

키보드 단축키

Miniflux는 키보드 중심 탐색을 지원합니다.

단축키기능
g u미읽은 목록
g b북마크 목록
g h히스토리
g f피드 목록
g c카테고리 목록
j / k다음/이전 아티클
o / Enter아티클 열기
v원본 링크 열기
m읽음/안읽음 토글
d북마크 토글
f전체 본문 가져오기
s저장 서비스로 보내기
/검색
?단축키 도움말

모바일 앱 연동

Google Reader API

서버 URL: https://rss.example.com/v1/
사용자명: [Miniflux 사용자명]
비밀번호: [Miniflux 비밀번호]

Fever API

  1. Settings → Integrations → Fever 활성화
  2. Fever 비밀번호 설정
서버 URL: https://rss.example.com/fever/
사용자명: [Miniflux 사용자명]
비밀번호: [Fever 비밀번호]

호환 앱

플랫폼API
iOSReederGoogle Reader
iOSUnreadFever
iOSFiery FeedsFever
AndroidFeedMeGoogle Reader
AndroidRead YouGoogle Reader
DesktopFluent ReaderGoogle Reader

Nextflux (대체 웹 UI)

Miniflux의 기본 UI가 너무 미니멀하다면 Nextflux를 사용할 수 있습니다.

# docker-compose.yml에 추가
  nextflux:
    image: ghcr.io/nextflux/nextflux:latest
    container_name: nextflux
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - MINIFLUX_URL=http://miniflux:8080

Nextflux는 더 현대적인 UI를 제공하면서 Miniflux API를 사용합니다.


백업 및 복원

OPML 내보내기

Settings → Export → Download OPML

데이터베이스 백업

# PostgreSQL 덤프
docker exec miniflux-db pg_dump -U miniflux miniflux > miniflux-backup.sql

# 압축
docker exec miniflux-db pg_dump -U miniflux miniflux | gzip > miniflux-backup.sql.gz

복원

# OPML: Settings → Import → OPML 파일 업로드

# 데이터베이스 복원
docker exec -i miniflux-db psql -U miniflux miniflux < miniflux-backup.sql

자동 백업 스크립트

#!/bin/bash
# miniflux-backup.sh

BACKUP_DIR="/backup/miniflux"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# 데이터베이스 백업
docker exec miniflux-db pg_dump -U miniflux miniflux | gzip > $BACKUP_DIR/miniflux-$DATE.sql.gz

# 7일 이상 된 백업 삭제
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

echo "Backup completed: miniflux-$DATE.sql.gz"

업데이트

Docker Compose

cd ~/miniflux

# 최신 이미지
docker compose pull

# 재시작 (마이그레이션 자동 실행)
docker compose up -d

# 로그 확인
docker compose logs -f miniflux

버전 고정

안정성을 위해 특정 버전을 사용:

image: miniflux/miniflux:2.1.3

트러블슈팅

일반적인 문제

데이터베이스 연결 실패:

# PostgreSQL 상태 확인
docker exec miniflux-db pg_isready -U miniflux

# 연결 테스트
docker exec miniflux-db psql -U miniflux -c "SELECT 1"

마이그레이션 오류:

# 수동 마이그레이션
docker exec miniflux /usr/bin/miniflux -migrate

관리자 비밀번호 재설정:

docker exec miniflux /usr/bin/miniflux -reset-password

로그 확인

# Miniflux 로그
docker logs miniflux -f

# PostgreSQL 로그
docker logs miniflux-db -f

상태 확인

# 버전 확인
docker exec miniflux /usr/bin/miniflux -version

# 설정 확인
docker exec miniflux /usr/bin/miniflux -info

성능 최적화

PostgreSQL 튜닝

db:
  image: postgres:15-alpine
  command:
    - "postgres"
    - "-c"
    - "shared_buffers=128MB"
    - "-c"
    - "effective_cache_size=384MB"
    - "-c"
    - "maintenance_work_mem=32MB"

피드 업데이트 최적화

environment:
  - POLLING_FREQUENCY=60           # 1시간
  - BATCH_SIZE=50                  # 배치 크기
  - POLLING_SCHEDULER=entry_frequency  # 스마트 스케줄링
  - SCHEDULER_ENTRY_FREQUENCY_MIN_INTERVAL=15m
  - SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL=24h

Reddit 피드 추가

Reddit 서브레딧을 RSS로 구독할 수 있습니다:

https://www.reddit.com/r/selfhosted/.rss
https://www.reddit.com/r/homelab/.rss
https://www.reddit.com/r/docker/.rss

사용 사례

1. 프라이버시 중시 사용자

  • 모든 추적 파라미터 자동 제거
  • 이미지 프록시로 IP 보호
  • 셀프호스팅으로 데이터 주권

2. 미니멀리스트

  • 불필요한 기능 없음
  • 빠르고 가벼운 인터페이스
  • 키보드 중심 탐색

3. 저사양 서버

  • Raspberry Pi에서도 실행
  • 최소 리소스 사용
  • 단일 바이너리 배포

마무리

Miniflux는 “적을수록 많다(Less is More)”는 철학을 완벽하게 구현한 RSS 리더입니다. 불필요한 기능을 과감히 배제하고 RSS 읽기의 본질에 충실하여, 빠르고 가벼우면서도 필요한 기능은 모두 갖추고 있습니다.

핵심 장점

장점설명
미니멀필요한 기능만 제공
가벼움~30MB RAM
빠름Go 언어 성능
프라이버시트래커 제거, 프록시
단순 배포단일 바이너리

이런 분께 추천

✅ 미니멀리스트
✅ 프라이버시 중시
✅ 저사양 서버 사용자
✅ 키보드 파워 유저
✅ 관리 부담 최소화 원하는 분



댓글 남기기