#Day42 카카오 클라우드

D0-$ANG ₩0N·2026년 1월 4일
post-thumbnail


생성한 인스턴스들

ssh config 등록

buntu@ip-10-250-4-240:~$ ls -al powermvp.pem
-rw-rw-r-- 1 ubuntu ubuntu 1678 Nov 13 20:25 powermvp.pem
ubuntu@ip-10-250-4-240:~$ chmod 400 powermvp.pem
ubuntu@ip-10-250-4-240:~$ ls -al powermvp.pem
-r-------- 1 ubuntu ubuntu 1678 Nov 13 20:25 powermvp.pem

kakao_keypair.pem 키이름 변경해서 키등록해주고

vi ~/.ssh/config 

Host nginx2a
HostName 172.30.32.80
User ubuntu
IdentityFile ~/.ssh/kakao_keypair.pem
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host nginx2b
HostName 172.30.48.80
User ubuntu
IdentityFile ~/.ssh/kakao_keypair.pem
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host fastapia
HostName 172.30.64.80
User ubuntu
IdentityFile ~/.ssh/kakao_keypair.pem
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host fastapib
HostName 172.30.80.80
User ubuntu
IdentityFile ~/.ssh/kakao_keypair.pem
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

단축명령어 지정

0.수동배포 완료


1.Front 자동배포

git 초기화

git init

github 저장소 만들기

  1. gitHub 접속
  2. New repository
  3. 이름 프로젝트이름아무거나
  4. README / .gitignore 체크x
  5. Create repository 생성

프로젝트와 github연결 (터미널에서)

git remote add origin https://github.com/aksdkdn/react.git

확인

git remote -v

상태 확인

git status

추가

git add .

커밋

git commit -m "initial commit"

github에 올리기

git branch -M main
git push -u origin main

yaml 파일만들기

일단 vs코드가서 .github/workflows 폴더만들기

