홈서버 구축기 - 서버 구입 및 초기 설정

언젠가 만들어봐야지.. 하고 마음 먹었던 홈서버. 드디어 구축을 했습니다. Host PC 구매부터 Proxmox 를 통한 가상화까지의 과정을 담았습니다. (티스토리에서 나눠져있던 글을 통합함)

홈서버 구축하기

나는 왜 서버를 구축하게 되었나.

어린 시절부터 나는 "나만의 서버"가 갖고 싶었다. 최근에는 클라우드를 간편하게 사용할 수 있게 되면서 그 필요성이 낮아지고 있지만 직접 내 서버 그리고 네트워크를 만들어나가는 일은 가슴이 두근두근거리는 일이다.

마침 42에서 제공하고 있던 AWS Credit 서비스가 종료되었다. 월 크레딧 $200 정도 소모하고 있었기에 (사실상 무료라고 너무 펑펑쓰기는 했다.) 이를 그대로 지출하는 것은 큰 부담이었고, 그냥 좋은 기회라고 생각하며 내 서버를 하나 만들어보기로 했다.

사실, 이전에도 놀고 있는 컴퓨터, 노트북으로 서버를 만드려는 시도는 많이했지만 그닥 활용성이 높지 않았다. 서버에 필요한 지식이 전무했기 때문이다. 그러나, 이제는 이래저래 치이면서 스스로 만들 준비가 되었다고 생각한다.

서버로 사용할 기기 구매하기

서버 구축의 시작은 서버로 사용할 기기를 구매하는 것이다. 보통 업그레이드 하면서 남는 PC, 노트북을활용하여 만들거나, 아니면 구 버전의 제온을 사서 그럴듯한 서버를 만들어본다거나, 아니면 나처럼 미니 PC 를 사기도 한다.

내 경우에는 내 방 안에서 운영해야하고, 전기세 또한 생각하면서 운영해야하기에, "저소음 - 저전력 - 소형" 이 기기 구매의 키워드였다.

기존에 가지고 있던 미니 서버

앞선 목적으로 예전에 ZBOX-nano 제품을 하나 구매해뒀다. "무소음 - 저전력 - 초소형"으로 완전히 내가 원하는 형태의 기기였다. 그러나, 잠깐 스펙을 살펴보면

CPU - Intel N4100 (1.1Ghz to 2.4Ghz)
RAM - 8GB
SSD - WD GREEN 120GB (SATA)

그냥 인터넷이나 겨우 할 성능을 가지고 있다. 더군다나 무소음이라서 로드가 오래 지속되면 큰 부담이 되어, 클럭이 2Ghz까지 잘 못간다. 지금도 사용하고는 있지만, Ghost 블로그를 여기에 올렸다가 성능때문에 너무 느려서 삽질을 하기도 했다.

내 Ghost blog는 왜 느릴까? - (2)
앞선 글에서 느린 Ghost blog 의 원인을 찾고 개선(?)을 했다. 남겨진 문제를 해결하는 과정을 살펴보자. 남겨진 문제 서버 시작 후 첫 접근에서 8~10 s 의 시간이 소요되는 문제가 발견되었다. 그러나, 따로 ”서버 시작 후 첫 로딩이 엄청 느려요” 라는 문서를 찾아볼 수는 없었다. 답답한 마음에, 서버포럼으로 가서 질문글을

아무튼, 해당 기기로는 제대로된 서버 운영이 힘들고 기존에 있던 서비스를 운영하거나, 새로운 서비스를 확장해서 운영하기에는 성능이 괜찮은 PC 가 하나 필요했다.

구매한 서버

여전히 "저소음 - 저전력 - 소형" 은 추구해야하지만 이번에는 "고성능" 까지 필요했다. 베어본 제품에서 주로 찾아보다가 해당 제품을 발견했다.

upload in progress, 0
Deskmini X300

바로 Deskmini X300 제품이다. 기본적으로는 케이스 + AMD CPU 꽂을 수 있는 보드를 판매하고, CPU, RAM, SSD 등은 알아서 구매해서 사용하는 타입이다.

