개인적으로는 8GB RAM, 4CPU, 80GB 디스크보다 낮은 사양에서는 듀얼 컨테이너 구성을 실행하지 않는 것을 권장합니다. 하지만 여러분의 환경과 상황은 다를 수 있습니다. 저는 이 Hetzner 설정으로 약 300명의 활성 사용자와 70~100 DEU(일일 활성 사용자) 규모의 비교적 바쁜 포럼을 운영 중입니다.
Hetzner 서버를 찾는 Bash 스크립트
이 내용은 이 글을 읽는 여러분과 다른 분들에게 도움이 될 수 있습니다. Hetzner에 특화되어 있지만, 다른 VPS 벤더에도 적용할 수 있을 것입니다. (저에게 직접 해달라고 요청하지는 마세요.)
이것은 5분마다 Hetzner 서버 CAX21 또는 CX33의 재고를 확인하고, 현재 Discourse 인스턴스의 지정된 카테고리에 토픽으로 게시하는 간단한 Bash 스크립트입니다. (원하는 구성에 맞게 스크립트를 수정할 수 있습니다.) RSS 피드 카테고리처럼 작동합니다.
스크립트가 동작하려면 Hetzner 토큰, Discourse API 키, 그리고 토픽을 게시할 대상 Discourse 카테고리 ID가 필요합니다. 스크립트를 수정하여 위치를 지정하는 필터를 포함할 수도 있습니다. (이 스크립트는 모든 위치를 검색합니다.)
1단계: API 토큰 발급
- Hetzner API 토큰: Hetzner 클라우드 콘솔에 접속 → 프로젝트 선택 → 왼쪽의 ‘보안(Security)’ 클릭 → ‘API 토큰’ → 토큰 생성 (읽기 전용이면 충분합니다). 이 키를 복사하여 저장하세요.
- Discourse API 키: Discourse 관리자 화면 → API → 새 키 생성 (시스템 사용자, 모든 엔드포인트면 충분합니다). 이것도 복사하여 저장하세요.
2단계: jq 설치
현재 Hetzner 서버에 SSH로 접속하여 jq JSON 파서를 설치합니다. (몇 초면 됩니다.)
apt-get update
apt-get install jq -y
3단계: 트래커 스크립트 설정
현재 Hetzner 서버에서 다음 Bash 스크립트를 생성하세요:
nano /root/hetzner_tracker.sh
아래 코드를 붙여넣으세요. (실제 API 키, 포럼 URL, 그리고 토픽을 게시할 카테고리 ID를 입력해야 합니다.)
#!/bin/bash
HETZNER_TOKEN="put_your_new_hetzner_token_here"
DISCOURSE_URL="https://your-forum.com"
DISCOURSE_USER="system"
DISCOURSE_API_KEY="put_your_new_discourse_api_key_here"
CATEGORY_ID=XX # 당신의 Discourse 포럼 카테고리 ID
# 1. Hetzner에 서버 모델을 요청하고, 저렴한 8GB 모델(CAX21 또는 CX33)의 ID만 가져옵니다.
TYPES_JSON=$(curl -s -H "Authorization: Bearer $HETZNER_TOKEN" "https://api.hetzner.cloud/v1/server_types")
TARGET_IDS=$(echo "$TYPES_JSON" | jq -c '[.server_types[] | select(.name == "cax21" or .name == "cx33") | .id]')
# 2. Hetzner에 모든 데이터센터의 실시간 재고 수준을 요청합니다.
DC_JSON=$(curl -s -H "Authorization: Bearer $HETZNER_TOKEN" "https://api.hetzner.cloud/v1/datacenters")
# 3. 모든 위치를 확인하여 특정 모델이 "가용(available)" 목록에 있는지 확인합니다.
MATCHES=$(echo "$DC_JSON" | jq -r --argjson targets "$TARGET_IDS" '
.datacenters[] |
.location.name as $loc |
.name as $dc |
.server_types.available[] |
select(. as $avail | $targets | index($avail)) |
"- Location: \($loc | ascii_upcase) (\($dc)) - Server Model ID: \(.)"
')
# 4. 매칭된 항목이 발견되면, Discourse 게시물을 구성하고 전송합니다!
if [ -n "$MATCHES" ]; then
RAW_TEXT="A budget 8GB server (CAX21 or CX33) is now available!
**Matches found:**
$MATCHES
[Go to the Hetzner console now!](https://console.hetzner.cloud/)"
PAYLOAD=$(jq -n --arg title "🚨 HETZNER ALERT: 8GB Server in Stock!" \
--arg raw "$RAW_TEXT" \
--argjson cat "$CATEGORY_ID" \
'{title: $title, raw: $raw, category: $cat}')
curl -s -X POST "$DISCOURSE_URL/posts.json" \
-H "Api-Key: $DISCOURSE_API_KEY" \
-H "Api-Username: $DISCOURSE_USER" \
-H "Content-Type: application/json" \
-d "$PAYLOAD"
# 포럼에 스팸이 되지 않도록 발동 후 스크립트 실행을 비활성화합니다.
chmod -x "$0"
fi
파일을 저장하고(ctrl+o, enter, ctrl+x), 실행 가능하도록 설정하세요:
chmod +x /root/hetzner_tracker.sh
4단계: 스크립트 자동화
cron 작업 스케줄 파일을 엽니다:
crontab -e
기존 코드의 맨 아래에 이 줄을 추가하세요:
*/5 * * * * /root/hetzner_tracker.sh
작동 원리:
5분마다 서버가 조용히 Hetzner에 *“오늘 가용한 서버가 있나요?”*라고 묻습니다.
Hetzner가 '예’라고 하면, 스크립트는 즉시 Discourse API를 사용하여 지정된 카테고리에 새로운 토픽을 생성합니다. Discourse가 새 토픽에 대한 알림을 설정해 두었다면, 이메일과/또는 휴대폰이 울릴 것입니다.
미국 지역에서 특정 8GB CPX31 서버를 찾았을 때의 예시 토픽 게시글입니다.
성공적으로 게시되면, 스크립트는 서버 재고가 있는 동안 포럼에 수십 개의 게시글을 스팸하지 않도록 자체 실행 권한(chmod -x)을 비활성화합니다.
걱정하지 마세요, 저는 이 방법을 여러 번 사용해 보았으며 레이트 리밋(rate limit)에 걸리지 않습니다. 원하시면 10분이나 15분과 같은 다른 시간 간격으로 변경할 수도 있습니다.