기존에 WordPress Choice Plus Hosting사용하시던 분들 중에 서버작업이 자유롭게 안되서 답답하다고 느끼신 분들에게 VPS플랜을 소개해 드리고자 합니다. VPS는 직접 서버를 관리하고, root권한까지 가지게 되어 모든 작업이 가능하게 되지만, 리눅스서버에 익숙하지 않은 사용자들은 다소 어려움이 있을수 있으니, Self-managed VPS보다는 managed VPS를 추천드립니다. 하지만 이 강의에서는 가장 저렴한 NVMe 2를 기준으로 설명을 드리고 있으니 참고 바랍니다.
Bluehost의 Plan
아래의 화면에서 보시듯이 Self-Managed VPS플랜은 관리해주는 툴을 사용할때보다 매우 저렴합니다.

하지만 리눅스서버에 자신이 없으신 분들은 cPanel등이 제공되는 Managed VPS플랜을 선택하세요.

Standard VPS NVMe 2
본 강의에서는 가장 저렴한 Standard VPS NVMe 2를 2년동안 사용하는 걸로 구매를 해보도록하겠습니다. 블루호스트의 메뉴에서 For Developers > Self-Managed VPS Hosting을 선택해주세요.

그러면 위에서 보여드린 플랜선택화면이 나오고 여기에서 가장 저렴한 NVMe 2를 선택합니다. Choose Plan버튼 클릭.

그러면 아래와 같이 결제하는 화면이 뜹니다.

지역은 버지니아 주에 있는 데이터센터가 기본적으로 선택이 되어 있는데 그대로 둡니다.

하드웨어는 선택한 플랜에 따라 정해지는데 가장 저렴한 버젼은 1 vCPU, RAM은 2 GB DDR5, 그리고 Storage는 50GB입니다.

Self-Managed VPS를 구매하면 하나의 앱을 무료로 제공받는데 기본값으로는 우분투OS에 Claude Code가 제공되지만 저는 Docker컨테이너를 사용할 것이라서 Coolify를 선택했습니다.

만약 우분투가 아닌 다른 OS를 설치하고 싶다면 Plain OS탭을 선택한 뒤 설치하고 싶은 OS를 선택하시면 됩니다.

cPanel을 설치해서 편리하게 이용할 수도 있지만, 한달에 $15씩 더 내야하므로 이건 pass합니다.

기타 Support & Security나, Advanced options는 한달에 $150씩 내고 기술지원서비스를 받는다거나 IP를 추가해야할 필요가 있으때 선택하는 항목인데 둘다 유료이므로 일단 패스하도록 하겠습니다.


선택이 끝났다면 우측하단의 Continue to checkout버튼을 눌러서 결제를 마무리합니다.
이제 Bluehost의 Hosting서비스를 열어보시면 기존에 WordPress Choice Plus Hosting과 Standard VPS – NVMe2가 나란히 있는것을 확인할 수 있습니다. 가장 우선적으로 Reset Password버튼을 눌러서 Root Password를 변경해 주세요.

그리고 Hostname이 설정이 안되어 있다면, Run Server Setup을 눌러서 메인 도메인으로 사용할 도메인도 설정해주세요

그 다음 Launch Console버튼을 누르시면 서버에 터미널로 접속이 되는데요. Login:에는 root를 넣으시고, Password:에는 방금전에 root password로 설정한 비번을 넣으시면 서버에 접속이 됩니다.