쇼핑몰을 뒤져보면 X300 에 5600G / 8GB / nvme 512 이런 식으로 같이 조립되어 파는 제품이 있으나, 아무래도 가성비가 조금 떨어진다. 어차피 컴퓨터는 중고로 사도 크게 차이가 없어 중고 제품을 알아보았다.

마침 중고나라에 가상화 서버 목적으로 사용하던 해당 제품이 있었고, 가격 또한 적당했다. 스펙은 이러하다.

CPU : AMD 4750G
RAM : 64 GB
SSD : Hynix Gold 500G

4750G 라서 스레드도 많고, 램도 넉넉하기에 바로 구매를 했다. 다만, 기본 쿨러의 경우 굉장히 소음이 심해서 녹투아 제품으로 교체했다. (녹투아 처음 써봤는데 거의 무소음이 되었다 ㄷㄷ..)

가상화

서버를 구매했으니, 다음으로 할 작업은 가상화이다. PC 의 성능이 너무 좋기에 여러 목적으로 나누어서 사용하고 싶었다. NAS (Synology) | Windows | Linux 이렇게 다양한 OS 를 두고 필요한 목적에 따라 사용할 수 있도록 가상화가 필요했다.

이 과정에서 Hypervisor 라는 것을 드디어 사용하게 되었다. 사실, Virtual Box, VMWare 등으로 종종 사용해본적은 있으나, 이렇게 베어메탈 위에 바로 붙어서 OS 를 여러개 돌리고 모니터링하는 Type 1 Hypervisor는 사용해본 적이 없었다.

VMWare ESXi 와 Prxmox 두 제품 중에 고민을 했고 다음과 같은 이유에서 Proxmox 를 골랐다.

  • 오픈소스 / 무료
  • ESXi 에서 제한걸어둔 기능들 사용 가능
  • 서버 포럼에서 적극적으로 사용하고 있어, 문제 해결이 용이
  • 리눅스라서 내부적으로도 다루기 편함.

서버 구조 계획

첫 홈서버의 구조와 글을 쓰는 지금의 구조가 상당히 다르다. 우선은 당시에 계획한 구조를 그려보겠다.

구조

단순히 X300 만 가상화를 하는 것이 첫 계획이었다. ZBOX 의 경우 사양이 낮아 Hypervisor - VM - Docker 까지 사용하면 상당히 부담이 될 것 같았고, X300 를 사용하게 되면 크게 사용하지 않을 것 같아 Proxmox 를 올릴 계획은 없었다.

따라서, Proxmox 를 X300에 설치하고, 돌아가는 VM은 총 3개의 운영체제 (Ubuntu / Windows / DSM ) 을 설치했다. 설치 과정의 경우 서버포럼 에 너무 잘 설명이 되어있어 생략..

요청 경로 (네트워크)

그리고 서버로의 요청은 다음과 같이 간략하게 잡았다.

단순히 포트 포워딩을 통해서 Ubuntu 의 Docker container 로 동작하고 있는 nginx 로 도달하고, 다시 nginx 에서는 내부 망에 존재하는 서비스로 Reverse proxy 하는 구조이다.

다만, 너무 단순하게 구성을 해둬서 이후에 보안적으로 취약한 부분들이 많이 보였다. 예를 들어, 내부 관리 서비스에 대한 접근 또한 *.photogrammer.me 를 통해서 접근이 가능하도록 해두었는데, nginx 에서 내부 망으로만 제한을 걸더라도 IP 스푸핑을 통해서 접근이 가능하기도 하였다. 이런 부분들을 추후에 VPN 과 관리 작업에 대한 호스트 분리 등을 통해서 해결하였다.

VM 활용 방안

Ubuntu

