# Homelab

홈랩 관련 문서

# 홈랩이란?

한국에선 좀 생소한 단어 같은데, 홈랩은 "home laboratory = 집에 있는 연구소" 입니다. 연구소라고는 하는데 보통 이 업계(?)에선 집에 서버 같은 걸 들여서 이것저것 서비스를 직접 하는 걸 말합니다.

# 하드웨어

홈랩을 구성하는 하드웨어 부분

# 홈 네트워크 구성

여러 서비스를 스스로 운영하려면 결국 서버를 돌려야 합니다. 한국에서는 일반 가정집에서 서버를 돌리는 것은 여러가지 제약이 있는데, 다음과 같은 문제가 있습니다.

1. 80(http), 443(https) port 가 막혀있는 경우 (정확히는 inbound가 막힘) 
    1. 외부에서 네트워크를 통해 내부의 정보를 요청할 수 없으므로 서버가 있어도 서비스가 불가능
2. 속도가 느림

위 문제가 대표적인데, 이것을 우회하여 웹 서비스를 할 수 있는 방법이 몇가지 존재합니다.

# OCI (오라클 클라우드)

오라클 클라우드에 대해...

여러 클라우드 서비스가 있고 인터넷에 연결된 VM을 운영할 수 있지만, 완전히 무료로 쓸 수 있는 신뢰할 수 있는 서비스가 몇 없습니다. 가장 크고 기업용으로도 쓰이는 서비스가 aws, azure, gcp (google cloud) 이 세가지인데, 아무리 light하게 쓰더라도 비용을 피할 수는 없습니다.

# UPS setting

##### UPS란?

UPS는 `Uninterruptible Power Supply`(무정전 전원 장치)의 약자로, 갑작스러운 순간 정전이나 긴 정전, 전력이 불안정한 상황에 연결된 장치에 일정시간 동안 안정된 전력을 계속 공급할 수 있는 장치이고, 고급형의 경우 외부 전력을 양질의 전력으로 바꿔주는 기능도 합니다. (DC로 변환한 후 다시 순수 sine파 AC로 재변환)

24시간 동작하는 서버 등 중요한 장비의 오작동을 방지하고 안전한 종료를 보장하는 기기입니다.

<table border="1" id="bkmrk-%EC%9C%A0%ED%98%95-%EB%B3%80%ED%99%98-%EB%B0%A9%EC%8B%9D-%EC%96%91%EC%A7%88-%EC%A0%84%EB%A0%A5-%EC%A0%9C%EA%B3%B5-%EC%97%AC%EB%B6%80" style="border-collapse: collapse; width: 100%; height: 169.36px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr><td>유형</td><td>변환 방식</td><td>양질 전력 제공 여부</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">오프라인</td><td style="height: 29.7969px;">직통 + 정전 시 변환</td><td style="height: 29.7969px;">제한적</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">라인 인터랙티브</td><td style="height: 29.7969px;">부분 조정 + 변환</td><td style="height: 29.7969px;">중간</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">온라인</td><td style="height: 29.7969px;">항상 이중 변환 (AC-DC-AC)</td><td style="height: 29.7969px;">우수</td></tr></tbody></table>

##### UPS 운영 전략

만약 가지고 있는 기기가 UPS와 서버 1대로만 이루어져 있다면, ups에서 제공하는 usb cable과 전원 케이블을 서버와 직통으로 연결해서 관리해도 됩니다. 보통 시놀로지, unraid 등의 유명 운영체제는 기본적으로 ups agent가 미리 내장되어 설정할 수 있습니다.

다만, ups에 서버가 여러대 연결될 경우엔, usb cable에 연결된 장치는 보호받을 수 있지만 정전 정보를 받을 수 없는 나머지 기기들은 배터리가 다 소진될때까지 동작하다가 갑자기 꺼져버리게 되어 의미가 없습니다.

이런 경우 대안은 NUT를 운영하는 것입니다. ups의 usb 케이블은 NUT master에서 받아서 전원을 관리하고, 유사 시 정전 정보를 브로드캐스팅하며 각 서버의 NUT slave에서 이 정보를 받아 안전하게 서버를 종료합니다.

