실습 로그 / 여울목 · 계곡 급류 사전경보 서비스

여울목 1단계 · 깃허브 세팅

서버 코드를 올릴 GitHub 저장소를 팀 조직 아래 만들고, 홈랩 서버 VM에서 바로 받고 올릴 수 있게 연결한다.

진행 과정은 실습 내용을 AI와 함께 정리했고, 배운 점은 그걸 보고 제가 이해한 대로 직접 썼습니다. 배운 점 바로가기 ↓

GitHubProxmoxSSH배포 키

목표

서버 코드를 올릴 GitHub 저장소를 팀 조직 아래 만들고, 홈랩 서버 VM에서 바로 받고 올릴 수 있게 연결한다.

A. GitHub 조직과 서버 저장소

  • 조직 yeoulmok 생성 (Free, 개인 계정 소속), 팀원 초대 후 Owner로 변경
    • 조직(Organization): 여러 사람이 저장소를 같이 관리하는 GitHub 팀 계정
    • Owner: 조직의 모든 저장소와 설정을 관리할 수 있는 권한
  • 조직 안에 서버 저장소 yeoulmok/server 생성 (Public, README, .gitignore Python)
    • Public: 공고 의무가 GitHub 공개라서. API 키는 저장소 밖에 두므로 공개해도 안전
  • 앱·웹 저장소는 팀원이 조직 안에 따로 만듦. 이슈·PR 규칙은 저장소마다 각자 정함
  • 처음 개인 계정에 만든 저장소는 삭제하고, 인수인계 문서와 .env.example만 새 저장소로 옮김

B. 서버 VM과 저장소 연결

  • 홈랩 미니PC(Proxmox)에 여울목 전용 VM 생성
항목 값
이름 / 번호 yeoulmok / VM 104
사양 2코어 / 4GB / 디스크 28GB (LVM 확장)
OS Ubuntu 26.04
접속 Tailscale, 기기 이름으로 SSH 접속 (IP 말고 이름으로)
SSH 키 맥·윈도우 데스크톱 등록 완료
설치 Docker
  • LVM 확장: 디스크를 늘린 뒤 리눅스 쪽 파티션도 같이 늘려야 실제로 쓸 수 있음
  • Tailscale: 집 밖에서도 내 기기끼리 사설망처럼 접속하게 해주는 VPN. 기기 이름으로 접속 가능
  • 도메인 계획 (아직 연결 안 함): yeoulmok.ihaewon.com, Cloudflare 터널 (커리어 내비와 같은 방식)
    • 웹과 API는 같은 주소에 두고 API는 /api/...로 나눔. api.yeoulmok.ihaewon.com 같은 두 단계 서브도메인은 Cloudflare 무료 인증서가 안 돼서
  • 작업 시작할 때: VM에 SSH 접속 → cd ~/yeoulmok && git pull
  • VM yeoulmok에서 배포 키 생성 → yeoulmok/server Settings → Deploy keys에 등록 (Allow write access 체크)
    • 배포 키(Deploy key): 저장소 하나에만 접근하는 SSH 키. 서버가 털려도 다른 저장소는 안전
    • Allow write access: 체크해야 VM에서 push 가능. 안 하면 clone·pull만 됨
  • ~/.ssh/config에 IdentityFile ~/.ssh/yeoulmok_server 지정 → GitHub 접속 때 이 키를 씀
  • VM에서 git clone [email protected]:yeoulmok/server.git ~/yeoulmok → ssh -T [email protected]으로 Hi yeoulmok/server! 확인
  • API 키는 VM ~/secrets/yeoulmok.env에만 보관 (chmod 600). 저장소에는 키 이름만 적은 .env.example
    • .env.example: 필요한 키 이름만 적어둔 빈 양식 파일
    • 변수: HRFCO_KEY(한강홍수통제소), KMA_KEY(기상청). 키 값만 넣음 (트러블슈팅 3번 참고)
    • 불러오기: set -a; source ~/secrets/yeoulmok.env; set +a
  • Claude GitHub 앱을 조직 yeoulmok에 설치 → Claude가 서버 저장소에 직접 push 가능
  • 배포 키 등록 중 두 번 막힘 (트러블슈팅 1, 2번 참고)

트러블슈팅

1. 조직 저장소에 배포 키를 추가할 수 없음

  • 증상 : yeoulmok/server Settings → Deploy keys에 "Disabled by yeoulmok"이라고 뜨고 추가 버튼이 없음
  • 확인한 것 : 저장소 설정이 아니라 조직 정책으로 막혀 있다는 표시
  • 원인 : 새로 만든 조직은 배포 키가 기본으로 꺼져 있음
  • 해결 : 조직 설정에서 배포 키를 허용으로 바꿈
  • 재발 방지 : 조직을 새로 만들면 배포 키 허용 여부부터 확인한다

