headscale-tailscale-replace.../add-client.sh
시골약사 35ecd4748e PharmQ SaaS 구독 서비스 관리 시스템 완전 구현
📋 기획 및 설계:
- PharmQ SaaS 서비스 기획서 작성
- 구독 서비스 라인업 정의 (클라우드PC, AI CCTV, CRM)
- DB 스키마 설계 및 API 아키텍처 설계

🗄️ 데이터베이스 구조:
- service_products: 서비스 상품 마스터 테이블
- pharmacy_subscriptions: 약국별 구독 현황 테이블
- subscription_usage_logs: 서비스 이용 로그 테이블
- billing_history: 결제 이력 테이블
- 샘플 데이터 자동 생성 (21개 구독, 월 118만원 매출)

🔧 백엔드 API 구현:
- 구독 현황 통계 API (/api/subscriptions/stats)
- 약국별 구독 조회 API (/api/pharmacies/subscriptions)
- 구독 상세 정보 API (/api/pharmacy/{id}/subscriptions)
- 구독 생성/해지 API (/api/subscriptions)

🖥️ 프론트엔드 UI 구현:
- 대시보드 구독 현황 카드 (월 매출, 구독 수, 구독률 등)
- 약국 목록에 구독 상태 아이콘 및 월 구독료 표시
- 약국 상세 페이지 구독 서비스 섹션 추가
- 실시간 구독 생성/해지 기능 구현

 주요 특징:
- 서비스별 색상 코딩 및 이모지 아이콘 시스템
- 실시간 업데이트 (구독 생성/해지 즉시 반영)
- 반응형 디자인 (모바일/태블릿 최적화)
- 툴팁 기반 상세 정보 표시

📊 현재 구독 현황:
- 총 월 매출: ₩1,180,000
- 구독 약국: 10/14개 (71.4%)
- AI CCTV: 6개 약국, CRM: 10개 약국, 클라우드PC: 5개 약국

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 19:48:12 +09:00

196 lines
7.1 KiB
Bash
Executable File

#!/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}"