가지고 있는 음원 파일을 밖에서도 듣고 싶을 때 쓰는 오픈소스 서버가 여럿 있다. 기능 목록으로 고르면 판단이 흐려진다. 실제로 갈라지는 지점은 세 가지다.
프로토콜. 서버가 어떤 API 를 말하느냐가 쓸 수 있는 클라이언트를 정한다. Subsonic · OpenSubsonic 계열은 클라이언트 생태계가 가장 넓다. 자체 프로토콜만 쓰는 서버는 공식 앱에 묶인다.
클라이언트. 서버 선택보다 앱 선택이 만족도를 좌우한다. Android 와 iOS 를 모두 써야 한다면 이 조건이 사실상 서버를 결정한다.
외부 소스 포함 여부. 내 파일만 재생하면 되는지, 외부 스트리밍 서비스까지 한 화면에서 다루고 싶은지에 따라 갈래가 완전히 달라진다.
| 서버 | 성격 | 프로토콜 |
|---|---|---|
| Navidrome | Go 로 쓰인 경량 서버. 설치와 운영이 가장 간단하다 | Subsonic · OpenSubsonic |
| Funkwhale | 연합(federation) 구조. 다른 인스턴스와 음악을 공유한다 | 자체 + Subsonic 일부 |
| Ampache | 오래된 웹 기반 오디오·비디오 스트리밍. 기능이 많고 무겁다 | 자체 + Subsonic |
| Koel | PHP · Vue 로 만든 개인용 서버. UI 가 깔끔하다 | 자체 |
| Mopidy | 서버라기보다 확장 가능한 음악 플레이어. 플러그인으로 외부 서비스를 붙인다 | 자체(+ 프런트엔드 다양) |
| Lyrion Music Server | 예전 Logitech Media Server. 하드웨어 플레이어 연동이 강하다 | 자체 |
| musikcube | 터미널 기반. 서버와 클라이언트를 함께 제공한다 | 자체 |
내 음원을 스트리밍하는 목적이라면 Navidrome 이 기본 선택지다. 이유는 기능이 많아서가 아니라 Subsonic API 를 구현하기 때문 이다. 서버를 바꿔도 클라이언트를 그대로 쓸 수 있고, 클라이언트가 마음에 안 들면 서버를 그대로 두고 앱만 바꿀 수 있다.
메타데이터는 SQLite 에 담고 음원 파일은 읽기만 하므로, 서버를 갈아엎어도 원본이 상하지 않는다. 컨테이너 한 개로 뜨고 메모리도 적게 쓴다.
Android 와 iOS 양쪽 클라이언트가 필요한 경우에도 Subsonic 계열이 선택폭이 가장 넓다. 클라이언트마다 오프라인 캐시, 가사 표시, 가벼움에서 차이가 나므로 몇 개를 써 보고 고른다. 앱 목록과 유지보수 상태는 자주 바뀌므로 도입 시점에 확인한다. (확인 필요 — 개별 클라이언트 앱의 현재 지원 상태는 변동이 잦다.)
여러 사람과 음악을 나누고 싶다면 Funkwhale 이다. ActivityPub 기반으로 인스턴스끼리 연결되며, 라이브러리를 공개 범위로 나눠 공유할 수 있다. 대신 구성 요소가 많아 운영 부담이 Navidrome 보다 크다.
외부 스트리밍 서비스를 한 화면에서 다루고 싶다면 Mopidy 다. 플러그인으로 여러 소스를 붙이고 웹 프런트엔드를 얹는 구조라 유연하지만, 조립품이라 손이 많이 간다. 외부 서비스 플러그인은 그 서비스의 정책 변경에 자주 깨진다.
오디오 장비를 물려 쓰고 있다면 Lyrion Music Server 다. 전용 하드웨어 플레이어와 Squeezelite 계열 클라이언트를 다루는 데 강하다.
서버와 클라이언트가 같은 기계라면 musikcube 처럼 가벼운 것도 쓸 만하다.
태그가 정리되어 있어야 한다. 어떤 서버를 쓰든 화면은 파일의 태그를 보여 준다. 아티스트 · 앨범 · 앨범 아티스트 · 트랙 번호가 엉켜 있으면 라이브러리가 엉킨다. 서버를 올리기 전에 태그를 정리하는 편이 훨씬 싸다.
외부 공개는 별개의 일이다. 밖에서 들으려면 리버스 프록시와 TLS, 인증이 필요하다. 서버를 그대로 포트 포워딩으로 열지 않는다.
트랜스코딩을 할지 정한다. 무손실 파일을 그대로 내보내면 대역폭을 많이 쓴다. 모바일에서 들을 때만 낮은 비트레이트로 변환하도록 설정하면 데이터 사용량이 크게 준다. 변환은 CPU 를 쓰므로 작은 기기에서는 동시 접속 수를 고려한다.
백업 대상은 두 가지다. 음원 파일과 서버의 데이터베이스다. 데이터베이스에는 재생 횟수, 좋아요, 플레이리스트가 들어 있어 다시 만들 수 없다.