#!/bin/bash # ============================================================================= # FARMQ Headscale 클라이언트 자동 등록 스크립트 # ============================================================================= # 사용법: ./add-client.sh [사용자명] [머신명] # 예시: ./add-client.sh pharmacy-01 busan-store-pc # ============================================================================= set -e # 오류 발생 시 스크립트 중단 # 색상 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 로고 echo -e "${BLUE}" echo " ███████╗ █████╗ ██████╗ ██╗ ██╗ ██████╗ " echo " ██╔════╝██╔══██╗██╔══██╗████╗ ████║██╔═══██╗" echo " █████╗ ███████║██████╔╝██╔████╔██║██║ ██║" echo " ██╔══╝ ██╔══██║██╔══██╗██║╚██╔╝██║██║▄▄ ██║" echo " ██║ ██║ ██║██║ ██║██║ ╚═╝ ██║╚██████╔╝" echo " ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚══▀▀═╝ " echo -e "${NC}" echo -e "${GREEN}🏥 FARMQ Headscale 클라이언트 자동 등록 스크립트${NC}" echo "============================================================" # 설정 변수 HEADSCALE_SERVER="192.168.0.151:8070" HEADSCALE_URL="http://${HEADSCALE_SERVER}" FARMQ_ADMIN_URL="http://192.168.0.151:5001" # 파라미터 확인 USER_NAME=${1:-""} MACHINE_NAME=${2:-""} # 사용자 입력 받기 if [[ -z "$USER_NAME" ]]; then echo -e "${YELLOW}📝 사용자명을 입력하세요 (예: pharmacy-01, store-busan):${NC}" read -p "사용자명: " USER_NAME fi if [[ -z "$MACHINE_NAME" ]]; then echo -e "${YELLOW}📝 머신명을 입력하세요 (예: pos-terminal, office-pc):${NC}" read -p "머신명: " MACHINE_NAME fi # 입력값 검증 if [[ -z "$USER_NAME" ]] || [[ -z "$MACHINE_NAME" ]]; then echo -e "${RED}❌ 사용자명과 머신명은 필수입니다.${NC}" exit 1 fi echo -e "${BLUE}📋 설정 정보:${NC}" echo " 사용자명: $USER_NAME" echo " 머신명: $MACHINE_NAME" echo " Headscale 서버: $HEADSCALE_SERVER" echo "" # 확인 메시지 echo -e "${YELLOW}⚠️ 이 설정으로 진행하시겠습니까? (y/N)${NC}" read -p "진행: " CONFIRM if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then echo -e "${RED}❌ 취소되었습니다.${NC}" exit 1 fi echo -e "${GREEN}🚀 클라이언트 등록을 시작합니다...${NC}" # 1. 시스템 업데이트 echo -e "${BLUE}📦 시스템 업데이트 중...${NC}" sudo apt update -qq # 2. Tailscale 설치 확인 if ! command -v tailscale &> /dev/null; then echo -e "${YELLOW}📥 Tailscale 설치 중...${NC}" curl -fsSL https://tailscale.com/install.sh | sh else echo -e "${GREEN}✅ Tailscale이 이미 설치되어 있습니다.${NC}" fi # 3. 기존 Tailscale 연결 해제 (있는 경우) echo -e "${BLUE}🧹 기존 연결 정리 중...${NC}" sudo tailscale logout 2>/dev/null || true sudo tailscale down 2>/dev/null || true # 4. Headscale 서버 연결 테스트 echo -e "${BLUE}🔍 Headscale 서버 연결 테스트 중...${NC}" if ! curl -s --connect-timeout 5 "$HEADSCALE_URL/health" > /dev/null 2>&1; then echo -e "${RED}❌ Headscale 서버에 연결할 수 없습니다: $HEADSCALE_URL${NC}" echo -e "${YELLOW}💡 서버가 실행 중이고 방화벽 설정을 확인하세요.${NC}" exit 1 fi echo -e "${GREEN}✅ Headscale 서버 연결 성공${NC}" # 5. Pre-auth key 생성 (서버에서 실행) echo -e "${BLUE}🔑 Pre-auth key 생성 중...${NC}" echo -e "${YELLOW}📝 Headscale 서버에서 다음 명령어를 실행해야 합니다:${NC}" echo "" echo -e "${GREEN}# SSH로 서버 접속 후 실행:${NC}" echo "cd /srv/headscale-setup" echo "docker exec headscale headscale users create $USER_NAME 2>/dev/null || true" echo "docker exec headscale headscale preauthkeys create --user $USER_NAME --expiration 1h" echo "" # Pre-auth key 입력 받기 echo -e "${YELLOW}🔐 생성된 Pre-auth key를 입력하세요:${NC}" read -p "Pre-auth key: " PREAUTH_KEY if [[ -z "$PREAUTH_KEY" ]]; then echo -e "${RED}❌ Pre-auth key는 필수입니다.${NC}" exit 1 fi # 6. Tailscale을 Headscale 서버에 연결 echo -e "${BLUE}🔗 Headscale 서버에 연결 중...${NC}" # 머신명 설정 sudo tailscale up \ --login-server="$HEADSCALE_URL" \ --authkey="$PREAUTH_KEY" \ --hostname="$MACHINE_NAME" \ --accept-dns=false \ --reset # 7. 연결 상태 확인 echo -e "${BLUE}🔍 연결 상태 확인 중...${NC}" sleep 5 # Tailscale 상태 확인 if tailscale status >/dev/null 2>&1; then echo -e "${GREEN}✅ Tailscale 서비스 정상 작동${NC}" # IP 주소 확인 TAILSCALE_IP=$(tailscale ip -4 2>/dev/null || echo "IP 조회 실패") echo -e "${GREEN}📍 할당된 IP 주소: $TAILSCALE_IP${NC}" # 연결된 노드 목록 echo -e "${BLUE}🌐 연결된 노드 목록:${NC}" tailscale status else echo -e "${RED}❌ Tailscale 연결에 실패했습니다.${NC}" echo -e "${YELLOW}💡 로그 확인: sudo journalctl -u tailscaled -f${NC}" exit 1 fi # 8. 네트워크 연결 테스트 echo -e "${BLUE}🧪 네트워크 연결 테스트 중...${NC}" # 서버와의 연결 테스트 if ping -c 3 100.64.0.1 >/dev/null 2>&1; then echo -e "${GREEN}✅ Headscale 서버와 통신 성공 (100.64.0.1)${NC}" else echo -e "${YELLOW}⚠️ 서버와의 직접 통신은 실패했지만 정상일 수 있습니다.${NC}" fi # 9. 시스템 서비스 활성화 echo -e "${BLUE}⚙️ 시스템 서비스 설정 중...${NC}" sudo systemctl enable tailscaled sudo systemctl start tailscaled # 10. 방화벽 설정 (선택사항) if command -v ufw &> /dev/null; then echo -e "${BLUE}🔥 방화벽 설정 중...${NC}" sudo ufw allow in on tailscale0 2>/dev/null || true fi # 11. 완료 메시지 echo -e "${GREEN}" echo "🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉" echo " FARMQ 클라이언트 등록 완료!" echo "🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉" echo -e "${NC}" echo -e "${GREEN}✅ 클라이언트가 성공적으로 등록되었습니다!${NC}" echo "" echo -e "${BLUE}📊 연결 정보:${NC}" echo " • 사용자명: $USER_NAME" echo " • 머신명: $MACHINE_NAME" echo " • Tailscale IP: $TAILSCALE_IP" echo " • 서버 주소: $HEADSCALE_SERVER" echo "" echo -e "${BLUE}🌐 관리 페이지:${NC}" echo " • FARMQ 관리자 페이지: $FARMQ_ADMIN_URL" echo " • Headplane UI: http://192.168.0.151:3000" echo "" echo -e "${BLUE}🔧 유용한 명령어:${NC}" echo " • 상태 확인: tailscale status" echo " • IP 주소 확인: tailscale ip" echo " • 로그 확인: sudo journalctl -u tailscaled -f" echo " • 재시작: sudo systemctl restart tailscaled" echo "" echo -e "${GREEN}🎊 이제 FARMQ 네트워크의 일부가 되었습니다!${NC}"