📋 기획 및 설계: - 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>
196 lines
7.1 KiB
Bash
Executable File
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}" |