신규 환경 1시간 셋업 스크립트의 진화
새 서버를 처음부터 셋업하는 데 걸리는 시간을 줄이기 위해 스크립트를 어떻게 발전시켜왔는지 — 처음 아이디어에서 지금의 형태까지.
새 서버가 생길 때마다 처음부터 셋업하는 것은 생각보다 많은 시간을 잡아먹는다. 패키지 설치, 방화벽 설정, 스왑, 타임존, 사용자 계정, fail2ban, nginx 기본 설정. 익숙한 사람이 하면 1시간이 채 안 걸리지만, 그 1시간은 다른 생산적인 일을 할 수 있는 1시간이다. 그리고 사람이 손으로 하면 실수가 생긴다.
우리는 처음에 셋업 과정을 텍스트 문서로 정리했고, 이후 셸 스크립트로 바꿨고, 지금은 좀 더 발전된 형태로 운영하고 있다. 이 글은 그 진화 과정이다.
1단계: 텍스트 체크리스트
가장 처음 형태는 노션에 정리한 체크리스트였다. “1. apt update && apt upgrade, 2. timedatectl set-timezone Asia/Seoul, 3. …” 식으로. 손으로 따라가면서 실행하는 방식이었다. 이것만으로도 처음보다 시간이 줄고 빠뜨리는 항목이 줄었다.
문제는 이 체크리스트가 점점 길어진다는 것이었다. 그리고 특정 단계가 실패했을 때 어디서 멈췄는지 기억해야 했다. 처음 하는 사람에게는 각 단계가 왜 필요한지 설명이 없으면 이해가 어려웠다.
2단계: 셸 스크립트
체크리스트를 그대로 셸 스크립트로 옮겼다. 직접 실행하면 순서대로 돌아가고, 실패하면 멈추도록 set -e를 걸었다. 처음 실행해봤을 때 체크리스트보다 확실히 빠르고 실수가 없었다.
다만 셸 스크립트는 멱등성(idempotency)이 없다. 이미 설치된 패키지를 다시 설치하려 하거나, 이미 존재하는 설정을 덮어쓰는 문제가 생겼다. 완전히 새 서버에서만 쓸 수 있었다.
3단계: 멱등성 고려
각 단계에 조건 체크를 추가했다. if ! command -v nginx &>/dev/null; then apt install -y nginx; fi 같은 식이다. 귀찮지만 한 번만 작성하면 이후에는 서버 상태와 무관하게 실행할 수 있다.
이 버전부터는 기존 서버에 누락된 설정을 추가할 때도 쓸 수 있게 됐다. 스크립트가 전체 환경의 “바람직한 상태”를 정의하는 역할을 하게 된 것이다.
현재 형태
지금은 스크립트를 역할별로 나누었다. 기본 시스템 설정 스크립트, nginx 설정 스크립트, Docker 설치 스크립트, 보안 설정 스크립트. 전체를 한 번에 돌릴 수도 있고, 특정 부분만 골라 실행할 수도 있다.
1시간 걸리던 것이 지금은 자동 실행 15분, 확인 작업 포함해도 30분 이내다. 더 중요한 건, 팀원 누가 하든 결과가 같다는 것이다. 스크립트가 인프라의 명세서이자 실행 도구가 된 셈이다.
— by mings