기존에는 제 블로그를 홈서버에 올려놓고, 공유기 포트포워딩을 설정하여 호스팅했습니다. 그런데 최근 tailscale을 적용하면서 포트포워딩을 막아야겠다 생각을 하면서 블로그 호스팅 서버를 옮기게 됐습니다.
제 블로그 내용은 이미지를 제외하곤 git으로 관리하고 있어서, 단순히 새 서버에 clone하고 배포를 하면되겠다 싶었는데, 생각처럼 잘 되지 않더라고요. 우선은 서버를 옮기기 위해 수행한 일들을 나열해 보겠습니다.


1. 블로그 파일 옮기기

우선 새 서버에 블로그 파일들을 옮겨야겠죠. git에 올라가있는 파일들은 clone하고, 이미지 파일들은 static 폴더 통째로 압축해서 scp로 넘겼습니다. 옮긴 서버에서도 배포 스크립트를 실해하면 build한 파일들이 자동으로 배포위치에 복사되겠죠. 제가 사용한 배포 스크립트는 대강 이런 내용입니다.

cd ~/hugo/myblog/ && hugo build && \
    sudo rsync -av --delete public/ /var/www/myblog/ && \
    sudo chown -R www-data:www-data /var/www/myblog/

2. nginx 설정파일 생성

새 서버에도 ngnix는 설치되어 있구요, 설정파일만 새로 작성해주면 됩니다. 유의할점은 기존 서버에 있던 nginx 설정 파일은, SSL 인증 때문에 certbot의 자동수정이 들어가있습니다. 그래서 기존 설정파일을 그대로 가져오면 안되고, SSL 인증 전 초기 설정 버전으로 작성해주어야합니다.

cd /etc/nginx/sites-available/
sudo vim myblog.conf
server {
    listen 80;
    server_name rammie-blog.xyz;

    root /var/www/myblog;
    index index.html;

    location / {
            try_files $uri $uri/ =404;
    }

    # 정적 파일 캐시
    location ~* \.(jpg|jpeg|png|gif|css|js)$ {
            expires 30d;
            add_header Cache-Control "public";
    }
}

작성한 설정 파일은 sites-enabled 위치에 링크를 만들어줍니다.

cd /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-avaliable/myblog.conf

3. 도메인 IP 옮기기

파일을 옮겼으면 이제 도메인 주소가 새 서버를 가리키도록 설정해야합니다. 기존 블로그 도메인(https://rammie-blog.xyz)은 저희집 IP를 가리키고 있기 때문에, 제가 도메인을 구매한 가비아에서 도메인 설정을 수정해주었습니다.


여기까지 진행을 했다면 블로그에 다시 접속이 잘 되어야 하죠. 그런데 기대한대로 잘 되지는 않았습니다. 아래는 발생한 문제들과 해결한 방법들입니다.

문제 1. index.html 파일 누락

블로그 주소로 접속을 하면 403 Forbidden 에러가 발생했습니다. 배포위치를 가보니 index.html 파일이 없더라구요. hugo가 build한 public 폴더에도 index.html 파일이 없었습니다. 왜그런지 원인은 찾지 못했구요.. 아마 원래 서버에 있던 git repo에서 누락된 파일이 있거나 한거겠죠. 이참에 누락 위험이 없도록 repo는 원래 쓰던 서버에 하나만 두고, 배포 서버에는 순수하게 배포 파일들만 옮기기로 했습니다. 그러려면 배포 스크립트를 수정해야겠죠. contents 생성과 build까지는 원래 서버에서 하고, build한 파일은 rsync를 이용해 배포 서버로 넘깁니다.

cd ~/hugo/myblog/ && hugo && \
    rsync -rvzc --delete --chmod=D755,F644 \
        public/ hugo@vultr1:/var/www/myblog/

그간 hugo 버전이 업데이트되어 build 명령을 hugo build로 하지 않고 hugo 만으로 하게 됐습니다. access 권한 축소를 위해 배포 서버에서 배포전용 비로그인 계정 hugo를 생성했습니다. rsync에서 -c option은 내용이 같은 파일을 건너뛰게 해주고, -z option은 파일을 압축해서 전송해줍니다.
이렇게 기존서버에서 build를 하니 index.html이 정상적으로 생성됐고, 배포 서버로 전송후 블로그 접속도 정상적으로 됐습니다.

문제 2. SSL 인증

제 블로그에도 나름 보안을 신경써서 SSL 인증을 적용했고 https로 전송하게 만들었습니다. 그런데 서버를 옮겨버리면 새 서버에는 인증서가 없어서 사이트에 접근할 수가 없겠죠. 인증서도 함께 옮기면 되겠지만, 다른 위치에서 인증서가 정상적으로 읽힐지 보장할 수 없었습니다. claude도 그냥 새 인증서를 발급하기를 권장했습니다. 그러면 직접 nginx 설정파일을 수정해야하는 번거로움도 없을거구요.
배포 서버에 새로 certbot을 설치하고 인증을 진행합니다.

sudo apt update
sudo apt install certbot python3-certbot-nginx

sudo certbot --nginx -d rammie-blog.xyz -d www.rammie-blog.xyz

그러면 기존 서버와 마찬가지로 certbot이 https 설정에 맞게 nginx 설정 파일을 자동 수정합니다.
certbot의 인증서 자동 갱신 루틴이 등록되었는지 확인하고 nginx를 reload 해줍니다.

systemctl list-timers | grep certbot
sudo systemctl reload nginx

이렇게 블로그 서버 이전을 마치고 지금 보시는 화면은 새 배포 서버에서 호스팅하게 되었습니다.
접속자가 아주 많은 대형사이트였다면 사이트 downtime을 최소화하기 위해 복잡한 트릭이 필요했겠지만, 개인블로그에 그런게 필요할리 없지요..ㅎㅎ 그냥 냅다 파일 옮겨놓고 시행착오를 겪으며 완료했습니다.