# ๐Ÿ”‘ FARMQ Headscale Pre-auth Key ๊ด€๋ฆฌ ๊ฐ€์ด๋“œ ## ๐Ÿ“š ๋ชฉ์ฐจ 1. [Pre-auth Key ๊ฐœ๋…](#pre-auth-key-๊ฐœ๋…) 2. [ํ‚ค ์œ ํ˜•๋ณ„ ๋น„๊ต](#ํ‚ค-์œ ํ˜•๋ณ„-๋น„๊ต) 3. [์•ฝ๊ตญ ํ™˜๊ฒฝ๋ณ„ ์‚ฌ์šฉ ์ „๋žต](#์•ฝ๊ตญ-ํ™˜๊ฒฝ๋ณ„-์‚ฌ์šฉ-์ „๋žต) 4. [์‹ค์ œ ๋ช…๋ น์–ด ์˜ˆ์‹œ](#์‹ค์ œ-๋ช…๋ น์–ด-์˜ˆ์‹œ) 5. [๋ณด์•ˆ ๊ด€๋ฆฌ](#๋ณด์•ˆ-๊ด€๋ฆฌ) 6. [๋ฌธ์ œ ํ•ด๊ฒฐ](#๋ฌธ์ œ-ํ•ด๊ฒฐ) 7. [์ฒดํฌ๋ฆฌ์ŠคํŠธ](#์ฒดํฌ๋ฆฌ์ŠคํŠธ) --- ## ๐Ÿง  Pre-auth Key ๊ฐœ๋… ### Pre-auth Key๋ž€? - **์‚ฌ์ „ ์ธ์ฆ ํ‚ค**: ํด๋ผ์ด์–ธํŠธ๊ฐ€ Headscale ์„œ๋ฒ„์— ์ž๋™ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” "์ž…์žฅ๊ถŒ" - **์ผํšŒ์šฉ ํŒจ์Šค์›Œ๋“œ** ๊ฐœ๋…์œผ๋กœ, ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ๋ฐฐํฌ - **๋ณด์•ˆ ๊ณ„์ธต**: ๋ฌด์ž‘์œ„ ์ ‘์†์„ ๋ฐฉ์ง€ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ณด์•ˆ ์žฅ๋ฒฝ ### ์ž‘๋™ ์›๋ฆฌ ```mermaid sequenceDiagram participant Admin as ๊ด€๋ฆฌ์ž participant Server as Headscale ์„œ๋ฒ„ participant Client as ํด๋ผ์ด์–ธํŠธ Admin->>Server: 1. PreAuth ํ‚ค ์ƒ์„ฑ Server-->>Admin: 2. ํ‚ค ๋ฐ˜ํ™˜ (abc123def456...) Admin->>Client: 3. ํ‚ค ์ „๋‹ฌ Client->>Server: 4. ํ‚ค์™€ ํ•จ๊ป˜ ๋“ฑ๋ก ์š”์ฒญ Server->>Server: 5. ํ‚ค ๊ฒ€์ฆ Server-->>Client: 6. ์Šน์ธ ๋ฐ VPN ์„ค์ • ์ „์†ก Server->>Server: 7. ํ‚ค ์‚ฌ์šฉ๋จ ํ‘œ์‹œ (์ผํšŒ์šฉ์ธ ๊ฒฝ์šฐ) ``` --- ## ๐Ÿ”„ ํ‚ค ์œ ํ˜•๋ณ„ ๋น„๊ต ### 1. ์ผํšŒ์šฉ ํ‚ค (Single-use Key) ```bash # ์ƒ์„ฑ ๋ช…๋ น์–ด docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 1h # ํŠน์ง• โœ… ์ตœ๊ณ  ์ˆ˜์ค€ ๋ณด์•ˆ โœ… ์ •ํ™•ํ•œ ๊ธฐ๊ธฐ ์ถ”์  ๊ฐ€๋Šฅ โŒ ๋งค๋ฒˆ ์ƒˆ ํ‚ค ์ƒ์„ฑ ํ•„์š” โŒ ๊ด€๋ฆฌ ๋ณต์žก๋„ ๋†’์Œ ``` ### 2. ์žฌ์‚ฌ์šฉ ํ‚ค (Reusable Key) ```bash # ์ƒ์„ฑ ๋ช…๋ น์–ด docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 7d --reusable # ํŠน์ง• โœ… ํŽธ๋ฆฌํ•œ ๊ด€๋ฆฌ โœ… ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ์—์„œ ๋™์ผ ํ‚ค ์‚ฌ์šฉ โš ๏ธ ํ‚ค ๋…ธ์ถœ ์‹œ ๋ณด์•ˆ ์œ„ํ—˜ โš ๏ธ ๊ธฐ๊ธฐ๋ณ„ ๊ตฌ๋ถ„ ์–ด๋ ค์›€ ``` ### 3. ์ž„์‹œ ํ‚ค (Ephemeral Key) ```bash # ์ƒ์„ฑ ๋ช…๋ น์–ด docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 30m --ephemeral # ํŠน์ง• โœ… ์ผ์‹œ์  ์ ‘์†์šฉ ์ตœ์  โœ… ๋„คํŠธ์›Œํฌ์—์„œ ์ž๋™ ์ œ๊ฑฐ โŒ ์˜๊ตฌ ์—ฐ๊ฒฐ ๋ถˆ๊ฐ€ โŒ ์žฌ์‹œ์ž‘ ์‹œ ์žฌ๋“ฑ๋ก ํ•„์š” ``` --- ## ๐Ÿฅ ์•ฝ๊ตญ ํ™˜๊ฒฝ๋ณ„ ์‚ฌ์šฉ ์ „๋žต ### ์ „๋žต 1: ์•ฝ๊ตญ๋ณ„ ๊ฐœ๋ณ„ ํ‚ค (๐ŸŒŸ ๊ถŒ์žฅ) #### ์ ์šฉ ๋Œ€์ƒ - ์ •๊ธฐ์ ์œผ๋กœ ์šด์˜๋˜๋Š” ์•ฝ๊ตญ - ์—ฌ๋Ÿฌ POS ๋‹จ๋ง๊ธฐ๊ฐ€ ์žˆ๋Š” ๋งค์žฅ - ๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ํ™˜๊ฒฝ #### ์„ค์ • ์˜ˆ์‹œ ```bash # 1๋‹จ๊ณ„: ์•ฝ๊ตญ๋ณ„ ์‚ฌ์šฉ์ž ์ƒ์„ฑ docker exec headscale headscale users create pharmacy-gangnam docker exec headscale headscale users create pharmacy-hongdae docker exec headscale headscale users create pharmacy-itaewon # 2๋‹จ๊ณ„: ์‚ฌ์šฉ์ž ID ํ™•์ธ docker exec headscale headscale users list # ์ถœ๋ ฅ: # ID | Name # 1 | myuser # 2 | pharmacy-gangnam # 3 | pharmacy-hongdae # 4 | pharmacy-itaewon # 3๋‹จ๊ณ„: ์•ฝ๊ตญ๋ณ„ ์žฌ์‚ฌ์šฉ ํ‚ค ์ƒ์„ฑ docker exec headscale headscale preauthkeys create --user 2 --expiration 30d --reusable # ๊ฐ•๋‚จ์•ฝ๊ตญ์šฉ: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0 docker exec headscale headscale preauthkeys create --user 3 --expiration 30d --reusable # ํ™๋Œ€์•ฝ๊ตญ์šฉ: z9y8x7w6v5u4t3s2r1q0p9o8n7m6l5k4j3i2h1g0f9e8d7c6b5a4z3y2x1w0 docker exec headscale headscale preauthkeys create --user 4 --expiration 30d --reusable # ์ดํƒœ์›์•ฝ๊ตญ์šฉ: m5n6o7p8q9r0s1t2u3v4w5x6y7z8a9b0c1d2e3f4g5h6i7j8k9l0m1n2o3p4 ``` #### ์žฅ์  - โœ… **์•ฝ๊ตญ๋ณ„ ๊ตฌ๋ถ„**: ๋„คํŠธ์›Œํฌ์—์„œ ์•ฝ๊ตญ๋ณ„๋กœ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ - โœ… **๋ถ€๋ถ„์  ๋ณด์•ˆ**: ํ•œ ์•ฝ๊ตญ์˜ ํ‚ค ๋…ธ์ถœ์ด ๋‹ค๋ฅธ ์•ฝ๊ตญ์— ์˜ํ–ฅ ์—†์Œ - โœ… **๊ด€๋ฆฌ ์šฉ์ด**: ์•ฝ๊ตญ๋ณ„๋กœ ํ‚ค ๊ฐฑ์‹  ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ - โœ… **ํ™•์žฅ์„ฑ**: ์ƒˆ ์•ฝ๊ตญ ์ถ”๊ฐ€ ์‹œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ ### ์ „๋žต 2: ์ง€์—ญ๋ณ„ ๊ทธ๋ฃน ํ‚ค #### ์ ์šฉ ๋Œ€์ƒ - ๊ฐ™์€ ์ง€์—ญ ๋‚ด ์—ฌ๋Ÿฌ ์ง€์  - ๊ด€๋ฆฌ ๊ตฌ์—ญ๋ณ„ ๋ถ„ํ•  ํ•„์š” ์‹œ - ์ค‘๊ฐ„ ๊ทœ๋ชจ ๋ณด์•ˆ ์š”๊ตฌ์‚ฌํ•ญ ```bash # ์ง€์—ญ๋ณ„ ์‚ฌ์šฉ์ž ์ƒ์„ฑ docker exec headscale headscale users create region-seoul docker exec headscale headscale users create region-busan docker exec headscale headscale users create region-daegu # ์ง€์—ญ๋ณ„ ํ‚ค ์ƒ์„ฑ (์„œ์šธ ์ง€์—ญ ๋ชจ๋“  ์•ฝ๊ตญ์ด ๊ณต์œ ) docker exec headscale headscale preauthkeys create --user 2 --expiration 14d --reusable ``` ### ์ „๋žต 3: ๋‹จ์ผ ๊ณตํ†ต ํ‚ค (โš ๏ธ ๋น„๊ถŒ์žฅ) #### ์ ์šฉ ๋Œ€์ƒ - ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ - ๋งค์šฐ ์†Œ๊ทœ๋ชจ ์šด์˜ (5๊ฐœ ๋ฏธ๋งŒ ์•ฝ๊ตญ) - ๊ด€๋ฆฌ ๋ฆฌ์†Œ์Šค ๊ทน๋„๋กœ ์ œํ•œ์ ์ธ ๊ฒฝ์šฐ ```bash # ๋ชจ๋“  ์•ฝ๊ตญ์ด ํ•˜๋‚˜์˜ ํ‚ค ๊ณต์œ  docker exec headscale headscale preauthkeys create --user 1 --expiration 90d --reusable ``` #### ๋‹จ์  - โŒ **๋ณด์•ˆ ์œ„ํ—˜**: ํ‚ค ํ•˜๋‚˜๋งŒ ๋…ธ์ถœ๋˜๋ฉด ์ „์ฒด ๋„คํŠธ์›Œํฌ ์œ„ํ—˜ - โŒ **๊ด€๋ฆฌ ๋ณต์žก**: ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์›์ธ ์ถ”์  ์–ด๋ ค์›€ - โŒ **ํ™•์žฅ์„ฑ ๋ถ€์กฑ**: ๊ทœ๋ชจ ์ฆ๊ฐ€ ์‹œ ๊ด€๋ฆฌ ํ•œ๊ณ„ --- ## ๐Ÿ’ป ์‹ค์ œ ๋ช…๋ น์–ด ์˜ˆ์‹œ ### FARMQ ํ‘œ์ค€ ์„ค์ • (๊ถŒ์žฅ) #### 1๋‹จ๊ณ„: ์•ฝ๊ตญ ๋“ฑ๋ก ์ค€๋น„ ```bash # ์ƒˆ ์•ฝ๊ตญ ๋“ฑ๋ก ์‹œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋“ค # ์•ฝ๊ตญ๋ช… ๋ณ€์ˆ˜ ์„ค์ • (ํŽธ์˜๋ฅผ ์œ„ํ•ด) PHARMACY_NAME="pharmacy-myeongdong" EXPIRATION="30d" # 30์ผ ๋งŒ๋ฃŒ echo "๐Ÿฅ ์ƒˆ ์•ฝ๊ตญ ๋“ฑ๋ก: $PHARMACY_NAME" ``` #### 2๋‹จ๊ณ„: ์‚ฌ์šฉ์ž ์ƒ์„ฑ ```bash # ์‚ฌ์šฉ์ž ์ƒ์„ฑ docker exec headscale headscale users create "$PHARMACY_NAME" # ์ƒ์„ฑ ๊ฒฐ๊ณผ ํ™•์ธ docker exec headscale headscale users list ``` #### 3๋‹จ๊ณ„: ์‚ฌ์šฉ์ž ID ํ™•์ธ ```bash # ๋ฐฉ๋ฒ• 1: ์ˆ˜๋™ ํ™•์ธ docker exec headscale headscale users list | grep "$PHARMACY_NAME" # ๋ฐฉ๋ฒ• 2: ์ž๋™ ์ถ”์ถœ (์Šคํฌ๋ฆฝํŠธ์šฉ) USER_ID=$(docker exec headscale headscale users list | grep "$PHARMACY_NAME" | awk '{print $1}') echo "์‚ฌ์šฉ์ž ID: $USER_ID" ``` #### 4๋‹จ๊ณ„: Pre-auth ํ‚ค ์ƒ์„ฑ ```bash # ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ‚ค ์ƒ์„ฑ PREAUTH_KEY=$(docker exec headscale headscale preauthkeys create --user "$USER_ID" --expiration "$EXPIRATION" --reusable | tail -1) echo "๐Ÿ”‘ ์ƒ์„ฑ๋œ Pre-auth Key:" echo "$PREAUTH_KEY" ``` #### 5๋‹จ๊ณ„: ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉ ```bash # ์•ฝ๊ตญ์˜ ๊ฐ ๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰ sudo tailscale up \ --login-server=http://192.168.0.151:8070 \ --authkey="$PREAUTH_KEY" \ --hostname=myeongdong-pos1 \ --accept-dns=false sudo tailscale up \ --login-server=http://192.168.0.151:8070 \ --authkey="$PREAUTH_KEY" \ --hostname=myeongdong-pos2 \ --accept-dns=false sudo tailscale up \ --login-server=http://192.168.0.151:8070 \ --authkey="$PREAUTH_KEY" \ --hostname=myeongdong-office \ --accept-dns=false ``` ### ํŠน์ˆ˜ ์ƒํ™ฉ๋ณ„ ๋ช…๋ น์–ด #### ์ž„์‹œ ์ ‘์† (๋งค๋‹ˆ์ € ๋…ธํŠธ๋ถ) ```bash # 2์‹œ๊ฐ„ ์งœ๋ฆฌ ์ผํšŒ์šฉ ํ‚ค docker exec headscale headscale preauthkeys create --user "$USER_ID" --expiration 2h # ์ผ์‹œ์  ์ ‘์† (์žฌ๋ถ€ํŒ… ์‹œ ์ž๋™ ํ•ด์ œ) docker exec headscale headscale preauthkeys create --user "$USER_ID" --expiration 1h --ephemeral ``` #### ๊ธฐ์ˆ  ์ง€์›์šฉ (์›๊ฒฉ ์ง€์›) ```bash # 30๋ถ„ ์งœ๋ฆฌ ephemeral ํ‚ค (์ง€์› ์™„๋ฃŒ ํ›„ ์ž๋™ ์‚ญ์ œ) docker exec headscale headscale preauthkeys create --user "$USER_ID" --expiration 30m --ephemeral ``` #### ํ…Œ์ŠคํŠธ์šฉ (๊ฐœ๋ฐœ/๊ฒ€์ฆ) ```bash # ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž ๋ฐ ์งง์€ ๋งŒ๋ฃŒ์‹œ๊ฐ„ docker exec headscale headscale users create test-environment docker exec headscale headscale preauthkeys create --user [TEST_USER_ID] --expiration 15m --reusable ``` --- ## ๐Ÿ” ๋ณด์•ˆ ๊ด€๋ฆฌ ### ํ‚ค ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ #### 1. ํ‚ค ์ƒ์„ฑ ์ •์ฑ… ```bash # ๊ถŒ์žฅ ๋งŒ๋ฃŒ์‹œ๊ฐ„ ์„ค์ • # - ์ผ๋ฐ˜ ์•ฝ๊ตญ: 30์ผ # - ์ž„์‹œ ์ ‘์†: 2-8์‹œ๊ฐ„ # - ๊ธฐ์ˆ  ์ง€์›: 30๋ถ„-1์‹œ๊ฐ„ # - ํ…Œ์ŠคํŠธ: 15๋ถ„-1์‹œ๊ฐ„ # ์˜ˆ์‹œ: ๋‹จ๊ณ„๋ณ„ ๋งŒ๋ฃŒ์‹œ๊ฐ„ docker exec headscale headscale preauthkeys create --user 2 --expiration 30d --reusable # ์šด์˜ docker exec headscale headscale preauthkeys create --user 2 --expiration 4h # ์ž„์‹œ docker exec headscale headscale preauthkeys create --user 2 --expiration 30m --ephemeral # ์ง€์› ``` #### 2. ํ‚ค ๊ฐฑ์‹  ์Šค์ผ€์ค„ ```bash # ์›”๋ณ„ ํ‚ค ๊ฐฑ์‹  ์Šคํฌ๋ฆฝํŠธ (cron ๋“ฑ๋ก ๊ถŒ์žฅ) #!/bin/bash # monthly-key-renewal.sh PHARMACIES=("pharmacy-gangnam" "pharmacy-hongdae" "pharmacy-itaewon") for pharmacy in "${PHARMACIES[@]}"; do echo "๐Ÿ”„ ๊ฐฑ์‹  ์ค‘: $pharmacy" # ๊ธฐ์กด ํ‚ค ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ (์ˆ˜๋™) echo "โš ๏ธ ๊ธฐ์กด ํ‚ค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜์„ธ์š”" # ์ƒˆ ํ‚ค ์ƒ์„ฑ USER_ID=$(docker exec headscale headscale users list | grep "$pharmacy" | awk '{print $1}') NEW_KEY=$(docker exec headscale headscale preauthkeys create --user "$USER_ID" --expiration 30d --reusable | tail -1) echo "๐Ÿ”‘ $pharmacy ์ƒˆ ํ‚ค: $NEW_KEY" echo "๐Ÿ“ง ์•ฝ๊ตญ์— ์ƒˆ ํ‚ค ์ „๋‹ฌ ํ•„์š”" done ``` #### 3. ํ‚ค ๋ชจ๋‹ˆํ„ฐ๋ง ```bash # ํ™œ์„ฑ ํ‚ค ํ™•์ธ docker exec headscale headscale preauthkeys list --user [USER_ID] # ๋งŒ๋ฃŒ ์˜ˆ์ • ํ‚ค ํ™•์ธ (์Šคํฌ๋ฆฝํŠธํ™” ๊ถŒ์žฅ) docker exec headscale headscale preauthkeys list --user [USER_ID] | grep -E "(expires|expired)" ``` ### ๋ณด์•ˆ ์‚ฌ๊ณ  ๋Œ€์‘ #### ํ‚ค ๋…ธ์ถœ ์‹œ ๋Œ€์‘ ์ ˆ์ฐจ ```bash # 1๋‹จ๊ณ„: ์ฆ‰์‹œ ์ƒˆ ํ‚ค ์ƒ์„ฑ EMERGENCY_KEY=$(docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 7d --reusable | tail -1) # 2๋‹จ๊ณ„: ํ•ด๋‹น ์•ฝ๊ตญ์— ๊ธด๊ธ‰ ์—ฐ๋ฝ echo "๐Ÿšจ ๊ธด๊ธ‰ ํ‚ค ๊ต์ฒด ํ•„์š”" echo "์ƒˆ ํ‚ค: $EMERGENCY_KEY" # 3๋‹จ๊ณ„: ๊ธฐ์กด ํ‚ค๋กœ ๋“ฑ๋ก๋œ ๋…ธ๋“œ ํ™•์ธ docker exec headscale headscale nodes list --user [USER_ID] # 4๋‹จ๊ณ„: ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋…ธ๋“œ ์ œ๊ฑฐ (ํ•„์š”์‹œ) # docker exec headscale headscale nodes delete [NODE_ID] ``` ### ์ ‘๊ทผ ์ œํ•œ ์„ค์ • #### ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (๊ณ ๊ธ‰) ```bash # ์•ฝ๊ตญ๋ณ„ ํƒœ๊ทธ ์„ค์ • docker exec headscale headscale preauthkeys create \ --user [USER_ID] \ --expiration 30d \ --reusable \ --tags "pharmacy:gangnam,role:pos" # ์ง€์—ญ๋ณ„ ์ ‘๊ทผ ์ œํ•œ docker exec headscale headscale preauthkeys create \ --user [USER_ID] \ --expiration 30d \ --reusable \ --tags "region:seoul,type:retail" ``` --- ## ๐Ÿ”ง ๋ฌธ์ œ ํ•ด๊ฒฐ ### ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋“ค #### 1. "invalid auth key" ์˜ค๋ฅ˜ ```bash # ์›์ธ: ํ‚ค ๋งŒ๋ฃŒ, ์ž˜๋ชป๋œ ํ‚ค, ์ด๋ฏธ ์‚ฌ์šฉ๋œ ์ผํšŒ์šฉ ํ‚ค # ์ง„๋‹จ: docker exec headscale headscale preauthkeys list --user [USER_ID] # ํ•ด๊ฒฐ: ์ƒˆ ํ‚ค ์ƒ์„ฑ docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 1h --reusable ``` #### 2. "user not found" ์˜ค๋ฅ˜ ```bash # ์›์ธ: ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž ID # ์ง„๋‹จ: docker exec headscale headscale users list # ํ•ด๊ฒฐ: ์‚ฌ์šฉ์ž ์ƒ์„ฑ docker exec headscale headscale users create [USERNAME] ``` #### 3. "foreign key constraint" ์˜ค๋ฅ˜ ```bash # ์›์ธ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ (FARMQ ํ™•์žฅ ํ…Œ์ด๋ธ”๊ณผ ์ถฉ๋Œ) # ํ•ด๊ฒฐ: ๊ธฐ์กด ์‚ฌ์šฉ์ž ์‚ฌ์šฉ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ฆฌ docker exec headscale headscale users list # ๊ธฐ์กด ์‚ฌ์šฉ์ž ํ™•์ธ # ๊ธฐ์กด ์‚ฌ์šฉ์ž ID๋กœ ํ‚ค ์ƒ์„ฑ ``` ### ๋””๋ฒ„๊น… ๋ช…๋ น์–ด ```bash # ์ „์ฒด ํ‚ค ๋ชฉ๋ก ํ™•์ธ docker exec headscale headscale preauthkeys list # ํŠน์ • ์‚ฌ์šฉ์ž์˜ ํ‚ค ๋ชฉ๋ก docker exec headscale headscale preauthkeys list --user [USER_ID] # ๋…ธ๋“œ ๋“ฑ๋ก ์ƒํƒœ ํ™•์ธ docker exec headscale headscale nodes list # ๋กœ๊ทธ ํ™•์ธ docker logs headscale | grep -i "preauth\|auth\|key" ``` --- ## ๐Ÿ“‹ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ### ์ƒˆ ์•ฝ๊ตญ ๋“ฑ๋ก ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [ ] ์•ฝ๊ตญ๋ช… ๊ฒฐ์ • (naming convention ์ค€์ˆ˜) - [ ] Headscale ์‚ฌ์šฉ์ž ์ƒ์„ฑ - [ ] ์‚ฌ์šฉ์ž ID ํ™•์ธ - [ ] ์ ์ ˆํ•œ ๋งŒ๋ฃŒ์‹œ๊ฐ„์œผ๋กœ Pre-auth ํ‚ค ์ƒ์„ฑ - [ ] ํ‚ค๋ฅผ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์•ฝ๊ตญ์— ์ „๋‹ฌ - [ ] ์•ฝ๊ตญ์—์„œ ํด๋ผ์ด์–ธํŠธ ๋“ฑ๋ก ํ…Œ์ŠคํŠธ - [ ] ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ™•์ธ - [ ] FARMQ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์—์„œ ํ™•์ธ ### ์ •๊ธฐ ๋ณด์•ˆ ์ ๊ฒ€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [ ] ๋งŒ๋ฃŒ ์˜ˆ์ • ํ‚ค ํ™•์ธ (30์ผ ์ „ ์•Œ๋ฆผ) - [ ] ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ‚ค ์ •๋ฆฌ - [ ] ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋…ธ๋“œ ์—ฐ๊ฒฐ ํ™•์ธ - [ ] ํ‚ค ์‚ฌ์šฉ ๋กœ๊ทธ ๊ฒ€ํ†  - [ ] ๋ฐฑ์—…๋œ ํ‚ค ์ •๋ณด ์—…๋ฐ์ดํŠธ ### ๊ธด๊ธ‰ ์ƒํ™ฉ ๋Œ€์‘ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - [ ] ํ‚ค ๋…ธ์ถœ ํ™•์ธ ์‹œ ์ฆ‰์‹œ ์ƒˆ ํ‚ค ์ƒ์„ฑ - [ ] ํ•ด๋‹น ์•ฝ๊ตญ์— ๊ธด๊ธ‰ ์—ฐ๋ฝ - [ ] ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋…ธ๋“œ ์ฐจ๋‹จ - [ ] ์‚ฌ๊ณ  ๊ฒฝ์œ„ ๋ฌธ์„œํ™” - [ ] ์žฌ๋ฐœ ๋ฐฉ์ง€ ๋Œ€์ฑ… ์ˆ˜๋ฆฝ --- ## ๐Ÿ“š ๋ช…๋ น์–ด ์ฐธ์กฐ ์นด๋“œ ### ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด ```bash # === ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ === docker exec headscale headscale users create [USERNAME] docker exec headscale headscale users list # === ํ‚ค ์ƒ์„ฑ === # ์ผํšŒ์šฉ docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 1h # ์žฌ์‚ฌ์šฉ (์ผ๋ฐ˜์ ) docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 30d --reusable # ์ž„์‹œ (ephemeral) docker exec headscale headscale preauthkeys create --user [USER_ID] --expiration 30m --ephemeral # === ํ‚ค ๊ด€๋ฆฌ === docker exec headscale headscale preauthkeys list --user [USER_ID] docker exec headscale headscale preauthkeys expire [KEY_ID] # === ๋…ธ๋“œ ๊ด€๋ฆฌ === docker exec headscale headscale nodes list docker exec headscale headscale nodes list --user [USER_ID] docker exec headscale headscale nodes delete [NODE_ID] ``` ### ํด๋ผ์ด์–ธํŠธ ๋ช…๋ น์–ด ```bash # ํ‘œ์ค€ ๋“ฑ๋ก sudo tailscale up \ --login-server=http://192.168.0.151:8070 \ --authkey=[PREAUTH_KEY] \ --hostname=[HOSTNAME] \ --accept-dns=false # ์ƒํƒœ ํ™•์ธ tailscale status tailscale ip -4 # ์—ฐ๊ฒฐ ํ•ด์ œ sudo tailscale down sudo tailscale logout ``` --- ## ๐ŸŽฏ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ์š”์•ฝ ### DO โœ… - **์•ฝ๊ตญ๋ณ„ ๊ฐœ๋ณ„ ํ‚ค ์‚ฌ์šฉ** - **์ ์ ˆํ•œ ๋งŒ๋ฃŒ์‹œ๊ฐ„ ์„ค์ •** (30์ผ ๊ถŒ์žฅ) - **์ •๊ธฐ์ ์ธ ํ‚ค ๊ฐฑ์‹ ** - **ํ‚ค ์ „๋‹ฌ ์‹œ ๋ณด์•ˆ ์ฑ„๋„ ์‚ฌ์šฉ** - **ํ‚ค ์‚ฌ์šฉ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง** ### DON'T โŒ - **๋ชจ๋“  ์•ฝ๊ตญ์ด ํ•˜๋‚˜์˜ ํ‚ค ๊ณต์œ ํ•˜์ง€ ์•Š๊ธฐ** - **๋งŒ๋ฃŒ์‹œ๊ฐ„ ๋„ˆ๋ฌด ๊ธธ๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š๊ธฐ** (90์ผ ์ด์ƒ) - **ํ‚ค๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ด๋ฉ”์ผ ์ „์†กํ•˜์ง€ ์•Š๊ธฐ** - **๋งŒ๋ฃŒ๋œ ํ‚ค ๋ฐฉ์น˜ํ•˜์ง€ ์•Š๊ธฐ** - **ํ‚ค ๋ฐฑ์—… ์—†์ด ์šด์˜ํ•˜์ง€ ์•Š๊ธฐ** --- **๐ŸŽŠ ์ฒด๊ณ„์ ์ธ ํ‚ค ๊ด€๋ฆฌ๋กœ ์•ˆ์ „ํ•œ FARMQ ๋„คํŠธ์›Œํฌ๋ฅผ ์šด์˜ํ•˜์„ธ์š”!**