🎯 이 글에서 다루는 내용#
Docker run 명령어 여러 개를 관리하다가 지쳐서 Docker Compose로 완전 전환한 과정을 정리했습니다:
- ✅ Docker run → Docker Compose 전환 - 통합 관리의 시작
- ✅ 폴더 구조 정리 - 흩어진 데이터를 한 곳으로
- ✅ n8n 워크플로우 자동화 도구 설치 - 자동화의 첫걸음
- ✅ IntelliJ Remote Development - 원격 서버도 로컬처럼
- ✅ 권한 에러와 Secure Cookie 해결 - 4시간의 삽질 기록
예상 소요시간: 1시간 | 난이도: 초급-중급 | 필요 도구: Docker, Docker Compose
😅 시작은 단순한 호기심이었는데…#
안녕하세요! CoderRed입니다 😊
Hugo 블로그 운영하면서 Docker 컨테이너가 하나둘 늘어나더니… 어느새 이런 상황이 되었어요:
# Hugo 블로그
docker run -d --name hugo-blog --restart unless-stopped ...
# Cusdis 댓글 시스템
docker run -d --name cusdis --restart unless-stopped ...
# 텔레그램 웹훅
docker run -d --name telegram-webhook --restart unless-stopped ...
“아… 명령어 기억 안 나면 어떡하지?” 😱
그때 떠오른 생각: “Docker Compose로 통합 관리하면 되잖아?”
그리고 김칫국 마시며 생각했죠: “n8n도 설치해서 자동화까지 해보자!”
(스포일러: 생각보다 삽질이 많았습니다 😅)
🔄 1단계: Docker run에서 Docker Compose로 대전환#
왜 Docker Compose로 바꿔야 하나?#
처음엔 이렇게 생각했어요:
“Docker run도
--restart unless-stopped있으면 충분한데?”
현실은…
- 서버 재부팅 후: “어? 컨테이너 명령어가 뭐였지?”
- 설정 변경할 때: “긴 명령어 다시 입력… 😩”
- 백업할 때: “각각 따로 백업해야 하네?”
Docker Compose의 달콤한 유혹#
# docker-compose.yml 하나로 모든 서비스 관리!
services:
hugo-blog:
# 설정...
cusdis:
# 설정...
telegram-webhook:
# 설정...
이제 이렇게만 하면 끝:
docker compose up -d # 모든 서비스 시작
docker compose down # 모든 서비스 중지
docker compose logs -f # 통합 로그 보기
“이거야!” 하고 바로 시작했죠 🚀
📁 2단계: 흩어진 폴더 구조 정리#
Before (지저분) 😵#
~/
├── coderblog/
├── cusdis-data/
├── telegram-webhook/
├── n8n-data/
└── data/ # 이건 뭐지...?
After (깔끔) ✨#
~/docker-services/
├── telegram-webhook/ # 소스코드
├── cusdis-data/ # 댓글 DB
├── n8n-data/ # n8n 설정
├── docker-compose.yml # 통합 설정
└── .env # 비밀 정보
폴더 이동 과정#
# 1. docker-services 폴더 생성
mkdir ~/docker-services
# 2. telegram-webhook 이동
mv ~/telegram-webhook ~/docker-services/
# 3. cusdis 먼저 중지 (데이터 보호!)
docker stop cusdis
# 4. cusdis-data 이동
mv ~/cusdis-data ~/docker-services/
🐳 3단계: docker-compose.yml 작성#
최종 통합 설정 파일#
services:
# Hugo 블로그
hugo-blog:
image: nginx:alpine
container_name: hugo-blog
restart: unless-stopped
ports:
- "9572:80"
volumes:
- ~/coderblog/public:/usr/share/nginx/html:ro
networks:
- npm_default
# Cusdis 댓글 시스템
cusdis:
image: djyde/cusdis:latest
container_name: cusdis
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./cusdis-data:/data # 상대 경로로 변경!
environment:
- USERNAME=admin
- PASSWORD=${CUSDIS_PASSWORD}
- JWT_SECRET=ofcourseistillloveyou
- NEXTAUTH_SECRET=ofcourseistillloveyou
- DB_URL=file:/data/db.sqlite
- NEXTAUTH_URL=https://comments.coderred.com
networks:
- npm_default
# 텔레그램 웹훅
telegram-webhook:
build: ./telegram-webhook # Dockerfile 빌드
container_name: telegram-webhook
restart: unless-stopped
environment:
- BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
- CHAT_ID=${TELEGRAM_CHAT_ID}
networks:
- npm_default
# n8n 워크플로우 자동화 (새로 추가!)
n8n:
image: n8nio/n8n
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
volumes:
- ./n8n-data:/home/node/.n8n
environment:
- N8N_HOST=n8n.windahead.com
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.windahead.com
user: "1000:1000" # 권한 문제 해결!
networks:
- npm_default
networks:
npm_default:
external: true # NPM이 이미 만든 네트워크 사용
.env 파일 (비밀 정보 분리)#
CUSDIS_PASSWORD=실제비밀번호
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
TELEGRAM_CHAT_ID=987654321
💥 4단계: 실행하면서 만난 문제들#
docker-compose 명령어가 없다고? 😱#
$ docker-compose up -d
명령어 'docker-compose' 을(를) 찾을 수 없습니다
해결책: 최신 Docker는 하이픈 없이!
docker compose up -d # docker-compose (X) → docker compose (O)
“아… 이제는 하이픈도 빼는구나” 😅
YAML 파일 경고#
WARN[0000] the attribute `version` is obsolete
해결책: version: '3.8' 라인 삭제! (최신 Docker는 필요 없음)
🚀 5단계: n8n 설치와 권한 지옥#
첫 번째 에러: Permission Denied#
Error: EACCES: permission denied, open '/home/node/.n8n/config'
n8n 컨테이너가 파일을 못 만든대요! 😤
시도 1: 폴더 권한 수정
sudo chown -R 1000:1000 ~/docker-services/n8n-data
chmod -R 755 ~/docker-services/n8n-data
시도 2: docker-compose.yml에 user 추가
n8n:
user: "1000:1000" # 이거 추가!
드디어 해결! 🎉
두 번째 에러: Secure Cookie 문제#
브라우저에 이런 메시지가:
“Your n8n server is configured to use a secure cookie, however you are either visiting this via an insecure URL”
“아… HTTP로 접속해서 그런 거구나!” 💡
해결책: 그냥 HTTPS로 접속!
https://n8n.windahead.com # NPM으로 이미 설정되어 있었음!
(처음부터 HTTPS로 접속할 걸… 😅)
🎯 6단계: n8n 첫 설정#
가입 화면이 나타났다!#
최신 n8n은 사용자 관리 시스템이 기본이더라고요:
- 이메일로 가입 (첫 번째 가입자 = Owner)
- Basic Auth는 이제 무시됨
- 가입 후 추가 가입 차단 설정
# 가입 완료 후 docker-compose.yml 수정
environment:
- N8N_USER_MANAGEMENT_SELF_SIGNUP_ENABLED=false # 추가 가입 차단
🛠️ 보너스: IntelliJ Remote Development#
서버 파일 편집이 불편해서…#
vim이나 nano로 YAML 편집하다가 화가 나서 😤
IntelliJ Ultimate의 Remote Development 발견!
File → Remote Development → SSH → New Connection
Host: 서버IP
Port: 22222
Project directory: /home/username
이제 서버 파일도 로컬처럼 편집! 완전 꿀! 🍯
서버 캐시 정리 (보너스)#
Remote Development 쓰다 보니 캐시가 20GB… 😱
# JetBrains 캐시 정리
rm -rf ~/.cache/JetBrains/RemoteDev-IU/241.* # 오래된 버전만
# 기타 불필요한 캐시
rm -rf ~/.cache/yarn
rm -rf ~/.cache/thumbnails
rm -rf ~/.cache/mozilla
41GB → 4GB로 다이어트 성공! 💪
💡 이번에 배운 교훈들#
기술적 교훈#
Docker Compose가 진짜 편하다
- 설정 파일 하나로 모든 서비스 관리
- 백업도
docker-services폴더만 압축하면 끝
폴더 구조 정리의 중요성
- 처음부터 잘 정리하자
- 데이터는 한 곳에 모아두기
권한 문제는 항상 발생한다
- Docker 볼륨 마운트 시
user설정 중요 1000:1000이 보통 해결책
- Docker 볼륨 마운트 시
삽질 방지 교훈#
HTTPS가 있으면 HTTPS로 접속하자
- Secure Cookie 에러로 30분 삽질… 😅
docker-compose vs docker compose
- 최신 Docker는 하이픈 없이!
가입 먼저, 보안 설정은 나중에
- n8n 가입 차단을 먼저 설정하면 본인도 못 들어감
🚀 앞으로의 계획#
이제 n8n이 설치되었으니:
- 블로그 자동 포스팅 워크플로우
- Gmail → Telegram 알림
- 서버 모니터링 자동화
- AI 연동 자동화
정말 재밌는 것들을 많이 해볼 수 있을 것 같아요! 🎉
📚 관련 포스트#
이제 모든 서비스가 docker-services 폴더 하나에서 관리됩니다!
docker compose up -d # 한 번에 시작
docker compose logs -f # 통합 로그
docker compose down # 깔끔하게 종료
정말 편해졌어요! 여러분도 Docker run 지옥에서 벗어나보세요! 😊
혹시 막히는 부분 있으면 댓글로 알려주세요. 제가 겪은 삽질이 도움이 되길 바라며… 🙏
