본문으로 건너뛰기

Docker Compose로 서비스 통합 관리하기 - n8n 워크플로우 자동화 도구 설치까지

목차

🎯 이 글에서 다루는 내용
#

Docker run 명령어 여러 개를 관리하다가 지쳐서 Docker Compose로 완전 전환한 과정을 정리했습니다:

  • Docker run → Docker Compose 전환 - 통합 관리의 시작
  • 폴더 구조 정리 - 흩어진 데이터를 한 곳으로
  • n8n 워크플로우 자동화 도구 설치 - 자동화의 첫걸음
  • IntelliJ Remote Development - 원격 서버도 로컬처럼
  • 권한 에러와 Secure Cookie 해결 - 4시간의 삽질 기록

예상 소요시간: 1시간 | 난이도: 초급-중급 | 필요 도구: Docker, Docker Compose

😅 시작은 단순한 호기심이었는데…
#

안녕하세요! CoderRed입니다 😊

Hugo 블로그 운영하면서 Docker 컨테이너가 하나둘 늘어나더니… 어느새 이런 상황이 되었어요:

1
2
3
4
5
6
7
8
# 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의 달콤한 유혹
#

1
2
3
4
5
6
7
8
# docker-compose.yml 하나로 모든 서비스 관리!
services:
  hugo-blog:
    # 설정...
  cusdis:
    # 설정...
  telegram-webhook:
    # 설정...

이제 이렇게만 하면 끝:

1
2
3
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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 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 작성
#

최종 통합 설정 파일
#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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 파일 (비밀 정보 분리)
#

1
2
3
CUSDIS_PASSWORD=실제비밀번호
TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
TELEGRAM_CHAT_ID=987654321

💥 4단계: 실행하면서 만난 문제들
#

docker-compose 명령어가 없다고? 😱
#

1
2
$ docker-compose up -d
명령어 'docker-compose'() 찾을 수 없습니다

해결책: 최신 Docker는 하이픈 없이!

1
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: 폴더 권한 수정

1
2
sudo chown -R 1000:1000 ~/docker-services/n8n-data
chmod -R 755 ~/docker-services/n8n-data

시도 2: docker-compose.yml에 user 추가

1
2
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은 사용자 관리 시스템이 기본이더라고요:

  1. 이메일로 가입 (첫 번째 가입자 = Owner)
  2. Basic Auth는 이제 무시됨
  3. 가입 후 추가 가입 차단 설정
1
2
3
# 가입 완료 후 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… 😱

1
2
3
4
5
6
7
# JetBrains 캐시 정리
rm -rf ~/.cache/JetBrains/RemoteDev-IU/241.*  # 오래된 버전만

# 기타 불필요한 캐시
rm -rf ~/.cache/yarn
rm -rf ~/.cache/thumbnails
rm -rf ~/.cache/mozilla

41GB → 4GB로 다이어트 성공! 💪

💡 이번에 배운 교훈들
#

기술적 교훈
#

  1. Docker Compose가 진짜 편하다

    • 설정 파일 하나로 모든 서비스 관리
    • 백업도 docker-services 폴더만 압축하면 끝
  2. 폴더 구조 정리의 중요성

    • 처음부터 잘 정리하자
    • 데이터는 한 곳에 모아두기
  3. 권한 문제는 항상 발생한다

    • Docker 볼륨 마운트 시 user 설정 중요
    • 1000:1000이 보통 해결책

삽질 방지 교훈
#

  1. HTTPS가 있으면 HTTPS로 접속하자

    • Secure Cookie 에러로 30분 삽질… 😅
  2. docker-compose vs docker compose

    • 최신 Docker는 하이픈 없이!
  3. 가입 먼저, 보안 설정은 나중에

    • n8n 가입 차단을 먼저 설정하면 본인도 못 들어감

🚀 앞으로의 계획
#

이제 n8n이 설치되었으니:

  • 블로그 자동 포스팅 워크플로우
  • Gmail → Telegram 알림
  • 서버 모니터링 자동화
  • AI 연동 자동화

정말 재밌는 것들을 많이 해볼 수 있을 것 같아요! 🎉

📚 관련 포스트
#


이제 모든 서비스가 docker-services 폴더 하나에서 관리됩니다!

1
2
3
docker compose up -d     # 한 번에 시작
docker compose logs -f   # 통합 로그
docker compose down      # 깔끔하게 종료

정말 편해졌어요! 여러분도 Docker run 지옥에서 벗어나보세요! 😊

혹시 막히는 부분 있으면 댓글로 알려주세요. 제가 겪은 삽질이 도움이 되길 바라며… 🙏


💬 댓글