2. "Key is already in use"로 배포 키 등록 실패

  • 증상 : VM에 있던 기존 배포 키를 새 저장소에 등록하자 "Key is already in use"
  • 확인한 것 : 같은 키가 개인 저장소에 등록돼 있었고, 지운 줄 알았던 그 저장소가 실제로는 남아 있었음 (git ls-remote로 확인)
  • 원인 : 배포 키는 저장소 하나에만 붙을 수 있음. 기존 저장소가 살아 있어서 키가 거기 묶여 있었음
  • 해결 : VM에서 새 키(yeoulmok_server)를 만들어 등록하고 ~/.ssh/config의 IdentityFile을 바꿈
  • 재발 방지 : 저장소를 옮기거나 새로 만들면 배포 키도 새로 만든다 (저장소 1개당 키 1개)
    • 배포 키는 저장소마다 다른 키여야 함. 같은 키를 두 저장소에 동시에 등록할 수 없음

3. API 키를 불러왔는데 값이 비어 있음

  • 증상 : ~/secrets/yeoulmok.env를 불러온 뒤 API를 호출했는데 키 값이 비어서 요청 실패
  • 확인한 것 : env 파일에 키 값이 아니라 발급 페이지의 요청 URL을 통째로 붙여넣었음
  • 원인 : URL 안의 &를 셸이 '뒤에서 실행' 기호로 읽어서 변수 값이 끊김
  • 해결 : env 파일에 키 값만 넣음 (HRFCO_KEY=값)
  • 재발 방지 : env 파일에는 값만 넣고, 특수문자가 있으면 따옴표로 감싼다

배운 점

직접 작성

A. 깃허브 조직과 서버 저장소

  • 목적 : 팀원이랑 같이 쓰는 저장소를 한 사람 계정이 아닌 팀 이름 아래 둠
  • 설명
    • 조직 만든 이유
      • 개인 계정으로 레포를 만들면 그 레포는 내 거가 되고 팀원은 설정도 바꾸지 못 함
      • yeoulmok 아래 주인 두 명으로 설정
        • owner 두 명 (팀원, 나)
          • 팀원도 앱, 웹 저장소를 조직안에 직접 만들어서 권한 같게 함
    • 조직 (Organization) : 여러 사람이 저장소를 같이 소유하는 깃헙 팀 계정
    • Owner : 조직의 모든 저장소와 설정 바꿀 수 있는 최고 권한
    • .env.example : 필요한 키 이름만 적어둔 빈 양식
      • 실제 값은 서버에만 둠
      • API 키는 VM의 ~/secrets/yeoulmok.env에만 두고 저장소에는 키 이름만 적힌 .env.example만 올림
      • 깃에 이게 필요한 이유 : 실행용이 아니라 안내용.
        • 나중에 내가 새 서버 만들거나 팀원이 서버 돌려볼 때 어떤 키인지 알기 위해서

B. 서버 VM과 저장소 연결

ssh-keygen -t ed25519 -f ~/.ssh/yeoulmok_server        # 이 저장소 전용 키 한 쌍을 새로 만듦
cat ~/.ssh/yeoulmok_server.pub                          # 공개키 출력 → GitHub Deploy keys에 붙여넣음
git clone [email protected]:yeoulmok/server.git ~/yeoulmok # 서버 저장소를 VM으로 복사
ssh -T [email protected]                                   # 연결 확인 → "Hi yeoulmok/server!"면 성공
set -a; source ~/secrets/yeoulmok.env; set +a           # API 키 파일을 환경변수로 불러옴
  • 목적 : 홈랩 VM이 서버 저장소에 코드를 받고 (pull) 올릴 수 있게 (push) 그리고 API키는 저장소 밖에 두기 위함
  • 설명
    • 디스크 확장 : LVM으로 남은 공간까지 늘려서 할당한 저장공간 전부 활용
    • 배포키 사용 이유 : 내 개인 SSH키를 VM에 넣으면 VM이 털렸을 때 내 모든 저장소가 위험.
    • ~/.ssh/config에 키 저장한 이유 : 키가 여러 개면 SSH가 아무거나 내밀기 때문에 적어두고 헷갈리지 않게 해둠
    • API 키 저장소 밖에 둔 이유 : 저장소가 공개라 키는 VM 안에만 두고 chmod 600으로 나만 읽게 해둠
    • 도메인을 /api로 나눈 이유 : api.yeoulmok.ihaewon.com 처럼 두 번이 들어가면 Cloudflare 무료 인증서가 안 되기 때문에 yeoulmok.ihaewon.com 하나에 웹을 두고 API는 /api/… 경로로 나눔
  • 단어
    • ssh-keygen : SSH 키 한 쌍 (공개키, 비밀키)을 만드는 명령어
    • 배포 키 (Deploy Key) : 저장소 하나에만 접근하는 SSH키
    • LVM : 디스크 공간을 나중에 늘리거나 줄일 수 있게 묶어 관리하는 방식
    • set -a / set +a : 그 사이에 불러온 변수를 전부 환경변수로 등록 , 끄기