사용자 추가
앞으로는 root로 SSH에 접속하지 마시고, 생성하신 사용자로 접속하시고 sudo를 통해 필요할 때만 root권한을 행사하시기를 추천드립니다. 그것이 리눅스 서버 운영의 가장 기본이자 핵심인 보안 원칙(Principle of Least Privilege)입니다.
-- 사용자 생성
# sudo adduser sol1000
info: Adding user `sol1000' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `sol1000' (1001) ...
info: Adding new user `sol1000' (1001) with group `sol1000 (1001)' ...
info: Creating home directory `/home/sol1000' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sol1000
Enter the new value, or press ENTER for the default
Full Name []: Firstname Lastname
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
info: Adding new user `sol1000' to supplemental / extra groups `users' ...
info: Adding user `sol1000' to group `users' ...
-- sudo 권한 부여
# usermod -aG sudo sol1000
생성한 사용자로 SSH접속
아래 명령어를 입력한 뒤 위에서 설정한 비번을 입력해 SSH로 서버에 접속합니다.
ssh sol1000@내서버주소
Git Server 설정
Git Folder 생성
-- gitusers그룹 생성하여 방금 생성한 사용자를 등록한다
sudo groupadd gitusers
sudo usermod -aG gitusers sol1000
-- git폴더의 소유를 그룹으로 변경한다
sudo chgrp -R gitusers /srv/git
-- 그룹에게 7권한을 외부인에게는 쓰기 권한은 허용하지 않는다
sudo chmod -R 775 /srv/git
-- SGID 비트 설정 (git의 하위폴더도 부모폴더의 권한을 상속받아야 추후 오류가 없다)
sudo chmod g+s /srv/git
Git 저장소 생성
만약 생성하려는 프로젝트가 기존에 Git서버가 없다면 아래 명령어를 통해 새롭게 생성해주세요.
-- 프로젝트 폴더 생성
sudo mkdir -p /srv/git/blockpangpang.git
-- Bare 저장소로 초기화
sudo git init --bare /srv/git/blockpangpang.git
Git 저장소 복사
만약 생성하려는 프로젝트의 Git서버가 다른 서버에 이미 존재할 경우에는 폴더를 새로 생성하지 말고 기존 폴더를 복사해오세요.
sudo rsync -avz --progress 이전사용자@이전서버:/home3/이전사용자/git/blockpangpang.git /srv/git/
Git 폴더권한 변경
-- 생성한 폴더가 gitusers그룹의 소유인지 확인하고 아니라면 그룹소유권 변경
sudo chown -R root:gitusers /srv/git/blockpangpang.git
-- 폴더 설정도 775인지 확인하고 아니라면 폴더권한 변경
sudo chmod -R 775 /srv/git/blockpangpang.git
Git은 2022년경 보안 업데이트를 통해 “Git 저장소의 소유자가 현재 명령을 실행하는 사용자와 다르면, 설령 권한이 있더라도 실행하지 않겠다”는 아주 강력한 보안 정책(safe.directory)을 도입했습니다. 그룹 권한으로 푸는 방식이 아니라, Git에게 “내 그룹 권한을 믿고 작업을 허용하라”고 명시적으로 예외 처리를 해주어야 합니다. 현재 sol1000 계정으로 서버에 접속해서 다음 명령어를 입력하세요:
-- 이 저장소는 신뢰할 수 있는 소유자가 관리하고 있으니 예외로 둠
git config --global --add safe.directory /srv/git/blockpangpang.git
로컬 환경에서 원격 저장소 경로 수정
-- 마스터브랜치로 이동
git checkout main
-- 기존 서버 주소 삭제
git remote remove origin
-- 지금 서버 주소로 재등록
git remote add origin sol1000@현재서버:/srv/git/blockpangpang.git
Git서버 이전이 완료되었습니다. 몇가지 코드를 변경해서 서버로 정상적으로 push가 되는지 확인해봅니다. 자동인증설정
git push --set-upstream origin main
Coolify 설정
위의 콘솔화면에서 Management UI: 에 뜨는 주소를 복사에서 브라우저에 붙여넣기 하세요. 그러면 아래와 같이 Root User를 설정하는 화면이 뜨는데 여기서 사용자 이름과, 이메일, 그리고 비번을 넣고 사용자를 생성해주세요. 앞으로 Coolify에 접속할때 해당 이메일과 비번으로 로그인해서 Docker container들을 관리하게 되실겁니다.

계정을 생성하고 나면, 배포할 앱과 데이타베이스들을 어디에 저장할지 물어보는 화면이 나오는데요. 보통은 클라우드나 다른 서버에 별도로 관리하지만 우리는 서버가 이거 하나니까 여기에서 앱이랑 DB도 죄다 관리하도록 “This Machine”을 선택합니다.

다음 단계는 첫번째 프로젝트를 생성하는 일입니다. 여기서 프로젝트란 말그대로 어떤 특정 서비스의 그룹을 말합니다. 이 프로젝트는 앱이나 웹, 또는 데이타베이스등 여러개의 컨테이너를 가질수 있습니다. Create “My First Project”를 눌러서 프로젝트를 생성합니다. 프로젝트명은 나중에 변경할 수 있습니다.

