

생성한 인스턴스들
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
단축명령어 지정


git init
프로젝트이름아무거나
git remote add origin https://github.com/aksdkdn/react.git
git remote -v
git status
git add .
git commit -m "initial commit"
git branch -M main
git push -u origin main
일단 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
'
"
경로를 잘 설정해준다.

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

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

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

바꾸기 완료
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
# 1. 보안 파일 (절대 금지)
.env
.env.*
secrets.json
*.pem
*.key
# 2. 파이썬/가상환경
__pycache__/
*.py[cod]
venv/
.venv/
env/
# 3. 기타
.DS_Store
.vscode/
.idea/

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

등록후 액션 누르고 들어가서 초록불 확인
바꾸기 완료
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 가능
HTTPS로 GitHub에 push하면:
비밀번호 대신 Personal Access Token (PAT) 을 사용
이 토큰에는 권한(scope)이 존재함
.github/workflows/*.yml 파일은 CI/CD 실행 권한 그 자체이기 때문에
GitHub에서 강하게 보호한다.
방식 workflow 수정 가능 여부
HTTPS + PAT (workflow 권한 ❌) ❌ 차단
HTTPS + PAT (workflow 권한 ⭕) ⭕ 허용
SSH 인증 ⭕ 기본 허용
즉,
HTTPS + workflow 권한 없는 토큰 → 무조건 차단
선택지 1 (비추천)
PAT 재발급
workflow scope 추가
토큰 관리 복잡, 만료 이슈 있음
선택지 2 (정답)
SSH 인증 방식으로 전환
실무에서도 CI/CD는 SSH가 표준
→ SSH로 전환 결정
모든 질문에서 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 파일 업로드 성공
HTTPS는 토큰 권한 기반
workflow 수정에는 workflow scope 필요
SSH는 등록된 키 기반 신뢰 인증
GitHub가 SSH 인증을 더 강하게 신뢰함
즉,
CI/CD, 배포, workflow 수정은 SSH가 정답

api 앞에 /이거 빼줘야함

