서버 정전 대비 자동 복구 설정하기

사무실 서버를 운영하면 정전을 피할 수 없다. 주말에 건물 전기 점검으로 전원이 나간 적이 있는데, 월요일 아침에 출근해보니 서버가 꺼져 있었다. 서비스 전부 다운. 원격으로 켤 수도 없어서 직접 전원 버튼을 눌러야 했다. 그 뒤로 자동 복구를 세팅해뒀고, 이후에는 정전이 와도 전기 복구 후 알아서 서버가 켜지고 서비스까지 올라온다. BIOS 설정: 전원 복구 시 자동 부팅 서버나 PC의 BIOS에 “AC Power Recovery” 또는 “After Power Loss” 같은 옵션이 있다. 보통 세 가지 중 하나를 선택할 수 있다: ...

2025년 5월 10일 · 3 분 · Salmonholic

Elasticsearch + Kibana 모니터링 스택 구축하기

서버 로그를 grep으로 뒤지는 건 한두 대일 때나 가능하다. 서비스가 늘어나면 로그를 한 곳에 모아서 검색하고 시각화할 수 있는 환경이 필요하다. ELK 스택(Elasticsearch + Logstash + Kibana)이 업계 표준인데, 작은 규모에서는 Logstash 대신 Filebeat만 써도 충분하다. Docker로 띄우면 설치 자체는 30분이면 끝난다. Docker Compose 설정 version: "3.8" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0 environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - es-data:/usr/share/elasticsearch/data ports: - "9200:9200" restart: unless-stopped healthcheck: test: curl -s http://localhost:9200 >/dev/null || exit 1 interval: 30s timeout: 10s retries: 5 kibana: image: docker.elastic.co/kibana/kibana:8.12.0 environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 ports: - "5601:5601" depends_on: elasticsearch: condition: service_healthy restart: unless-stopped volumes: es-data: xpack.security.enabled=false는 개발/내부용으로 쓸 때 편하려고 끈 거다. 외부에 노출한다면 반드시 켜야 한다. ...

2025년 4월 18일 · 2 분 · Salmonholic

Let's Encrypt SSL 인증서 자동 갱신 설정하기

요즘은 HTTPS가 선택이 아니라 필수다. 브라우저에서 “안전하지 않음” 경고를 띄우니까 사용자 입장에서도 신뢰가 안 간다. 예전에는 SSL 인증서가 비쌌는데, Let’s Encrypt 덕분에 무료로 쓸 수 있게 됐다. 다만 90일마다 갱신해야 하는데, 자동화해두면 한 번 설정하고 까먹어도 된다. certbot 설치 Ubuntu 기준: sudo apt update sudo apt install certbot python3-certbot-nginx python3-certbot-nginx 플러그인이 Nginx 설정까지 자동으로 건드려주니까 같이 설치하는 게 편하다. 인증서 발급 Nginx가 이미 돌아가고 있고 도메인이 서버 IP로 연결되어 있다면: ...

2025년 4월 2일 · 2 분 · Salmonholic

Redis를 Docker로 빠르게 구축하기

API 응답이 느려서 캐시를 붙여야 하는 상황이 왔다. Redis가 가장 무난한 선택이었는데, 서버에 직접 설치하면 버전 관리도 귀찮고 나중에 지울 때도 깔끔하지 않다. Docker로 띄우면 한 줄이면 되고, 안 쓸 때 컨테이너만 지우면 끝이라 편하다. 기본 실행 가장 간단한 방법: docker run -d --name redis \ -p 6379:6379 \ redis:7-alpine 끝이다. 이것만으로 Redis 서버가 돌아간다. 접속 테스트: docker exec -it redis redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> set hello "world" OK 127.0.0.1:6379> get hello "world" 근데 이렇게 쓰면 컨테이너가 죽을 때 데이터가 다 날아간다. 캐시 용도라면 상관없지만, 세션 스토어 같은 걸로 쓸 때는 데이터를 보존해야 한다. ...

2025년 3월 25일 · 2 분 · Salmonholic

Nginx 리버스 프록시로 Basic Auth 걸기

사내에서 Grafana, Jenkins, Portainer 같은 관리 도구를 띄워놓으면 편한데, 이걸 그냥 열어두면 불안하다. VPN을 구축하면 가장 좋겠지만 규모가 작은 팀이라 그건 좀 오버스펙이었다. 그래서 Nginx 리버스 프록시 앞에 Basic Auth를 걸어서 최소한의 보호막을 만들었다. htpasswd 파일 생성 Basic Auth에 사용할 사용자/비밀번호 파일을 먼저 만든다. apache2-utils 패키지에 htpasswd 명령이 들어있다: sudo apt install apache2-utils # 파일 새로 생성 + 사용자 추가 sudo htpasswd -c /etc/nginx/.htpasswd admin 비밀번호를 물어보니까 입력하면 된다. 사용자를 추가할 때는 -c 옵션을 빼야 한다 (파일을 덮어쓰니까): ...

2025년 3월 12일 · 3 분 · Salmonholic

Docker Compose로 사내 서버 관리하기

회사에서 자체 서버를 운영하다 보면 서비스가 하나둘 늘어난다. 처음에는 docker run 으로 하나씩 띄우다가, 어느 순간 컨테이너가 10개를 넘기면서 관리가 안 되기 시작했다. 어떤 컨테이너가 어떤 포트를 쓰는지, 볼륨은 어디에 마운트했는지, 환경변수는 뭘 넣었는지… 결국 Docker Compose로 전부 옮기고 나서야 숨통이 트였다. 기본 구조 잡기 프로젝트 루트에 docker-compose.yml 하나면 된다. 우리 팀은 보통 이런 식으로 구성한다: /srv/ ├── docker-compose.yml ├── .env ├── nginx/ │ └── conf.d/ ├── data/ │ ├── postgres/ │ ├── redis/ │ └── minio/ └── logs/ docker-compose.yml 기본 뼈대는 이렇다: ...

2025년 3월 5일 · 3 분 · Salmonholic

우분투에서 NVIDIA 드라이버 업데이트 가이드

우분투에서 NVIDIA 드라이버 업데이트는 생각보다 함정이 많다. 잘못 건드리면 부팅 후 검은 화면만 보이는 공포를 경험할 수 있다. 나도 한 번 잘못 업데이트했다가 SSH로 접속해서 복구한 적이 있다. 그래서 안전한 업데이트 방법을 정리해둔다. 현재 드라이버 확인 먼저 지금 설치된 드라이버 버전을 확인한다: nvidia-smi 출력에서 Driver Version을 확인한다. 또한 어떤 방식으로 설치되어 있는지도 중요하다: dpkg -l | grep nvidia-driver 이게 결과가 있으면 apt로 설치된 거고, 없으면 런파일(.run)로 설치한 거다. 설치 방식에 따라 업데이트 방법이 다르다. ...

2025년 2월 5일 · 3 분 · Salmonholic