서버 운영
서버 배포 전 점검 체크리스트
배포 환경이 로컬과 다르다는 것을 알고 있어도, 그냥 push 버튼을 누르고 나면 문제가 생긴다. 배포 직전에 확인해야 할 것들을 정리했다.
배포는 순간의 실수로 서비스를 중단시킬 수 있다. 특히 혼자 운영하는 서버라면 더욱 조심스럽다.
환경 변수 확인
# 배포 환경의 .env 파일 확인
cat .env.production
# 필수 변수가 모두 있는지
echo $DATABASE_URL
echo $API_KEY
echo $SECRET_TOKEN
환경 변수가 하나라도 빠지면, 애플리케이션이 시작조차 하지 못한다.
포트와 네트워크 설정
# 리버스 프록시(nginx, Traefik)가 올바른 백엔드 포트를 가리키는지
grep -r "upstream\|backend\|target" /etc/nginx/
# 또는 Dokploy를 사용한다면
docker inspect dokploy-traefik
포트 번호가 하나 틀려도 서비스가 닿지 않는다.
데이터베이스 연결
# 배포 환경에서 DB에 접속할 수 있는지
# PostgreSQL
psql $DATABASE_URL -c "SELECT 1;"
# MySQL
mysql -u$DB_USER -p$DB_PASS -h$DB_HOST -e "SELECT 1;"
타임아웃이 나거나 "permission denied"가 나면, DB 권한이나 네트워크 설정을 확인해야 한다.
디스크 공간 확인
df -h
# 특히 /home이나 /var 파티션이 꽉 찼는지
du -sh /var/lib/docker/*
디스크가 꽉 차면, 로그도 쓸 수 없고 앱도 시작 못한다.
메모리와 CPU
free -h
top -bn1 | head -20
메모리가 부족하거나 CPU가 이미 높다면, 배포 중 서비스가 중단될 수 있다.
백업 확인
# 최근 백업이 성공했는지
ls -lh /backup/
date
배포 중 문제가 생겨서 롤백해야 할 때, 백업이 없으면 복구가 불가능하다.
현재 실행 중인 서비스 상태
# Docker Swarm이라면
docker service ls
docker service ps <service_name>
# 또는 systemd라면
sudo systemctl status <service>
# 또는 process 직접 확인
ps aux | grep node
이미 떠 있는 서비스가 있는 상태에서 새로 배포하면, 충돌이 날 수 있다.
배포 스크립트 검증
# 배포 명령이 정말 원하는 대로 동작하는지 dry-run
# Dokploy를 사용한다면
# 웹 UI에서 "Deploy" 전에 "Redeploy" 버튼으로 기존 버전 재배포
# Docker Compose라면
docker-compose -f docker-compose.prod.yml config
배포 설정 파일의 문법 오류가 없는지 미리 검증한다.
로그 출력 설정
# 배포 후 로그를 볼 수 있도록
sudo journalctl -u docker -f
# 또는
docker logs -f <container_id>
배포 직후 로그를 모니터링하면, 문제를 빠르게 발견할 수 있다.
롤백 계획
배포 전에 이전 버전으로 돌아가는 방법을 알아둔다.
# Docker 이미지 태그
docker tag myapp:latest myapp:backup-$(date +%Y%m%d)
docker push myapp:backup-$(date +%Y%m%d)
# 문제가 생기면
docker service update --image myapp:backup-20260601 myapp-prod
또는 git에서:
# 현재 커밋 기록
git log -1 --oneline
# 문제가 생기면
git checkout <이전_커밋>