feat: 자동 등록 스크립트를 별도 파일로 분리
변경사항:
- headscale-quick-install.sh: 기존 스크립트 유지 (단순 VPN 등록만)
- headscale-auto-register.sh: 새로운 자동 등록 스크립트 (NEW!)
headscale-auto-register.sh 기능:
- Headscale VPN 자동 등록
- VPN IP 자동 확인 (10초 재시도)
- 약국 정보 수집 (약국명 필수)
- farmq.db에 약국 자동 생성 (demo.pharmq.kr)
- gateway.db에 admin 계정 자동 생성 (gateway.pharmq.kr)
- 로그인 정보 출력 (아이디: p{code}, 비밀번호: 1234)
사용법:
# 기존 방식 (VPN만 등록)
curl -fsSL https://git.0bin.in/.../headscale-quick-install.sh | bash
# 새로운 방식 (VPN + 약국 + 계정 자동 생성)
curl -fsSL https://git.0bin.in/.../headscale-auto-register.sh | bash
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -486,185 +486,28 @@ show_final_info() {
|
||||
print_header "설치 완료 - 팜큐 네트워크를 사용할 수 있습니다!"
|
||||
}
|
||||
|
||||
# ================================
|
||||
# 약국 자동 등록 함수들
|
||||
# ================================
|
||||
|
||||
# 약국 정보 수집
|
||||
collect_pharmacy_info() {
|
||||
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
echo -e "${WHITE}약국 정보 입력${NC}"
|
||||
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
|
||||
# 약국명 입력 (필수)
|
||||
while [ -z "$PHARMACY_NAME" ]; do
|
||||
read -p "약국명을 입력하세요: " PHARMACY_NAME
|
||||
done
|
||||
|
||||
# 요양기관부호 입력 (선택)
|
||||
read -p "요양기관부호 (선택, Enter로 건너뛰기): " HIRA_CODE
|
||||
|
||||
# 약국 주소 입력 (선택)
|
||||
read -p "약국 주소 (선택): " PHARMACY_ADDRESS
|
||||
|
||||
# 약국장 이름 입력 (선택)
|
||||
read -p "약국장 이름 (선택): " OWNER_NAME
|
||||
|
||||
# 연락처 입력 (선택)
|
||||
read -p "약국 연락처 (선택): " PHARMACY_PHONE
|
||||
|
||||
echo -e "${GREEN}✓ 약국 정보 입력 완료${NC}"
|
||||
}
|
||||
|
||||
# VPN IP 확인
|
||||
get_assigned_vpn_ip() {
|
||||
echo -e "${BLUE}VPN IP 확인 중...${NC}"
|
||||
|
||||
# tailscale status로 IP 추출 (최대 10초 대기)
|
||||
for i in {1..10}; do
|
||||
VPN_IP=$(tailscale status --json 2>/dev/null | grep -oP '"TailscaleIPs":\["\K[^"]+' | head -1)
|
||||
|
||||
if [ -n "$VPN_IP" ]; then
|
||||
echo -e "${GREEN}✓ VPN IP: $VPN_IP${NC}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}⏳ VPN IP 할당 대기 중... ($i/10)${NC}"
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo -e "${RED}✗ VPN IP를 가져올 수 없습니다${NC}"
|
||||
return 1
|
||||
}
|
||||
|
||||
# farmq-admin API 호출하여 약국 생성
|
||||
create_pharmacy_via_api() {
|
||||
echo -e "${BLUE}약국 등록 중 (farmq.db)...${NC}"
|
||||
|
||||
# JSON 데이터 구성
|
||||
JSON_DATA=$(cat <<EOF
|
||||
{
|
||||
"pharmacy_name": "$PHARMACY_NAME",
|
||||
"vpn_ip": "$VPN_IP",
|
||||
"hira_code": "$HIRA_CODE",
|
||||
"address": "$PHARMACY_ADDRESS",
|
||||
"owner_name": "$OWNER_NAME",
|
||||
"phone": "$PHARMACY_PHONE",
|
||||
"api_port": 8082
|
||||
}
|
||||
EOF
|
||||
)
|
||||
|
||||
# API 호출 (외부 도메인)
|
||||
RESPONSE=$(curl -s -X POST https://demo.pharmq.kr/api/pharmacy \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$JSON_DATA")
|
||||
|
||||
# pharmacy_code 추출
|
||||
PHARMACY_CODE=$(echo "$RESPONSE" | grep -oP '"pharmacy_code":"[^"]*"' | cut -d'"' -f4)
|
||||
|
||||
if [ -z "$PHARMACY_CODE" ]; then
|
||||
echo -e "${RED}✗ 약국 생성 실패${NC}"
|
||||
echo "$RESPONSE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ 약국 생성 완료: $PHARMACY_CODE${NC}"
|
||||
return 0
|
||||
}
|
||||
|
||||
# gateway API 호출하여 관리자 계정 생성
|
||||
create_gateway_user_via_api() {
|
||||
echo -e "${BLUE}관리자 계정 생성 중 (gateway.db)...${NC}"
|
||||
|
||||
# username: pharmacy_code 소문자 (P0005 → p0005)
|
||||
USERNAME=$(echo "$PHARMACY_CODE" | tr '[:upper:]' '[:lower:]')
|
||||
PASSWORD="1234" # 기본 비밀번호
|
||||
EMAIL="${USERNAME}@pharmq.internal"
|
||||
|
||||
# JSON 데이터 구성
|
||||
JSON_DATA=$(cat <<EOF
|
||||
{
|
||||
"username": "$USERNAME",
|
||||
"email": "$EMAIL",
|
||||
"password": "$PASSWORD",
|
||||
"name": "${PHARMACY_NAME} 관리자",
|
||||
"phone": "$PHARMACY_PHONE",
|
||||
"primary_pharmacy_code": "$PHARMACY_CODE",
|
||||
"role": "admin"
|
||||
}
|
||||
EOF
|
||||
)
|
||||
|
||||
# API 호출 (외부 도메인)
|
||||
RESPONSE=$(curl -s -X POST https://gateway.pharmq.kr/api/auth/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$JSON_DATA")
|
||||
|
||||
# 성공 여부 확인
|
||||
if echo "$RESPONSE" | grep -q '"success":true'; then
|
||||
echo -e "${GREEN}✓ 관리자 계정 생성 완료${NC}"
|
||||
return 0
|
||||
else
|
||||
echo -e "${RED}✗ 관리자 계정 생성 실패${NC}"
|
||||
echo "$RESPONSE"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 로그인 정보 출력
|
||||
display_login_credentials() {
|
||||
echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
echo -e "${WHITE}🎉 설치 및 등록 완료!${NC}"
|
||||
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
|
||||
echo -e "\n${GREEN}약국 정보:${NC}"
|
||||
echo -e " 약국 코드: ${WHITE}$PHARMACY_CODE${NC}"
|
||||
echo -e " 약국명: ${WHITE}$PHARMACY_NAME${NC}"
|
||||
echo -e " VPN IP: ${WHITE}$VPN_IP${NC}"
|
||||
|
||||
echo -e "\n${GREEN}프론트엔드 로그인 정보:${NC}"
|
||||
echo -e " URL: ${WHITE}https://pharmq.kr${NC}"
|
||||
echo -e " 아이디: ${WHITE}$(echo "$PHARMACY_CODE" | tr '[:upper:]' '[:lower:]')${NC}"
|
||||
echo -e " 비밀번호: ${WHITE}1234${NC}"
|
||||
echo -e " ${YELLOW}⚠ 최초 로그인 후 비밀번호를 변경하세요!${NC}"
|
||||
|
||||
echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
}
|
||||
|
||||
# ================================
|
||||
# 메인 함수
|
||||
# ================================
|
||||
main() {
|
||||
print_header "팜큐(FARMQ) Headscale 원클릭 설치 및 약국 등록"
|
||||
|
||||
print_header "팜큐(FARMQ) Headscale 원클릭 설치"
|
||||
|
||||
# 사전 체크
|
||||
detect_os
|
||||
check_requirements
|
||||
|
||||
|
||||
# 설치 과정
|
||||
install_tailscale
|
||||
start_tailscale
|
||||
register_headscale
|
||||
|
||||
# VPN IP 확인 (Headscale 등록 직후)
|
||||
sleep 3 # Headscale에서 IP 할당 대기
|
||||
get_assigned_vpn_ip || exit 1
|
||||
|
||||
# 약국 정보 수집
|
||||
collect_pharmacy_info
|
||||
|
||||
# 약국 및 계정 생성
|
||||
create_pharmacy_via_api || exit 1
|
||||
create_gateway_user_via_api || exit 1
|
||||
|
||||
|
||||
# 사후 설정
|
||||
configure_firewall
|
||||
verify_connection
|
||||
|
||||
|
||||
# 정리 및 완료
|
||||
cleanup
|
||||
display_login_credentials
|
||||
show_final_info
|
||||
}
|
||||
|
||||
# ================================
|
||||
|
||||
Reference in New Issue
Block a user