name: React Deploy via Bastion

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: npm

      - name: Install dependencies
        run: npm ci

      - name: React 파일 빌드
        run: npm run build

      - name: ssh 키 접속
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.BASTION_SSH_KEY }}" > ~/.ssh/deploy.key
          chmod 600 ~/.ssh/deploy.key

          ssh-keyscan -T 5 -H ${{ secrets.BASTION_HOST }} >> ~/.ssh/known_hosts || true
          
      - name: bastion에 파일 업로드
        run: |
          ssh -i ~/.ssh/deploy.key \
            ${{ secrets.BASTION_USER }}@${{ secrets.BASTION_HOST }} \
            "mkdir -p ~/dist && rm -rf ~/dist/*"

          rsync -avz \
            -e "ssh -i ~/.ssh/deploy.key" \
            dist/ \
            ${{ secrets.BASTION_USER }}@${{ secrets.BASTION_HOST }}:~/dist/

      - name: bastion에서 nginx로 파일 이동 후 재시작
        run: |
          ssh -i ~/.ssh/deploy.key \
            ${{ secrets.BASTION_USER }}@${{ secrets.BASTION_HOST }} "
              rsync -avz ~/dist/ nginx2b:/home/ubuntu/dist/ &&
              ssh nginx2b '
                sudo rm -rf /usr/share/nginx/html/* &&
                sudo cp -r /home/ubuntu/dist/* /usr/share/nginx/html/ &&
                sudo systemctl reload nginx
              '
            "

vi /etc/nginx/conf.d/default.conf
들어가서

root /usr/share/nginx/html; 경로확인해서 맨밑에

ssh nginx2b '
sudo rm -rf /usr/share/nginx/html/ &&
sudo cp -r /home/ubuntu/dist/
/usr/share/nginx/html/ &&
sudo systemctl reload nginx
'
"
경로를 잘 설정해준다.

  • nginx2b 쓰고싶으면 jobs: 부터 코드 복사하면된다

Secrets and variables 설정


key -> terminus 에서 키 파일 복사
host -> 퍼블릭 IP
user -> ubuntu


등록후 액션 누르고 들어가서 초록불 확인



코드 수정후에
git status
git add src/App.jsx
git commit -m "test: check auto deploy"

바꾸기 완료

2.FastApi

yamlfile

name: Deploy FastAPI to Private Server

on:
  push:
    branches: [ main ]  # main 브랜치에 푸시하면 발동

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy via Bastion
        uses: appleboy/ssh-action@v1.0.0
        with:
          # 1. 징검다리 (Bastion) 설정
          proxy_host: ${{ secrets.BASTION_HOST }}
          proxy_username: ${{ secrets.USERNAME }}
          proxy_key: ${{ secrets.KAKAO_KEY }}
          
          # 2. 목적지 (Private Server) 설정
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KAKAO_KEY }}
          
          # 3. 서버에서 실행할 명령어들 (수동으로 하던 것들)
          script: |
            # 폴더 이동
            cd /home/ubuntu/kakaofast
            
            # 1) 최신 코드 받기
            git pull origin main
            
            # 2) 가상환경 활성화 및 패키지 설치
            source venv/bin/activate
            pip install -r requirements.txt
            
            # 3) 서버 재시작 (서비스 등록해뒀으므로 한 줄이면 끝!)
            sudo systemctl restart fastapi
            


sudo nano /etc/systemd/system/fastapi.service

-----작성 후 ------
sudo systemctl daemon-reload
sudo systemctl start fastapi
sudo systemctl enable fastapi

.gitignore

# 1. 보안 파일 (절대 금지)
.env
.env.*
secrets.json
*.pem
*.key

# 2. 파이썬/가상환경
__pycache__/
*.py[cod]
venv/
.venv/
env/

# 3. 기타
.DS_Store
.vscode/
.idea/

Secrets and variables 설정


Bastion_host -->퍼블릭 아이피
key -> terminus 에서 키 파일 복사
host -> fastapi2b 아이피
username -> ubuntu


등록후 액션 누르고 들어가서 초록불 확인

바꾸기 완료

트러블 슈팅

FastApi

git 에 workflow가 안올라감

1. 문제 상황 요약

GitHub Actions용 workflow 파일
.github/workflows/deploy-backend.yml 을 push하려고 할 때
아래 에러가 계속 발생했다.

refusing to allow a Personal Access Token to create or update workflow
without workflow scope

핵심 증상

git push 는 실패

workflow 파일이 포함된 커밋만 차단됨

일반 코드 파일은 push 가능

2. 원인 분석 (중요)

2-1. HTTPS push의 동작 방식

HTTPS로 GitHub에 push하면:

비밀번호 대신 Personal Access Token (PAT) 을 사용

이 토큰에는 권한(scope)이 존재함

2-2. GitHub의 보안 정책

.github/workflows/*.yml 파일은 CI/CD 실행 권한 그 자체이기 때문에
GitHub에서 강하게 보호한다.

방식 workflow 수정 가능 여부
HTTPS + PAT (workflow 권한 ❌) ❌ 차단
HTTPS + PAT (workflow 권한 ⭕) ⭕ 허용
SSH 인증 ⭕ 기본 허용

즉,

HTTPS + workflow 권한 없는 토큰 → 무조건 차단

3. 해결 전략

선택지 1 (비추천)

PAT 재발급

workflow scope 추가

토큰 관리 복잡, 만료 이슈 있음

선택지 2 (정답)

SSH 인증 방식으로 전환

실무에서도 CI/CD는 SSH가 표준

→ SSH로 전환 결정

  1. SSH 방식으로 해결한 전체 순서 (정답 루트)
    4-1. SSH 키 생성
    ssh-keygen -t rsa -b 4096 -C "apple@macbook"

모든 질문에서 Enter

생성 결과:

~/.ssh/id_rsa

~/.ssh/id_rsa.pub

확인:

ls ~/.ssh

4-2. GitHub에 SSH 공개키 등록

공개키 출력:

cat ~/.ssh/id_rsa.pub

GitHub에서:

Settings → SSH and GPG keys

New SSH key

Key type: Authentication Key

위에서 출력한 ssh-rsa로 시작하는 한 줄 전체 붙여넣기

4-3. ssh-agent에 키 등록 (macOS 필수)
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

4-4. GitHub SSH 연결 테스트
ssh -T git@github.com

정상 출력:

Hi aksdkdn! You've successfully authenticated, but GitHub does not provide shell access.

4-5. Git remote를 SSH로 변경
git remote set-url origin git@github.com:aksdkdn/back.git

확인:

git remote -v

정상:

origin git@github.com:aksdkdn/back.git (fetch)
origin git@github.com:aksdkdn/back.git (push)

4-6. workflow 파일 커밋 & push
git add .github
git commit -m "ci: add backend auto deploy workflow"
git push origin main

성공 로그:

To github.com:aksdkdn/back.git

→ workflow 파일 업로드 성공

5. 왜 SSH는 되고 HTTPS는 안 됐는가 (요약)

HTTPS는 토큰 권한 기반

workflow 수정에는 workflow scope 필요

SSH는 등록된 키 기반 신뢰 인증

GitHub가 SSH 인증을 더 강하게 신뢰함

즉,

CI/CD, 배포, workflow 수정은 SSH가 정답

db가 안올라가는 문제


api 앞에 /이거 빼줘야함

실행결과

       
profile
Change Up

0개의 댓글