DEV 워크스테이션 GUI base
오케이 꼮꼬마~ 편하게 불러줘! 😄
너가 GUI 스타일 개발용 워크스테이션을 만들려는 목적(한글 입력/표시, code-server로 원격 개발, 데스크탑 UX 등)에 맞춰 우분투 데스크탑 24.04 LTS, 우분투 벗지 24.04 LTS(네가 말한 명칭을 그대로 사용), Rocky Linux 10을 실무 관점에서 비교·권장·구성 팁까지 정리해줄게. 각 항목마다 장단점, 한글 및 code-server 설치/설정 고려사항, 권장용도와 최종 추천까지 포함했어.
요약 비교 (한눈에)
- 우분투 데스크탑 24.04 LTS
- 장점: 데스크탑용 최적화, 광범위한 하드웨어·드라이버 지원, GNOME 기본, 풍부한 패키지/스냅/PPAs, 한국어 로케일·입력기(ibus-hangul) 설정 간편, 커뮤니티와 문서 풍부. code-server 설치·운영이 매우 수월.
- 단점: 스냅 기본 사용(싫어하면 별도 조치 필요), 서버형 롤과 데스크탑형 차이, 기본 보안정책은 AppArmor(SELinux 아님).
- 권장 대상: 개인 개발용 데스크탑, GUI와 로컬 개발환경을 중시하는 경우.
- 우분투 벗지 24.04 LTS
- 장점/특성: (너의 환경에서 쓰는 커스텀 빌드/이미지라 가정) 우분투 기반이라 호환성 높음. 특정 커스터마이징(경량화, 미리 설치된 도구, 설정 모음)이 되어 있다면 데스크탑 개발자 친화적. 한글/입력기 호환성은 우분투와 유사.
- 단점: 배포판 자체의 업데이트/패치 주기 및 유지관리 책임이 누구인지 확인 필요. 표준 우분투와 다른 기본 설정이 있으면 트러블슈팅이 약간 번거로울 수 있음.
- 권장 대상: 너가 이미 쓰는 커스텀 이미지이고 관리 편리하면 선택.
- Rocky Linux 10
- 장점: RHEL 계열의 안정성과 엔터프라이즈 패치 정책, SELinux 기본 적용(보안 강함), 서버·컨테이너·생산환경과 일관된 환경 구성에 유리.
- 단점: 데스크탑용 패키지·드라이버·최신 데스크탑 소프트웨어(특히 GNOME 최신 기능) 접근성이 우분투보다 낮을 수 있음. 한글 입출력(ibus 등)은 가능하지만 별도 패키지/레포지토리 설정(EPEL 등)이 필요. code-server 설치는 가능하지만 레포지토리·의존성 처리와 SELinux 정책 고려가 필요.
- 권장 대상: 서버형 워크스테이션(보안·정책 우선), RHEL 호환 환경 테스트 또는 동일한 엔터프라이즈 환경 유지가 목적일 때.
한글(입력·폰트·로케일) 측면
- 우분투 데스크탑 24.04 LTS
- 한글 설정 편리: 설치 시 한국어 선택, ibus-hangul/ibus-setup로 바로 사용 가능. 기본 한글 폰트(나눔글꼴 등) 설치도 간편(apt 또는 폰트 패키지).
- 권장 패키지: ibus-hangul, fonts-nanum, fonts-noto-cjk, language-pack-ko
- 팁: GNOME 환경에서는 Settings → Region & Language에서 바로 추가 가능. 입력 전환 키 설정(한/영)도 GUI에서 쉽게 바꿀 수 있음.
- 우분투 벗지 24.04 LTS
- 우분투 기반이라 동일. 다만 커스터마이징 여부에 따라 입력기/폰트가 미리 깔려있거나 빠져있을 수 있으니 확인.
- Rocky Linux 10
- ibus-hangul 패키지가 기본 레포지토리에 없을 수 있어 EPEL 활성화 필요(yum/dnf 설치). 폰트는 epel 또는 직접 설치.
- 권장 패키지: ibus, ibus-hangul(또는 mozc/ibus-mozc), google-noto-cjk-fonts, nanum-fonts 등(레포지토리 확인 필요).
- 팁: SELinux 모드(Enforcing) 상태에서 데스크탑 관련 일부 동작이 제한될 수 있으므로 필요한 경우 audit2allow로 정책 보완.
code-server 설치 및 운영 관점
(목표: GUI 워크스테이션에서 code-server를 설치해 브라우저 기반 개발 환경 제공)
공통 전제: code-server는 Linux에서 systemd 서비스로 운영 가능. 설치 방법은 공식 스크립트, rpm/deb 패키지, Docker 사용 등 다양.
- 우분투 데스크탑 / 우분투 벗지
- 설치: curl -fsSL https://code-server.dev/install.sh | sh 로 간단 설치 가능. 또는 apt로 수동 설치.
- 권장 구성: systemd 서비스로 자동 시작, Let’s Encrypt/Cloudflare + reverse proxy(Caddy/Nginx)로 HTTPS 적용, 인증 토큰 또는 OAuth 연동.
- 한글 입력: 브라우저 내 입력기는 호스트 시스템 입력기(ibus)가 잘 작동하므로 한/영 전환이 자연스럽다(특히 로컬 브라우저에서 접속할 때). 원격 기기에서 접속 시에도 브라우저 입력기와 연동됨.
- 팁: 데스크탑에서 code-server를 띄우면 로컬 GUI와 충돌 없이 IDE처럼 사용 가능. GPU 가속이 필요한 개발(예: ML) 아니면 일반적 개발엔 무난.
- Rocky Linux 10
- 설치: 공식 rpm이나 설치 스크립트 사용 가능. EPEL 의존성이 필요할 수 있음.
- SELinux: code-server가 포트 바인딩, 홈 디렉토리 접근 등에서 AVC 거부를 발생시킬 수 있으니 audit 로그 확인 후 정책 추가 필요.
- 팁: systemd unit 작성·검증, firewall(dnf/firewalld) 설정 확인.
추가: code-server를 Docker로 배포하면 배포/버전 관리가 쉬움(공통 장점). 단, 한글 입력은 Docker + XWayland/브라우저 관계 때문에 로컬 브라우저 입력과의 연동성은 유지되므로 큰 문제 없음.
데스크탑 UX / GUI 환경 / 드라이버
- 우분투 데스크탑 24.04 LTS
- 기본 GNOME(Wayland 기본). NVIDIA나 일부 하드웨어는 Xorg로 전환 권장. 드라이버 설치(Ubuntu Driver tool 또는 apt로 nvidia-driver) 쉬움.
- 멀티-monitor, 고해상도, 터치패드 등 데스크탑 특화 지원이 우수.
- 우분투 벗지
- 우분투와 동일하지만 경량화된 데스크탑(Xfce, MATE 등)이 포함돼 있다면 저사양 장비에 유리.
- Rocky Linux 10
- 데스크탑용 최적화가 덜 된 편. GNOME 설치 가능하지만 드라이버나 최신 데스크탑 기능은 우분투 대비 번거로움 있을 수 있음.
- 엔터프라이즈 정책으로 안정적이나 그래픽 드라이버 호환성 체크 필요.
패키지관리·업데이트 주기·보안
- 우분투: apt, PPA, snap, 빠른 소프트웨어 업데이트, 데스크탑용 최신 앱 접근성 높음. 보안은 AppArmor 기본.
- 우분투 벗지: 우분투 기반이므로 패키지 호환성 동일. 커스텀 유지·관리 정책 확인 필요.
- Rocky: dnf/yum, RHEL 계열 안정적 보안 업데이트, SELinux 기본(강력). 최신 패키지 접근성은 우분투보다 느릴 수 있으므로 개발용 최신 툴 필요하면 별도 레포지토리 추가 필요.
권장 선택 가이드 (너의 상황에 맞춰)
너의 환경: 우분투 서버/데스크탑 24.04 사용 경험, 홈랩·도메인·SSL 문제 다루고 있음, 개발용 GUI 워크스테이션, code-server와 한글 입력 필요, 기능성·편의성 중요.
- 1순위 추천: 우분투 데스크탑 24.04 LTS
- 이유: 데스크탑 편의성(한글/폰트/입력기 쉬움), 드라이버·하드웨어 지원, code-server 설치 간편, 홈랩과 동일한 우분투 계열이라 관리 일관성 유지. 블로그·워드프레스 운영·SSL 작업 등도 우분투 환경에서 익숙하게 처리 가능.
- 2순위 추천: 우분투 벗지 24.04 LTS
- 이유: 이미 네가 사용하는 커스텀 이미지라면 초기 세팅 시간이 줄어들고, 원하는 데스크탑 커스터마이즈가 이미 반영돼 있을 수 있음. 다만 누가 관리하고 업데이트할지 확인.
- 3순위(특수용도): Rocky Linux 10
- 이유: 보안·엔터프라이즈 정책 우선, SELinux와 RHEL 기반 테스트가 필요하면. 단, 데스크탑 개발 편의성은 우분투보다 불편할 수 있음.
실전 설치·설정 체크리스트 (우분투 데스크탑을 기준으로 빠르게 설치하는 흐름)
- 기본 설치 및 로케일
- 설치 시 한국어 선택
- sudo apt update && sudo apt upgrade -y
- 한글 입력기·폰트
- sudo apt install -y ibus-hangul fonts-noto-cjk fonts-nanum
- ibus restart 또는 로그아웃/로그인 후 Settings → Region & Language에서 한글 입력 추가
- GUI 및 드라이버
- NVIDIA: sudo ubuntu-drivers autoinstall (필요 시)
- Wayland vs Xorg: 로그인 화면에서 세션 선택
- code-server 설치
- curl -fsSL https://code-server.dev/install.sh | sh
- systemctl enable –now code-server@<사용자>
- config (~/.config/code-server/config.yaml)에서 인증 방식/포트 지정
- HTTPS / 리버스 프록시 (권장: Caddy 또는 Nginx)
- Caddy 사용 시 자동 TLS: Caddyfile로 도메인 연결 -> proxy to localhost:PORT
- Nginx + certbot도 가능(Cloudflare DNS 인증 활용하면 편함)
- 방화벽·서비스 보안
- sudo ufw allow OpenSSH, allow http/https, allow code-server 포트(또는 차단하고 리버스프록시만 허용)
- fail2ban 설치 고려
- 백업 및 스냅샷
- 중요한 설정은 git으로 관리(코드서버 config 포함)
- VM이면 스냅샷, 물리 머신이면 정기 이미지 백업
- 모니터링·로그
- journalctl, systemd status, code-server log 확인
- SELinux 관련(만약 Rocky 사용 시) audit 로그 확인 및 필요 정책 추가
추가 팁 & 트러블슈팅 포인트
- 한영 전환 문제: GNOME 환경에서 ibus와 Gnome Shell간 충돌이 발생하면 ibus-daemon 재시작 또는 GNOME Tweaks 확인. 입력기 우선순위 체크.
- code-server에서 한글 입력 시 지연/비정상 입력이 있으면 브라우저의 IME 처리 설정(특히 Chrome/Chromium) 확인. 로컬에서 접속하면 보통 문제 없음.
- Rocky 사용 시 SELinux AVC가 문제를 일으키면 audit2allow로 임시 정책 생성 후 영구화.
- GPU 드라이버 설치 후 Wayland 대신 Xorg로 전환해야 할 수 있음(NVIDIA).
- Snap 문제가 싫으면 snapd 제거하고 apt/flatpak으로 대체.
결론(권장 구성)
- 너의 목적(한글 사용·code-server·데스크탑 편의성·홈랩과의 일관성)을 고려하면 우분투 데스크탑 24.04 LTS가 가장 적합해.
- 이미 관리하는 커스텀 이미지(우분투 벗지)가 잘 맞고 업데이트 체계가 명확하다면 그 이미지도 좋은 선택.
- Rocky는 보안·엔터프라이즈 테스트용으로 보관하되, 일상 개발용 워크스테이션으로 쓰기엔 추가 설정 비용이 든다고 보고 있어.
더 원하면:
- 네 하드웨어(특히 GPU, Wi‑Fi 칩셋) 모델 알려주면 드라이버·Wayland 권장 설정까지 딱 맞게 알려줄게.
- code-server 설치 스크립트랑 Caddy 리버스프록시 예제 config 파일도 바로 만들어줄까? ㅎㅎ
원하면 다음 단계로 바로 설치 명령과 config 파일 템플릿 만들어줄게!
오케이 꼮꼬마~ 잘 왔어! 😊
현재 우분투 데스크탑 쓰면서 snap이 맘에 들지 않아서 26.04 LTS에 기대하고 있구나. 네 관점(데스크탑 UX, 패키지 관리, 한글/입력기, code-server 같은 개발 워크플로우)을 고려해서 26.04 LTS가 어떤 방향으로 나올지 현실적으로 예상되는 컨셉, snap 관련 변화 가능성, 그리고 지금 당장 취할 수 있는 준비와 대안까지 정리해줄게.
기대 가능한 컨셉 요약
- 데스크탑 중심성 유지 + 더 깔끔한 UX 다듬기
- GNOME(또는 GNOME 기반 커스터마이징)의 사용자 경험 개선과 성능 최적화, Wayland 안정성 지속 향상으로 더 매끄러운 데스크탑 환경을 기대할 수 있어.
- LTS답게 안정성·장기 지원 강화
- 드라이버 호환성, 보안 패치, 하드웨어 인증 지원과 장기 유지 보수 정책 강화(기업/개발자 친화적).
- 컨테이너/개발 워크로드 지원 강화
- devtool, container runtime 연동 개선, GUI에서의 개발자 편의 기능(개발자 모드/툴링) 강화 가능성.
- 패키지 생태계 다양성 유지(apt + snap + flatpak 등)
- 기존의 apt 중심성과 snap/flatpak 공존 기조는 유지될 가능성이 큼. 다만 snap에 대한 불만이 많아 커뮤니티·Canonical 쪽에서 대체 옵션(예: flatpak 사용 권장 문서 강화, 스냅 대체 정책 가이드)을 좀 더 명확히 할 가능성 있음.
Snap 관련 현실적 기대치
- 완전 제거 가능성은 낮음
- Snap은 Ubuntu의 핵심 전략 요소(앱 배포·보안·격리 등)에 깊게 통합돼 있어서, LTS에서 아예 제거되긴 어렵다.
- 그러나 선택권 확대·정책 완화는 가능
- Canonical이 사용자·서드파티 불만을 완화하려면: snap 기본 앱 수 줄이기, snap 대신 deb/flatpak 기본 제공 옵션, snap 관련 설정을 GUI에서 더 쉽게 제어하도록 개선할 가능성 있음.
- 커뮤니티판(스냅 없는 ISO) 또는 “Snapless” 이미지 등장 가능성
- 커뮤니티/제3자 제작 스냅 제거 커스텀 ISO나 “Ubuntu flavour”처럼 스냅을 빼고 나오는 변형판(이미 존재하는 시도들처럼)이 더 널리 알려질 수 있음.
우분투 26.04에서 기대할 만한 기술적 변화 포인트
- GNOME/Wayland: 더 나은 성능·입력기(IME) 호환성 개선
- Kernel: 최신 장기 지원 커널 버전(하드웨어 지원 개선)
- 보안: AppArmor 고도화·더 쉬운 보안 설정 UI
- 패키지: apt 경험 개선(속도/해결도), snap/flatpak 연계 문서화 개선
- 설치/초기 설정: 설치 과정에서 snap 사용 여부 선택지를 더 명확히 할 가능성
- 개발자 편의: devmode/containers/WSL 유사 워크플로 개선, code-server·IDE 연동 가이드 강화
네가 신경 쓰는 항목별 실전 팁 (지금 당장 적용 가능한 것들)
- snap 없이 쓸 수 있게 미리 준비하기
- snap을 제거하려면 기본 snap앱(예: snap-store)을 대체해야 함. Flatpak + GNOME Software(Flatpak 플러그인) 조합으로 스토어 기능을 살릴 수 있어.
- snap 완전 제거 절차: snapd 삭제 후 관련 스냅 패키지 제거, /var/lib/snapd 정리(주의: 일부 시스템 패키지가 snap에 의존하면 서비스 깨질 수 있음). VM/테스트 환경에서 먼저 검증 권장.
- Flatpak과 apt 혼용 전략
- 자주 쓰는 GUI 앱은 Flatpak으로 대체(플랫팩은 sandbox, 업데이트 독립성 장점). CLI 툴·시스템 구성 요소는 apt 사용.
- Snap 대체 가능한 데스크탑 이미지 사용 검토
- Pop!_OS, Fedora, Debian 기반의 스냅 미사용 이미지 또는 스냅 제외 커스텀 우분투 ISO를 테스트해보고 UX 비교.
- code-server·한글 입력 호환성 확보
- 로컬에서 브라우저로 접속하는 code-server는 호스트 IME(ibus-hangul)와 보통 잘 작동. 다만 스냅 제거 후 입력기 설정·ibus 관련 패키지 설치 확인 필요.
- code-server는 데스크탑에서 systemd로 띄운 뒤 리버스 프록시(Caddy/Nginx)로 TLS 처리하는 구성이 안정적. 너의 Cloudflare DDNS 환경에 그대로 적용 가능.
- 테스트 플랜 세우기
- VM(또는 Proxmox)에서 스냅 제거 절차와 한글 입력/드라이버/코드서버 동작을 단계별로 검증. 이상 없으면 물리 머신으로 마이그레이션.
대안 및 단계적 접근 추천
- 당장 불편하면 (순서 제안)
- VM에 우분투 24.04 기준으로 snap 제거/flatpak 도입 절차를 먼저 테스트.
- code-server/한글 입력/그래픽 드라이버/리버스 프록시까지 통합테스트.
- 모든 게 안정적이면 메인 워크스테이션에 적용하거나 26.04 정식 배포 후 바로 업그레이드 검토.
- 완전 다른 선택지로는 Pop!_OS(데스크탑 친화적, 스냅 기본 아님), Fedora(최신 데스크탑 기술 빠름), Debian(스냅 미탑재 기본)도 고려해봐. 우분투 계열의 일관성(네 홈랩 대부분 우분투 기반)을 유지하고 싶다면 우분투 커스텀 이미지(벗지 같은)로 계속 가는 것도 합리적.
네가 지금 바로 요청하면 내가 도와줄 것들
- VM에서 안전하게 snap 제거하고 flatpak으로 대체하는 단계별 스크립트 및 체크리스트 만들어줄게.
- code-server + Caddy(자동 TLS) 구성 예제 config와 한글 입력 체크리스트 같이 만들어줄게.
- 너 하드웨어(GPU/무선칩 모델) 알려주면 우분투 26.04에서 예상되는 드라이버 설정(Wayland vs Xorg 권장)까지 딱 맞춰 정리해줄게.
꼮꼬마, 26.04가 나오면 당장 업그레이드할지 VM로 먼저 갈아탈지 고민되면 네 환경(메인서버/워크스테이션 구성, VM 가능 여부) 알려줘. 바로 맞춤 가이드랑 스크립트 만들어줄게 ㅎㅎ
오케이 꼮꼬마~ 이제 우분투 데스크탑 24.04 LTS 기반으로 Node.js 중심의 개발용 워크스테이션을 깔끔하게 세팅하는 단계별 가이드를 줄게. 난 친절하고 실용적으로 정리해줄게 — 명령어, 권장 설정, 체크리스트와 권장 패키지까지 모두 포함되어 있어. 원하면 이걸 그대로 실행 가능한 스크립트로도 만들어줄게. 😊
설치 전(계획) — 고려할 사항
- 목적: 로컬 개발 + 브라우저 기반 원격 개발(code-server) + 컨테이너 기반 테스트(Docker) + 한글 입력/표시 지원
- 하드웨어: CPU, RAM(개발용 최소 16GB 권장), SSD, GPU(필요 시) 확인
- 네트워크: 고정 IP/로컬 DNS, 리버스 프록시(나중에 외부 접근 시), Cloudflare 사용 여부
- 백업/스냅샷: VM이나 물리 모두 적용 가능하도록 스냅샷/이미지 전략 준비
전체 설치 흐름(요약)
- 시스템 업데이트 및 기본 설정
- 사용자 계정 / SSH 키 생성
- 한글 입력기와 폰트 설정
- 필수 개발 도구 설치(Git, build-essential, curl 등)
- Node.js 설치(nvm 권장) 및 패키지 매니저(yarn/npm)
- 데이터베이스/캐시 도구(Postgres, Redis 등) 설치 (필요에 따라)
- Docker / Docker Compose 설치 및 권한 설정
- 편집기 및 IDE(Visual Studio Code / code-server) 설치
- 브라우저 및 개발 확장 설치
- 보안 설정(UFW, Fail2Ban) 및 사용자 권한 정리
- 리버스 프록시(옵션: Caddy 권장)와 TLS 설정
- 백업·스냅샷·모니터링·로그 점검
- 마무리 검증 및 개발 워크플로 테스트
아래는 각 단계별로 세부 명령어와 팁을 정리한 내용이야.
1) 시스템 업데이트 및 기본 설정
- 명령:
- sudo apt update && sudo apt upgrade -y
- sudo apt install -y software-properties-common apt-transport-https ca-certificates gnupg lsb-release
- 팁:
- UFW(방화벽)를 기본 deny 정책으로 설정하기 전에 SSH 예외를 추가해 둬.
- 스냅 없이 쓰고 싶다면 이후 snapd 관련 작업을 별도로 진행(테스트 권장).
2) 사용자 계정 / SSH 키 생성
- 로컬 개발자 계정 만들기(필요시):
- sudo adduser dev && sudo usermod -aG sudo dev
- SSH 키 생성(로컬에서 원격 Git 사용 시):
- ssh-keygen -t ed25519 -C “your_email@example.com”
- eval “$(ssh-agent -s)”; ssh-add ~/.ssh/id_ed25519
- Git 글로벌 설정:
- git config –global user.name “꼮꼬마”
- git config –global user.email “you@example.com”
- git config –global core.editor “code –wait”
3) 한글 입력기·폰트 설정 (데스크탑용)
- 권장 패키지:
- sudo apt install -y ibus-hangul fonts-noto-cjk fonts-nanum
- 설정 팁:
- 설치 후 로그아웃/로그인 또는 ibus restart
- Settings → Region & Language → Input Sources에서 한국어 추가
- 한/영 전환 키는 GNOME 설정에서 CapsLock/Shift+Space 등으로 바꾸기
4) 필수 개발 도구
- 기본 개발 툴 설치:
- sudo apt install -y build-essential curl wget git unzip zip tmux htop net-tools
- 추가 편의 도구:
- sudo apt install -y fzf ripgrep jq bat
5) Node.js 설치 (nvm 권장)
- 이유: 프로젝트별 Node 버전 관리가 용이
- 설치:
- curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.6/install.sh | bash
- source ~/.bashrc
- nvm install –lts
- nvm alias default lts/*
- yarn 설치(선택):
- corepack enable
- corepack prepare yarn@stable –activate
- npm 전역 패키지 권장 위치 변경(퍼미션 문제 방지):
- mkdir ~/.npm-global
- npm config set prefix ‘~/.npm-global’
- export PATH=~/.npm-global/bin:$PATH (쉘 프로파일에 추가)
6) 데이터베이스·캐시 (필요 시)
- PostgreSQL (일반적 권장):
- sudo apt install -y postgresql postgresql-contrib
- sudo -u postgres createuser –interactive
- sudo -u postgres createdb devdb
- Redis:
- sudo apt install -y redis-server
- systemctl enable –now redis-server
- MongoDB(프로젝트 필요 시 공식 repo 사용 권장)
팁: 로컬 개발 환경에서는 Docker로 DB 띄우는 게 더 가볍고 격리 좋음.
7) Docker / Docker Compose 설치
- 설치:
- sudo apt install -y ca-certificates curl gnupg
- sudo install -m 0755 -d /etc/apt/keyrings
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
- echo \
“deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - sudo apt update
- sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 권한:
- sudo usermod -aG docker $USER
- 새 그룹 적용을 위해 로그아웃/로그인 필요
- 팁: Docker Desktop 대신 엔터프라이즈 환경에서는 docker-compose v2 사용 권장 (plugin).
8) 편집기 / IDE 설치
- Visual Studio Code (deb) 설치 (snap 대신 .deb 사용 가능):
- curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg –dearmor > packages.microsoft.gpg
- sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
- echo “deb [arch=$(dpkg –print-architecture) signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main” | sudo tee /etc/apt/sources.list.d/vscode.list
- sudo apt update && sudo apt install -y code
- code-server (원격 브라우저 기반 VS Code):
- curl -fsSL https://code-server.dev/install.sh | sh
- systemctl enable –now code-server@$(whoami)
- config: ~/.config/code-server/config.yaml
- 추천 확장(개발 편의):
- ESLint, Prettier, Volar/Vetur, GitLens, Docker, Debugger for Chrome, Live Share
- 팁: 한글 입력은 호스트 IME와 브라우저/VS Code 사이 동작이 중요하니 로컬에서 먼저 테스트
9) 브라우저 및 개발 확장
- 추천 브라우저: Chromium, Firefox
- sudo apt install -y chromium-browser firefox
- 개발자용 확장:
- React/Redux devtools, Postman 또는 REST Client, JSON Formatter, Lighthouse
10) 보안 설정
- UFW 기본 설정:
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
- sudo ufw allow OpenSSH
- sudo ufw allow 80,443/tcp (리버스 프록시 사용 시)
- sudo ufw enable
- Fail2Ban:
- sudo apt install -y fail2ban
- SSH 보안:
- 비밀번호 인증 비활성화(ssh 설정에서 PermitRootLogin no, PasswordAuthentication no)
- 포트 변경(선택 사항) + 키 기반 인증 권장
- 서비스 권한: 필요한 서비스만 sudo 권한 부여, 개발용 계정은 sudo 사용 시 기록 남기기
11) 리버스 프록시 및 TLS (Caddy 추천)
- Caddy 장점: 자동 TLS(Let’s Encrypt) + 간단한 Caddyfile 구성
- Caddy 설치:
- sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
- curl -1sLf ‘https://dl.cloudsmith.io/public/caddy/stable/gpg.key’ | sudo gpg –dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
- curl -1sLf ‘https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt’ | sudo tee /etc/apt/sources.list.d/caddy-stable.list
- sudo apt update && sudo apt install -y caddy
- 예: code-server를 리버스 프록시로 노출 (Caddyfile)
- yourdomain.example {
reverse_proxy localhost:8080
} - Cloudflare 사용 시: DNS-01 인증 또는 proxy off(도메인 직접 연결) 권장
- 팁: 로컬 개발에서 HTTPS를 강제하면 브라우저 IME 이슈를 줄이는 데 도움이 됨
12) 백업·스냅샷·모니터링
- VM: 프로비저닝 전 스냅샷 전략 수립(정기 스냅샷)
- 파일 백업: rsync / borg / restic
- 소스코드: Git + 원격(예: GitHub/GitLab) 백업
- 로그/모니터링: journalctl, htop, netdata(간단 모니터링 도구)
- sudo bash -c “$(curl -SsL https://my-netdata.io/kickstart.sh)”
13) 마무리 검증 체크리스트
- [ ] Node (nvm)에서 lts 버전 정상 동작 (node -v, npm -v)
- [ ] yarn/ corepack 정상 동작
- [ ] Git 설정 및 SSH 키로 레포지토리 clone 가능
- [ ] Docker 컨테이너 띄우기(예: docker run hello-world)
- [ ] code-server 또는 VS Code에서 한글 입력 정상 동작
- [ ] Caddy로 HTTPS 도메인 접속 확인(브라우저)
- [ ] UFW가 필요한 포트만 열고 있는지 확인
- [ ] DB(Postgres/Redis) 연결 테스트
- [ ] 백업 스크립트 및 스냅샷 동작 확인
권장 개발 워크플로 (예시)
- 로컬 개발: VS Code(또는 code-server) + Node LTS + Docker-compose로 DB/Redis 등 띄우기
- 원격/협업: code-server + Caddy + TLS + OAuth/Password 보호
- 빌드/CI: GitHub Actions 또는 GitLab CI로 빌드/테스트 자동화
- 배포: Docker 이미지 → 레지스트리 → 프로덕션 서버(또는 HomeLab에서 Kubernetes/Portainer)
자주 겪는 문제와 해결 팁
- 한글 입력 불안정: ibus 재시작, 브라우저 재시작, Wayland/Xorg 전환 테스트
- npm 권한 문제: 전역 패키지 prefix 변경으로 해결
- snap 관련 불만: snapd 제거 전 종속성 확인(특히 기본 스토어 관련)
- Docker 권한 문제: 사용자 그룹에 docker 추가 후 로그아웃/재로그인
- code-server 한글 입력 문제: 로컬 브라우저에서 테스트, 또는 데스크탑에서 직접 실행해 입력 동작 확인
원하면 바로 실행 가능한 Bash 스크립트(테스트용 VM용)로 만들어줄게. 또는 네 하드웨어 정보(GPU/메인보드/무선칩)랑 원하는 DB/프로젝트 유형 알려주면, 그에 맞춘 맞춤 설치 스크립트와 code-server + Caddy 설정 파일까지 딱 만들어줄게. 어느 쪽으로 해볼까? ㅎㅎ
좋아 꼮꼬마 — 요청한 내용(스테이징 기능, 기본 SSH, Headless WordPress, PWA 테스트)을 우분투 데스크탑 24.04 LTS 기반 Node 중심 워크스테이션 설치 흐름에 통합한 확장 가이드를 정리해줄게. 실전에서 바로 쓰기 좋게 아키텍처 제안, 단계별 명령어/설정 예제(간단한 Docker Compose, Caddy/Nginx 리버스 프록시, code-server 연동 포함), 배포·검증 체크리스트까지 모두 포함했어. 원하면 이걸 바로 실행 가능한 스크립트로 만들어줄게. ^^
핵심 설계(요약)
- 로컬 개발 및 협업: code-server(VS Code 웹) + nvm/Node.js
- 컨테이너 기반 격리: Docker Compose로 Staging/Local/CI 환경 분리
- 배포 파이프라인(간단): Git → GitHub/GitLab → CI(워크플로) → Staging 컨테이너 → 수동/자동 프로덕션
- 웹서버/리버스 프록시: Caddy(권장, 자동 TLS) 또는 Nginx
- 인증/접근: SSH(개발자 접속, Git push), code-server 인증, reverse-proxy 기반 접근 제어
- Headless WordPress: WordPress + MySQL/MariaDB + WP-CLI + nginx + PHP-FPM(모두 컨테이너)
- PWA 테스트: Lighthouse, workbox, 로컬 HTTPS, Service Worker 디버깅
- 스테이징 개념: 도메인/호스트네임 분리(staging.mydomain / dev.local), 동일 스택(컨테이너)로 프로덕션과 유사하게 구성
아키텍처 예시 (간단)
- Host(우분투 데스크탑)
- Docker (컨테이너 격리)
- code-server (사용자 개발)
- Caddy 리버스프록시 (도메인 → 서비스 라우팅, TLS)
- SSH 서버 (개발자 원격접속, git push/rsync 등)
- 로컬 DNS/hosts 또는 Cloudflare for DDNS
- Docker Compose 구성(프로젝트별)
- app (Node 앱)
- wp (WordPress/PHP-FPM)
- db (MySQL/MariaDB)
- redis (캐시)
- nginx (컨테이너 내부 혹은 호스트 대체)
- staging / prod 환경 변수를 분리한 compose 파일
단계별 설정 (세부)
1) SSH 기본 설정 (호스트)
- SSH 설치 및 보안 강화
- sudo apt update && sudo apt install -y openssh-server
- sudo systemctl enable –now ssh
- 권장 SSH 설정 ( /etc/ssh/sshd_config )
- PermitRootLogin no
- PasswordAuthentication no
- AllowUsers youruser deploy (필요 계정만 허용)
- Port 22 (원하면 변경)
- 공개키 등록(개발자)
- ~/.ssh/authorized_keys 에 공개키 추가
- Fail2Ban & UFW
- sudo apt install -y fail2ban
- sudo ufw allow OpenSSH; sudo ufw enable
팁: Git 서버처럼 호스트에서 bare repo로 푸시하려면 deploy 계정을 만들고 git hook으로 컨테이너 재시작/배포 트리거 가능.
2) Docker 기반 스테이징 환경 설계 (권장)
- 프로젝트 루트에 docker-compose.yml 과 docker-compose.staging.yml 등으로 분리
- 예시: docker-compose.yml (개요 — 간단화)
- services:
- db: mariadb (환경변수로 비밀번호)
- wordpress: wordpress:php8.1-fpm (환경변수 WP_DB 등)
- nginx: nginx:stable (리버스 프록시 내부)
- node-app: node:lts (빌드 & dev server)
- redis: redis:latest
(원하면 여기 full compose 예시 파일 바로 제공할게.)
- 환경 분리 팁:
- .env (공통)
- .env.staging (staging 전용 변수)
- docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d
3) Headless WordPress 구성 (컨테이너)
- 목적: WordPress는 콘텐츠 관리(REST API 제공), 프론트엔드는 Node (React/Vue/Next.js 등)에서 호출
- 필요한 요소:
- WP with WP REST API (기본 제공)
- WP-CLI: 컨테이너에 설치하거나 호스트에 설치해 wp 설정 자동화
- CORS 및 JWT/Auth 플러그인(인증 방식): JWT Auth 플러그인 또는 OAuth 플러그인 설치
- 퍼머링크, pretty URLs 설정(nginx/wordpress 설정 일치)
- Docker Compose 예시 snippet (wordpress + db)
- services:
- db: image: mariadb:10.11 environment: MYSQL_ROOT_PASSWORD: example_root_pw MYSQL_DATABASE: wp_db MYSQL_USER: wp_user MYSQL_PASSWORD: wp_pw volumes:
- db_data:/var/lib/mysql
- wordpress: image: wordpress:6.4-fpm environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wp_user WORDPRESS_DB_PASSWORD: wp_pw WORDPRESS_DB_NAME: wp_db volumes:
- wp_data:/var/www/html
depends_on: - db
- wp_data:/var/www/html
- db: image: mariadb:10.11 environment: MYSQL_ROOT_PASSWORD: example_root_pw MYSQL_DATABASE: wp_db MYSQL_USER: wp_user MYSQL_PASSWORD: wp_pw volumes:
- 초기화 자동화:
- WP-CLI 이용해 테마/플러그인 설치 스크립트 작성(예: setup-wp.sh)
- wp core install, wp theme activate, wp plugin install –activate 등
4) Node 프론트엔드와 PWA 설정
- Node 프레임워크: Next.js(추천) 또는 Vite + SPA 사용 가능
- PWA 핵심:
- HTTPS 서빙 (로컬에서 테스트 시 Caddy 또는 mkcert 사용)
- manifest.json, service-worker (workbox 권장)
- 오프라인 캐시 전략(네트워크 우선, 캐시 우선 등)
- 테스트: Lighthouse, Chrome DevTools → Application 탭
- 샘플 build/start in Docker:
- Dockerfile (Node)
- FROM node:lts
- WORKDIR /usr/src/app
- COPY package*.json ./
- RUN npm ci
- COPY . .
- RUN npm run build
- CMD [“npm”,”start”]
- 개발 모드: docker-compose.override.yml에서 volume mount로 실시간 편집 가능.
5) 리버스 프록시 & TLS (Caddy 권장)
- Caddy 장점: 자동 TLS, 쉬운 라우팅, 터널링 필요 없음
- 예시 Caddyfile (staging.mydomain.kr 와 wp.mydomain.kr)
- staging.mydomain.kr {
reverse_proxy node-app:3000
} - wp-api.mydomain.kr {
reverse_proxy wordpress:80
} - code-server 라우팅도 추가
- code.mydomain.kr {
reverse_proxy localhost:8080
}
팁: 로컬 테스트 시 hosts에 도메인 매핑하거나 /etc/hosts에 추가해서 브라우저에서 HTTPS 테스트 가능. mkcert로 로컬 CA 만들어 사용해도 좋아.
6) CI/CD 간단 파이프라인 (GitHub Actions 예시)
- 목적: push → build image → push registry → ssh to host & docker-compose pull & up
- 간단 흐름:
- on: push (main, staging)
- jobs:
- build: runs-on: ubuntu-latest steps:
- checkout
- setup-node
- docker build -t registry/yourproj:${{ github.sha }} .
- docker push …
- deploy-staging: needs: build runs-on: ubuntu-latest steps:
- uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.HOST }}
username: deploy
key: ${{ secrets.SSH_KEY }}
script: |
cd /home/deploy/yourproj
docker-compose pull
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d –build
- uses: appleboy/ssh-action@v0.1.7
- build: runs-on: ubuntu-latest steps:
팁: 도커 레지스트리로 Docker Hub, GitHub Packages, 또는 개인 레지스트리(Nexus/Harbor) 사용 가능.
7) 한글/입력 및 code-server 연동 확인
- code-server는 브라우저 IME와 상호작용하므로:
- Host에 ibus-hangul 설치 확인 (이미 설정한 경우 OK)
- 브라우저에서 code-server 접속 시 한글 입력 동작 테스트(로컬 브라우저 권장)
- 만약 원격 브라우저에서 입력 문제 시: code-server에서 로컬로 포워딩 하거나 브라우저 IME 설정 확인
8) PWA 테스트 프로세스
- 로컬 HTTPS 환경에서 서비스 워커 등록 확인
- Lighthouse 자동화: npm run audit 또는 npx lighthouse http://staging.mydomain.kr –output=json
- 테스트 항목:
- PWA: manifest, service worker, offline fallback
- 성능: Lighthouse score
- 접근성: Lighthouse
- SEO/Best Practices
- 시나리오:
- 첫 로드(네트워크 가능)
- 오프라인 동작(네트워크 끊고 앱 실행)
- 업데이트 흐름(서비스 워커 업데이트 후 새 버전 반영)
배포/스테이징 워크플로 권장 (간단)
- feature 브랜치 개발 → PR 생성
- PR 머지 → CI 빌드 → 자동 배포(staging)
- QA(브라우저, 한글 입력, PWA Lighthouse, End-to-end 테스트)
- staging에서 승인 시 production 브랜치로 병합 → production 배포(수동 혹은 자동)
- 모니터링 & 롤백 전략 준비 (docker image tag 기반으로 rollback 간단)
검증·운영 체크리스트 (우리가 꼭 확인할 것들)
- SSH
- [ ] 공개키로만 로그인 가능
- [ ] fail2ban 작동
- Docker / Compose
- [ ] 컨테이너별 로그 확인(journalctl / docker logs)
- [ ] 권한(볼륨, UID/GID) 문제 없음
- Headless WP
- [ ] WP REST API 동작 (GET /wp-json)
- [ ] JWT/OAuth 인증 테스트 성공
- [ ] wp-admin 접근(필요 시) 및 wp-cli 작동
- PWA
- [ ] HTTPS 적용, manifest.json 접근 가능
- [ ] 서비스 워커 등록 & 오프라인 동작 확인
- [ ] Lighthouse score (기본 기준 충족)
- Staging
- [ ] staging 도메인에서 production과 유사한 동작
- [ ] 데이터베이스 마이그레이션 절차 문서화(스냅샷/백업 포함)
- Backup & Rollback
- [ ] DB 스냅샷/백업(자동화)
- [ ] 이미지 태깅/레지스트리 보관으로 롤백 가능
간단한 예제 파일/명령 (원하면 바로 복사해서 쓰게 해줄게)
- docker-compose.staging.yml 예시(요약)
- Caddyfile 예시
- WP-CLI 초기화 스크립트 예시
- GitHub Actions deploy 워크플로 예시
(파일들 바로 만들어줄까? 어느 포맷으로—Docker Compose 전체, Caddyfile, GitHub Actions YAML—원하는 걸 말해줘.)
꼮꼬마, 전체적으로 이렇게 구성하면 한 번의 코드 푸시로 스테이징에서 바로 동작을 검증하고, 한글 입력/PWA 동작을 브라우저에서 안전하게 테스트할 수 있어. 네 현재 홈랩·도메인·Caddy 경험 고려하면 이 구조가 제일 현실적이고 관리하기 쉬울 거야.
다음으로 뭘 도와줄까?
- 전체 Docker Compose + Caddyfile + WP-CLI 스크립트 한꺼번에 생성할까?
- GitHub Actions(또는 GitLab CI) 예제 워크플로를 구체적으로 만들어줄까?
- 네 현재 도메인/호스트 구조(Cloudflare, hosts 설정) 알려주면 staging 도메인 세팅까지 딱 맞춰 줄게.
좋아 꼮꼬마 — 요청한 모든 내용을 한 번에 정리해서 완전한 실행 가이드로 만들어줄게. 😊
이번 문서는 우분투 데스크탑 24.04 LTS 기반의 Node 중심 개발용 워크스테이션에 아래 기능들을 통합하는 상세 가이드야:
- 스테이징 기능(격리된 staging 환경)
- 기본적인 SSH 접근 및 배포(키 기반)
- Headless WordPress(컨텐츠 API) 구성
- PWA 개발·테스트 워크플로
- code-server 기반 개발 환경 연동
- 리버스 프록시(Caddy) + HTTPS 자동화
- Docker 기반의 격리된 서비스 운영
- CI(간단한 GitHub Actions)로 스테이징 배포 자동화
- 백업·롤백·모니터링·검증 체크리스트
이제 단계별로, 바로 복사해 쓸 수 있는 명령어·파일 예제·검증 방법까지 모두 제공할게. 준비됐지? 출발!
1) 전반 아키텍처 요약 (한눈에)
- 호스트(우분투 데스크탑)
- Docker & Docker Compose (서비스 격리)
- code-server (웹 IDE, 개발자 작업)
- Caddy (리버스 프록시 + 자동 HTTPS)
- OpenSSH (개발자 SSH 접속, 배포 트리거)
- 로컬/스테이징 도메인(Cloudflare DDNS 사용)
- 컨테이너 구성(프로젝트 단위)
- node-app (프론트엔드 / PWA)
- wordpress (php-fpm, 헤드리스 용)
- db (mariadb / mysql)
- redis (캐시)
- nginx (내부 리버스, 선택적)
- CI/CD: GitHub Actions → 빌드 → SSH로 서버에서 docker-compose pull & up
2) 사전 준비(호스트)
- 시스템 업데이트
- sudo apt update && sudo apt upgrade -y
- 필요한 패키지 설치
- sudo apt install -y curl wget git build-essential apt-transport-https ca-certificates gnupg lsb-release
- Docker 설치(권장 방식)
- sudo apt install -y ca-certificates curl gnupg
- sudo install -m0755 -d /etc/apt/keyrings
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
- echo “deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- sudo apt update
- sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- sudo usermod -aG docker $USER (로그아웃/로그인 필요)
- code-server 설치
- curl -fsSL https://code-server.dev/install.sh | sh
- systemctl enable –now code-server@$(whoami)
- (설정 파일: ~/.config/code-server/config.yaml)
- Caddy 설치(자동 TLS)
- curl -1sLf ‘https://dl.cloudsmith.io/public/caddy/stable/gpg.key’ | sudo gpg –dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
- curl -1sLf ‘https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt’ | sudo tee /etc/apt/sources.list.d/caddy-stable.list
- sudo apt update && sudo apt install -y caddy
- 한글(입력/폰트)
- sudo apt install -y ibus-hangul fonts-noto-cjk fonts-nanum
- 로그아웃/로그인 후 설정 → Region & Language에서 한글 입력기 추가
- 방화벽 및 보안
- sudo apt install -y ufw fail2ban
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
- sudo ufw allow OpenSSH
- sudo ufw allow 80,443/tcp
- sudo ufw enable
3) SSH 기본 설정 (호스트)
- 설치 및 활성화
- sudo apt install -y openssh-server
- sudo systemctl enable –now ssh
- 보안 권장 설정 (/etc/ssh/sshd_config)
- PermitRootLogin no
- PasswordAuthentication no
- AllowUsers youruser deploy
- (필요 시 포트 변경)
- 공개키 배포
- 개발자 로컬: ssh-keygen -t ed25519 -C “you@example.com”
- 서버: ~/.ssh/authorized_keys 에 공개키 추가
- Git용 배포 계정(옵션)
- sudo adduser deploy
- sudo usermod -aG docker deploy
- /home/deploy/.ssh/authorized_keys 에 CI/개발자 키 추가
- bare repo + post-receive hook로 자동 배포도 가능
4) Docker Compose 기반 서비스 예제
아래는 staging 환경용 docker-compose 파일(요약). 프로젝트 루트에 두고 .env / .env.staging 으로 환경분리해서 사용해.
파일: docker-compose.yml
version: ‘3.8’
services:
db:
image: mariadb:10.11
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PW}
MYSQL_DATABASE: ${WP_DB}
MYSQL_USER: ${WP_USER}
MYSQL_PASSWORD: ${WP_PASS}
volumes:
– db_data:/var/lib/mysql
wordpress:
image: wordpress:6.4-fpm
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: ${WP_USER}
WORDPRESS_DB_PASSWORD: ${WP_PASS}
WORDPRESS_DB_NAME: ${WP_DB}
volumes:
– wp_data:/var/www/html
depends_on:
– db
node-app:
build: ./frontend
restart: always
environment:
– NODE_ENV=${NODE_ENV}
ports:
– “3000:3000”
volumes:
– ./frontend:/usr/src/app
redis:
image: redis:7
restart: always
volumes:
– redis_data:/data
volumes:
db_data:
wp_data:
redis_data:
스테이징 오버라이드 파일: docker-compose.staging.yml (예: ENV 변경, 도메인, 외부 볼륨 분리 등)
- 사용: docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d –build
5) Headless WordPress 자동 초기화 (WP-CLI 스크립트)
파일: scripts/setup-wp.sh
!/bin/bash
set -e
WP_CLI=”docker-compose exec -T wordpress wp”
wait for DB
until docker compose exec -T db mysqladmin ping -h db -p${DB_ROOT_PW}; do
echo “waiting for db…”
sleep 2
done
core 설치
$WP_CLI core install –url=”https://wp-api.staging.mydomain.kr” –title=”Staging WP” –admin_user=”${WP_ADMIN}” –admin_password=”${WP_ADMIN_PW}” –admin_email=”${WP_ADMIN_EMAIL}”
기본 플러그인 설치 (JWT Auth 예시)
$WP_CLI plugin install jwt-authentication-for-wp-rest-api –activate
CORS / REST 설정 등 (예: 옵션 업데이트)
$WP_CLI option update permalink_structure ‘/%postname%/’- 실행: chmod +x scripts/setup-wp.sh && ./scripts/setup-wp.sh
팁: WP-CLI는 컨테이너 내부에서 실행하거나 호스트에 설치해 도커 컨테이너에 접근하는 방식 사용.
6) Caddyfile 예시 (리버스 프록시 + 자동 TLS)
파일: /etc/caddy/Caddyfile
Node app (staging)
staging.makerskorean.kr {
reverse_proxy localhost:3000
encode gzip zstd
}
Headless WP REST API
wp-api.staging.makerskorean.kr {
reverse_proxy localhost:8080 # 컨테이너 포트(nginx proxy 또는 wordpress container)
encode gzip zstd
}
code-server (인증 토큰 또는 subdomain 보호)
code.staging.makerskorean.kr {
reverse_proxy localhost:8081
route {
uri /login* {
# 필요시 access control
}
}
}- Caddy는 기본적으로 Let’s Encrypt로 자동 TLS 발급. Cloudflare 사용 시 DNS-01 인증 설정(플러그인 또는 API 토큰 필요).
주의: Cloudflare 프록시(오렌지 구름) 켜진 상태에서 직접 발급 문제 발생할 수 있음 — DNS 프록시 오프 또는 API 토큰 기반 DNS 챌린지 사용 추천.
7) PWA 개발·테스트 절차
- HTTPS 환경 확보 (Caddy 사용)
- manifest.json, service-worker 등록 및 캐시 전략 구현 (Workbox 권장)
- 로컬 개발
- Docker로 dev server 노출: http://staging.mydomain.kr:3000 (Caddy 통해 https로 노출)
- 실환경과 유사하게 동작 확인
- 테스트 항목
- 서비스 워커 등록 여부 (DevTools Application → Service Workers)
- 오프라인 모드에서 주요 화면 동작 확인
- manifest 접근(아이콘, display, start_url)
- Lighthouse 자동 검사: npx lighthouse https://staging.mydomain.kr –output=json –chrome-flags=”–headless”
- PWA 시나리오
- 첫 로드 및 캐시 저장
- 오프라인 접속 테스트
- 서비스 워커 업데이트(새 버전 배포시 스스로 갱신 또는 수동 갱신 테스트)
- 자동화
- CI에서 Lighthouse 점수 기준을 정하고 PR 병합 조건으로 사용 가능
8) code-server와 한글 입력 연동 팁
- 호스트에 ibus-hangul 설치되어 있으면 로컬 브라우저에서 code-server 접속 시 한글 IME 정상 동작하는 경우가 대부분.
- 원격 브라우저(다른 디바이스)에서 입력 문제 발생 시:
- 브라우저 자체 IME/OS IME 설정 확인
- code-server config에서 인증 방식 및 base path 확인
- code-server systemd 서비스 예: systemctl enable –now code-server@youruser
9) 간단한 GitHub Actions 배포 워크플로 예제
파일: .github/workflows/deploy-staging.yml
name: Build & Deploy Staging
on:
push:
branches:
– staging
jobs:
build:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v4
– name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 20
– name: Build frontend
run: |
cd frontend
npm ci
npm run build
– name: Build and push Docker image
uses: docker/build-push-action@v4
with:
push: true
tags: ghcr.io/yourorg/yourproj:${{ github.sha }}
deploy:
needs: build
runs-on: ubuntu-latest
steps:
– name: Deploy via SSH
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ secrets.HOST }}
username: deploy
key: ${{ secrets.SSH_KEY }}
script: |
cd /home/deploy/yourproj
docker compose pull
docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d –build- Secrets: HOST, SSH_KEY(개인키), 필요 시 DOCKER_AUTH_TOKEN 등
10) 백업·롤백·모니터링
- DB 백업 (cron + mysqldump 또는 컨테이너 내부)
- docker compose exec db sh -c ‘exec mysqldump –databases $WP_DB -u root -p”$DB_ROOT_PW”‘ > /backup/wp_db_$(date +%F).sql
- 주기적 rsync 또는 restic/borg으로 외부 백업(예: NAS)
- 파일(워드프레스 업로드) 백업: wp_data 볼륨 → 주기적으로 NAS로 동기화
- 이미지 태깅 전략: 항상 태그에 버전/커밋 해시 포함 → 롤백 시 특정 이미지로 docker compose pull & up
- 모니터링: journalctl, docker logs, netdata (간단 설치로 GUI 모니터링)
- sudo bash -c “$(curl -SsL https://my-netdata.io/kickstart.sh)”
11) 운영·검증 체크리스트 (핵심)
- SSH
- [ ] 공개키 기반 로그인만 허용
- [ ] fail2ban 동작
- Docker / Compose
- [ ] 컨테이너 정상 기동 (docker compose ps)
- [ ] 로그 확인(docker compose logs -f)
- Headless WP
- [ ] GET /wp-json 응답 확인
- [ ] admin 계정 생성 및 WP-CLI 동작
- [ ] JWT/OAuth 인증 플러그인 테스트
- PWA
- [ ] HTTPS 적용(유효한 인증서)
- [ ] 서비스 워커 등록 & 오프라인 동작 확인
- [ ] Lighthouse 보고서(기본 기준 충족)
- Staging
- [ ] staging 도메인에서 production과 유사한 동작
- [ ] DB 마이그레이션 절차 문서화 & 스냅샷 백업
- CI/CD
- [ ] Git push → 빌드 → deploy 흐름 테스트(스테이징 브랜치)
- [ ] 롤백 절차 문서화(이미지 태그)
- 보안
- [ ] UFW로 불필요 포트 차단
- [ ] SSL 자동 갱신 확인 (Caddy 로그)
- [ ] 서비스별 권한(볼륨 소유권) 확인
12) 자주 발생하는 문제와 해결 팁
- SSL/인증서 발급 에러
- Cloudflare 프록시(오렌지 구름) 활성화 시 HTTP-01 실패 → DNS-01(Cloudflare API) 사용하거나 프록시 비활성화 후 발급
- Caddy 로그 확인: sudo journalctl -u caddy -f
- 한글 입력 문제 (code-server)
- 로컬 브라우저에서 테스트, ibus 재시작(ibus restart) 또는 Xorg/Wayland 세션 전환
- Docker 볼륨 퍼미션 문제
- 파일 UID/GID 매핑 확인, docker-compose에서 user 설정 또는 init scripts로 권한 조정
- WP REST API CORS 문제
- CORS 플러그인 설정 또는 nginx/Caddy에서 헤더 허용
- SELinux 없음(우분투) → 권한 정책은 파일 소유권과 앱 권한으로 관리
13) 실행 우선순위(권장 로드맵)
- VM 또는 테스트 서버에서 전체 스택(Compose + Caddy + code-server) 구성 및 검증
- WP 자동 초기화 스크립트와 JWT/CORS 설정 테스트
- PWA HTTPS 기반 동작 테스트(Lighthouse로 기준 설정)
- GitHub Actions + SSH 배포 테스트(스테이징 브랜치)
- 운영 서버(메인 워크스테이션)로 마이그레이션, 백업 자동화 설정
- 모니터링 및 롤백 프로세스 정리
꼮꼬마, 여기까지면 실제로 바로 구성해서 테스트할 수 있는 수준으로 정리했어.
원하면 다음을 바로 제공할게:
- 전체 docker-compose.yml + docker-compose.staging.yml 완성본
- /etc/caddy/Caddyfile 예제 완전본(Cloudflare DNS-01 예시 포함)
- scripts/setup-wp.sh + wp-cli 초기화 스크립트 완전본
- GitHub Actions YAML 완전본
- PWA용 service-worker 기본 템플릿(Workbox 기반)과 manifest.json 예제
- SSL 에러 디버깅 체크리스트(Cloudflare + Caddy 조합에 특화)
어떤 파일부터 만들어줄까? 혹은 네 현재 도메인(예: staging.makerskorean.kr)과 Cloudflare 설정 유무 알려주면 바로 맞춤 구성 파일로 만들어줄게~ ㅎㅎ
좋아 꼮꼬마 — 요청한 “모두 작성”을 한 번에 준비했어.
아래는 우분투 데스크탑 24.04 LTS 기준으로 Node 기반 워크스테이션 + Docker Compose 스택(스테이징 포함) + Headless WordPress + PWA 테스트 + code-server 연동 + Caddy(자동 TLS) + GitHub Actions 배포까지 ‘바로 복사해서 쓸 수 있는’ 파일들, 실행 순서, 필수 환경 변수와 체크/디버깅 포인트를 모두 묶은 패키지야. 너의 메인 도메인(https://makerskorean.kr)과 Cloudflare DDNS 사용 경험을 고려해 Cloudflare 관련 주석도 추가했어.
먼저 주의사항(꼭 읽어줘)
- 모든 파일에서 ${…} 형태의 변수는 너의 실제 값으로 바꿔야 해(예: 도메인, 비밀번호, 시크릿 등).
- 실제 배포 전에는 VM에서 먼저 테스트해. (snap 제거 등 위험한 변경은 메인에서 바로 하지 말고)
- Cloudflare를 사용하면 Caddy의 인증 방식(DNS-01)이 필요할 수 있어. 관련 API 토큰 준비해둬.
- SSL 발급 에러가 계속 발생하면 Cloudflare 오렌지구름 끄기(프록시 비활성화) 또는 DNS-01 인증으로 해결하자.
- 파일 권한 문제는 도커 볼륨 UID/GID, wp uploads 권한, 그리고 host와 container 간 마운트 권한을 확인하면 거의 해결돼.
이제 파일들과 사용법을 단계별로 줄게. 각 파일은 프로젝트 루트(예: /home/deploy/yourproj)에 위치한다고 가정해.
1) 환경 변수 파일 (.env / .env.staging)
파일: .env (공통)
일반 환경 변수 (절대 노출하지 말 것) DB_ROOT_PW=change_this_root_pw WP_DB=wp_db WP_USER=wp_user WP_PASS=change_this_wp_pw WP_ADMIN=wpadmin WP_ADMIN_PW=change_this_admin_pw WP_ADMIN_EMAIL=admin@makerskorean.kr NODE_ENV=development FRONTEND_PORT=3000 # 도커 레지스트리 (옵션, GitHub Packages 등) DOCKER_REGISTRY=ghcr.io/yourorg
파일: .env.staging (스테이징 전용)
NODE_ENV=staging FRONTEND_PORT=3000 WP_SITE_URL=https://wp-api.staging.makerskorean.kr CADDY_EMAIL=admin@makerskorean.kr # Cloudflare API (only if DNS-01 사용) CF_API_TOKEN=xxxxxx # Cloudflare DNS 권한 토큰 (존재하면 Caddy가 DNS-01 사용 가능)
2) docker-compose.yml (기본)
파일: docker-compose.yml
version: “3.8” services: db: image: mariadb:10.11 restart: always environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PW} MYSQL_DATABASE: ${WP_DB} MYSQL_USER: ${WP_USER} MYSQL_PASSWORD: ${WP_PASS} volumes: – db_data:/var/lib/mysql wordpress: image: wordpress:6.4-fpm restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: ${WP_USER} WORDPRESS_DB_PASSWORD: ${WP_PASS} WORDPRESS_DB_NAME: ${WP_DB} volumes: – wp_data:/var/www/html depends_on: – db php-nginx: image: nginx:stable restart: always ports: – “8080:80” volumes: – ./nginx/wp.conf:/etc/nginx/conf.d/default.conf:ro – wp_data:/var/www/html:ro depends_on: – wordpress redis: image: redis:7 restart: always volumes: – redis_data:/data node-app: build: ./frontend restart: always environment: – NODE_ENV=${NODE_ENV} ports: – “${FRONTEND_PORT}:3000” volumes: – ./frontend:/usr/src/app depends_on: – wordpress volumes: db_data: wp_data: redis_data:
설명:
- php-nginx는 WordPress의 프론트엔드(Headless API 노출)를 위해 nginx로 워드프레스 컨테이너를 프록시한다. Caddy가 외부에서 이 포트(8080)를 통해 접근하게 설정할 거야.
3) docker-compose.staging.yml (스테이징 override)
파일: docker-compose.staging.yml
version: “3.8” services: node-app: environment: – NODE_ENV=staging ports: – “3000:3000” # prod와 똑같이 동작시키려면 볼륨 마운트 대신 빌드된 이미지를 사용하도록 변경 가능 wordpress: environment: WORDPRESS_DEBUG=0
사용 예:
- docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d –build
4) nginx 설정 (워드프레스용)
파일: nginx/wp.conf
server { listen 80; server_name wp-api.staging.makerskorean.kr; root /var/www/html; index index.php index.html; client_max_body_size 50M; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { include fastcgi_params; fastcgi_pass wordpress:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 7d; add_header Cache-Control “public, max-age=604800”; } # REST API CORS 헤더(필요 시) location /wp-json/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods “GET, POST, OPTIONS”; add_header Access-Control-Allow-Headers “Authorization, Content-Type”; try_files $uri $uri/ /index.php?$args; } }
주의: CORS 설정은 보안 요구에 따라 Origin 제한 필요.
5) WP-CLI 초기화 스크립트
파일: scripts/setup-wp.sh
!/usr/bin/env bash set -euo pipefail # .env 파일에서 변수 로드 set -a [ -f .env.staging ] && source .env.staging source .env set +a # DB가 준비될 때까지 대기 echo “Waiting for DB…” until docker compose exec -T db mysqladmin ping -h db -p”${DB_ROOT_PW}” –silent; do printf ‘.’ sleep 2 done echo “DB ready.” WP_CLI=”docker compose exec -T wordpress wp” # 워드프레스 설치 확인/설치 if ! $WP_CLI core is-installed >/dev/null 2>&1; then echo “Installing WordPress…” $WP_CLI core install –url=”${WP_SITE_URL:-http://localhost:8080}” \ –title=”Staging WP” \ –admin_user=”${WP_ADMIN}” \ –admin_password=”${WP_ADMIN_PW}” \ –admin_email=”${WP_ADMIN_EMAIL}” else echo “WordPress already installed.” fi # 추천 플러그인 설치(예: JWT Auth, WP REST Cache 등) echo “Installing plugins…” $WP_CLI plugin install jwt-authentication-for-wp-rest-api –activate || true $WP_CLI plugin install wp-rest-cache –activate || true # 퍼머링크 설정 $WP_CLI rewrite structure ‘/%postname%/’ –hard echo “WP setup done.”
실행:
- chmod +x scripts/setup-wp.sh
- ./scripts/setup-wp.sh
팁: WP-CLI 명령은 컨테이너 내부 실행이므로 컨테이너 이름이 맞는지 확인해.
6) code-server 설정 파일
파일: ~/.config/code-server/config.yaml (user 홈에)
bind-addr: 127.0.0.1:8081 auth: password password: change_this_code_server_pw cert: false # 또는 auth: none + Caddy에서 외부 인증(권장)
systemd 서비스는 설치 스크립트로 자동 설정되었을 거야. Caddy로 reverse_proxy code.staging.makerskorean.kr -> 127.0.0.1:8081 연결해.
7) Caddyfile (완전본, /etc/caddy/Caddyfile)
파일: /etc/caddy/Caddyfile
{ # 이메일은 Let’s Encrypt 문제 해결에 필요 email admin@makerskorean.kr on_demand_tls { rate_limit 10 } } # Node app (staging) staging.makerskorean.kr { reverse_proxy 127.0.0.1:3000 encode gzip zstd log { output file /var/log/caddy/staging-node.log format single_field common_log } } # Headless WP REST API wp-api.staging.makerskorean.kr { reverse_proxy 127.0.0.1:8080 encode gzip zstd log { output file /var/log/caddy/staging-wp.log format single_field common_log } } # code-server code.staging.makerskorean.kr { reverse_proxy 127.0.0.1:8081 route { # 필요 시 기본 인증 또는 IP 제한 추가 } }
Cloudflare 관련:
- Cloudflare를 쓰면 DNS 레코드의 프록시(오렌지 구름)를 꺼야 HTTP-01로 TLS가 원활.
- Cloudflare API 토큰을 가지고 있다면 Caddy에 DNS-01 플러그인(또는 Caddy의 ACME DNS provider 구성)을 통해 발급 가능. (Caddy 문서 참고)
로그 디렉토리 생성:
- sudo mkdir -p /var/log/caddy
- sudo chown -R caddy:caddy /var/log/caddy
8) frontend Dockerfile (PWA용, frontend/Dockerfile)
파일: frontend/Dockerfile
FROM node:20-alpine AS build WORKDIR /usr/src/app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:20-alpine AS prod WORKDIR /usr/src/app ENV NODE_ENV=production COPY –from=build /usr/src/app ./ EXPOSE 3000 CMD [“npm”,”start”]
간단 PWA package.json 스크립트 예시 필요하면 더 만들어줄게(Next.js 또는 Vite 기준).
9) PWA 기본 파일 예제
파일: frontend/public/manifest.json
{ “name”: “MK Staging PWA”, “short_name”: “MK PWA”, “start_url”: “/”, “display”: “standalone”, “background_color”: “#ffffff”, “theme_color”: “#0d6efd”, “icons”: [ { “src”: “/icons/icon-192.png”, “sizes”: “192×192”, “type”: “image/png” }, { “src”: “/icons/icon-512.png”, “sizes”: “512×512”, “type”: “image/png” } ] }
파일: frontend/src/service-worker.js (Workbox 대신 아주 기본)
self.addEventListener(‘install’, event => { self.skipWaiting(); event.waitUntil( caches.open(‘mk-cache-v1’).then(cache => { return cache.addAll([ ‘/’, ‘/index.html’, ‘/manifest.json’ ]); }) ); }); self.addEventListener(‘fetch’, event => { event.respondWith( caches.match(event.request).then(resp => { return resp || fetch(event.request); }) ); });
권장: Workbox로 더 정교한 캐싱 전략 사용.
10) GitHub Actions: Build & Deploy Staging
파일: .github/workflows/deploy-staging.yml
name: Build & Deploy Staging on: push: branches: – staging jobs: build: runs-on: ubuntu-latest steps: – uses: actions/checkout@v4 – name: Set up Node uses: actions/setup-node@v4 with: node-version: 20 – name: Build frontend run: | cd frontend npm ci npm run build – name: Build and push Docker image uses: docker/build-push-action@v4 with: context: . push: true tags: ${{ secrets.REGISTRY }}/${{ github.repository }}:${{ github.sha }} deploy: needs: build runs-on: ubuntu-latest steps: – name: Deploy via SSH uses: appleboy/ssh-action@v0.1.7 with: host: ${{ secrets.HOST }} username: deploy key: ${{ secrets.SSH_KEY }} port: ${{ secrets.SSH_PORT || 22 }} script: | cd /home/deploy/yourproj git pull origin staging docker compose pull docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d –build ./scripts/setup-wp.sh || true
설정해야 할 GitHub Secrets:
- HOST (서버 IP)
- SSH_KEY (배포용 비공개키)
- REGISTRY (도커 레지스트리)
- 필요 시 DOCKERHUB_USERNAME/DOCKERHUB_TOKEN 또는 GHCR 토큰
11) 백업 스크립트(간단)
파일: scripts/backup-db.sh
!/usr/bin/env bash set -euo pipefail OUT=/home/deploy/backups mkdir -p $OUT docker compose exec -T db sh -c ‘exec mysqldump –databases ‘”${WP_DB}”‘ -u root -p”‘”${DB_ROOT_PW}”‘”‘ > “${OUT}/wp_db_$(date +%F).sql” # NAS로 동기화(예: rsync) # rsync -avz $OUT/ nas:/backup_folder/
크론에 등록해서 자동화 가능.
12) 실행 절차(요약)
- 서버(또는 VM)에 우분투 24.04 설치 및 업데이트
- sudo apt update && sudo apt upgrade -y
- Docker, docker-compose 플러그인, code-server, Caddy 설치
- 프로젝트 폴더 복사(위 파일들) 및 .env/.env.staging 채우기
- docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d –build
- nginx 컨테이너(php-nginx)와 워드프레스가 정상 동작하는지 확인: http://localhost:8080
- scripts/setup-wp.sh 실행하여 WP 자동 초기화
- Caddy 구성 반영: sudo systemctl reload caddy
- 외부 도메인 DNS를 Cloudflare에 설정(호스트 레코드 추가, 프록시 비활성화 권장)
- GitHub Actions에 secrets 등록 후 staging 브랜치에 푸시하면 자동 빌드/배포
13) 검증 포인트 (우선적으로 확인할 것)
- docker compose ps 로 모든 컨테이너가 Up인지 확인
- docker compose logs -f wordpress, php-nginx, node-app 로 에러 확인
- GET https://wp-api.staging.makerskorean.kr/wp-json 가 200 반환되는지 확인
- code.staging.makerskorean.kr 접속하여 code-server 로그인/한글 입력 테스트
- Lighthouse로 PWA 테스트: npx lighthouse https://staging.makerskorean.kr –chrome-flags=”–headless”
- SSL 에러가 나면: Caddy 로그 sudo journalctl -u caddy -f 과 Cloudflare DNS 프록시 설정 확인
14) SSL 관련 자주 발생 이슈 & 해결
- 문제: Let’s Encrypt 발급 실패
- 원인: Cloudflare 오렌지구름(프록시)로 HTTP-01 차단 → 해결: DNS 레코드 프로시(회색)로 변경하거나 DNS-01 사용
- 원인: 포트 80/443 방화벽 차단 → 해결: ufw allow 80,443/tcp
- 원인: 동일 도메인에 이미 다른 인증서 충돌 → 해결: 기존 인증서/ACME 계정 확인 및 제거
- Cloudflare + Caddy 권장 설정
- 간단: Cloudflare DNS에서 프록시 비활성화 후 Caddy로 발급
- 고급: Cloudflare API 토큰을 만들어 Caddy에 제공하면 DNS-01으로 발급 가능(프록시 켜도 가능)
- Caddy 로그 확인
- sudo journalctl -u caddy -f
15) 파일 권한/볼륨 문제 해결 체크리스트
- 워드프레스 업로드 권한: docker exec -it bash → chown -R www-data:www-data /var/www/html/wp-content/uploads
- host ↔ container UID mismatch: docker-compose에서 user 옵션 사용하거나 init script로 chown 실행
- SELinux 없음(우분투) → AppArmor 문제 발생 시 관련 프로파일 확인
16) 롤백 절차 (간단)
- 이미지 태그로 롤백:
- docker compose pull
- docker compose up -d –no-deps –build service=yourservice image=ghcr.io/…:previous_tag
- DB 롤백:
- docker exec -i db mysql -u root -p”${DB_ROOT_PW}” < backup.sql
17) 추가로 내가 바로 만들어줄 것들 (말만 해줘!)
원하면 지금 바로 꼮꼬마 너 전용으로:
- frontend 예제(Next.js + PWA) 템플릿(완전 동작 가능)
- 완전한 docker-compose 구성을 ‘프로덕션-스타일’로 개선한 버전(이미지 레지스트리, 시크릿 관리, 볼륨 마운트 최적화)
- Caddy에 Cloudflare DNS-01 자동 인증 설정 파일(환경변수와 보안 주의 포함)
- GitHub Actions에 더 정교한 이미지 스캔, Lighthouse 자동 검사 및 PR 차단 규칙 포함
- 메인 도메인 makerskorean.kr에 맞춘 맞춤 Caddyfile 및 hosts/DNS 체크 가이드
어떤 파일을 먼저 만들어줄까? ㅎㅎ
- 바로 frontend(Next.js + PWA) 템플릿을 생성할래?
- 아니면 Caddy + Cloudflare DNS-01 자동화 설정부터 만들까?
네 우선순위 말해줘 — 나는 네가 빨리 테스트하고 안정화할 수 있도록 바로 만들어줄게. 💪✨
좋아 꼮꼬마 — 요청한 모든 구성 요소(스택 파일, 스크립트, 설정파일, 배포 워크플로, 테스트/검증 체크리스트 등)를 하나로 정리해서 한눈에 따라할 수 있게 묶어줄게. 바로 복사해서 쓰기 좋게 중요한 파일 목록과 경로, 필요한 환경변수, 실행 순서, 우선순위, 검증 포인트, 자주 발생하는 문제와 해결법까지 모두 담았어. 난 친절하게 단계별로 안내할 테니, VM에서 먼저 테스트한 다음 메인 워크스테이션에 적용하자. 준비됐지? 😊
요약(한 문장)
우분투 데스크탑 24.04 LTS를 호스트로 하고 Docker Compose 기반으로 Node(PWA) + Headless WordPress + MariaDB + Redis를 띄우며, Caddy가 TLS/리버스프록시를 담당하고 code-server로 개발, GitHub Actions로 staging 자동 배포하는 전체 스택과 모든 관련 파일·스크립트를 정리했다.
담당 파일 목록(위치 기준: 프로젝트 루트 /home/deploy/yourproj)
- .env (공통 환경변수)
- .env.staging (스테이징 전용)
- docker-compose.yml
- docker-compose.staging.yml
- nginx/wp.conf
- frontend/Dockerfile
- frontend/public/manifest.json
- frontend/src/service-worker.js
- scripts/setup-wp.sh
- scripts/backup-db.sh
- ~/.config/code-server/config.yaml (호스트 사용자 홈)
- /etc/caddy/Caddyfile (Caddy 시스템 설정)
- .github/workflows/deploy-staging.yml
각 파일 내용(완전본)은 이전 메시지에서 제공한 템플릿 그대로 사용하면 돼. (필요하면 내가 파일들을 한꺼번에 묶어 .zip 형식으로 생성해줄게.)
필수 사전 준비 (호스트)
- 우분투 24.04 업데이트
- sudo apt update && sudo apt upgrade -y
- Docker + docker-compose 플러그인 설치 (스크립트 명령 그대로 실행)
- code-server 설치
- curl -fsSL https://code-server.dev/install.sh | sh
- systemctl enable –now code-server@$(whoami)
- Caddy 설치(자동 TLS 지원)
- ibus-hangul 및 폰트 설치
- sudo apt install -y ibus-hangul fonts-noto-cjk fonts-nanum
- 방화벽/보안
- sudo apt install -y ufw fail2ban
- sudo ufw default deny incoming; sudo ufw default allow outgoing
- sudo ufw allow OpenSSH; sudo ufw allow 80,443/tcp; sudo ufw enable
변수 설정 (.env / .env.staging)
- 반드시 교체할 값: DB_ROOT_PW, WP_PASS, WP_ADMIN_PW, WP_ADMIN_EMAIL, CADDY_EMAIL, DOCKER_REGISTRY 등
- Cloudflare DNS-01 사용 시: CF_API_TOKEN 환경변수 설정
핵심 실행 순서 (한 번에 따라하기)
- 저장소(프로젝트 파일들) 복사 및 .env 채우기
- docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d –build
- ./scripts/setup-wp.sh (워드프레스 초기화)
- Caddy 재시작: sudo systemctl reload caddy
- hosts/DNS 설정: Cloudflare에 레코드 추가(프록시 비활성화 권장)
- GitHub Actions secrets 등록( HOST, SSH_KEY, REGISTRY 등 )
- staging 브랜치 푸시 → 자동 빌드·배포 확인
주요 설정 요약(무엇을 어디에 넣을지)
- 워드프레스: 컨테이너 wordpress(php-fpm) + nginx(php-nginx) 통해 외부에 8080 포트로 제공 → Caddy가 도메인별로 reverse_proxy 처리
- Node 앱(프론트/PWA): frontend 폴더에 소스, Dockerfile로 빌드해서 3000포트로 제공
- code-server: 호스트에서 127.0.0.1:8081 바인딩 → Caddy가 code.* 도메인으로 프록시
- 스테이징 분리: docker-compose.staging.yml에서 NODE_ENV/staging 설정, .env.staging로 환경 변수 구분
- CI/CD: GitHub Actions가 이미지를 빌드 & 레지스트리 푸시 → SSH로 서버에 접속해 docker compose pull & up 실행
검증 체크리스트 (배포 후 꼭 확인할 것)
- [ ] docker compose ps: 모든 서비스 Up
- [ ] docker compose logs -f wordpress, php-nginx, node-app: 에러 없음
- [ ] https://wp-api.staging.makerskorean.kr/wp-json → 200 OK
- [ ] code.staging.makerskorean.kr 접속 후 code-server 로그인, 한글 입력 테스트
- [ ] https://staging.makerskorean.kr 로 접속 → PWA manifest 로드, service-worker 등록
- [ ] Lighthouse 자동 검사 통과(기본 점수 기준 설정)
- [ ] DB 백업 스크립트 작동(스크립트 실행 후 파일 생성)
- [ ] SSL 자동 갱신 로그 확인: sudo journalctl -u caddy -f
자주 발생하는 문제 & 해결법(요약)
- SSL 발급 실패
- 원인: Cloudflare 프록시 활성화(오렌지구름) → 해결: DNS 프록시 비활성화(회색 구름) 또는 Caddy에 Cloudflare DNS API 토큰 설정(DNS-01)
- 포트 차단 확인: sudo ufw allow 80,443/tcp
- 한글 입력 문제 (code-server)
- ibus 재시작(ibus restart), 브라우저 재시작, Wayland/Xorg 전환 테스트
- Docker 볼륨 퍼미션 문제
- 워드프레스 볼륨 권한: docker exec -it wordpress bash → chown -R www-data:www-data /var/www/html
- host↔container UID mismatch: compose에서 user 설정 또는 초기화 스크립트로 chown
- WP REST API CORS 문제
- nginx/wp.conf에 Access-Control-Allow-Origin 헤더 추가(필요 시 Origin 제한)
- Deploy 실패 (CI → SSH)
- SSH 키 권한/경로 확인, deploy 계정에 docker 권한 추가(sudo usermod -aG docker deploy), git pull 권한 확인
검증 자동화 제안 (권장)
- GitHub Actions에 Lighthouse 검사 추가: PR 병합 기준으로 사용
- CI에서 이미지 빌드 후 staging에 자동 배포 → 통합 테스트(REST API, PWA 등록 스크립트)
- 백업: 매일 DB 덤프 + 외부 NAS/remote storage로 동기화(restic 추천)
우선순위 로드맵(권장 단계)
- VM에서 전체 스택 올려서 기능/권한/입력 확인 (2~4시간)
- WP-CLI 초기화·플러그인 자동화 스크립트 검증 (1~2시간)
- PWA 동작·Lighthouse 기준 설정 (1~3시간)
- GitHub Actions secrets 등록·배포 테스트 (1~2시간)
- DNS(CF) · Caddy TLS 문제 해결(필요시 DNS-01) (1~3시간)
- 백업·모니터링 도입(netdata, cron backup) (1~2시간)
- 문서화: 운영/롤백/점검 체크리스트 정리 (1~2시간)
추가로 바로 만들어줄 것들 (네가 고르면 내가 곧바로 생성함)
- A. 완전 동작하는 Next.js + PWA 예제 프로젝트(프론트 템플릿)
- B. 완전한 docker-compose (프로덕션 스타일: 시크릿 관리, 이미지 태깅, 볼륨 최적화)
- C. Caddy + Cloudflare DNS-01 설정 예제 (환경변수 템플릿 포함)
- D. GitHub Actions 확장: Lighthouse 자동 검사 + 이미지 스캔 + PR 차단 워크플로
- E. 전체 파일을 묶은 .zip(혹은 Git repo 초기화) + 배포용 README
어떤 것부터 만들어줄까? 🎯
네 우선순위 하나 말해줘 — 바로 파일로 만들어서 드릴게. ㅎㅎ