기본 목적은 다양한 Docker container 를 올리는 것이다. 컨테이너가 아니라, 잘게 VM 을 쪼개서 (EC2처럼) 사용할 수도 있겠지만, 관리적인 측면이나, 전체 자원 소모 측면에서나 OS 하나 두고 도커로 사용하는 것이 조금 더 낫다고 판단했다. 이후 k8s 관련 지식을 좀 습득하고 나면, Docker 보다 K8s 를 통해서 서비스들을 관리해볼 계획이다.

현재는 그냥 Docker 로 관리하지는 않고, Dockge 라는 docker 를 매니징 할 수 있는 도구를 통해서 관리하고 있다. 서버포럼을 통해 소개받아서 사용하고 있는데 생각보다 편하다. 나중에 한번 소개해보겠다.

DSM (Synology)

올해 부로 OneDrive, Google Drive 등 학교 계정을 통해서 제공받고 있던 클라우드 드라이브에 대한 접근이 제한되었다. 따라서, 기존의 데이터를 좀 옮겨둘 곳이 필요했고 헤놀로지를 올려서 해결하기로 했다.

이를 위해서 기존에 외장 SSD 로 쓰고 있었던 SSD를 X300 에 심었고, Proxmox 내에서 스토리지로 넣어두었다. DSM 에서도 도커 컨테이너 작동이 가능하지만, DSM 자체는 클라우드 드라이브의 성격으로 사용하기로 하여 컴퓨팅 성능을 낮게 잡아두었고, 대부분 저장된 정보를 통해서 무언가를 할 수 있는 성격의 서비스들만 올려두려고 한다.

Windows

Windows 의 경우 일부 윈도우를 통해서만 가능한 작업을 하거나, 가볍게 RDP 를 통해서 코딩 하는 용도로 선정해두었다. 다만, 실제로 설치하고 사용했을 때 Linux 나 DSM 과 달리 메모리가 실제 사용량에 따라 증가하지 않고, 초기에 16기가를 할당하면 그대로 사용 상태로 할당되어버리는 문제가 있었다. 이는 Windows 가 부팅과 동시에 메모리 영역을 0으로 초기화하며 접근하기에 발생하는 문제로, 딱히 해결을 할 수는 없었다.

때문에, 일반적으로 메모리를 정확하게 나눠서 사용하기는 하지만, 내 경우 다른 OS 쪽에 더 넉넉하게 주고, 겹치도록 사용하려고 하는 계획은 물거품이 되었다. (만약, 겹치는 순간이 오면 그냥 종료된다.) 다만, 램 자체가 넉넉해서 아직은 그냥 넉넉하게 주고 사용 중이다.

초기 설정은 끝났다.

초기 설정은 이정도로 마무리했었다. 다만, 이는 11월 쯤 구성했던 구성이었고, 지금은 바뀐 것들이 있다. 이후 포스팅에서는 서버를 어떤 식으로 변화해왔는지 한번 설명해보겠다.


Read more

대량의 더미 데이터 DB에 주입하기

대량의 더미 데이터 DB에 주입하기

대량의 더미 데이터 DB에 주입하기 현재 만들고 있는 토이 프로젝트에서는 대량의 데이터가 존재하는 DB 를 대상으로 여러가지 테스트를 수행한다. 테스트를 수행하기 위해서 더미 데이터를 주입할 방법에 대해서 모색해야했다. SQL Procedure * SQL 문으로 직접 테이블에 데이터를 주입한다. * 직접 Insert into () values (); 와 같은 구문을 작성할 수도 있지만, Procedure 혹은 function 을

By Sungjun Park
Lombok 에 대한 짧은 생각

Lombok 에 대한 짧은 생각

최근 Java / Spring 으로 스택을 변경하면서 작은 프로젝트를 하고 있다. 팀원의 추천으로 lombok 이라는 라이브러리를 사용하게 되었다. Lombok 을 쓰면 정말 간단하다. Getter, Setter, Constructor, equals, hashCode 과 같이 작성해야하지만 작성에 피로를 느끼는 코드들을 annotation을 통해서 너무 쉽게 만들 수 있다. 그런데, 이 라이브러리 사용할수록 필요성에 대한 의문이 생긴다. 생각을

By Sungjun Park