1. 서론
VPN 설정까지 마쳤으니 이제 실제 개발 환경을 구축하려고 한다.
미니 PC에 도커 설치, 배포용 사용자 계정 생성, Github 리포지토리 생성, Github Action 설정 등의 행위를 했는데 그중 중요한 것만 기록하려고 한다.
2. Github Action 설정
Github Action은 push가 일어났을 때 자동으로 배포를 할 수 있도록 돕는 툴이다. SSH로 서버에 접속해서 미리 입력한 명령어를 수행한다고 생각하면 된다. 아래와 같이 deploy.yml 파일을 만들 수 있다.
# deploy.yml
name: Deploy to Mini PC
on:
push:
branches:
- main # main 브랜치에 푸시할 때 실행
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup SSH
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} # 비공개 SSH 키 설정
- name: Deploy to Mini PC
run: |
ssh -o StrictHostKeyChecking=no deployuser@ddns.iptime.org << 'EOF'
cd /home/deployuser/helper
# 최신 코드를 가져오기
git pull origin main
# Docker 이미지 빌드
docker build -t helper_image .
# 기존 컨테이너 중지 및 삭제
docker stop helper_container || true
docker rm helper_container || true
# 새 컨테이너 실행 (자동 재시작 설정 포함)
docker run -d --restart unless-stopped -p 8000:8000 --name helper_container helper_image
# 불필요한 dangling 이미지 삭제
docker image prune -f
EOF
1) Github Settings > Secrets and variables > Actions에 SSH_PRIVATE_KEY 를 미리 등록해 놓아야 한다. (당연히 하드코딩은 보안에 위험성이 크다...)
2) 서버에 배포용 사용자 계정을 생성했다면 deployuser 자리에 넣고, ddns.iptime.org는 iptime DDNS 설정 값이다. 동적 IP를 그대로 사용한다면 매번 yml 파일을 변경해줘야 할 것이다. (DDNS 등록 방법은 아래 포스팅 참고)
https://peaceful-dev.tistory.com/10
[홈서버 만들기 - 5] VPN 서버 구축
1. 서론나의 앱 서버를 외부에 노출시키게 되면 보안상의 문제로 원치 않는 정보를 탈취당할 수 있다. 따라서 VPN 서버만을 외부에 노출하고, 인가된 사용자만 내부 리소스에 접근할 수 있도록 설
peaceful-dev.tistory.com
3) 프로젝트를 배포하고 싶은 경로는 자유롭게 설정하되 배포용 사용자 계정 내에 디렉토리를 만드는 것이 좋다. 위 코드가 하는 일은 다음과 같다.
- 서버 PC에 SSH 접속하기
- 배포 폴더로 이동하기
- github 최신 코드 가져오기 (main 브랜치)
- Docker 이미지 빌드하기
- 기존 컨테이너 중지 및 삭제 후 새 컨테이너 실행하기
- 기존 Docker 이미지 삭제하기
4) 배포를 위해서 SSH 접속을 해야 한다. Github는 기본적으로 외부망에서 접근하기 때문에 미니 PC의 SSH 포트에 접속하려면 공유기에서 포트포워딩을 해줘야 한다. 역시 위 포스팅을 참고하여 진행하면 된다.
3. VPN에서 외부 네트워크 접속하기
사실 저번 글에 썼어야 하는데 VPN으로 접속하게 되면 내부망에 있는 것처럼 행동하게 된다. 즉, 내부에만 오픈한 나의 앱 서버에 바로 접근이 가능하다. 그런데 이상하게 외부망으로 다시 나가는 건 안 되는 문제가 있었다. 네이버, 구글 등으로 접속이 불가능한 것이다. 열심히 패킷 나가는 걸 분석해본 결과 방화벽이 VPN서버에서 나와서 공유기로 나가는 요청을 차단하고 있었다.
먼저 아래 명령어로 공유기와 VPN 서버의 네트워크 인터페이스 이름을 파악한다.
ip a
그리고 IP 포워딩을 허용해야 한다.
# IP 포워딩 활성화 확인
sysctl net.ipv4.ip_forward
# 만약 위 값이 0이면 아래 명령어 입력하여 활성화
sudo sysctl -w net.ipv4.ip_forward=1
# 또는 아래 파일에서 net.ipv4.ip_forward = 1 추가
sudo nano /etc/sysctl.conf
# 변경사항 적용
sudo sysctl -p
위에서 확인한 공유기 인터페이스를 A, VPN 서버의 인터페이스를 B라고 하면 아래처럼 A에서 B로의 트래픽을 허용할 수 있다.
# 트래픽 허용
sudo ufw allow in on A out on B
# 적용된 방화벽 상태 확인
sudo ufw status
결과는 다음과 같이 나와야 한다. 첫 두 줄은 SSH와 VPN 서버 포트를 열어 외부 트래픽을 받겠다는 것이고, 마지막 줄이 VPN 서버에서 공유기로 나가는 트래픽을 허용한다는 뜻이다.
위처럼 하면 VPN을 연결해 내부망 앱 서버를 사용하면서도 외부망에도 접속하여 일반적인 인터넷 사용이 가능하다ㅎㅎ
4. 배포 확인
중간에 다른 얘기를 하긴 했지만 이 포스팅의 원래 목적은 CI/CD 구축이었다.
위처럼 Github Action도 잘 작동했고, 실제 Docker 컨테이너가 띄워진 것도 확인!
(docker 그룹을 배포용 계정에 줘버렸기 때문에 다른 사용자는 sudo를 통해서만 확인 가능하다.)
서버 재부팅 후 자동으로 docker 컨테이너가 실행되는 것까지 확인했으니 잘 작동한다고 볼 수 있다.
'홈서버 만들기' 카테고리의 다른 글
[홈서버 만들기 - 5] VPN 서버 구축 (0) | 2024.09.28 |
---|---|
[홈서버 만들기 - 4] Linux 설치 후 원격 접속하기 (1) | 2024.09.22 |
GMKtec N100 미니 PC 언박싱 (0) | 2024.09.21 |
[홈서버 만들기 - 3] 클라이언트 앱 만들기 (5) | 2024.09.15 |
[홈서버 만들기 - 2] 아키텍처 설계 (0) | 2024.09.15 |