From 9e7d0cd1bb409e9ddbd4d17dd4618a6dea166c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=9C=EA=B3=A8=EC=95=BD=EC=82=AC?= Date: Sat, 6 Sep 2025 16:50:25 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Initial=20commit:=20Headscale=20+?= =?UTF-8?q?=20Headplane=20=EC=99=84=EC=A0=84=20=EA=B5=AC=EC=B6=95=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ: - Tailscale ์™„์ „ ๋Œ€์ฒดํ•˜๋Š” ์ž์ฒด ํ˜ธ์ŠคํŒ… ์†”๋ฃจ์…˜ ๊ตฌ์ถ• - Headscale + Headplane Docker Compose๋กœ ์›ํด๋ฆญ ์„ค์น˜ - Headplane ํ•œ๊ธ€ํ™” ๋ฐ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• - ์™„์ „ํ•œ VPN ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ: - Headscale: Tailscale ํ˜ธํ™˜ ์ปจํŠธ๋กค ์„œ๋ฒ„ - Headplane: ์›น ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ UI - Docker & Docker Compose - SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - ํ–ฅํ›„ PostgreSQL ์ง€์› ์˜ˆ์ • ๐Ÿ”ง ์ฃผ์š” ๊ตฌ์„ฑ: - docker-compose.yml: ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ - config/config.yaml: Headscale ์ƒ์„ธ ์„ค์ • - start.sh: ์ž๋™ํ™”๋œ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ - .env: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ด€๋ฆฌ ๐Ÿ“‹ ๊ฐœ๋ฐœ ๊ณ„ํš: 1. ๊ธฐ๋ณธ ์„ค์น˜ ๋ฐ ํ…Œ์ŠคํŠธ 2. HTTPS/TLS ๋ณด์•ˆ ๊ตฌ์„ฑ 3. Headplane UI ํ•œ๊ธ€ํ™” 4. ๊ณ ๊ธ‰ ๋„คํŠธ์›Œํ‚น ์„ค์ • 5. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ฐฑ์—… ์‹œ์Šคํ…œ ๐Ÿค– Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .env.example | 20 +++++++++++++++ .gitignore | 64 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 50 ++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 docker-compose.yml diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c22cf5d --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# Headscale API Key (will be generated after first startup) +HEADSCALE_API_KEY=your_api_key_here + +# Server configuration +SERVER_URL=http://localhost:8080 +LISTEN_ADDR=0.0.0.0:8080 + +# Database (SQLite by default) +DB_TYPE=sqlite3 +DB_PATH=/var/lib/headscale/db.sqlite + +# Magic DNS +MAGIC_DNS=true +BASE_DOMAIN=headscale.local + +# Network settings +IP_PREFIXES=100.64.0.0/10 + +# Timezone +TZ=Asia/Seoul \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7d1df2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,64 @@ +# Environment variables +.env* +!.env.example + +# Database files +*.db +*.sqlite +*.sqlite3 + +# Data directories +data/ +run/ +logs/ + +# Docker volumes +volumes/ + +# SSL certificates +*.crt +*.key +*.pem + +# Backup files +*.backup +*.bak + +# IDE +.vscode/ +.idea/ + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Dependency directories +node_modules/ + +# Build outputs +dist/ +build/ +out/ + +# API keys and secrets +api_keys.txt +secrets.txt + +# Temporary files +tmp/ +temp/ + +# Docker Compose override files +docker-compose.override.yml \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d7d340d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,50 @@ +version: '3.8' + +services: + headscale: + image: headscale/headscale:latest + container_name: headscale + restart: unless-stopped + command: headscale serve + environment: + - TZ=Asia/Seoul + volumes: + - ./config:/etc/headscale + - ./data:/var/lib/headscale + - ./run:/var/run/headscale + ports: + - "8080:8080" # Headscale HTTP API + - "9090:9090" # Metrics (optional) + networks: + - headscale-net + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + headplane: + image: ghcr.io/tale/headplane:latest + container_name: headplane + restart: unless-stopped + environment: + - TZ=Asia/Seoul + - HEADSCALE_URL=http://headscale:8080 + - HEADSCALE_API_KEY=${HEADSCALE_API_KEY} + ports: + - "3000:3000" # Headplane Web UI + depends_on: + headscale: + condition: service_healthy + networks: + - headscale-net + +networks: + headscale-net: + driver: bridge + +volumes: + headscale_config: + headscale_data: + headscale_run: \ No newline at end of file