Bring Your Own Node: Relayium 릴레이 및 스토리지를 무료로 사용하기
마지막 업데이트: 2026-08-06
네트워크를 넘나드는 전송과 저장된 링크는 당사에 비용이 드는 릴레이 대역폭과 디스크를 사용하므로, 무료 허용량 내에서 동작하고 그 이상은 유료입니다. 이를 우회하는 방법이 있습니다. 직접 릴레이/스토리지 노드를 운영하여 계정에 연결하면, 전송이 당사가 아닌 내 노드를 통해 흐르며 종량 계측도 청구도 전혀 없습니다.
이는 Relayium 서버 전체를 셀프 호스팅하는 것과는 다릅니다. 평소 쓰던 relayium.com 계정과 동일한 앱을 그대로 사용하면서, 트래픽을 운반할 본인 소유의 노드를 추가하는 것뿐입니다. 이 가이드는 새로운 Linux 머신에서 온라인 노드까지 약 5분 만에 안내합니다.
왜 직접 노드를 운영해야 하나
두 가지 이유가 있습니다. 첫째, 비용입니다. 직접 운영하는 노드는 내 릴레이와 스토리지 트래픽을 직접 운반하므로 당사의 종량제 인프라에 전혀 닿지 않고 청구할 것이 없습니다. 사용량이 아무리 커도 무료입니다.
둘째, 통제권입니다. 릴레이된 바이트와 저장된 블롭은 직접 운영하고 본인의 운영 통제하에 있는 하드웨어에 존재합니다. 실시간 전송은 전 구간에서 종단 간 암호화를 유지하므로, 내 노드조차 항상 암호문만 보게 됩니다.
노드를 설치하고 온라인으로 만들기
1단계 전에 필요한 것
- 인터넷에서 접근 가능한 리눅스 서버 — 저렴한 VPS도, 집에 늘 켜둔 컴퓨터도 됩니다. amd64와 arm64 모두 지원합니다.
- 그 서버의 root 권한 또는 sudo. 설치할 때 한 번만 필요하며, 노드 자체는 결코 root로 실행되지 않습니다.
- 인바운드 포트를 열 수 있는 권한 — 호스트 방화벽에서, 그리고 클라우드 VPS라면 제공업체의 보안 그룹에서도.
- 로그인되어 있는 relayium.com 계정. 설치 명령은 계정 페이지에서 발급되며 일회용 토큰을 담고 있습니다.
- 디스크 공간은 중계뿐 아니라 저장까지 맡기려는 경우에만 필요합니다. 중계 전용 노드에는 필요 없으며 RELAYIUM_NODE_STORAGE_DIR을 빼면 됩니다.
순서대로 네 가지를 합니다. 명령을 발급받고, 실행하고, 포트를 열고, 노드가 온라인이 되었는지 확인합니다. 새 서버라면 5분 정도입니다.
relayium.com에 로그인하고 계정 페이지 /me를 엽니다.
내 노드까지 내려가 노드 추가를 누릅니다. 설치 명령을 즉시 복사하세요 — 그 안의 토큰은 한 번만 표시되고 다시는 볼 수 없습니다.
서버에 붙여 넣어 실행합니다. relayium-node 바이너리를 내려받아 체크섬을 검증하고, /usr/local/bin에 설치하고, systemd 서비스를 작성한 뒤 시작합니다.
curl -fsSL https://relayium.com/install-node.sh | sudo RELAYIUM_CENTRAL_URL=https://relayium.com RELAYIUM_NODE_TOKEN=<your-token> RELAYIUM_NODE_STORAGE_DIR=/var/lib/relayium-node/blobs sh서비스가 떠 있고 재부팅 후에도 돌아오는지 확인합니다. 두 답이 모두 중요합니다. active는 지금 돌고 있다는 뜻이고, 재부팅을 견디게 하는 것은 enabled입니다.
systemctl is-active relayium-nodesystemctl is-enabled relayium-node호스트 방화벽에서 인바운드 포트를 엽니다. 온라인 표시에는 아웃바운드만 있으면 되지만, 상대가 중계하고 저장하는 통로는 이 포트들입니다.
sudo ufw allow 3478/udp # TURN sudo ufw allow 8081/tcp # storage sudo ufw allow 49152:65535/udp # relay클라우드 VPS라면 제공업체의 보안 그룹에서도 같은 포트를 허용하세요. ufw만으로는 상위에서 막힌 채로 남고, 그동안 노드는 계속 정상으로 보입니다.
/me로 돌아가 노드가 온라인으로 바뀌는지 지켜봅니다 — 보통 30초 정도입니다. 그 뒤로 계정의 전송은 자동으로 이 노드를 우선합니다.
선택: 「중계/저장에 내 노드만 사용」을 켜면 공유 인프라로 조용히 되돌아가는 대신 전송이 실패합니다.
정상적인 노드의 모습
systemd가 서비스를 active이자 enabled로 보고하고, 내 노드 아래에서 노드가 온라인으로 표시됩니다. active만으로는 부족합니다 — enabled가 아닌 노드는 다음 재부팅에 사라집니다.
$ systemctl is-active relayium-node
active
$ systemctl is-enabled relayium-node
enabled- <your-token> 부분은 계정 페이지에서 자동으로 채워집니다. 위의 자리 표시자를 그대로 붙여넣지 마세요.
- RELAYIUM_NODE_STORAGE_DIR는 릴레이뿐 아니라 블롭 스토리지도 켭니다. 노드가 저장하지 않고 릴레이만 하기를 원한다면 이를 끈 채로(변수를 생략) 두세요.
- 시작되었는지 확인: systemctl status relayium-node(active/running으로 표시되어야 함).
- 부팅 지속성 확인: systemctl is-enabled relayium-node(enabled로 표시되어야 함).
- 로그 실시간 확인: journalctl -u relayium-node -f.
- 3478/udp는 피어가 릴레이에 사용하는 TURN 포트이고, 8081/tcp는 블롭 스토리지 HTTP 포트이며, 49152–65535/udp는 릴레이 미디어 범위입니다.
- 클라우드 VPS에서는 ufw뿐 아니라 공급자의 보안 그룹/네트워크 방화벽에서도 이들을 허용하세요.
이 설치 프로그램을 root로 실행해도 안전한가요?
무엇보다 먼저: BYO 노드는 당사 자체 플릿 노드와 완전히 같은 코드, 완전히 같은 강화 설정으로 동작합니다 — 같은 서명된 릴리스의 같은 바이너리를, 같은 스크립트로, 같은 systemd 유닛 아래에 설치합니다. 유일한 차이는 그 머신이 누구의 것이냐뿐입니다. 아래 설명은 양쪽 모두에 해당합니다.
인터넷에서 받아온 스크립트를 root 셸로 파이프하는 명령에 대해 나올 만한 질문이며, “괜찮습니다”라는 안심 대신 구체적인 답을 받을 자격이 있습니다. root는 설치에만 쓰이고, 그 이후 노드가 하는 일에는 전혀 쓰이지 않습니다. 설치 프로그램은 로그인 셸도 홈 디렉터리도 없는 relayium-node 시스템 계정을 만들고, systemd 유닛을 작성하고, 서비스를 시작한 뒤 종료합니다. 노드 자체는 결코 root로 실행되지 않습니다. 유닛에 User=relayium-node가 지정되어 있어, 온라인이 되는 순간부터 내 머신에서 아무것도 소유하지 않은 비특권 계정입니다. (기본으로 켜져 있는 자동 업데이트는 root로 실행되는 두 번째 유닛을 추가합니다 — 다음 절 전체가 그 유닛이 무엇을 할 수 있고 무엇을 할 수 없는지에 대한 이야기입니다.)
그 계정 주위로 유닛은 systemd 샌드박스를 두릅니다. 모든 줄이 “노드 프로세스가 장악당했을 때 공격자가 다음으로 손을 뻗을 대상”을 겨냥합니다. 감춰 둔 것은 없습니다. 설치 후 cat /etc/systemd/system/relayium-node.service로 유닛 전체를 읽어 보세요.
| 유닛의 설정 | 노드가 침해되었을 때 무엇을 막는가 |
|---|---|
User=relayium-node | 공격자는 아무것도 가지지 않은 사용자일 뿐이며 root가 아닙니다. |
ProtectHome=yes | /home과 /root가 보이지 않습니다 — SSH 개인키도, 다른 프로젝트의 데이터도 훔칠 수 없습니다. |
ProtectSystem=strict | 파일 시스템 전체가 읽기 전용이라 어떤 시스템 파일도 수정할 수 없습니다. |
ReadWritePaths= | 쓸 수 있는 곳은 노드 자신의 상태 디렉터리와, 스토리지를 설정한 경우 그 디렉터리뿐입니다. 다른 곳에 대한 쓰기는 모두 실패합니다. |
NoExecPaths= | 스토리지 디렉터리 안의 것은 실행할 수 없습니다 — 업로드된 파일이 실행될 수 없습니다. |
NoNewPrivileges=yes | root로 돌아갈 경로가 없어 흔한 권한 상승 수법이 막힙니다. |
CapabilityBoundingSet= | 비어 있음 — Linux 케이퍼빌리티를 전혀 부여하지 않습니다. |
ProtectKernelTunables=yes, ProtectKernelModules=yes | 커널에 손이 닿지 않습니다: sysctl 변경도, 모듈 로드도 불가능하고 루트킷을 심을 수 없습니다. |
- ReadWritePaths와 NoExecPaths가 스토리지 디렉터리를 가리키는 것은 실제로 저장을 하는 노드뿐입니다. 릴레이 전용 노드에는 두 줄 모두 없으며, 자신의 상태 디렉터리 외에는 어디에도 쓸 수 없습니다.
- 일반적인 구성에서 케이퍼빌리티 집합은 비어 있습니다. 유일한 예외는 직접 다운로드 리스너를 1024 미만 포트에 두는 경우로, 바인딩에 CAP_NET_BIND_SERVICE가 필요합니다. 기본 다운로드 포트는 1024보다 큰 2053이므로 아무것도 부여되지 않습니다.
- 노드는 키를 갖고 있지 않습니다. 파일은 업로드되기 전에 보내는 쪽에서 암호화되므로, 스토리지 노드에 도달하는 것은 그 노드가 읽을 수 없는 암호문입니다 — 내 노드도, 본인도 읽을 수 없습니다.
자동 업데이터가 할 수 있는 일과 할 수 없는 일
설치 프로그램은 자동 업데이트 타이머도 설정하며, 기본값은 켜짐입니다. relayium-node-update.timer가 약 10분마다 relayium.com에 “이 노드는 어떤 버전을 실행해야 하는지”를 묻습니다. 이것은 두 번째 유닛이고 root로 실행되므로, 그 자신에 대한 설명도 마땅히 필요합니다.
중앙은 결코 바이너리를 보내지 않습니다. 응답의 전부는 버전 번호, 두 개의 플래그(이 노드가 지금 움직여도 되는지, 이것이 의도적인 다운그레이드인지), 그리고 짧은 사유 문자열입니다 — 바이트도, URL도, 명령도 없습니다. 그다음 노드가 스스로 그 릴리스를 받아 아카이브의 SHA-256을 릴리스의 checksums.txt와 대조하고, checksums.txt에 대한 ECDSA P-256 서명을 바로 그 검증을 수행하는 바이너리 자체에 컴파일되어 들어 있는 공개키로 검증합니다. 그 키의 개인키 쪽은 이 폴링에 답하는 서버에 있지 않습니다. 따라서 중앙이 침해되더라도 버전을 지목할 수는 있어도, 검증을 통과하는 바이너리를 만들어 낼 수는 없습니다.
업데이터와 노드는 권한이 정반대인 두 개의 별도 프로세스입니다. relayium-node.service는 위의 샌드박스 그 자체로, ProtectSystem=strict 아래에서는 /usr/local/bin에 쓰는 것 자체가 불가능합니다. 즉 노드는 자기 것을 포함해 어떤 바이너리도 수정할 수 없습니다. relayium-node-update.service는 root로 실행되는 작은 oneshot 유닛이며 의도적으로 샌드박스를 두르지 않습니다. /usr/local/bin의 파일을 교체하려면, 바로 노드의 샌드박스가 막으려는 그 권한이 필요하기 때문입니다. 그 권한을 노드 본체의 강화를 느슨하게 푸는 대신 단일 목적 유닛 하나에 가둬 두는 것 — 그것이 이 분리의 핵심입니다. root를 가진 프로세스는 바이너리를 교체만 하고, 우리 안의 프로세스는 결코 바이너리에 손댈 수 없습니다.
업데이트가 잘못되면 스스로 되돌립니다. 업데이터는 이전 바이너리를 새 바이너리 옆에 남겨 두고 서비스를 재시작한 뒤 최대 10분간 하트비트를 지켜봅니다. 그 시간 안에 새 버전이 정상이라고 보고하지 않으면 이전 바이너리를 되돌려 놓고 다시 재시작하며, 그 불량 버전을 기록해 다시 시도하지 않습니다. 이 과정에서 저장된 파일이 읽히거나 옮겨지거나 삭제되는 일은 전혀 없습니다.
- 원하지 않는다면: RELAYIUM_NODE_AUTO_UPDATE=off를 주고 설치 프로그램을 다시 실행하세요. 타이머와 그 서비스는 비활성화되고 삭제됩니다. 노드는 계속 동작하며, 업데이트 시점은 직접 정합니다.
- 노드를 완전히 그만두려면: 아래 “노드 제거하기”를 보세요.
노드 제거하기
제거는 스크립트 하나로 끝나며, 파일을 저장하는 노드든 릴레이만 하는 노드든 같은 스크립트를 씁니다. 유닛, 바이너리, 설정, 서비스 계정을 제거하고 노드가 사라졌음을 relayium.com에 최선을 다해 알립니다. 그 호출이 실패해도 터미널에 한 줄이 더 나올 뿐 제거가 고장 난 것은 아니며, 노드 ID가 출력되므로 수동으로 제거됨 표시를 할 수 있습니다.
내려받고, 확인한 다음 실행하세요. sh로 바로 파이프하면 404나 일시적인 네트워크 문제에서 명령 전체가 아무것도 출력하지 않고 종료 코드 0으로 끝나, 제거가 성공한 것처럼 보입니다.
아는 것만 지웁니다. 상태 디렉터리나 저장 디렉터리에 예상치 못한 파일이 있으면 지우지 않고 보관한 뒤 보고합니다.
curl -fsSL https://relayium.com/uninstall-node.sh -o uninstall-node.sh && \
[ -s uninstall-node.sh ] && sudo sh uninstall-node.sh
- 저장 디렉터리에 알아보지 못하는 파일이 하나라도 남아 있으면 거부합니다(정리가 아직 닿지 않은 만료된 blob도 마찬가지). 저장된 파일은 정확히 한 노드에만 있고 복제본이 없기 때문입니다. 0이 될 때까지 기다리거나, 그 파일들이 도달 불가능해지는 것을 감수하고 RELAYIUM_NODE_FORCE=1을 넘기세요.
- blob이 어디 있는지 판단할 수 없으면 추측하지 않고 멈춥니다. RELAYIUM_NODE_ASSUME_NO_STORAGE=1이 유일한 통과 방법이며, 그래도 알아보지 못하는 것은 삭제하지 않습니다.
- 저장 디렉터리 자체는 RELAYIUM_NODE_PURGE_STORAGE=1을 함께 넘기지 않는 한 남습니다. 환경 변수는 | sudo sh를 넘지 못하므로 sudo env RELAYIUM_NODE_PURGE_STORAGE=1 sh uninstall-node.sh 형태로 넘기세요.
- 그다음 systemctl status relayium-node는 not-found여야 하고 relayium-node 타이머도 보이지 않아야 합니다. 나중에 다시 설치하면 계정에 생기는 것은 완전히 새 노드입니다. 제거가 노드의 신원 파일을 지우므로, 재설치는 옛 노드를 되살리는 것이 아니라 새로 등록하는 것입니다.
잘 안 될 때
올라오지 않는 노드는 거의 모두 다섯 가지 중 하나이며, 그중 셋은 서버에서 보면 멀쩡합니다. 서비스는 돌고 있고, 아니라고 말해 주는 것은 계정 페이지나 리스닝 소켓뿐입니다.
증상, 확인, 해결
- 셸이 「relayium-node: command not found」라고 답합니다.
command -v relayium-node # 아무것도 출력되지 않음바이너리가 설치되어 있지 않습니다. relayium-node를 따로 설치하는 일은 없습니다 — 계정 페이지의 한 줄 명령이 바로 바이너리를 내려받아 PATH에 놓고 서비스로 시작해 주는 것입니다. 그 명령을 실행하세요.
- 서비스는 active인데 계정 페이지에서 노드가 끝내 온라인이 되지 않습니다.
journalctl -u relayium-node -n 50 --no-pager온라인 여부는 아웃바운드 하트비트로 결정되므로 여기서 방화벽이 원인인 경우는 드물고, 대개 등록 실패입니다. 토큰은 일회용이라 이미 실행한 명령이나 이전 시도에서 남은 옛 명령은 실패합니다. 노드 추가를 다시 눌러 새 명령을 받아 실행하세요.
- 노드는 온라인인데 전송이 여전히 공유 인프라를 지나갑니다.
sudo ss -lunp | grep 3478온라인은 아웃바운드 하트비트만 증명합니다. 상대에게 필요한 것은 인바운드 포트입니다. 노드가 리스닝 중인지 확인한 뒤 호스트 방화벽과 클라우드 보안 그룹 양쪽에서 3478/udp, 8081/tcp, 49152-65535/udp를 여세요. 조용한 폴백을 완전히 배제하려면 내 노드만 사용 설정을 켜면 됩니다.
- 제거 명령이 아무것도 출력하지 않고 종료 코드 0으로 끝났는데 서비스는 그대로입니다.
systemctl status relayium-node # active (running)실패한 다운로드를 sh로 파이프했을 때의 모습 그대로입니다. 404나 일시적인 네트워크 문제는 아무것도 출력하지 않고 종료 코드 0으로 끝나 성공처럼 읽힙니다. 스크립트를 내려받고 비어 있지 않은지 확인한 다음 실행하세요 — 이 문서의 명령이 파이프 하나가 아니라 세 부분으로 쓰인 이유가 그것입니다.
- 저장 디렉터리에 아직 파일이 남아 있어 제거가 거부됩니다.
sudo ls /var/lib/relayium-node/blobs | wc -l의도된 동작입니다. 저장된 파일은 정확히 한 노드에만 존재하고 복제본이 없으므로, 노드를 없애면 그 파일들에 다시 닿을 수 없습니다. 블롭이 만료되어 개수가 0이 될 때까지 기다리거나, RELAYIUM_NODE_FORCE=1로 그 손실을 감수하세요. 환경 변수는 sudo sh로 가는 파이프를 넘지 못하므로 sudo env RELAYIUM_NODE_FORCE=1 sh uninstall-node.sh 형태로 넘겨야 합니다.
자주 묻는 질문
“relayium-node: command not found”가 떴습니다 — 무엇이 잘못되었나요?
relayium-node 바이너리를 설치하기 전에 실행한 것입니다. 계정 페이지의 한 줄 설치 명령어(curl … | sudo … sh 형태)를 사용하세요. 이것이 바이너리를 다운로드하여 PATH에 놓고 서비스로 시작합니다. relayium-node를 별도로 설치하는 일은 결코 없습니다.
재부팅 후에도 노드가 온라인을 유지하나요?
네. 설치 프로그램은 부팅 시 활성화되고 Restart=always로 설정된 systemd 서비스를 등록하므로, 재부팅 후 복귀하고 충돌하면 스스로 재시작합니다. 추가로 실행할 것은 없습니다.
이것은 Relayium 셀프 호스팅과 어떻게 다른가요?
Bring-your-own-node는 평소의 relayium.com 계정과 앱을 그대로 유지하면서 트래픽을 운반할 본인 소유의 노드를 추가하는 것뿐입니다. 셀프 호스팅은 서버 스택 전체(계정, 웹 앱, 시그널링)를 본인 도메인에서 운영합니다. 이에 대해서는 “Relayium 셀프 호스팅” 가이드를 참조하세요.
다른 사람이 제 노드를 사용하거나 제 데이터를 볼 수 있나요?
아니요. 노드는 토큰으로 내 계정에 연결되어 그 계정의 트래픽만 운반합니다. 실시간 전송은 종단 간 암호화되고, 저장된 블롭은 내 노드가 읽을 수 없는 암호문입니다. 내 데이터와 노드 구성은 오직 본인만 사용할 수 있습니다.
로그인하여 계정 페이지를 열고 1분도 안 되어 첫 노드를 추가하세요.
계정 페이지 열기