# ๐Ÿฅ PharmQ Headscale Network - Live Production pharmq.kr ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Headscale VPN ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ• ์™„๋ฃŒ ## ๐Ÿš€ ํด๋ผ์ด์–ธํŠธ ์ž๋™ ๋“ฑ๋ก ### ํ•œ ์ค„ ์„ค์น˜ (๊ถŒ์žฅ) ```bash curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/register-client-pharmq-live.sh | bash ``` ### ๋‹ค์šด๋กœ๋“œ ํ›„ ์„ค์น˜ ```bash curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/register-client-pharmq-live.sh -o register-client.sh chmod +x register-client.sh ./register-client.sh ``` ### ๐Ÿ“‹ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ - [register-client-pharmq-live.sh](./register-client-pharmq-live.sh) - ํด๋ผ์ด์–ธํŠธ ์ž๋™ ๋“ฑ๋ก ์Šคํฌ๋ฆฝํŠธ ## ๐ŸŒ ์„œ๋น„์Šค ์ฃผ์†Œ ### ๋ฉ”์ธ ์„œ๋น„์Šค - **Headscale ์„œ๋ฒ„**: http://head.pharmq.kr:8070 - **๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ**: http://head.pharmq.kr:5001 ### ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ (๋‚ด๋ถ€์šฉ) - **Headscale**: http://192.168.0.100:8070 - **farmq-admin**: http://192.168.0.100:5001 ## ๐Ÿ“Š ๋„คํŠธ์›Œํฌ ์ •๋ณด - **๋„คํŠธ์›Œํฌ ๋Œ€์—ญ**: 100.64.0.0/10 - **IPv6 ๋Œ€์—ญ**: fd7a:115c:a1e0::/48 - **Magic DNS**: headscale.local - **๊ธฐ๋ณธ ์‚ฌ์šฉ์ž**: default ## ๐Ÿ”ง ๊ด€๋ฆฌ์ž ๋„๊ตฌ ### farmq-admin ์›น GUI - ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ - ๋จธ์‹ /๋…ธ๋“œ ๊ด€๋ฆฌ - ์‹ค์‹œ๊ฐ„ ๋„คํŠธ์›Œํฌ ๋ชจ๋‹ˆํ„ฐ๋ง - Headscale CLI API ๋ž˜ํผ ### ์ฃผ์š” ๊ธฐ๋Šฅ - โœ… Docker ๊ธฐ๋ฐ˜ Headscale ์„œ๋ฒ„ - โœ… ์›น ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค - โœ… ์ž๋™ ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก ์Šคํฌ๋ฆฝํŠธ - โœ… 1๋…„ ์œ ํšจ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ preauth key - โœ… Magic DNS ์ง€์› ## ๐Ÿ“‹ ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก ๊ณผ์ • 1. **์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰**: ์œ„ curl ๋ช…๋ น์–ด ์‹คํ–‰ 2. **Tailscale ์ž๋™ ์„ค์น˜**: ์‹œ์Šคํ…œ์— ๋งž๊ฒŒ ์„ค์น˜ 3. **Headscale ์„œ๋ฒ„ ์—ฐ๊ฒฐ**: head.pharmq.kr ์—ฐ๊ฒฐ 4. **์ž๋™ ์ธ์ฆ**: preauth key๋กœ ์ฆ‰์‹œ ์Šน์ธ 5. **๋„คํŠธ์›Œํฌ ์ฐธ์—ฌ**: Tailscale IP ํ• ๋‹น ์™„๋ฃŒ ## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ - **Headscale**: v0.26.1 (Docker) - **farmq-admin**: Flask + SQLAlchemy - **Database**: SQLite3 - **Frontend**: HTML/CSS/JavaScript - **Network**: Tailscale protocol ## ๐Ÿ“ ํŒŒ์ผ ๊ตฌ์กฐ ``` headscale-setup/ โ”œโ”€โ”€ docker-compose.yml # Docker Compose ์„ค์ • โ”œโ”€โ”€ .env # ํ™˜๊ฒฝ๋ณ€์ˆ˜ (๋ณต์‚ฌ ํ•„์š”) โ”œโ”€โ”€ .env.example # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ…œํ”Œ๋ฆฟ โ”œโ”€โ”€ start.sh # ์ž๋™ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ โ”œโ”€โ”€ README.md # ์ด ๋ฌธ์„œ โ”œโ”€โ”€ .gitignore # Git ์ œ์™ธ ํŒŒ์ผ โ”œโ”€โ”€ config/ โ”‚ โ””โ”€โ”€ config.yaml # Headscale ์„ค์ • โ”œโ”€โ”€ data/ # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ํ‚ค ํŒŒ์ผ (์ž๋™ ์ƒ์„ฑ) โ””โ”€โ”€ run/ # ๋Ÿฐํƒ€์ž„ ํŒŒ์ผ (์ž๋™ ์ƒ์„ฑ) ``` ## ๐Ÿš€ Git Repository - **์ €์žฅ์†Œ**: https://git.0bin.in/thug0bin/headscale-tailscale-replacement - **๊ด€๋ฆฌ์ž**: ์‹œ๊ณจ์•ฝ์‚ฌ (thug0bin@gmail.com) ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ### 1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ```bash # .env.example์„ .env๋กœ ๋ณต์‚ฌ cp .env.example .env ``` ### 2. ์ž๋™ ์„ค์น˜ (๊ถŒ์žฅ) ```bash # ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์‹คํ–‰ chmod +x ./start.sh ./start.sh ``` ### 3. ์ˆ˜๋™ ์„ค์น˜ ```bash # 1. Headscale ์‹œ์ž‘ docker-compose up -d headscale # 2. API ํ‚ค ์ƒ์„ฑ docker-compose exec headscale headscale apikeys create # 3. .env ํŒŒ์ผ์— API ํ‚ค ์ž…๋ ฅ (HEADSCALE_API_KEY ๊ฐ’ ์ˆ˜์ •) vi .env # 4. Headplane ์‹œ์ž‘ docker-compose up -d headplane ``` ## ๐Ÿ“‹ ์ ‘์† ์ •๋ณด - **Headscale API**: http://localhost:8070 - **Headplane UI**: http://localhost:3000 ## ๐Ÿ‘ค ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ### ์‚ฌ์šฉ์ž ์ƒ์„ฑ ```bash docker-compose exec headscale headscale users create myuser ``` ### Pre-auth ํ‚ค ์ƒ์„ฑ ```bash docker-compose exec headscale headscale preauthkeys create --user myuser --reusable --expiration 24h ``` ## ๐Ÿ“ฑ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ### Linux/macOS ```bash # Tailscale ํด๋ผ์ด์–ธํŠธ ์„ค์น˜ ํ›„ tailscale up --login-server=http://localhost:8080 ``` ### Windows ```cmd tailscale up --login-server=http://localhost:8080 ``` ## ๐Ÿ”ง ์œ ์šฉํ•œ ๋ช…๋ น์–ด ### ์ƒํƒœ ํ™•์ธ ```bash docker-compose ps docker-compose logs -f ``` ### ๋…ธ๋“œ ๋ชฉ๋ก ํ™•์ธ ```bash docker-compose exec headscale headscale nodes list ``` ### ์‚ฌ์šฉ์ž ๋ชฉ๋ก ํ™•์ธ ```bash docker-compose exec headscale headscale users list ``` ## ๐Ÿ› ๏ธ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ### ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ ```bash docker-compose restart ``` ### ๋กœ๊ทธ ํ™•์ธ ```bash docker-compose logs headscale docker-compose logs headplane ``` ### ์™„์ „ ์ดˆ๊ธฐํ™” ```bash docker-compose down sudo rm -rf data/* docker-compose up -d ``` ## ๐Ÿ”„ Git ๊ด€๋ฆฌ ํ•„์š”์‹œ ์ˆ˜๋™์œผ๋กœ Git ์ปค๋ฐ‹์„ ์ง„ํ–‰ํ•˜์„ธ์š”: ```bash # ํ˜„์žฌ ์ƒํƒœ ํ™•์ธ git status # ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ git add . git commit -m "Update: ์„ค๋ช…" git push origin main ``` ## โšก ์ƒˆ ์„œ๋ฒ„ ์›ํด๋ฆญ ๋“ฑ๋ก ์ƒˆ๋กœ์šด ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„๋ฅผ ํŒœํ ๋„คํŠธ์›Œํฌ์— **ํ•œ ๋ฒˆ์˜ ๋ช…๋ น**์œผ๋กœ ๋“ฑ๋ก: ### ๋น ๋ฅธ ์„ค์น˜ (๊ถŒ์žฅ) ```bash # ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๊ณ„์ • curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/quick-install.sh | sudo bash # root ๊ณ„์ • (Proxmox ๋“ฑ) curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/quick-install.sh | bash ``` ### ๊ธฐ์กด Tailscale ์—ฐ๊ฒฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ (๊ฐ•์ œ ์žฌ๋“ฑ๋ก) ```bash # ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/quick-install.sh | sudo bash -s -- --force # root ๊ณ„์ • curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/quick-install.sh | bash -s -- --force ``` ### ์ง€์› OS - Ubuntu, Debian, CentOS, RHEL, Rocky Linux, Fedora, Arch Linux - ์ž๋™ Tailscale ์„ค์น˜ + Headscale ๋“ฑ๋ก - ๋ฐฉํ™”๋ฒฝ ์ž๋™ ์„ค์ • + ์—ฐ๊ฒฐ ๊ฒ€์ฆ **30์ดˆ ๋งŒ์— ํŒœํ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์™„๋ฃŒ!** ๐ŸŽ‰ ## ๐ŸชŸ Windows ์›ํด๋ฆญ ๋“ฑ๋ก Windows PC์—์„œ **ํ•œ ๋ฒˆ์˜ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ**๋กœ ํŒœํ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ: ### ๊ธฐ๋ณธ ์„ค์น˜ (๊ถŒ์žฅ) - ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ ํ•ด๊ฒฐ๋จ ```powershell # ๊ด€๋ฆฌ์ž PowerShell์—์„œ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ (English version - ํ•œ๊ธ€ ๊นจ์ง ํ•ด๊ฒฐ) iex ((New-Object System.Net.WebClient).DownloadString('https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/farmq-install-en.ps1')) ``` ### ๊ธฐ์กด Tailscale ์žˆ๋Š” ๊ฒฝ์šฐ (๊ฐ•์ œ ์žฌ๋“ฑ๋ก) ```powershell # ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ์ž๋™์œผ๋กœ ํ•ด์ œํ•˜๊ณ  ์žฌ๋“ฑ๋ก (English version) $Force = $true; iex ((New-Object System.Net.WebClient).DownloadString('https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/farmq-install-en.ps1')) ``` ### ํ•œ๊ธ€ ๋ฒ„์ „ (์ธ์ฝ”๋”ฉ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ) ```powershell # ํ•œ๊ธ€์ด ๊นจ์ ธ ๋ณด์ผ ์ˆ˜ ์žˆ์Œ - ์œ„ English ๋ฒ„์ „ ๊ถŒ์žฅ iex ((New-Object System.Net.WebClient).DownloadString('https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/farmq-install.ps1')) ``` ### ์‹คํ–‰ ๋ฐฉ๋ฒ• 1. **Windows ํ‚ค + X** โ†’ **"Windows PowerShell(๊ด€๋ฆฌ์ž)"** ํด๋ฆญ 2. ์œ„ ๋ช…๋ น์–ด **๋ณต์‚ฌ โ†’ ๋ถ™์—ฌ๋„ฃ๊ธฐ โ†’ Enter** 3. ์ž๋™ ์„ค์น˜ ์ง„ํ–‰ (2-3๋ถ„) 4. ํŒœํ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์™„๋ฃŒ! ๐ŸŽ‰ ### Windows ์ž๋™ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ - โœ… **Tailscale ์ž๋™ ๋‹ค์šด๋กœ๋“œ** ๋ฐ ์„ค์น˜ - โœ… **๊ด€๋ฆฌ์ž ๊ถŒํ•œ** ์ž๋™ ํ™•์ธ - โœ… **๊ธฐ์กด ์—ฐ๊ฒฐ ์Šค๋งˆํŠธ ์ฒ˜๋ฆฌ** (Linux์™€ ๋™์ผ) - โœ… **Windows Defender ๋ฐฉํ™”๋ฒฝ** ์ž๋™ ์„ค์ • - โœ… **๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ** ๋ฐ ํ™•์ธ ## ๐Ÿ’ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • (code-server) ํŒœํ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋œ ์„œ๋ฒ„์—์„œ **์›น ๊ธฐ๋ฐ˜ VS Code ๊ฐœ๋ฐœ ํ™˜๊ฒฝ**์„ ๋น ๋ฅด๊ฒŒ ๊ตฌ์ถ•: ### ํ•œ ์ค„ ์„ค์น˜ (๊ถŒ์žฅ) ```bash # ๊ธฐ๋ณธ ํฌํŠธ 8080์œผ๋กœ ์„ค์น˜ curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/docs/code-server.sh | bash # ํฌํŠธ ์ง€์ • ์„ค์น˜ (์˜ˆ: 8443) curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/docs/code-server.sh | PORT=8443 bash ``` ### ๋ฌด์ธ ์„ค์น˜ (๋น„๋ฐ€๋ฒˆํ˜ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •) ```bash # ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ curl -fsSL https://git.0bin.in/thug0bin/headscale-tailscale-replacement/raw/branch/live/pharmq-headscale-production/docs/code-server.sh | PASSWORD="your-secure-password" SKIP_CONFIRM=1 bash ``` ### ์ž๋™ ์„ค์น˜ ๊ธฐ๋Šฅ - โœ… **code-server ์ž๋™ ์„ค์น˜** (๋ฏธ์„ค์น˜ ์‹œ) - โœ… **์„ค์ • ํŒŒ์ผ ์ž๋™ ์ƒ์„ฑ** ๋ฐ ๊ตฌ์„ฑ - โœ… **๊ธฐ์กด ํ”„๋กœ์„ธ์Šค ์ •๋ฆฌ** (์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€) - โœ… **0.0.0.0 ๋ฐ”์ธ๋”ฉ** (์™ธ๋ถ€ ์ ‘์† ๊ฐ€๋Šฅ) - โœ… **nohup ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰** (์„ธ์…˜ ์ข…๋ฃŒ ํ›„์—๋„ ์œ ์ง€) ### ์„ค์น˜ ํ›„ ์ ‘์† ```bash # ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘์† http://<์„œ๋ฒ„IP>:8080 # ๋กœ๊ทธ ํ™•์ธ tail -f ~/code-server.log ``` ### ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ - ๐Ÿ”’ **์—ญํ”„๋ก์‹œ ์‚ฌ์šฉ**: Caddy ๋˜๋Š” Nginx๋กœ HTTPS ์„ค์ • - ๐Ÿ”’ **๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ**: ๋ณต์žกํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ - ๐Ÿ”’ **๋ฐฉํ™”๋ฒฝ ์„ค์ •**: ํ•„์š”ํ•œ IP๋งŒ ์ ‘๊ทผ ํ—ˆ์šฉ - ๐Ÿ”’ **VPN ์ ‘์†**: ํŒœํ ๋„คํŠธ์›Œํฌ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘์†