[홈서버구축하기 7] 공유 스토리지를 만들어보자(feat. 시놀로지)
홈서버 구축하기 시리즈
- [홈서버구축하기 1] 홈서버를 구축 한 이유
- [홈서버구축하기 2] 제품 선택 및 설치
- [홈서버구축하기 3] 내부망 고정아이피 설정 및 포트포워딩 그리고 DDNS
- [홈서버구축하기 4] 클라우드플레어를 활용하여 내 서버 아이피 숨기기(feat. HTTPS)
- [홈서버구축하기 5] 클라우드를 사용해 게이트웨이 구축(feat.vpn)
- [홈서버구축하기 6] Docker 및 Docker Swarm 설정하기
- [홈서버구축하기 7] 공유 스토리지를 만들어보자(feat. 시놀로지)
- [홈서버구축하기 8] 완성된 내 홈서버 네트워크 구성도 및 홈서버 배치 모습 그리고 총 비용
앞선 게시글에서 여러개의 서버를 운영할 때 공유스토리지가 필요 한 이유에 대해 설명을 하고 마무리되었다.
필자는 이를 깨달았을 때에는 이미 하드웨어서버가 두대였고, Vultr를 통한 게이트웨이 서버까지 총 세대의 서버를 운영하고 있었다.
그래서 도커스웜에는 각각이 매니저 노드로 설정되어있었고, 도커 인스턴스는 특정 서버에만 실행되도록 설정을 해 두었었다.
그렇지 않으면, 필요한 volume이 mount될 수 없었기 때문에 도커 인스턴스가 실행조차 되지 않았다.
이때 NFS를 구축하는 방법은 두가지가 있었다.
- 내가 보유하고있는 두개 하드웨어 서버중 한대에 NFS를 구축하여 스토리지를 공유한다.
- NFS용 서버 한대를 더 구비한다.
이 판단은 개인 취향 그리고 지갑사정에 따라 결정하면 될 것 같다.
나 같은 경우에는 별도의 NFS용 서버를 구매하기로 판단했다.
그 이유는 아래와 같다.
- 두대의 하드웨어서버의 목적을 이미 분리 한 상태였다. (프로젝트 구동용 서버/DB 구동용 서버)
- 꽤나 사양이 괜찮은 하드웨어서버를 NFS서버로 사용해 리소스를 낭비하기 너무 아까웠다.
- 서버와는 다른 별개의 희망사항으로 개인 백업 서버를 갖고싶었다.
- 하드웨어 서버에 꽂혀있는 대용량 NVME 스토리지를 고대로 옮겨서 쓴다면, 새로운 NFS용 서버에 스토리지에 대한 추가적인 비용 지출 없이 운영할 수 있었다.
이왕 구축할거 제대로 구축하고 싶었다.
이러한 이유로 나는 Nas를 구축하기로 마음먹게 되었고, Synology 423+제품을 추가로 구매하게 되었다.
나도 알고있다. 작게 시작했던 홈서버 프로젝트가 점점 커지고있다는 것을..
하지만, 서버를 한대씩 구축해나가면서 겪는 경험 하나하나가 나를 성장시키고있는것은 너무나도 명확했고, 홈서버를 구축해보지 않았다면 겪어보지 못했을 경험들과 문제 해결은 나로 하여금 가슴 깊숙히에 있던 열정을 다시 꺼내서 활활 불태워줬다.라고 합리화한다. 하지만 실제로도 맞다.
NFS 서버 구축하기
Linux에서 구축하기
보유하고있는 서버를 활용한다면, Ubuntu에서 직접 NFS를 구축할 수 있다.
요런 글을 읽으면구축하는데 문제 없지 않을까 싶다.
Synology에서 구축하기
나는 Synology를 구매했기 때문에 GUI로 손쉽게 설정할 수 있었다.
그리고 Synology는 Tailscale을 공식적으로 지원하기 때문에 VPN에도 전혀 문제가 없다.
다만, Tailscale + NFS를 사용하기 위해서는 이 작업이 1회 필요하다. (왜냐하면 기본적으로 아웃바운드 허용이 되지 않기 때문이다.)
- 제어판>파일 서비스>NFS 에 NFS 서비스 활성화를 체크해준다. 그리고 최대 NFS 프로토콜은
NFSv4.1
로 선택 해 주었다. - 제어판>공유폴더에 nfs를 사용하기 위한 공유 폴더를 생성해준다.
- 해당 공유폴더 우클릭>편집>NFS 권한 탭으로 들어가준다.
- "생성"을 눌러주고, 아래 사진과 같이 설정해주면 된다.
호스트이름 또는 IP
의 경우 Tailscale IP 목록을 넣어주면 된다. 필자의 경우 수동으로 Tailscale 아이피를 특정 CIDR로 몰아 설정해주어 1개의 NFS 설정으로 관리할 수 있었다.시놀로지 정말 편하고 좋다.
NFS 연결하기
프로그램 설치하기
sudo apt-get update
sudo apt-get install -y nfs-common
NFS mount하기
마운트 할 폴더 생성
경로와 폴더이름은 원하는 대로 생성하면 된다. 나는 /mnt 폴더에 nas라는 폴더명을 생성하여 사용했다. (mount하기 이전에 먼저 폴더를 생성해줘야한다.)
cd /mnt
sudo mkdir nas
마운트 설정
만약에 아래 커맨드를 시도해도 연결이 되지 않는다면, 해당 아이피가 화이트리스트 되지 않았을 수도 있다.
sudo mount ${NFS서버 ip}:${마운트 경로} /mnt/nas
마운트 경로는 Synology의 경우 사진에 나와있듯이 나같은 경우에는 /volume4/linux_mount
를 입력해주면 된다.
서버 재부팅시에도 자동 마운트 시켜주기
예상 외로 이친구가 조금 까다로웠다.
/etc/fstab
해당 파일만 수정하여 적용시켜주려고 했는데, 두가지 문제가 있었다.
- Tailscale VPN 사용하는 나는 Tailscale 네트워크에 연결이 되기 이전에 NFS mount가 진행될 경우 mount에 실패했다.
- NFS mount가 되기 이전에 docker service들이 실행 될 경우 volume에러를 맞이했다.
따라서 나는 프로그램 실행 순서를 정해주기로 했다.
Tailscale 실행 > NFS mount > Docker
NFS mount 하는 데몬 생성 및 Tailscale 이후에 작동하도록 설정
service 파일 생성
sudo vi /etc/systemd/system/mountnas.service
아래 내용 입력
[Unit]
Description=Mount NAS Volume
After=network.target tailscaled.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mount ${NFS서버 ip}:${마운트 경로} /mnt/nas
ExecStop=/bin/umount /mnt/nas
[Install]
WantedBy=multi-user.target
Description
: 서비스에 대한 간단한 설명입니다.After=network.target
: 네트워크가 활성화된 후에 이 서비스가 실행되도록 한다.Type=oneshot
: 한 번만 실행되고 종료되는 서비스 타입을 나타낸다.RemainAfterExit=yes
: 서비스가 시작 또는 종료된 후에도 상태를 유지한다.ExecStart
: 서비스 시작 시 실행할 명령이다.ExecStop
: 서비스 중지 시 실행할 명령이다.WantedBy=multi-user.target
: 기본 실행 레벨에서 이 서비스를 시작하려는 의도이다.
After에 tailscaled.service 설정을 함으로서 tailscale이 실행 된 이후에 작동하도록 설정한다.
저장 후 적용
sudo systemctl daemon-reload
생성한 데몬이 원하는대로 작동하는지 테스트
sudo systemctl start mountnas
재시동시 자동시작하도록 적용
sudo systemctl enable mountnas
Docker는 Mount 이후에 작동하도록 설정
Docker system 설정파일 위치로 진입
sudo vi /lib/systemd/system/docker.service
[Unit]>After에 mountnas.service
를 추가해준다.
Before
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket
After
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target mountnas.service
Wants=network-online.target containerd.service
Requires=docker.socket
저장 후 적용
sudo systemctl daemon-reload
이로서 서버를 재시작 해주면 Tailscale 연결, NFS mount, Docker 실행들이 정상적으로 작동하게 됐다.