기존에 사용하던 AWS 프리티어가 끝났습니다. 소마할 때는 서버비를 줘서 좋았는데, 사이드를 하면서 사비로 클라우드 비용을 충당하기는 부담이 됐습니다. 그래서 결국 마지못해 기쁜 마음으로 저만의 서버를 구축하기로 했습니다. 캡디 자재비로 라즈베리파이 3개를 대기시켜놨기 때문에 걱정은 하나도 되지 않았습니다 ! 라즈베리파이를 이용해서 개인 서버를 만들고 싶거나, 이것저것 놀아보고 싶은 사람들. 그리고 혹시 미래의 나를 위해 과정을 기록해두었습니다.
그럼 바로 나만의 play ground 를 만들어봅시다 🙌
목표
원래는 라베파가 세개 있어서 공부 겸 쿠버네티스를 적용해보려고 했었는데 서버가 없어서 클라이언트 개발자들의 작업이 멈춘 상태라 일단 개발 테스트용 컨테이너 먼저 올리기로 했습니다. 요약하자면 라베파에 API 서버와 DB 를 도커 컨테이너로 올리고, Git develop 브랜치 merge 시에 배포 자동화가 되는 것까지 세팅하는 것이 목표입니다. DB 를 다른 라베파로 분리할 수도 있겠지만 어차피 노드가 하나라 다중화가 되지 않기 때문에 라베파 몇개를 이용한 구조에서 SPOF 는 피하기 어려울 것 같습니다 .. 우선 개발환경을 세팅하고 장애 복구나 다중화는 출시할 때 클라우드로 다시 마이그레이션하면서 생각해봅시다 ! 절대 미루는 거 아님
Ubuntu 이미지 파일 SD 카드 굽기
SD 카드 포맷
맥 기준 [디스크 유틸리티] 에서 SD 카드를 선택하고 [지우기] 해주면 됩니다. (포맷은 FAT32 로 !)
Ubuntu 부팅 이미지 설치
Install Ubuntu on a Raspberry Pi | Ubuntu
부팅 이미지를 SD 에 구워주겠습니다. 저는 Ubuntu Server 22.04.2 LTS 로 설치했습니다.
부팅 이미지 굽기
이미지 굽는 건 아래 프로그램을 이용했습니다.
balenaEtcher - Flash OS images to SD cards & USB drives
직관적인 UI 따라 이미지 굽기를 진행하시면 됩니다.
- balenaEtcher 앱 실행
- Flash from file 에서 다운받은 Ubuntu Server 이미지 선택
- Select target 에서 설치할 SD card 선택
- Flash 클릭
라즈베리파이 세팅
부팅
성공적으로 SD Card 에 이미지가 구워졌다면 이제 라즈베리파이에 SD Card 를 꽂고 부팅해봅시다. Ubuntu Server 로 설치했기 때문에 터미널에 글자들이 나오는데 처음 로그인 화면이 뜨고 5분 정도 기다린 후, 다시 로그인 화면이 떴을 때 로그인 정보를 입력해야 합니다. 초기 id 와 비밀번호는 ubuntu / ubuntu 입니다.
네트워크 설정
서버로 사용하기 위해서 포트포워딩과 고정 ip 설정이 필요합니다. 아래 경로로 들어가서 파일을 확인해봅시다. 파일 이름은 조금씩 다를 수 있습니다.
cd /etc/netplan
sudo vi 50-cloud-init.yaml
아마 파일을 보면 아래와 같은 내용이 있습니다.
network:
ethernets:
eth0:
dhcp4: true
optional: true
version: 2
이 파일을 수정해줍시다. 아 수정하기 전에 항상 백업하는 습관을 들입시다 !
sudo cp 50-cloud-init.yaml 50-cloud-init.yaml.backup
YAML 파일이라 들여쓰기를 주의해야 합니다. 랜선 세팅은 ethernets
에, 무선 세팅은 wifis
에 작성하면 됩니다. 저는 이더넷 랜선은 고정 IP, 와이파이는 DHCP 설정으로 사용하였습니다. 우선 고정 ip 를 설정하려면 아래와 같이 파일을 수정해주면 됩니다.
network:
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.219.151/24
routes:
- to: 0.0.0.0/0
via: 192.168.219.1
nameservers:
addresses:
- 61.41.153.2
- 1.214.68.2
optional: true
version: 2
wifis:
wlan0:
access-points:
"[wifi 이름]":
password: "[wifi 비밀번호]"
dhcp4: true
optional: true
addresses
부분에 사용하고 싶은 고정 ip를, nameservers
의 addresses
부분에 dns 정보를 적어줍니다. 게이트웨이 정보는 routes
밑에 적어줍시다. (Ubuntu22 이전 버전에는 gateway4
필드.) 이제 해당 파일을 다시 적용해줍니다. wifis 에는 현재 접속할 와이파이의 이름과 비밀번호가 필요합니다. 위에서 [wifi 이름] 과 [wifi 비밀번호] 부분을 채워주면 됩니다. 파일을 저장 후, netplan generate
명령어로 들여쓰기가 잘못되거나 하는 문법 오류를 확인할 수 있습니다.
sudo netplan generate
sudo netplan apply
연결이 잘 되었는지 네트워크를 확인해봅시다. ifconfig
가 안 먹힌다면 apt install net-tools
!
SSH 연결
이제 라즈베리파이에 직접 모니터 키보드 붙여서 그만 작업하자 ..! 일단 라즈베리파이에 ssh 세팅을 합시다.
sudo apt install openssh-server
sudo apt install ssh
sudo ssh restart
openssh-server 는 아마 우분투 내에 기본적으로 깔려있을 겁니다. (없으면 설치) ssh 클라이언트도 깔고 service 를 재시작해주고, ssh 에서 22번 포트를 사용하니 방화벽도 열어줍니다.
sudo ufw enable
sudo ufw allow 22
이제 같은 로컬 네트워크에 있는 노트북에서 ssh 로 접속이 가능합니다. 접속할 때마다 시스템 비밀번호를 입력해야 하는데, ssh key 를 이용해서 이것도 편하게 로그인할 수 있습니다. 만들어둔 키가 없다면 ssh-keygen
명령어로 키를 하나 만들어줍시다. 키를 만들고 나서 Public key 를 서버로 넘겨주기만 하면 끝 !
ssh-copy-id [username]@[remote_host]
이제 모니터랑 키보드 꽂았다 뺐다 안 해도 된답니다.. 🫠
Timezone 설정
서버의 시간대를 한국시간대로 변경하겠습니다. 이 부분은 필수는 아니고, UTC 로 사용해야 하는 이유가 있다면 건너뛰어도 됩니다. timedatectl
을 입력해서 Local time 이 KST 가 아니라면 아래 명령어로 바꿔줍니다.
timedatectl set-timezone Asia/Seoul
공유기 포트포워딩
이제 포트포워딩을 해야 하는데, 먼저 공유기 설정을 해야 합니다. 공유기 벤더와 모델에 따라 좀 다를 수 있는데 공유기 접속 주소는 .. 검색하면 바로 나옵니다. 저는 LG U+ 공유기였고 접속 후 바로 API 로 사용할 포트와 SSH 접속용 포트를 포워딩해줬습니다.
Docker & docker-compose 설치
이전에 클라우드에서 어플리케이션을 docker compose 를 이용해서 배포했었습니다. docker 를 이용하면 세팅도 편리하고 환경도 격리하고 등등 장점이 많습니다. 아무튼 바로 설치해보겠습니다. 일일이 설치하는 건 귀찮으니 쉘 스크립트로 만들어뒀습니다.
https://github.com/NaJuDoRyeong/mineme-server/blob/main/init.sh
그대로 스크립트 파일을 만들고 실행만 하면 됩니다. (chmod 로 실행 권한 주기)
환경 세팅 완료 ! 이제 라베파로 서비스를 돌려봅시다 🙋♂️