[NUT](https://networkupstools.org/index.html)는 `Network UPS tools`의 약자이며 ups 뿐만 아니라 PDU, 태양광 장치 등의 전력 기기의 모니터링을 위한 소프트웨어 모음입니다. 서드파티에서 관리하는 만큼 최신형 기기나 해당 ups가 네트워크 관련 특화로 별도 드라이버를 제공하지 않는 경우 NUT에서 모니터링이 어려운 경우도 있습니다. 여담으로 ups 상태를 모니터링하는 dashboard docker app으로 [PeaNUT](https://github.com/Brandawg93/PeaNUT)이 있습니다.

##### 라즈베리파이 서버

우선 ups 정보를 24시간 감시할 저젼력 서버를 준비합니다. 24시간 감시를 해야하므로 항상 켜져 있어야 하지만, 시스템 자원은 아주 적게 소모하기 때문에 라즈베리파이 서버가 가장 좋은 대안이긴 합니다. 하지만 필요에 따라서 docker를 운영할 수 있는 어떤 서버도 문제 없습니다.

우선 ups의 usb 케이블을 연결한 후 rpi의 터미널에서 다음 명령으로 출력을 확인합니다.

```shell
lsusb | grep -i ups # 연결된 장치에서 ups를 포함하는 장치 확인
```

잘 연결되어 있는 상태라면 다음과 비슷한 응답이 돌아옵니다.

[![스크린샷 2026-01-02 13.04.06.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/GIsNe08hbqHnvXnF-2026-01-02-13-04-06.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/GIsNe08hbqHnvXnF-2026-01-02-13-04-06.png)

여기서는 vender id `051d`와 product id `0003`이 중요합니다. 다음으로 docker compose 파일을 작성합니다.

```yaml
services:
  nut-upsd:
    image: instantlinux/nut-upsd:latest
    container_name: nut-upsd
    restart: unless-stopped
    ports:
      - "3493:3493"
    environment:
      - TZ=Asia/Seoul
      - API_USER=upsmon
      - API_PASSWORD=upsmon # need to change if server expose
      - DRIVER=usbhid-ups
      - GROUP=nut
      - NAME=ups
      - POLLINTERVAL=15
      - PORT=auto
      - SERVER=master # master mode
      - VENDORID=051d # lsusb
      - DESCRIPTION=APC Smart-UPS SMT750RMI2UC
    devices:
      - /dev/bus/usb:/dev/bus/usb
    privileged: true
    volumes:
      - nut-config:/etc/nut
    healthcheck:
      test: ["CMD", "upsc", "ups@localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
  peanut:
    image: brandawg93/peanut:latest
    container_name: PeaNUT
    restart: unless-stopped
    depends_on:
      - nut-upsd
    environment:
      WEB_PORT: 8080
    ports:
      - "8080:8080" # Access the dashboard at http://localhost:8080
    volumes:
      - /path/to/config:/config

volumes:
  nut-config:
```

위 설정에서는 간단한 배터리 대시보드인 peanut 서비스까지 통합했습니다.

보통 포트는 일반적으로 3493번을 이용합니다. docker-compose 파일을 작성한 후 docker 를 동작시키면 다음과 같은 응답을 받을 수 있습니다.

[![스크린샷 2026-01-02 13.38.33.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/PXTA7oDUi8lANaUS-2026-01-02-13-38-33.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/PXTA7oDUi8lANaUS-2026-01-02-13-38-33.png)

##### load가 표시되지 않는 경우

APC ups의 경우 기본적으로 modbus가 비활성화되어 있고 이것 때문에 upsd의 출력 중에 load가 노출되지 않는 경우가 있습니다. 그래서 nut-upsd -&gt; peanut -&gt; homepage dashboard에서 load가 NaN으로 표시되는 경우가 있습니다.

[https://forums.unraid.net/topic/74208-apc-smartups-setup/#comment-736429](https://forums.unraid.net/topic/74208-apc-smartups-setup/#comment-736429)

[![스크린샷 2026-01-02 15.11.21.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/d4tJ526W2h4AIcfM-2026-01-02-15-11-21.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/d4tJ526W2h4AIcfM-2026-01-02-15-11-21.png)

이때엔 APC UPS 자체의 설정에서 modbus를 활성화하면 된다고 합니다.

1. 화면에 표시되는 메뉴를 통해 UPS의 고급 설정 옵션을 활성화합니다.
2. 설정 옵션을 열고 ModBus를 찾을 때까지 아래로 스크롤합니다.
3. ModBus를 활성화로 변경하십시오. 모든 APC UPS 장치에서 ModBus는 기본적으로 비활성화되어 있습니다.

# rpi5 cluster

rpi5 cluster에 microk8s 패키지를 설치해서 클러스터를 구성하는 방법을 알아보자.

- 현재 rpi5 기기는 4대가 준비되어 있고, 구성은 master node 3대, worker node 1대로 구성하기로 함
- 원래 5대였으나 1대는 집안에서 완벽하게 365일 전원이 들어오는 서버로 활용하려고 따로 빼놓음. 만약 이경우엔 master 3대, worker 2대로 구성했을 듯

[https://ubuntu.com/tutorials/how-to-kubernetes-cluster-on-raspberry-pi](https://ubuntu.com/tutorials/how-to-kubernetes-cluster-on-raspberry-pi) ubuntu를 만든 캐노니컬에서 microk8s도 만들고 있기 때문에 아주 권장되는 조합이고 공식 매뉴얼에서도 라즈베리 몇대를 묶어 ubuntu + microk8s 를 설치하는 가이드를 찾을 수 있다.

우선 여러개의 터미널을 동시에 입력시킬 수 있는 앱 (여기서는 윈도에서 termius를 사용합니다)으로 4개의 터미널을 띄움

[![스크린샷 2026-01-03 225721.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/AoWqejOKgxuCaMqn-2026-01-03-225721.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/AoWqejOKgxuCaMqn-2026-01-03-225721.png)

이런 터미널 앱들은 기본적으로 모든 터미널에 같은 키보드 입력을 할 수 있는 기능이 있으므로 기본적인 업데이트나 k8s 설치를 동시에 진행하는 것이 편리합니다.

참고로 microk8s 를 설치할 것이기 때문에 docker 를 설치할 필요는 없어서 기본적인 업데이트 후 바로 snap으로 microk8s를 설치합니다.

```bash
apt update && apt upgrade
```

ubuntu와 rpi5의 조합에서는 microk8s를 설치하기 전에 몇가지 작업이 더 필요하다. `/boot/firmware/cmdline.txt` 에 cgroups를 활성화시켜 줘야 하고, 24.04 이전 버전의 경우 추가 패키지도 설치해야 한다. 자세한 내용은 [여기](https://canonical.com/microk8s/docs/install-raspberry-pi) 참조

```bash
sudo nano /boot/firmware/cmdline.txt
```

마지막 줄에 다음 내용 추가

```
cgroup_enable=memory cgroup_memory=1
```

이제 microk8s 설치

```bash
sudo snap install microk8s --classic # 자동 설치
sudo usermod -a -G microk8s $USER # sudo를 사용하지 않고 microk8s 를 조작할 수 있음
sudo chown -f -R $USER ~/.kube
su - $USER

microk8s status --wait-ready # 정상 서비스 상태가 될때까지 기다림
```

이제 편리한 alias 설정을 위해 bashrc 파일을 편집하자.

```bash
{
    echo alias kubectl="'microk8s kubectl'"
    echo alias kcd="'microk8s kubectl describe'"
} >> ~/.bashrc && \
source ~/.bashrc
```

위의 alias가 잘 동작하는지 확인 및 필요한 addon 활성화

```bash
kubectl get nodes
kubectl get pods
kubectl get services

microk8s enable ha-cluster # master node가 3대 이상일 경우 high availability cluster를 사용할 수 있으므로 addon 활성화

microk8s enable dashboard
microk8s enable dns
microk8s enable registry
```

이제부터는 클러스터 구성을 위해 전체 입력 가능한 기능을 끄고 개별적으로 입력하면 됩니다.

```bash
$ microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46 --worker

If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join 192.168.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46
microk8s join fd6c:2c0c:b217:3d0b:2ecf:67ff:fe93:8166:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46
```

`microk8s add-node` 를 입력하면 각 노드를 클러스터로 묶기 위한 코드와 키를 확인할 수 있습니다. 이 키는 한번만 사용할 수 있기 때문에 노드를 추가할 때마다 실행해서 새로운 키를 받아야 합니다. 또한 포트는 25000을 사용하기 때문에 내부 네트웍이 아닌 외부에서 vm끼리 묶을 경우 25000번 포트를 방화벽에서 허용할 필요도 있습니다.

2번 및 3번 rpi는 master node로 추가할 것이기 때문에 `--worker` 옵션을 넣지 않고 join하면 됩니다.

```bash
$ microk8s join 192.168.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46
WARNING: Hostpath storage is enabled and is not suitable for multi node clusters.

Contacting cluster at 192.168.1.42
Waiting for this node to finish joining the cluster. .. .. .. ..  
Successfully joined the cluster.
```

4번 rpi는 worker 노드로 join할 것이기 때문에 `--worker` 옵션을 추가합니다.

이 과정을 3번 반복하면 총 4대가 클러스터링이 됩니다. 이후 `microk8s status` 명령으로 상태를 확인하면 자동으로 ha-cluster 기능이 활성화된 것을 확인할 수 있습니다.

```bash
$ microk8s status
microk8s is running
high-availability: yes
  datastore master nodes: 192.168.1.42:19001 192.168.1.43:19001 192.168.1.44:19001
  datastore standby nodes: none
addons:
  enabled:
    dashboard            # (core) The Kubernetes dashboard
    dns                  # (core) CoreDNS
...
```

# 홈랩 구축기

대략의 구성은 다음과 같다.

1. OCI VM : 외부에 도메인과 연결해서 홈랩 내부 서비스를 proxy해주는 서버, 모니터링이나 OIDC SSO 서비스도 여기서 docker로 추가
2. 라우터 : n305 미니피시, wifi7 ap, 및 opnsense 구성
3. 스위치허브 : 알리익스프레스 산 10Gbe, POE 지원 스위치 허브. 10Gb로 구성됨
4. 홈서버 #1 : proxmox (PVE) 하이퍼바이저 운영. VM, LXC, 그리고 docker로 여러 서비스 운영
5. 홈서버 #2 : 베어메탈로 proxmox backup server (PBS) 운영하면서 vm 등의 컨테이너와 unraid hdd 백업
6. 홈서버 #3 : unraid storage server 운영. rtx 4000 ada GPU도 포함되어 있어 AI 모델 테스트도 병행
7. 라즈베리파이5 클러스터 : 쿠버네티스 테스트용. 개인적으로는 k8s를 본격적으로 공부하긴 벅차고 microk8s 기반 워드프레스로 블로그 설치하는 정도로 운영
8. 메인 데스크탑 : 델 웍스 (스레드리퍼7955wx) - 2cpu에서 미개봉 제품에서 옵션을 엄청나게 제거해서... 스레드리퍼 치고 생각보다 매우 싸게 구매

# 소프트웨어

홈랩을 구성하는 소프트웨어, self-hosted 앱 및 설정

# pocket-id

간단한 OIDC (open id connect) provider입니다. 가장 큰 특징은 passkey만 지원한다는 것인데, 이점이 약간의 호불호가 있긴 합니다.

- site : [https://pocket-id.org/](https://pocket-id.org/)
- git : [https://github.com/pocket-id/pocket-id](https://github.com/pocket-id/pocket-id)

[![스크린샷_2025-12-21_005054.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/Fdeq5qCFY8aKtAfi-2025-12-21-005054.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/Fdeq5qCFY8aKtAfi-2025-12-21-005054.png)

passkey에 관해서는 따로 이야기해야 할 정도이지만 쉽게 말하면 기존과 같은 패스워드 기반이 아니라, 특정 보안 하드웨어 또는 생체 인식 등으로 인증을 대신하는 것입니다.

[![스크린샷_2025-12-21_005127.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/BHqz0qJ4wVvKVaac-2025-12-21-005127.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/BHqz0qJ4wVvKVaac-2025-12-21-005127.png)

저같은 경우 제 노트북과 데스크탑에 하드웨어 키, 그리고 vaultwarden에 패스키를 등록했고 이를 인증에 이용하도록 세팅했습니다.

##### install

기본적으로 docker compose 를 추천하고 있습니다.

```shell
# curl -o docker-compose.yml https://raw.githubusercontent.com/pocket-id/pocket-id/main/docker-compose.yml
# curl -o .env https://raw.githubusercontent.com/pocket-id/pocket-id/main/.env.example
```

curl 명령으로 기본적인 템플릿을 다운로드받아서, 자신의 환경에 맞게 수정해주면 됩니다.

```yaml
services:
  pocket-id:
    image: ghcr.io/pocket-id/pocket-id:v1
    restart: unless-stopped
    env_file: .env
    ports:
      - 1411:1411
    volumes:
      - "./data:/app/data"
    # Optional healthcheck
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.pocket-id.rule=Host(`YOUR_OIDC_DOMAIN`)"
      - "traefik.http.routers.pocket-id.entrypoints=websecure"
      - "traefik.http.routers.pocket-id.tls=true"
      - "traefik.http.routers.pocket-id.tls.certresolver=letsencrypt"
      - "traefik.http.services.pocket-id.loadbalancer.server.port=1411"
    networks:
      - proxy
    healthcheck:
      test: [ "CMD", "/app/pocket-id", "healthcheck" ]
      interval: 1m30s
      timeout: 5s
      retries: 2
      start_period: 10s

networks:
  proxy:
    external: true
```

.env 파일도 자신의 환경에 맞게 수정하면 됩니다.

```bash
# See the documentation for more information: https://pocket-id.org/docs/configuration/environment-variables

# These variables must be configured for your deployment:
APP_URL=https://auth.your.domain

# Encryption key (choose one method):
# Method 1: Direct key (simple but less secure)
# Generate with: openssl rand -base64 32
ENCRYPTION_KEY=...
# Method 2: File-based key (recommended)
# Put the base64 key in a file and point to it here.
# ENCRYPTION_KEY_FILE=/path/to/encryption_key

# These variables are optional but recommended to review:
TRUST_PROXY=true
MAXMIND_LICENSE_KEY=...
PUID=1000
PGID=1000
```

`TRUST_PROXY` 옵션은 해당 docker가 리버스프록시 뒤에 있을 경우 설정해주면 됩니다. `MAXMIND_LICENSE_KEY` 는 audit log에서 접속된 IP의 지리적 정보를 취득하는데 이용합니다. 만약 키가 없을 경우 ip의 위치는 알수 없음으로 표시됩니다.

---

개별 서비스에 pocket-id를 OIDC로 등록하는 방법은 어느정도 공통적인 매뉴얼이 있으나, pocket-id docs에서 잘 알려진 앱들의 개별적인 세팅 방법도 소개하고 있다. [https://pocket-id.org/docs/client-examples](https://pocket-id.org/docs/client-examples)

# traefik

간단히 "리버스 프록시"인데, 정말 많은 기능을 가지고 있습니다. 그만큼 쓰기는 좀 어렵긴 하네요.

1. docker, k8s 등의 컨테이너 환경과 연동해서 서비스를 자동으로 도메인과 연결해서 외부에 노출시켜 줍니다. 
    1. docker 를 사용할 경우 설정에서 label을 붙이면 traefik이 자동으로 인식하여 라우팅해줍니다.
2. 자동으로 letsencrypt의 인증서 발급 및 갱신 (with CloudFlare)
3. 로드밸런싱 및 부하 분산
4. 여러 미들웨어를 지원

가장 큰 장점이라면 해당 서버의 docker, k8s 의 컨테이너에서 label을 인식해서 자동으로 해당 도메인으로 라우팅해준다는 점인데, 제가 마지막으로 찾아본 바로는 같은 서버에서만 적용됩니다. 다른 서버로 라우팅하려면 dynamic config를 사용해야 하는데, 이건 별도의 yml 파일을 만들어줘야 해서 오히려 좀 불편한 부분이었네요.

[![traefik-architecture.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/akDnVuyuJe1AXvDL-traefik-architecture.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/akDnVuyuJe1AXvDL-traefik-architecture.png)

회사는 프랑스 회사이고, 이름도 영어의 `traffic`을 프랑스식으로 적은 것이라고 합니다. (근데 프랑스어로 교통량은 다른 단어입니다 ㅎㅎ)

# pangolin

또다른 리버스 프록시인 pangolin 입니다. 리버스 프록시이면서 newt라는 wireguard 기반의 VPN 클라이언트가 포함되어 있어서 마치 cloudflare 의 터널 서비스를 연상하게 합니다. 내부적으로는 pangolin UI + traefik + newt 로 구성되어 있습니다.

- 리버스 프록시와 VPN의 결합 솔루션
- 기본적인 SSO 기능이 내장되어 있으며, 별도의 OIDC provider 등을 추가하여 인증할 수도 있다.
- CrowdSec 연동

pangolin 내부에 traefik 이 내장되어 있기 때문에 엄밀하게 말하면 pangolin은 traefik의 wrapper라고 해도 과언은 아니고, 더 가볍게 쓰고 싶다면 traefik을 쓰는게 정답일 수도 있습니다. traefik + authentic 등으로 구현한다면 거의 같은 기능을 구현할 수도 있을것 같습니다. 하지만 편리하게 쓸 수 있는 UI 가 큰 장점인 것 같습니다.

다만, Traefik과 몇가지 다른점이 있습니다.

- traefik의 경우 k8s, docker의 label 기반으로 자동으로 도메인으로 연결해주는 특징이 있어서 같은 서버에 있는 컨테이너를 도메인과 연결하기 쉽지만 다른 서버의 컨테이너는 따로 dynamic config 파일을 작성해야 하기 때문에 (file provider) 불편함이 있다.
- pangolin은 내부/외부 구분없이 config 추가해야 하지만, (traefik의 dynamic config 같은) 텍스트 파일 직접 편집이 아닌 UI로 해결이 가능하다.

개인적으로는 외부 VM에 리버스 프록시가 있고 여기에서 집의 로컬 네트워크 내의 서버로 연결해야 하기 때문에 거의 dynamic config를 작성해야 했기 때문에 이를 UI에서 처리할 수 있다면 더 편리한 것이 됩니다.

추가로 newt 가 vpn이므로 tailscale 이 필요 없습니다. ㅎ

현재는 해당 프로젝트도 유료 기능을 준비하고 있습니다. 기업용 기능으로 지원되는 기능은 다음과 같습니다.

- 티켓 기반 지원
- 자동 IdP 사용자 프로비저닝
- 자동화를 위한 강력한 통합 API

하지만 위의 기능은 일반적인 homelab에서는 크게 필요하지 않고 여전히 커뮤니티 에디션으로도 개발이 잘 되고 있는 중입니다. 지금은 유료 기능과 별도로 supporter key 라는 기능이 있어서 기부를 받는 기능 정도만 있습니다.

사람에 따라서는 이러한 유료 기능, 기부 기능 추가가 반갑게 보이지 않겠지만, 글쎄요... pangolin은 아주 좋은 소프트웨어임엔 틀림없는 것 같고, 이제까지 오픈소스가 번아웃으로 없어지거나 수익이 안되서 개발 중단되거나 하는 걸 너무 많이 보고 오픈소스의 연속성에 관해 논의가 많이 되는 시점인데 이런 얘기도 못하게 하면... 글쎄요...

- [https://www.reddit.com/r/selfhosted/comments/1ke5jhy/too\_soon\_to\_make\_it\_paid\_pangolin/?tl=ko](https://www.reddit.com/r/selfhosted/comments/1ke5jhy/too_soon_to_make_it_paid_pangolin/?tl=ko)

#####  몇가지 운영 매뉴얼

newt를 업데이트할 때 docker로 설치했을때와 service(binary)로 설치했을 때 방법이 다름.

- docker - 간단하게 `docker compose pull` 만 하면 됨
- service (binary) - cli에서 `curl -fsSL https://static.pangolin.net/get-newt.sh | bash` 명령어로 재설치하는 형식으로 진행. 이후에는 `systemctl restart newt.service` 사용하여 활성화

# Obsidian

옵시디안은 markdown 문법으로 작성할 수 있는 크로스 플랫폼 노트 앱입니다. 즉 표준인 마크다운 문법으로 거의 웬만한 플랫폼에 앱이 있는 아주 범용성 있는 노트입니다.

- 여러 노트 앱들과 차별화되는 높은 범용성 - markdown, cross platform
- 무료 (유료 기능으로 sync, publish가 있다)
- [제텔카스텐](https://www.google.com/search?q=%EC%A0%9C%ED%85%94%EC%B9%B4%EC%8A%A4%ED%85%90+%EB%A9%94%EB%AA%A8%EB%B2%95) 시스템 - 노션 및 롬리서치와 비슷한 메모 시스템
- 다양한 플러그인
- 완전히 로컬에만 저장 가능 (월 4$에 동기화 지원)

여타 앱과 다른 특이사항으로 완전히 로컬에만 파일을 저장한다는 부분이 있는데, 장점이라고도 볼수 있지만 요즘 같은 시대엔 단점일 수밖에 없다.

하지만 이 동기화도 self-hosted로 해결할 수 있는 방법이 있다. 플러그인 중 [self-hosted livesync](https://github.com/vrtmrz/obsidian-livesync) 를 설치하고 db를 apache couchDB를 운영하면 된다.

##### 준비사항

couchDB LXC 설치 (on proxmox). proxmox script로 [couchDB](https://community-scripts.github.io/ProxmoxVE/scripts?id=apache-couchdb&category=Databases) LXC 설치 (설치 주소는 127.0.0.1:5984)

pangolin에서 reverse proxy로 도메인으로 연결 ( [https://couchdb-sample.your.domain](https://couchdb-sample.your.domain) -&gt; 127.0.0.1:5984)

[![스크린샷 2026-01-09 18.48.51.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/iO09I4lsJFb1sQtd-2026-01-09-18-48-51.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/iO09I4lsJFb1sQtd-2026-01-09-18-48-51.png)

해당 서비스는 인증을 해야 이용할 수 있기 때문에 기본 상태확인 url을 아무것도 설정하지 않으면 **비정상**이 뜨면서 서비스가 연결되지 않는다. 그래서 기본적으로 상태 확인을 끄거나 healthcheck url 경로를 `/_up` 을 사용해야 한다.

[![스크린샷 2026-01-09 18.49.01.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/LumMfkesRfrKaHkG-2026-01-09-18-49-01.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/LumMfkesRfrKaHkG-2026-01-09-18-49-01.png)

다만 이후 설정할 livesync plugin 을 위한 DB 설정에서 `require_valid_user: true` 속성을 추가해야 하는데 healthcheck url까지 인증이 걸려 사이트가 뜨지 않는 문제가 발생할 수 있다. health check에 사용하는 url에는 인증을 제외하는 `require_valid_user_except_for_up: true` 옵션을 추가하면 된다.

[![스크린샷 2026-01-09 18.52.55.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/l1l1YJ0LxWuRS45q-2026-01-09-18-52-55.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/l1l1YJ0LxWuRS45q-2026-01-09-18-52-55.png)

준비한 도메인으로 접속할 때 json 응답 또는 http login dialog가 뜨면 성공.

이후엔 [https://www.reddit.com/r/selfhosted/comments/1eo7knj/guide\_obsidian\_with\_free\_selfhosted\_instant\_sync/?tl=ko](https://www.reddit.com/r/selfhosted/comments/1eo7knj/guide_obsidian_with_free_selfhosted_instant_sync/?tl=ko) 이 문서를 따라서 db를 세팅하고 obsidian app과 연결하면 끝

# uptime kuma

간단한 시스템 모니터링 소프트웨어. 보통 모니터링으로 유명한 건 prometheus + grafana 조합으로 어느정도 표준화되어 있지만, 간단하게 시스템 상황만 모니터링하고 알림을 받기에는 uptime kuma도 꽤 괜찮은 솔루션이다.

[https://github.com/louislam/uptime-kuma](https://github.com/louislam/uptime-kuma)

- 쉬운 설치 및 사용: 복잡한 설정 없이 빠르게 구축하고 직관적인 대시보드에서 모니터링할 수 있습니다.
- 다양한 모니터링 방식: HTTP/HTTPS, TCP, Ping, DNS, Keyword 등 여러 프로토콜로 서비스 상태를 점검합니다.
- 알림 연동: 서비스 장애 시 슬랙(Slack), 디스코드(Discord), 텔레그램(Telegram), 이메일 등으로 즉시 알림을 받을 수 있습니다.
- SSL 인증서 관리: SSL 인증서 만료일을 미리 알려주어 보안 관리를 돕습니다.
- 자체 호스팅 (Self-Hosted): 직접 서버에 설치하여 운영하므로 데이터 프라이버시를 지키며 무료로 사용할 수 있습니다.
- 간편한 대시보드: 깔끔하고 사용자 친화적인 UI로 서비스 상태를 한눈에 파악할 수 있습니다.
- 모바일 앱 지원: Uptime Kuma Manager 앱 등을 통해 스마트폰에서도 쉽게 모니터링할 수 있습니다.

간단하게 docker compose를 다음과 같이 작성하면 된다. (주석 부분은 traefik을 사용했을때 쓰는 부분)

```yaml
services:
  uptime-kuma:
    container_name: uptime-kuma
    image: louislam/uptime-kuma:2
    restart: unless-stopped
    volumes:
      - ./data:/app/data
    ports:
      - "3001:3001"
    environment:
      - PUID=1000
      - PGID=1000
    #labels:
    #  - "traefik.enable=true"
    #  - "traefik.http.routers.uptimekuma.rule=Host(`monitor.neue.nz`)"
    #  - "traefik.http.routers.uptimekuma.entrypoints=websecure"
    #  - "traefik.http.routers.uptimekuma.tls=true"
    #  - "traefik.http.routers.uptimekuma.tls.certresolver=letsencrypt"
    #  - "traefik.http.services.uptimekuma.loadbalancer.server.port=3001"
    #networks:
    #  - proxy

#networks:
#  proxy:
#    external: true
```

대부분의 사이트 추가, 알림 설정은 앱을 구동하고 적용하면 된다.

[![스크린샷 2026-01-16 101435.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/c3P9H8hPwXI4ldkP-2026-01-16-101435.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/c3P9H8hPwXI4ldkP-2026-01-16-101435.png)

기본적으로 admin 은 로그인 후 대시보드에서 사이트 추가, 설정 작업을 할 수 있고,

[![스크린샷 2026-01-16 101253.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/wBtnEJ8g3UkiO9HO-2026-01-16-101253.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/wBtnEJ8g3UkiO9HO-2026-01-16-101253.png)

매번 로그인하는 것도 귀찮기 때문에 (보통은 로그인을 아예 비활성화하고 traefik에서 OIDC middleware를 사용하여 공통으로 로그인하게 구현) 로그인하지 않은 상태에서 status 페이지를 볼 수 있게 설정할 수도 있다.

[![스크린샷 2026-01-16 101533.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/LC6BpwVSicQ6dh52-2026-01-16-101533.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/LC6BpwVSicQ6dh52-2026-01-16-101533.png)

간단한 모니터링 소프트웨어라고 했지만, 굉장히 많은 설정으로 사이트의 상태 체크가 가능하다. login 하지 않으면 볼 수 없는 사이트 등도 인증 설정을 해서 로그인 후의 사이트 모니터링도 가능

[![스크린샷 2026-01-16 101648.png](https://wiki.neue.nz/uploads/images/gallery/2026-01/scaled-1680-/C3QBNzn4aQu49gnG-2026-01-16-101648.png)](https://wiki.neue.nz/uploads/images/gallery/2026-01/C3QBNzn4aQu49gnG-2026-01-16-101648.png)

공통 알림도 설정할 수 있다. 여기서는 현재 사용하는 gotify만 설정했지만 꽤 다양한 옵션이 있다.

- 대시보드 디자인이 개인 취향에 맞는다.
- 터미널에서 일일히 docker compose, config 파일 등을 편집하는 것은 싫고 웹에서 설정하는 게 취향이다.
- 각 서버마다 prometheus exporter 등을 설치해서 관리하는 것, 복잡한 grafana 대시보드 등의 설정이 크게 필요하지 않다.

이정도라면 uptime kuma는 기본적인 홈랩 모니터링 소프트웨어로 충분하다.