Fix machine management page to display proper Magic DNS names: - Use given_name instead of hostname for machine display - Add Magic DNS address with copy-to-clipboard functionality - Distinguish between machine name and OS hostname like Headplane - Enhance UI with Magic DNS information (.headscale.local) Changes: - farmq-admin/utils/database_new.py: Use given_name for machine_name - farmq-admin/models/farmq_models.py: Update sync logic for given_name - farmq-admin/templates/machines/list.html: Add Magic DNS display with copy feature - FARMQ_ADMIN_MACHINE_NAME_FIX_PLAN.md: Complete analysis and implementation plan Now displays: - Machine Name: pbs-hp (Magic DNS name) - Magic DNS: pbs-hp.headscale.local (with copy button) - OS Hostname: proxmox-backup-server (system name) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
8.2 KiB
8.2 KiB
FarmQ Admin 머신 이름 표시 문제 해결 계획
📋 문제 상황
현재 FarmQ Admin의 머신 관리 페이지에서 머신 이름이 hostname으로만 표시되고 있어, Magic DNS에서 사용되는 실제 노드 이름(given_name)과 일치하지 않는 문제가 발생하고 있습니다.
🔍 문제 분석
1. 현재 상황
Headscale CLI API 실제 데이터:
{
"id": 1,
"name": "0bin-Ubuntu-VM", // ❌ 실제 Magic DNS에서 사용되는 이름
"given_name": "0bin-ubuntu-vm", // ✅ Magic DNS 접두어 (pev.headscale.local)
"ip_addresses": ["100.64.0.1"],
"user": {"name": "myuser"},
"online": true
}
FarmQ Admin 현재 표시:
<strong>{{ machine_data.machine_name or machine_data.hostname }}</strong>
<div class="small text-muted">{{ machine_data.hostname }}</div>
2. 문제의 근본 원인
A. 데이터베이스 스키마 불일치
Headscale 모델:
# models/headscale_models.py
class Node:
hostname = Column(String) # 시스템 호스트명 (0bin-Ubuntu-VM)
given_name = Column(String) # 사용자 지정 이름 (0bin-ubuntu-vm) - Magic DNS용
FarmQ 모델:
# models/farmq_models.py
class MachineProfile:
hostname = Column(String) # hostname으로 복사됨
machine_name = Column(String) # hostname으로 중복 저장됨 ❌
B. 동기화 로직 문제
# utils/database_new.py (line 343)
machine_data = {
'hostname': node.hostname, # "0bin-Ubuntu-VM"
'machine_name': node.hostname, # ❌ hostname 중복! given_name이어야 함
'tailscale_ip': node.ipv4,
}
C. 템플릿 표시 문제
<!-- templates/machines/list.html (line 115) -->
<strong>{{ machine_data.machine_name or machine_data.hostname }}</strong>
<!-- 현재: "0bin-Ubuntu-VM" (hostname) -->
<!-- 원하는: "0bin-ubuntu-vm" (given_name) -->
✅ 해결 방안
1. 즉시 수정 (Quick Fix)
A. 데이터베이스 동기화 로직 수정
# farmq-admin/utils/database_new.py
def get_all_machines_with_details():
machine_data = {
'hostname': node.hostname, # 시스템 호스트명
'machine_name': node.given_name, # ✅ Magic DNS 이름으로 변경
'display_name': node.given_name or node.hostname, # 표시용 이름
'tailscale_ip': node.ipv4,
}
B. FarmQ 모델 동기화 수정
# models/farmq_models.py - sync_machine_from_headscale
machine = MachineProfile(
hostname=headscale_node_data.get('hostname'),
machine_name=headscale_node_data.get('given_name'), # ✅ given_name 사용
tailscale_ip=headscale_node_data.get('ipv4'),
)
C. 템플릿 표시 개선
<!-- templates/machines/list.html -->
<strong>{{ machine_data.machine_name or machine_data.hostname }}</strong>
<div class="small text-muted">
<i class="fas fa-network-wired"></i> {{ machine_data.machine_name }}.headscale.local
</div>
<div class="small text-muted">
<i class="fas fa-server"></i> {{ machine_data.hostname }}
</div>
2. 근본적 개선 (Long-term)
A. 필드 명칭 명확화
class MachineProfile:
system_hostname = Column(String) # 시스템 호스트명 (0bin-Ubuntu-VM)
headscale_name = Column(String) # Headscale given_name (0bin-ubuntu-vm)
magic_dns_name = Column(String) # Magic DNS 전체 이름 (0bin-ubuntu-vm.headscale.local)
display_name = Column(String) # 사용자 표시용 이름
B. Magic DNS 정보 표시 강화
<div class="machine-info">
<h5>{{ machine.display_name }}</h5>
<div class="dns-info">
<code>{{ machine.magic_dns_name }}</code>
<button class="btn btn-sm" onclick="copyToClipboard('{{ machine.magic_dns_name }}')">
<i class="fas fa-copy"></i>
</button>
</div>
<div class="system-info small text-muted">
시스템: {{ machine.system_hostname }}
</div>
</div>
🚀 구현 단계
Phase 1: 긴급 수정 (1-2시간)
-
데이터 동기화 로직 수정
# 파일: farmq-admin/utils/database_new.py # 라인: 343 'machine_name': node.given_name, # hostname → given_name -
템플릿 표시 개선
# 파일: farmq-admin/templates/machines/list.html # Magic DNS 정보 추가 표시 -
동기화 함수 수정
# 파일: farmq-admin/models/farmq_models.py # sync_machine_from_headscale 함수 수정
Phase 2: 표시 개선 (2-3시간)
-
Magic DNS 정보 강화 표시
.headscale.local접미사 자동 표시- 클립보드 복사 기능
- 연결 테스트 기능
-
필터링 기능 추가
- Magic DNS 이름으로 검색
- 온라인/오프라인 필터
- 사용자별 필터
Phase 3: 구조적 개선 (4-6시간)
-
데이터베이스 스키마 개선
- 필드명 명확화
- Magic DNS 전용 필드 추가
- 인덱스 최적화
-
API 통합 개선
- Headscale CLI 응답 캐싱
- 실시간 상태 업데이트
- WebSocket을 통한 실시간 알림
📊 예상 결과
Before (현재)
머신 이름: 0bin-Ubuntu-VM # hostname (시스템명)
호스트명: 0bin-Ubuntu-VM # 중복 정보
Magic DNS: 사용불가 ❌ # given_name 정보 부족
After (수정 후)
머신 이름: 0bin-ubuntu-vm # given_name (Magic DNS용)
Magic DNS: 0bin-ubuntu-vm.headscale.local ✅
시스템명: 0bin-Ubuntu-VM # hostname (참고 정보)
IP 주소: 100.64.0.1 # 현재와 동일
🧪 테스트 계획
1. 데이터 검증
# 테스트 스크립트
def test_machine_name_mapping():
nodes = headscale_session.query(Node).all()
for node in nodes:
print(f"ID: {node.id}")
print(f"Hostname: {node.hostname}") # 0bin-Ubuntu-VM
print(f"Given Name: {node.given_name}") # 0bin-ubuntu-vm
print(f"Magic DNS: {node.given_name}.headscale.local")
print("---")
2. Magic DNS 연결 테스트
# 각 노드별 Magic DNS 테스트
ping 0bin-ubuntu-vm.headscale.local
ping pev.headscale.local
ping pqserver.headscale.local
3. UI 표시 확인
- 머신 목록에서 올바른 이름 표시
- Magic DNS 주소 복사 기능
- 연결 상태와 일치성 확인
📝 체크리스트
코드 수정
farmq-admin/utils/database_new.py- 동기화 로직 수정farmq-admin/models/farmq_models.py- 모델 동기화 수정farmq-admin/templates/machines/list.html- 표시 개선farmq-admin/templates/machines/detail.html- 상세 페이지 수정
테스트
- 데이터베이스 동기화 테스트
- Magic DNS 이름 표시 확인
- UI 표시 정상성 확인
- 기존 기능 호환성 테스트
문서화
- 변경사항 README 업데이트
- API 문서 갱신
- 사용자 가이드 수정
🔧 구현 파일 목록
수정할 파일들
-
farmq-admin/utils/database_new.py(라인 343)machine_name필드를given_name으로 변경
-
farmq-admin/models/farmq_models.py(라인 445)- 동기화 시
given_name사용
- 동기화 시
-
farmq-admin/templates/machines/list.html(라인 115-119)- Magic DNS 정보 추가 표시
-
farmq-admin/templates/machines/detail.html- 상세 페이지 Magic DNS 정보 개선
새로 추가할 기능
- Magic DNS 주소 클립보드 복사
- 연결 테스트 버튼
- 실시간 온라인 상태 표시
💡 장기적 개선사항
1. Headscale API 직접 통합
현재 CLI 기반 → REST API 직접 호출로 전환하여 성능 개선
2. 실시간 모니터링
WebSocket을 통한 실시간 노드 상태 업데이트
3. Magic DNS 관리 기능
- 노드 이름 변경
- Magic DNS 도메인 설정
- DNS 해석 테스트 도구
📅 구현 일정
| 단계 | 작업 | 소요시간 | 완료일 |
|---|---|---|---|
| Phase 1 | 긴급 수정 | 2시간 | 당일 |
| Phase 2 | 표시 개선 | 3시간 | 1일 |
| Phase 3 | 구조 개선 | 6시간 | 2-3일 |
작성일: 2025년 9월 13일 업데이트: FarmQ Admin 머신 이름 표시 문제 분석 및 해결 계획 수립 완료