이제 배포를 해보도록 하겠습니다. Deploy Your First Resource를 클릭해주세요.

그러면 상단에 New Resource라는 타이틀이 뜨고, 아래에 각종 애플리케이션들이 나옵니다.

프로젝트에 Resource 추가하기
Git 저장소 추가하기
위의 Resource중에 “Private Repository (with Deploy Key)”를 선택합니다.
아래와 같은 화면이 뜨면 “Create a new private key”버튼을 클릭합니다.

그러면 Private Key목록을 보여줍니다. 아래 localhost’s key라는게 있지만 우리는 따로 만들도록 합니다.
옆에 +Add버튼을 클릭하세요.

Generate new ED25519 SSH Key버튼을 클릭하여 Private Key를 생성해줍니다.
이 방식이 RSA방식보다 훨씬 최신 기술이며, 암호화 수준도 훨씬 강력합니다.

continue버튼을 클릭하면 아래와 같이 키가 생성되고 여기에서 이름과 설명을 수정할 수도 있습니다.

서버에는 Public Key (잠금장치)
localhost’s key에서 일단 Public key를 가져다가 서버의 .ssh폴더의 authorized_keys에 복사해줍니다. 주의! 키를 입력한뒤 엔터를 쳐서 줄바꿈을 해줘야합니다.
vi ~/.ssh/authorized_keys
로컬에는 Private Key (열쇠)
그리고 Private key를 가져다가 랩탑의 .ssh폴더에 vps_key파일에 복사해줍니다.
vi ~/.ssh/bluehost/vps_key
다시 돌아오면 키를 추가하라는 버튼 대신 방금 생성한 키가 보일거에요. 그걸 선택해주세요.

그러면 우리가 이전한 새로운 Git저장소의 정보를 넣는 부분이 나옵니다. Repository URL에 “사용자@서버호스트:Git폴더경로”를 입력하고, Branch는 main으로 그리고 Build Pack는 Static으로 선택한 뒤 Continue버튼을 클릭합니다. 필요에 따라 Monorepo를 지향하는 경우 해당 컨테이너에 영향을 주는 폴더만 Base Directory에 넣을 수 있습니다.

컨테이너의 이름을 알맞게 변경해주고 Domain에 실제 서비스할 도메인을 추가한 뒤 Save버튼을 누릅니다. (도메인을 이전하는 부분은 추후에 따로 다루도록 하겠습니다.)

그리고 우측 상단의 Deploy버튼을 클릭합니다.

이제 설정된 임시도메인으로 브라우저를 띄우면 http://llkz3vhg9uffd6keuu4ahd4e.50.6.6.213.sslip.io 아래와 같이 웹사이트가 뜹니다.

도메인 이전
이제 기존 WordPress Plan에 묶여 있는 도메인만 가져오면 되는데요. 가장 우선적으로 현재 Coolify가 돌아가고 있는 VPS의 Public IP를 정확히 알아야합니다.
# curl ifconfig.me
50.6.6.***
이제 도메인의 A레코드를 수정해야하는데요. 일단 Bluehost에 로그인하셔서 좌측메뉴에 Domains를 클릭하면 소유한 도메인목록이 뜹니다. 그중에 수정하고자 하는 도메인을 클릭하고 들어가면 다음과 같은 화면이 나옵니다. 아랫쪽에 보명 현재 WordPress서비스에 연결된 것이 확인됩니다.

밑으로 스크롤 내려보시면 DNS Record들이 보이실거에요. 그중에 Type이 A인 것들이 Point To가 50.87.169.177로 설정되어 있는게 보이시죠? 그 항목들을 전부 위에서 받아온 IP로 변경해주세요.

