CMS 서버 설치
사이트에 CMS 서버를 세우는 순서입니다. 전문 지식 없이 따라 할 수 있게 썼습니다 — 설치 파일이 준비 상태를 스스로 점검하고, 필요한 것은 직접 설치합니다.
시작하기 전에 — 받은 것을 한곳에 모읍니다
섹션 제목: “시작하기 전에 — 받은 것을 한곳에 모읍니다”Windows PC 의 C:\treet 에 받으신 것을 전부 넣어 두세요. 폴더가 없으면 만드시면 됩니다.
받으시는 꾸러미는 이렇게 생겼습니다 — 폴더째 통째로 옮기세요.
C:\treet\ 읽어주세요.md ← 🔴 **먼저 읽으세요.** 이 현장의 값이 적혀 있습니다 목록.md ← 들어 있는 파일과 sha256 TreeT_코드서명_공개인증서.cer ← 🔴 키오스크마다 **설치 전에** 등록합니다 check-install.ps1 ← 설치가 제대로 됐는지 재는 스크립트 설치파일\ ← 키오스크용 설치 파일들(+ 안드로이드 APK) CMS\treet-cms-offline-<판>.tar.gz ← CMS 설치 패키지 매뉴얼\ ← 이 문서의 오프라인 사본 키오스크셋팅\ ← 키오스크 PC 최적화 스크립트여기에 하나를 더 받아 같이 두세요 — 저희가 드리지 않습니다:
ubuntu-26.04.x-live-server-amd64.iso ← 가상 머신에 깔 Ubuntu (ubuntu.com 에서 받습니다)전체 흐름 한눈에 보기
섹션 제목: “전체 흐름 한눈에 보기”처음이시면 이 지도를 한 번 보고 시작하세요. 위에서 아래로 한 번만 가면 끝납니다.
| 무엇을 | 얼마나 | 누가 합니까 | |
|---|---|---|---|
| 준비 | 받은 것을 C:\treet 에 모으기 (바로 위) | 5분 | 사람 |
| 0 | 가상 머신 만들고 Ubuntu 설치 | 30~60분 | 사람 |
| 0-e | 🔴 디스크 넓히기 — Ubuntu 가 절반만 씁니다 | 1분 | 사람 |
| 1 | 설치 패키지를 VM 안으로 | 5~10분 | 사람 |
| 2 | sudo bash install.sh 실행 | 1분 | 사람 |
| 3 | 준비 상태 점검 | 자동 | 설치 파일 |
| 4 | 질문 세 개에 답 | 1분 | 사람 |
| 5 | 관리자 비밀번호 받아 적기 | 1분 | 사람 |
| 6 | 실제로 뜨는지 확인 | 자동(몇 분) | 설치 파일 |
| 7 | 백업 켜기 — 설치가 자동으로 · 확인만 | 1분 | 설치 파일 |
| 7-b | 이 PC 에 Watchdog 깔기 — CMS VM 이 멈추면 다시 켭니다 | 5분 | 사람 |
| 8 | 원격 접속 준비 | 필요할 때 | 사람 |
| 9 | 인터넷 주소·인증서 + 관리자 입구 | 20분 | 사람(토큰·브라우저 승인) + 스크립트 |
0. 가상 머신을 만듭니다 (Hyper-V)
섹션 제목: “0. 가상 머신을 만듭니다 (Hyper-V)”CMS 는 Ubuntu 가상 머신 안에서 돕니다. Windows PC 라면 먼저 그 VM 을 만듭니다.
0-a. Hyper-V 를 켜고 외부 스위치를 만듭니다
섹션 제목: “0-a. Hyper-V 를 켜고 외부 스위치를 만듭니다”제어판 → 프로그램 → Windows 기능 켜기/끄기 에서 Hyper-V 를 체크하고 재부팅합니다.
재부팅한 뒤 VM 보다 먼저 외부 스위치를 만듭니다. 키오스크들이 이 VM 에 붙으려면 VM 이 이 PC 의 실제 랜카드에 연결돼 있어야 합니다.
화면으로: Hyper-V 관리자 → 가상 스위치 관리자 → 새 가상 네트워크 스위치 → 외부 →
이름 TreeT-External → 이 PC 가 실제로 쓰는 랜카드를 고릅니다.
⚠️ 화면으로 만들었다면, 만든 뒤 아래 명령의 ③ DNS 확인·채우기를 꼭 따로 하세요(고정 IP 면 DNS 가 빠집니다).
명령으로(관리자 PowerShell) — 빠진 DNS 까지 한 번에 처리합니다:
# ① 랜카드 이름 확인 — 키오스크와 같은 망에 연결된 것(보통 '이더넷')Get-NetAdapter -Physical | Format-Table Name, InterfaceDescription, Status, LinkSpeed
# ② 위 목록의 Name 을 넣습니다$Switch = "TreeT-External"$Nic = "이더넷"
# 만들기 전에 지금 설정을 기억해 둡니다 — 고정 IP 이면 스위치를 만들 때 DNS 만 사라집니다$Static = (Get-NetIPInterface -InterfaceAlias $Nic -AddressFamily IPv4).Dhcp -eq "Disabled"$Dns = (Get-DnsClientServerAddress -InterfaceAlias $Nic -AddressFamily IPv4).ServerAddresses"고정 IP: $Static · 지금 DNS: $($Dns -join ', ')"
# 스위치 만들기 — 이미 있으면 건너뜁니다 (⚠️ 몇 초 네트워크가 끊깁니다)if (-not (Get-VMSwitch -Name $Switch -ErrorAction SilentlyContinue)) { New-VMSwitch -Name $Switch -NetAdapterName $Nic -AllowManagementOS $true | Out-Null}
# ③ DNS 확인·채우기 — 새 어댑터에 DNS 가 비어 있으면 채웁니다# 고정 IP 면 DNS 가 따라오지 않고, 자동 IP 여도 바로 못 받아오는 경우가 있습니다.# 그래서 고정/자동과 상관없이 **비어 있으면** 채웁니다.$vEth = "vEthernet ($Switch)"for ($i = 0; $i -lt 10 -and -not (Get-DnsClientServerAddress -InterfaceAlias $vEth -AddressFamily IPv4).ServerAddresses; $i++) { Start-Sleep 2 }if (-not (Get-DnsClientServerAddress -InterfaceAlias $vEth -AddressFamily IPv4).ServerAddresses) { if (-not $Dns) { # 원래도 DNS 가 비어 있었다면 공유기(게이트웨이)와 공용 DNS 를 넣습니다 $Gw = (Get-NetIPConfiguration -InterfaceAlias $vEth).IPv4DefaultGateway.NextHop $Dns = @($Gw, "8.8.8.8") | Where-Object { $_ } } Set-DnsClientServerAddress -InterfaceAlias $vEth -ServerAddresses $Dns Clear-DnsClientCache}
# ④ 확인 — 둘 다 나와야 합니다Get-VMSwitch $Switch | Format-Table Name, SwitchType, NetAdapterInterfaceDescriptionGet-DnsClientServerAddress -InterfaceAlias $vEth -AddressFamily IPv4 | Format-Table InterfaceAlias, ServerAddressesResolve-DnsName ubuntu.com -Type A | Select-Object -First 1 Name, IPAddress0-b. VM 을 만듭니다
섹션 제목: “0-b. VM 을 만듭니다”Hyper-V 관리자 → 새로 만들기 → 가상 머신.
| 항목 | 값 | 왜 이 값인가 |
|---|---|---|
| 세대 | 2세대 | UEFI 부팅. Ubuntu 26.04 는 2세대가 기본입니다 |
| 메모리 | 6 GB (동적 메모리 끄기) | 실측은 유휴 214 MB 지만, 설치·DB 임포트와 영상 변환에 여유가 필요합니다 |
| 프로세서 | 4 코어 | 영상 변환이 CPU 를 씁니다 — 여기 투자하는 것이 가장 체감됩니다 |
| 하드 디스크 | 120 GB · 동적 확장 | 프로그램은 작지만(약 200 MB) 미디어와 이미지가 쌓입니다. 동적이라 처음부터 120 GB 를 먹지 않습니다 |
| 네트워크 | TreeT-External(0-a 에서 만든 외부 스위치) | 키오스크들이 이 VM 에 붙어야 합니다 |
| 보안 부팅 템플릿 | Microsoft UEFI 인증 기관 | 기본값(Windows)으로 두면 Ubuntu 가 부팅하지 않습니다 |
0-c. 설치 이미지를 붙이고 켭니다
섹션 제목: “0-c. 설치 이미지를 붙이고 켭니다”🔵 위 명령으로 만들었다면 이미 붙어 있고 켜져 있습니다 — 0-d 로 넘어가세요.
마법사로 만들었다면: 받아 둔 ubuntu-26.04.x-live-server-amd64.iso 를 VM 설정의 SCSI 컨트롤러 → DVD
드라이브에 붙이고 시작합니다.
0-d. Ubuntu 를 설치합니다
섹션 제목: “0-d. Ubuntu 를 설치합니다”기본값으로 넘어가도 되지만, 두 곳만 신경 씁니다 — 고정 IP(+DNS) 와 OpenSSH.
① 네트워크 — VM 에 고정 IP 를 줍니다
키오스크들이 이 주소로 CMS 에 붙고, CMS 설치 때 인증서에도 이 주소가 들어갑니다. 바뀌면 키오스크가 끊기므로 고정 IP 로 둡니다.
먼저 주소를 정합니다 — 호스트 PC 와 같은 대역에서 안 쓰는 주소, 그리고 공유기가 자동으로 나눠 주는 범위(DHCP)
밖이어야 합니다. 호스트에서 ipconfig 로 대역과 공유기(기본 게이트웨이)를 확인하세요.
| 예 | 값 |
|---|---|
| 호스트 PC | 192.168.0.4 |
| 공유기(게이트웨이) | 192.168.0.1 |
| 이 VM 에 줄 주소 | 192.168.0.10 (현장에 맞게) |
설치 화면에서 — Network configuration → eth0 → Edit IPv4 → Manual:
| 칸 | 값 |
|---|---|
| Subnet | 192.168.0.0/24 |
| Address | 192.168.0.10 |
| Gateway | 192.168.0.1 |
| Name servers | 192.168.0.1, 8.8.8.8 |
| Search domains | 비워 둡니다 |
설치를 이미 끝냈다면 — VM 안에서 설정합니다. 랜카드 이름(보통 eth0)을 먼저 확인하세요.
ip -br linksudo tee /etc/netplan/60-treet-static.yaml > /dev/null <<'EOF'network: version: 2 ethernets: eth0: dhcp4: false addresses: [192.168.0.10/24] routes: - to: default via: 192.168.0.1 nameservers: addresses: [192.168.0.1, 8.8.8.8]EOFsudo chmod 600 /etc/netplan/60-treet-static.yamlsudo netplan try🔵 netplan try 는 적용한 뒤 120초 안에 Enter 를 누르지 않으면 원래대로 되돌립니다 — 잘못 넣어 연결이 끊겨도 안전합니다.
Enter 를 누른 뒤 확인합니다:
ip -4 addr show eth0 | grep inetresolvectl query ubuntu.com② Install OpenSSH server 를 체크하세요
VM 화면에서 직접 타이핑하는 것보다, 다른 PC 에서 접속해 작업하는 편이 훨씬 편합니다. 설치 패키지를 옮길 때도 씁니다.
설치가 끝나면 재부팅하고, 로그인해서 아래로 정한 고정 IP 가 붙었는지 확인합니다.
ip -4 addr show | grep inet0-e. 🔴 설치 직후 반드시 — 디스크 넓히기
섹션 제목: “0-e. 🔴 설치 직후 반드시 — 디스크 넓히기”Ubuntu 설치 관리자는 디스크를 절반만 씁니다. 120 GB 를 줘도 실제로 쓰는 자리는 약 58 GB 입니다.
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lvsudo resize2fs /dev/ubuntu-vg/ubuntu-lvdf -h /df -h / 가 100 GB 이상을 보이면 됐습니다.
여기까지 되면 아래 1번으로 갑니다.
1. 설치 패키지를 VM 안으로 옮깁니다
섹션 제목: “1. 설치 패키지를 VM 안으로 옮깁니다”꾸러미의 CMS\treet-cms-offline-<판>.tar.gz 파일 하나를 VM 안으로 옮기고,
거기서 풉니다. VM 안에서 둘 자리는 고정된 로컬 경로입니다. 예: /home/사용자/
옮겼으면 VM 안에서 풉니다.
cd ~tar xzf treet-cms-offline-*.tar.gzcd treet-cms-offline2. 설치를 시작합니다
섹션 제목: “2. 설치를 시작합니다”폴더 안에서 아래를 실행합니다.
sudo bash install.shsudo 로 실행하는 이유는, 준비가 안 된 항목(예: Docker)을 설치 파일이 직접 설치하기
때문입니다.
3. 설치 파일이 먼저 점검합니다 (읽고 지나가세요)
섹션 제목: “3. 설치 파일이 먼저 점검합니다 (읽고 지나가세요)”🔵 여기서 하실 일은 없습니다. 설치 파일이 알아서 봅니다 — 아래는 무엇을 보는지 알려 드리는 것이고, 막혔을 때 돌아와 찾으시라고 적어 둔 것입니다.
부족한 것이 있으면 무엇을 어떻게 해야 하는지 화면에 알려줍니다.
| 점검 항목 | 문제가 있으면 |
|---|---|
| 운영체제 | Ubuntu 26.04 LTS 가 아니면 알려줍니다(진행은 됩니다) |
| 이름 해석(DNS) | 안 되면 원인까지 알려줍니다 — 아래 참고 |
| 인터넷 연결 | 폐쇄망이면 정상입니다(Docker 가 이미 있어야 합니다) |
| Docker | 없으면 자동으로 설치합니다 |
| 시계 | 시각이 크게 틀리면 알려줍니다 |
| 디스크 · 메모리 | 부족하면 막습니다 |
| 포트 | 이미 쓰는 프로그램이 있으면 막습니다 |
| 파일 권한 | 지켜지지 않는 곳이면 알려줍니다(진행은 됩니다) — 아래 참고 |
4. 세 가지를 물어봅니다
섹션 제목: “4. 세 가지를 물어봅니다”점검을 통과하면 아래 세 가지만 묻습니다. 나머지는 알아서 설정됩니다.
① 이 사이트의 이름
1) 이 사이트의 이름 (영문 소문자·숫자·하이픈). 추천: kjr7zbs ← 지금 사용 가능한 이름입니다 >추천된 이름을 그대로 쓰셔도 됩니다(엔터). 이 이름은 기기와 주고받는 신호를 구분하는 데 쓰입니다.
② 이 CMS 에 접속할 주소
2) 이 CMS 에 접속할 주소입니다 — 재생기가 이 주소로 붙습니다. 여러 개면 쉼표로 나열하세요. [192.168.0.5] >대괄호 안은 이 PC 의 주소를 자동으로 찾은 값입니다. 맞으면 엔터만 치세요.
③ 바깥 망에서 들어오는 주소
3) 바깥 망에서 이 CMS 로 들어오는 주소가 있으면 적으세요 — 공유기 포워딩 주소(여러 개면 쉼표). 이름으로 붙는 것이 먼저입니다. 이름이 안 풀리는 망(폐쇄망 · 이중 NAT 바깥)에서 쓰는 IP 만 적으세요. 없으면 엔터. >대부분은 엔터(비움)입니다. 공유기를 두 번 거치는 구성처럼, 바깥 망의 기기나 중계 장치가 공유기의 포워딩 주소(IP) 로 이 CMS 에 붙어야 할 때만 그 주소를 적습니다. 적은 주소는 CMS 인증서에 들어갑니다. 설치 뒤에 바꿔야 하면 다시 설치하지 않고 관리 화면에서 바꿉니다 — 담당자에게 문의하세요.
5. 관리자 비밀번호를 받아 적습니다
섹션 제목: “5. 관리자 비밀번호를 받아 적습니다”설치가 끝나면 관리자 초기 비밀번호가 한 번 표시됩니다.
6. 설치가 스스로 확인합니다 (읽고 지나가세요)
섹션 제목: “6. 설치가 스스로 확인합니다 (읽고 지나가세요)”🔵 마지막에 점검 한 화면이 나옵니다 — 이 기계를 맞춘 넷(시간대를 사이트 시각으로 · 도커가 부팅 때 자동으로 켜지게 · Hyper-V 면 KVP 데몬 · 백업 예약)의 결과와 CMS 상태 주소 · 다음 예약 시각 · 이 기계의 주소입니다. ⚠️ 가 붙은 줄은 그 줄이 보여 주는 명령을 그대로 실행하세요(못 했어도 설치는 성공입니다).
마지막으로 설치 파일이 실제로 화면이 뜨는지 확인합니다. 컨테이너가 떠 있어도 화면이 안 나오는 경우가 있어서, “명령이 끝났다” 가 아니라 “실제로 응답한다” 를 봅니다.
설치 검증 (실제로 응답하는지 — 최초 설치는 DB 초기화로 몇 분 걸립니다)... ✓ 컨테이너 web 동작 ✓ 컨테이너 laravel 동작 ✓ 컨테이너 db 동작 ✓ 컨테이너 guacd 동작 (원격제어) ✓ 컨테이너 guacamole 동작 (원격제어) ✓ CMS 응답 확인 (HTTP 200)여기까지 나오면 브라우저에서 http://<이 PC 주소>:8080 으로 접속할 수 있습니다.
7. 백업을 켭니다 (꼭 하세요)
섹션 제목: “7. 백업을 켭니다 (꼭 하세요)”🔵 설치가 이 일을 스스로 합니다 — 매일 03:40(사이트 시각) · 14일 보관 · 설치 폴더의 backup/. 아래는 켜졌는지 확인하거나 저장 위치를 바꿀 때 씁니다(다시 깔아도 됩니다).
sudo bash docker/install-backup-timer.sh매일 새벽에 설정·인증서·데이터베이스를 한 묶음으로 백업하고 14일간 보관합니다.
한 번은 손으로 돌려 실제로 파일이 생기는지 확인하세요.
sudo systemctl start treetweb-backup-site.servicels -la backup/7-b. 이 PC 에 Watchdog 을 깝니다 — CMS 가 멈추면 다시 켭니다
섹션 제목: “7-b. 이 PC 에 Watchdog 을 깝니다 — CMS 가 멈추면 다시 켭니다”CMS 는 이 PC 의 가상 머신 안에서 돕니다. 그 VM 이 멈추면 현장의 화면 관리가 통째로 끊기는데, VM 은 스스로 그걸 알릴 수 없습니다. 그래서 바깥(이 윈도 PC)에서 Watchdog 이 지킵니다.
-
재생기 PC 와 같은 방법으로 Watchdog 을 깝니다 — 현장 배포 의 Watchdog 설치를 보세요. 설치 중에 CMS 주소를 물으면 이 VM 의 주소(예:
http://192.168.0.5:8080)를 넣습니다. -
따로 할 일은 없습니다. Watchdog 이 켜지면 CMS 주소와 같은 IP 의 VM 을 스스로 찾아 감시에 넣습니다.
-
⚠️ 단, VM 안에 Hyper-V 연동 도구가 돌아야 Watchdog 이 그 VM 의 IP 를 봅니다(설치가 자동으로 깝니다 — 인터넷이 있어야 합니다). 이 윈도 PC(관리자 PowerShell)에서 확인합니다:
Terminal window Get-VMNetworkAdapter -VMName treet-cms | Select-Object -ExpandProperty IPAddressesVM 주소(예:
192.168.0.5)가 안 나오고 비어 있으면, VM 안에서 연동 도구를 깔고 켭니다(인터넷이 필요합니다):Terminal window sudo apt install -y linux-cloud-tools-$(uname -r)sudo udevadm trigger --subsystem-match=misc --action=addsudo systemctl restart hv-kvp-daemon다시 위 명령으로 주소가 보이면 됩니다. 10분 안에 CMS 로그에 “이 PC 의 Hyper-V VM ‘treet-cms’ 을(를) CMS 로 알아보고 감시에 넣었습니다” 가 남습니다.
🔵 Watchdog 은 이 상태를 스스로 알려 줍니다 — VM 이 켜져 있는데 IP 가 안 보이면 CMS 로그의 감시 줄에 ”… IP 가 Hyper-V 에 안 보입니다: VM 안에 hv-kvp-daemon … 이 돌아야 하고 …” 가 남습니다. 그 줄을 보면 위 세 줄을 실행하세요.
🔵 이미 Watchdog 이 깔린 PC 면 새로 깔지 않습니다 — 재생기와 CMS 가 한 PC 에 있는 현장이 그렇습니다. 그 Watchdog 이 CMS 도 같이 지킵니다.
켜 두면 이렇게 됩니다:
| 이런 일이 생기면 | Watchdog 이 |
|---|---|
| VM 이 꺼지거나 일시정지됨 | 다시 켭니다(3분 간격으로 봅니다) |
| CMS 가 3분 넘게 응답이 없음 | CMS 로그에 남기고, 살아나면 “몇 시~몇 시 (N분) 응답이 없었다” 를 한 줄 남깁니다 |
| VM 은 켜져 있는데 CMS 만 응답이 없음 | 보고만 합니다 — VM 안의 프로그램은 Watchdog 이 건드리지 못합니다 |
8. 원격으로 붙는 방법 (둘은 다른 이야기입니다)
섹션 제목: “8. 원격으로 붙는 방법 (둘은 다른 이야기입니다)”자주 헷갈리는 자리라 갈라 적습니다.
8-a. 이 CMS PC 에 붙으려면 — SSH 입니다
섹션 제목: “8-a. 이 CMS PC 에 붙으려면 — SSH 입니다”설치 파일이 깔아 주지 않습니다. Ubuntu 를 설치할 때 Install OpenSSH server 를 체크한
것이 그 역할입니다(0-d 참고).
안 하셨다면 지금 깔면 됩니다.
sudo apt install -y openssh-serversystemctl status ssh붙지 않으면 아래를 차례로 봅니다.
| 확인 | 명령 · 자리 |
|---|---|
| SSH 가 도는가 | systemctl status ssh |
| 이 PC 의 주소 | ip -4 addr show | grep inet |
| 🔴 VM 이 외부 스위치인가 | Hyper-V 관리자 → VM 설정 → 네트워크 어댑터. 내부/개인용이면 밖에서 못 붙습니다 |
| 방화벽 | sudo ufw status (기본은 꺼져 있습니다) |
8-b. 기기 화면을 보려면 — 원격제어 기능입니다
섹션 제목: “8-b. 기기 화면을 보려면 — 원격제어 기능입니다”CMS 관리 화면에서 키오스크 화면을 브라우저로 들여다보는 기능입니다. 설치하면 바로 켜져 있습니다 — 따로 하실 일이 없습니다.
🔴 기기마다 UltraVNC 를 깔아야 합니다
섹션 제목: “🔴 기기마다 UltraVNC 를 깔아야 합니다”CMS 쪽은 준비돼 있지만, 보여 줄 화면을 내보내는 쪽은 기기에 있습니다. 키오스크 PC 마다 VNC 서버(UltraVNC) 를 설치·실행해 두세요.
| 기기에서 | 값 |
|---|---|
| VNC 서버 | UltraVNC (설치 후 자동 시작되게) |
| 포트 | 5900 (기본값 그대로) |
| 비밀번호 | 정하지 않아도 됩니다 — 단추를 누를 때마다 그 PC 의 Watchdog 이 일회용으로 겁니다(CMS 2026.9.725 · Watchdog 2026.9.153 부터) |
CMS 쪽은 대부분 비워 두면 됩니다(기기가 보고한 IP · 5900). 주소나 포트가 다를 때만
관리 화면의 기기관리 → 기기 페이지 → 기본 정보 고치기 → “원격접속” 칸에 주소[:포트] 를 적습니다 — 비밀번호는 적지 않습니다.
9. 인터넷 주소와 인증서 — 두 입구를 함께 세웁니다
섹션 제목: “9. 인터넷 주소와 인증서 — 두 입구를 함께 세웁니다”사이트에는 입구가 둘 있습니다. 기본 구성은 둘 다입니다.
| 주소 | 누가 씁니까 | 어떻게 들어옵니까 |
|---|---|---|
https://<사이트>.treetsites.com:8443 | 기기 · 큰 영상 업로드 · 평소 관리 | 공유기 → CMS 로 곧장(공개 인증서) |
https://admin-<사이트>.treetsites.com | 관리자만 — 공유기 포트가 막혔을 때의 비상 입구 | Cloudflare 터널 |
9-e. 확인합니다
섹션 제목: “9-e. 확인합니다”VM 에서:
sudo ./cert-check.sh # 공개 인증서인지 · 만료까지 며칠인지sudo ./install-tunnel.sh --check # 터널 서비스 · 밖에서의 응답그리고 Windows 브라우저에서 두 주소를 직접 엽니다 — 둘 다 자물쇠 아이콘이 떠야 하고 경고 화면이 나오면 안 됩니다. 🔵 사이트 안 네트워크에서 첫 번째 주소가 안 열리면 공유기가 자기 공인 IP 로 되돌아오는 접속(헤어핀)을 막는 경우입니다 — 휴대폰 데이터로 확인하거나, 관리자 입구를 쓰세요.
시간 서버 — CMS 가 기기에 시간을 내줍니다
섹션 제목: “시간 서버 — CMS 가 기기에 시간을 내줍니다”CMS 를 설치하면 시간 서버(NTP) 가 함께 뜹니다. 끄는 스위치는 없습니다 — 기기가 시간 동기를 켜는 순간 받을 수 있어야 하기 때문입니다. 같은 내부망의 기기가 UDP 123 번으로 이 CMS 에서 시간을 받아 갑니다. 인터넷 쪽 시간 서버에 닿지 못하는 폐쇄망이어도, 기기끼리는 이 CMS 시계에 맞춰집니다.
| 할 일 | 왜 |
|---|---|
| CMS VM 의 방화벽을 켰다면 내부망에서 들어오는 UDP 123 을 엽니다 | 막히면 기기가 시간을 못 받습니다 |
| 공유기에서 바깥으로는 열지 않습니다 | 공개된 시간 서버는 공격에 악용됩니다 |
| CMS VM 에 다른 시간 서버 프로그램(chrony · ntpd)을 따로 깔지 않습니다 | 123 번을 서로 쓰려 해 CMS 의 시간 서버가 뜨지 못합니다 — 설치 전 점검이 그런 경우 막고 알려 줍니다. 우분투 기본 시간 맞춤(timesyncd)은 괜찮습니다 |
CMS 자신의 시계는 VM 이 맞춥니다(Hyper-V 통합 서비스의 시간 동기화 · 우분투 기본 시간 맞춤).
다 됐는지 확인하기
섹션 제목: “다 됐는지 확인하기”여기까지 오셨으면 아래가 모두 되어 있어야 합니다. 하나라도 안 되면 그 번호로 돌아가세요.
| 확인 | 어떻게 | 안 되면 |
|---|---|---|
| 관리 화면이 열린다 | 브라우저에서 http://<이 PC 주소>:8080 | 6번 |
| 관리자로 로그인된다 | 5번에서 받아 적은 비밀번호로 | 5번 |
| 백업이 켜져 있다 | systemctl list-timers | grep treetweb | 7번 |
| 백업 파일이 실제로 생긴다 | ls -la backup/ | 7번 |
| 사이트 주소가 경고 없이 열린다 | https://<사이트>.treetsites.com:8443 | 9번 |
| 관리자 입구가 열린다 | https://admin-<사이트>.treetsites.com | 9-d |
다음은 무엇을 하나요
섹션 제목: “다음은 무엇을 하나요”설치는 CMS 를 세우는 것까지입니다. 화면에 콘텐츠가 나오려면 세 가지가 더 필요합니다.
- 재생기(TreeTview) 를 키오스크 PC 에 설치하고, 그 PC 에서 F8 로 이 CMS 주소를
넣습니다. 🔴 설치만으로는 안 붙습니다 — 재생기는 개발 기본값(
127.0.0.1)을 들고 나옵니다. 주소를 넣으면 그때 스스로 등록되어 기기 목록에 나타납니다(기기 인증서도 자동으로 발급받습니다). → 현장 배포 ⚠️ 넣은 뒤 재생기 로그의[사이트설정] 확인줄을 눈으로 보세요. 목록에 뜨는 것만으로는 부족합니다 — 이 확인을 건너뛰면 뒤에서 원인을 못 찾습니다. - 콘텐츠를 올리고 편성합니다 — 어떤 화면에 무엇을 언제 틀지 정합니다.
- 기기마다 UltraVNC 를 깝니다 — 원격제어는 CMS 쪽이 이미 켜져 있고, 보여 줄 화면을 내보내는 쪽만 기기에 있으면 됩니다(8-b).
쓰는 방법은 관리 화면 문서에 있습니다 — 기기 등록·편성·원격제어가 화면 순서대로 적혀 있습니다.
운영으로 넘길 때 — 업데이트 채널을 stable 로
섹션 제목: “운영으로 넘길 때 — 업데이트 채널을 stable 로”설치를 막 마친 CMS 는 아직 운영 전(개발 단계) 으로 봅니다. 이때는 개발 판(시험 중인 앱·CMS 판)도 받습니다. 기기를 다 붙이고 편성까지 마쳐 모든 설정이 끝나면 운영으로 넘깁니다 — 그때부터는 시험을 마치고 정식으로 내보낸 판(stable)만 받습니다.
- 설치 폴더의
.env를 엽니다:sudo nano .env #TREET_UPDATE_CHANNEL=stable줄의 맨 앞#을 지웁니다. 그 줄이 없으면 맨 끝에TREET_UPDATE_CHANNEL=stable을 새로 적습니다.- 저장하고 CMS 를 다시 올립니다:
sudo docker compose up -d
TREET_UPDATE_CHANNEL | 이 CMS 는 |
|---|---|
| (비어 있음 — 기본) | 운영 전. 개발 판도 받습니다 |
stable | 운영 중. 승격된(stable) 판만 받습니다 — 앱 업데이트 목록 · CMS 업데이트 꾸러미 · 손으로 올리는 설치본 모두 |
CMS 를 새 판으로 올릴 때
섹션 제목: “CMS 를 새 판으로 올릴 때”처음 설치와 같은 방법입니다 — 새 꾸러미를 받아 그 안에서 install.sh 를 다시 돌립니다.
따로 업데이트 절차가 있는 것이 아닙니다.
# VM 안에서, 새 꾸러미를 푼 폴더에서sudo bash install.sh무엇이 바뀌었는지는 꾸러미의 읽어주세요.md 와 판 번호로 확인합니다. 올린 뒤에는
위 “다 됐는지 확인하기” 의 넷을 다시 봅니다 — 특히 관리 화면이 열리는지.
다시 설치해야 할 때 (복구)
섹션 제목: “다시 설치해야 할 때 (복구)”같은 사이트를 다시 세우는 경우에는 백업 파일이 먼저 있어야 합니다.
bash docker/restore-site.sh <백업파일> # 설정·인증서를 제자리에sudo bash install.sh # 설치bash docker/restore-site.sh <백업파일> --db-only # 데이터 넣기문제가 생기면
섹션 제목: “문제가 생기면”docker compose logs --tail 50 web laravel # 최근 로그(예약 작업까지: laravel-scheduler media-worker 를 덧붙입니다)docker compose ps # 무엇이 떠 있는지sudo bash docker/preflight.sh # 준비 상태 다시 점검