FreshRSS: 알고리즘 없는 나만의 뉴스 피드
소셜 네트워크는 어떤 게시물을 먼저 보여줄지 자체적으로 결정합니다. 그 결과 프로젝트의 중요한 업데이트를 놓치고, 대신 수십 개의 추천 콘텐츠를 보게 될 수 있습니다. FreshRSS는 다르게 작동합니다. 사용자가 소스를 선택하면 새 콘텐츠가 하나의 시간순 피드에 표시됩니다.
FreshRSS는 자체 서버에 설치하여 블로그, 뉴스, 소프트웨어 업데이트, 포럼, 팟캐스트, 기타 RSS 또는 Atom 소스를 위한 통합 받은편지함처럼 사용할 수 있습니다. 이 글에서는 애플리케이션의 기능, 서버 요구 사항, Docker와 HTTPS를 이용한 VPS 설치 방법을 살펴봅니다.
다섯 단계로 시작하는 FreshRSS
- Linux VPS를 만들고
rss.example.com과 같은 하위 도메인이 해당 서버를 가리키도록 설정합니다. - Docker와 Docker Compose를 설치합니다.
- 자동 HTTPS를 위해 FreshRSS와 Caddy를 함께 실행합니다.
- 하위 도메인을 열고 SQLite를 선택한 뒤 계정을 만듭니다.
- OPML에서 구독 목록을 가져오거나 사이트를 수동으로 추가합니다.
설정이 끝나면 사용자의 컴퓨터가 꺼져 있어도 VPS가 일정에 따라 소스를 자동으로 확인합니다.
FreshRSS란 무엇인가
FreshRSS는 무료 셀프 호스팅 RSS 및 Atom 수집기입니다. 셀프 호스팅이란 애플리케이션과 데이터베이스가 클라우드 서비스 사업자의 인프라가 아니라 사용자가 관리하는 서버에서 실행된다는 뜻입니다.
RSS 피드는 사이트가 새 콘텐츠를 게시할 때 업데이트하는 특수 파일입니다. FreshRSS는 선택한 소스에서 이러한 파일을 정기적으로 가져와 하나의 인터페이스에 항목을 모읍니다. 읽지 않은 글, 즐겨찾기, 읽기 기록은 여러 기기 사이에서 동기화됩니다.
핵심 개념은 간단합니다. 사용자가 누구를 구독할지, 게시물을 어떤 순서로 볼지 직접 결정합니다. FreshRSS는 참여도에 따라 항목의 순위를 매기지 않으며 구독 콘텐츠 사이에 추천 콘텐츠를 삽입하지 않습니다.
FreshRSS의 기능
| 기능 | 용도 |
|---|---|
| 카테고리, 상태, 즐겨찾기 | 업무, 기술, 개인 소스를 구분 |
| 검색, 필터, 저장된 쿼리 | 원하는 주제의 게시물만 표시 |
| OPML 가져오기 및 내보내기 | 구독 목록을 빠르게 이전 |
| Google Reader API 및 Fever API | 휴대전화와 컴퓨터의 호환 앱 연결 |
| WebSub | 지원되는 소스에서 게시 직후 항목 수신 |
| 다중 사용자 | 가족이나 팀을 위한 별도 계정 생성 |
| 테마 및 확장 기능 | 인터페이스를 변경하고 기능 추가 |
| XPath 및 JSON Feed | 일반 RSS나 Atom이 없는 일부 소스 구독 |
저장된 쿼리는 별도의 주제별 피드가 될 수 있습니다. 예를 들어 보안 관련 게시물이나 특정 제품의 업데이트만 모을 수 있습니다. 결과는 FreshRSS 안에서 열거나 HTML 또는 RSS로 게시할 수 있으며, 피드 목록에는 OPML도 사용할 수 있습니다.
WebSub를 사용하면 호환 사이트가 다음 예약 확인을 기다리지 않고 새 항목을 FreshRSS에 직접 알릴 수 있습니다. 이를 위해서는 FreshRSS 인스턴스가 올바른 공개 주소를 통해 인터넷에서 접근 가능해야 합니다.
FreshRSS는 개발자와 관리자에게 특히 유용합니다. 프로젝트 블로그, 릴리스, 장애 보고서, 보안 게시물을 하나의 피드에 모을 수 있습니다. 일반적인 읽기 용도로도 수십 개의 열린 탭을 대신하며 모든 기기에서 정확한 ‘읽음’ 상태를 유지합니다.
FreshRSS의 시스템 요구 사항
FreshRSS는 많은 리소스를 필요로 하지 않습니다. SQLite, PostgreSQL, MariaDB, MySQL을 지원하며, 수동 설치에는 웹 서버와 PHP 8.1 이상이 필요합니다. 공식 설명에는 Raspberry Pi 1에서 150개 피드와 2만 2천 개의 글을 실행한 테스트 사례도 소개되어 있습니다.
실용적인 시작 구성:
| 사용 시나리오 | CPU | RAM | 저장 공간 | 데이터베이스 |
|---|---|---|---|---|
| 개인 피드 | 1 vCPU | 1 GB | 10–20 GB SSD | SQLite |
| 가족 또는 소규모 팀 | 1–2 vCPU | 2 GB | 20–40 GB SSD | SQLite 또는 외부 데이터베이스 |
| 많은 사용자와 대규모 아카이브 | 2 vCPU 이상 | 4 GB 이상 | 40 GB SSD 이상 | PostgreSQL 또는 MariaDB |
이는 참고 기준이며 엄격한 최소 사양은 아닙니다. 디스크 사용량은 소스 수, 게시 빈도, 기록 보관 기간에 따라 달라집니다. 24시간 업데이트, 외부 접속, 모바일 동기화, WebSub가 필요하다면 가정용 컴퓨터보다 VPS가 더 편리합니다.
Docker로 VPS에 FreshRSS를 설치하는 방법
아래 구성에서는 FreshRSS가 Caddy 뒤에서 실행됩니다. Caddy는 외부 요청을 받고 TLS 인증서를 자동으로 발급받습니다.
Linux VPS, docker compose 명령을 사용할 수 있도록 설치된 Docker, 서버 IP를 가리키는 A 레코드가 설정된 하위 도메인, 그리고 열려 있는 80번 및 443번 포트가 필요합니다.
1단계. 디렉터리 생성
sudo mkdir -p /opt/freshrss
sudo chown "$USER":"$USER" /opt/freshrss
cd /opt/freshrss2단계. compose.yaml 생성
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
restart: unless-stopped
logging:
options:
max-size: 10m
environment:
TZ: Etc/UTC
CRON_MIN: '3,33'
FRESHRSS_ENV: production
TRUSTED_PROXY: 172.16.0.0/12
volumes:
- freshrss_data:/var/www/FreshRSS/data
- freshrss_extensions:/var/www/FreshRSS/extensions
caddy:
image: caddy:2
container_name: freshrss-caddy
restart: unless-stopped
depends_on:
- freshrss
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
freshrss_data:
freshrss_extensions:
caddy_data:
caddy_config:CRON_MIN: '3,33'은 매시간 3분과 33분에 피드 확인을 시작합니다. FreshRSS는 하나의 피드를 약 20분에 한 번보다 더 자주 업데이트하지 않으므로 일반적으로 더 잦게 실행할 필요가 없습니다.
3단계. Caddyfile 생성
rss.example.com {
reverse_proxy freshrss:80
}도메인을 자신의 도메인으로 바꾸십시오. DNS 레코드가 반영되고 포트에 접근할 수 있게 되면 Caddy가 인증서를 자동으로 발급받고 갱신합니다.
4단계. FreshRSS 실행
docker compose up -d
docker compose ps다음 명령으로 로그를 확인할 수 있습니다.
docker compose logs -f --tail=100https://rss.example.com을 엽니다. 설치 마법사가 환경을 확인하고 데이터베이스 선택과 첫 번째 사용자 생성을 안내합니다. 개인 서버에서는 별도의 데이터베이스 컨테이너가 필요 없는 SQLite가 가장 간단한 선택입니다.
초기 설정
FreshRSS는 일반적인 사이트 주소만으로 RSS 또는 Atom 피드를 찾아내는 경우가 많습니다. 자동 검색이 작동하지 않으면 피드의 직접 URL을 입력하십시오. Feedly, Inoreader 및 기타 리더의 구독 목록은 OPML을 통해 편리하게 이전할 수 있습니다.
처음부터 소스를 ‘필독’, ‘업무’, ‘보안’, ‘긴 글’, ‘가볍게 읽기’ 같은 카테고리로 나누십시오. 게시 빈도가 높은 뉴스 사이트가 정말 중요한 업데이트를 메인 피드 밖으로 밀어내지 않도록 해야 합니다.
앱을 연결하려면 인증 설정에서 API를 활성화하고 프로필에 별도의 API 비밀번호를 지정합니다. Google Reader API 주소는 다음과 같습니다.
https://rss.example.com/api/greader.php기본 계정 비밀번호와 API 비밀번호는 서로 다르게 설정하는 것이 좋습니다.
읽지 않은 글에 파묻히지 않는 방법
FreshRSS는 약간만 설정해도 훨씬 유용해집니다.
- 메인 피드에는 중요한 소스만 남깁니다.
- 필터를 사용해 불필요한 섹션을 자동으로 읽음 처리합니다.
- 제품, 작성자, 주제에 대한 검색 쿼리를 저장합니다.
- 통계를 정기적으로 확인하고 잡음만 만드는 소스를 삭제합니다.
확장 기능을 이용하면 예상 읽기 시간, 단어 강조, 이미지 프록시, YouTube 삽입, 웹훅 알림, 호환되는 LLM API를 통한 글 분류 등을 추가할 수 있습니다. 타사 확장 기능은 신뢰할 수 있는 출처에서만 설치하십시오.
업데이트, 보안 및 백업
컨테이너를 업데이트하려면 다음 명령을 실행합니다.
cd /opt/freshrss
docker compose pull
docker compose up -d대규모 업데이트 전에는 백업을 만드십시오. freshrss_data 볼륨에는 사용자 설정이 저장되며, SQLite를 사용할 경우 글 데이터베이스도 들어 있습니다. 확장 기능을 사용한다면 freshrss_extensions도 보관하십시오. PostgreSQL, MariaDB 또는 MySQL은 별도의 데이터베이스 덤프가 필요합니다.
최소한의 보안 조치:
- HTTPS를 사용합니다.
- 필요한 계정을 만든 후 공개 가입을 비활성화합니다.
- 필요하지 않다면 익명 접근을 활성화하지 않습니다.
- 별도의 API 비밀번호를 사용합니다.
- FreshRSS와 확장 기능을 정기적으로 업데이트합니다.
- 백업을 VPS 외부에 보관합니다.
OPML 내보내기는 전체 백업을 대신할 수 없지만, 호환되는 RSS 리더에서 구독 목록을 빠르게 복원하는 데 도움이 됩니다.
tropic.host VPS에서 FreshRSS 실행하기
FreshRSS는 첫 번째 셀프 호스팅 서비스로 적합합니다. 리소스 요구량이 적고 Docker에서 실행되며, 구독 목록을 가져온 직후부터 분명한 효용을 제공합니다. 공용 VPS를 사용하면 24시간 피드 업데이트, 휴대전화 접속, WebSub의 정상적인 작동이 가능합니다.
개인 설치에는 일반적으로 소규모 Linux 구성이면 충분합니다. tropic.host에서는 FreshRSS에 별도 하위 도메인을 할당하고, 입문용 VPS로 시작하며, 가정용 컴퓨터와 독립적으로 서비스를 운영할 수 있습니다. 요금제를 선택할 때는 큰 CPU 여유보다 안정성, 아카이브 공간, 백업이 더 중요합니다.
결론
FreshRSS는 수십 개의 사이트를 알고리즘 순위 없이 관리 가능한 개인 피드로 바꿔 줍니다. 모바일 클라이언트, 필터, 저장된 쿼리, 다중 사용자, WebSub, 확장 기능을 지원하면서도 소형 VPS에서 실행할 수 있을 만큼 가볍습니다.
시작하려면 Docker, 도메인, SQLite가 필요합니다. 설치 후 카테고리, 자동 업데이트, HTTPS, 백업을 설정하십시오. 그러면 FreshRSS는 사용자가 선택한 소스만 보여 주고 읽기에 대한 통제권을 사용자에게 돌려줍니다.
FAQ
FreshRSS는 무료인가요?
예. FreshRSS는 AGPL-3.0 라이선스로 배포됩니다. 애플리케이션을 임대한 VPS에서 실행한다면 인프라 비용만 지불하면 됩니다.
도메인 없이 FreshRSS를 사용할 수 있나요?
예. 컨테이너 포트를 외부에 공개하면 됩니다. 다만 계속 사용할 목적이라면 도메인과 HTTPS를 설정하는 편이 좋습니다. 안전한 접속, 모바일 동기화, WebSub 사용이 더 간단해집니다.
FreshRSS에는 RAM이 얼마나 필요한가요?
개인 피드라면 1 GB RAM과 SQLite로 시작하는 것이 합리적입니다. 대규모 아카이브, 여러 사용자, 추가 서비스가 있다면 더 많은 메모리가 필요합니다.
RSS가 없는 사이트도 추가할 수 있나요?
경우에 따라 가능합니다. FreshRSS는 XPath를 이용한 웹 스크래핑을 지원하지만 규칙을 수동으로 설정해야 합니다. 사이트 레이아웃이 바뀌면 해당 소스를 수정해야 할 수 있습니다.
반드시 백업해야 하는 것은 무엇인가요?
가장 먼저 freshrss_data 볼륨을 백업해야 합니다. SQLite를 사용할 경우 이 볼륨에 글 데이터베이스가 들어 있습니다. freshrss_extensions도 보관하고, 외부 데이터베이스를 사용한다면 덤프를 생성하십시오.