TTL이 4시간으로 되어 있으므로, 변경 사항이 완전히 반영되기까지 최대 몇 시간이 걸릴 수 있습니다.
Cloudflare Email Routing
기존에는 cPanel에서 이메일까지 다 관리를 해주었지만 도메인이 이전이 되는 순간 cPanel로 관리되던 모든 기능들은 더이상 사용할 수 없게됩니다. 따라서 기존에 해당 도메인으로 사용하던 이메일이 있다면 새로운 메일서버를 설치해서 관리해야 하지만 메일서버를 관리하는 일은 쉽지 않습니다. 그래서 Cloudflare를 이용해서 이메일을 내 개인메일로 포워딩하도록 설정하겠습니다.
우선 Cloudflare.com에 들어가셔서 회원가입을 해주세요. 이메일과 비번만 입력하면 별도의 확인절차 없이 바로 회원가입이 됩니다. 회원가입을 하면 이런 저런 질문들을 하는 화면이 나오는데 우측하단의 Skip버튼을 누르면 바로 대시보드로 이동합니다. 좌측메뉴에서 Domains를 클릭한뒤 Add domain을 눌러서 도메인을 추가해줍니다.

그러면 도메인을 연결만 할지, 이전할지, 새로 구매를 할지를 물어봅니다. 여기서 Connect a domain을 클릭합니다.

연결할 도메인을 입력해주세요.

Continue버튼을 클릭하면 유료버젼을 쓸지 물어보는데 Free버젼을 선택합니다.

그러면 아래와 같이 Record들을 보여주는데 이메일 포워딩을 하려면 기존의 MX 레코드와 이메일 관련 CNAME 레코드들을 모두 지워야 합니다. (기존 호스팅 업체의 메일 서버와 충돌이 발생하기 때문입니다.) MX와 TXT타입의 왼쪽 선택박스에 체크를 하면 상단에 Delete 5 Records버튼이 생깁니다. 클릭해서 삭제해주세요. 그리고 CNAME에서 imap, pop, smtp, webmail 전부 삭제하고, cpanel도 VPS에서는 더이상 사용하지 않으니까 cpanel도 삭제합니다. 그리고 A타입에 mail이 있는데 우리는 이메일을 포워딩할거기 때문에 mail.blockpangpang.com은 더이상 사용하지 않을것 이므로 그것도 삭제를 해주세요. 그 밖에 다른 A타입 레코드들은 그대로 두시면 웹사이트 연결에 문제없습니다. Continue to activation버튼을 눌러서 활성화 시켜주세요.

전부 삭제하고나면 다음과 같이 심플한 DNS레코드만 남습니다.

Continue to activation버튼을 누르면 도메인 관리회사에 들어가서 네임서버를 Cloudflare로 바꾸라고 합니다. 저는 도메인은 Whois.com에서 관리하는데 로그인해서 blockpangpang.com의 네임서버를 아래와 같이 바꿔줍니다.
현재 네임서버: ns1.bluehost.com, ns2.bluehost.com
Cloudflare: oaklyn.ns.cloudflare.com, peter.ns.cloudflare.com
Email Routing
이제 이메일 포워딩을 설정하겠습니다.
Cloudflare의 대시보드 좌측메뉴에서 Email > Email Routing을 클릭한뒤, 우측 상단에 Destination Addresses버튼을 클립합니다.

그러면 포워딩할 이메일들의 목록이 뜨는데 현재는 아무것도 없고, 하단 텍스트상자에 포워딩 받을 이메일을 추가합니다.

이메일이 등록되면 화면에 들어갑니다.

다시 Email Routing화면으로 돌아와서 우측 상단에 + Onboard Domain버튼을 눌러서 포워딩 신청을 합니다. Zone에서 이전하려는 도메인을 선택하면 추가할 DNS 레코드를 보여줍니다. Done버튼을 클릭합니다.

이메일 포워딩 신청이 완료되었습니다.

위의 목록에서 해당 도메인을 클릭하고 들어가면 다음과 같이 상세페이지가 뜹니다.

이제 여기에서 info@blockpangpang.com을 등록할거에요. 상단에 Routing rules라는 탭을 누르면 아래와 같이 각종 규칙들을 만들수가 있는데 여기에서 + Create routing rule버튼을 클릭합니다.

그리고 규칙을 만듭니다. info@blockpangpang.com으로 이메일이 오면 아래 지정한 이메일로 메일을 보내라고 설정한 뒤 Save합니다.

이제 모든 설정이 마무리 되었습니다. 도메인이 Cloudflare로 이전되는 시간이 이틀정도 걸리니 이틀뒤에 다시 확인해서 업데이트 하도록 하겠습니다. 수고하셨습니다.