히스토리

  • [2025-07-19 Sat 10:50] 그래 노트북에 다 설치해서 아주 기본 동작은 다 확인 할 수 있다. 그 정도 환경은 되니까. 아하!

관련메타

BIBLIOGRAPHY

도커 컴포즈 로컬 노트북

  • [2025-07-20 Sun 13:57] zammad 설치
  • [2025-07-19 Sat 19:21] n8n 설치 - 오버라이드로 설치하면 설정 값을 서버와 동일하게 유지 할 수 있다.

n8n

https://docs.n8n.io/hosting/installation/docker/#prerequisites

yml

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
      volumes:
        - /disk-A/data/helpdesk/n8n/data:/home/node/.n8n
        environment:
          - N8N_HOST=localhost
          - WEBHOOK_URL=http://localhost:5678/ # <--- 위 N8N_HOST와 동일하게 변경하세요.
          - N8N_SECURE_COOKIE=false # <--- 이 줄이 추가되었습니다.
          - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
          - N8N_RUNNERS_ENABLED=true

설치 - 스토리지

[2025-07-15 Tue 17:07]

# sudo mkdir -p /disk-A/data/helpdesk/n8n
# sudo chown -R 1000:1000 /disk-A/data/helpdesk/n8n
sudo docker compose ps
sudo docker compose up -d

로그

 …/sync/office/dev/helpdesk/n8n master !2 ?23
➜ ls
'Channel.io Integration-v1.json'   docker-restart.sh
 code-template.json                http-request-channelio-get-v5-user-chats-import.json
 docker-compose.override.yml       http-request-channelio-get-v5-user-chats.json
 docker-compose.yml                http-request-template.json
…/sync/office/dev/helpdesk/n8n master !2 ?23
➜ sudo docker compose up -d
 
[+] Running 14/14
 ✔ n8n Pulled                                                                      39.6s    ✔ fe07684b16b8 Pull complete                                                     2.0s    ✔ 49b72e7e39fe Pull complete                                                    16.1s    ✔ c1ab3b052759 Pull complete                                                    16.1s    ✔ 845179b1d451 Pull complete                                                    16.2s    ✔ ad03744990d9 Pull complete                                                    20.5s    ✔ 4f4fb700ef54 Pull complete                                                    20.5s    ✔ bfdece05f48d Pull complete                                                    34.1s    ✔ 8b4638fd27f8 Pull complete                                                    34.1s    ✔ a74496b54e34 Pull complete                                                    34.2s    ✔ a626ce764b76 Pull complete                                                    34.2s    ✔ f42131b32d27 Pull complete                                                    34.3s    ✔ 4ef26991ce21 Pull complete                                                    34.6s    ✔ 889bf67856df Pull complete                                                    34.7s [+] Running 2/2
 ✔ Network n8n_default  Created                                                     0.0s  ✔ Container n8n-n8n-1  Started                                                     1.2s …/sync/office/dev/helpdesk/n8n master !2 ?23

zammad

  • 포트 8085 변경 - 사내 서버와 동일하게

yml

---
version: "3.8"
 
x-shared:
  zammad-service: &zammad-service
    environment: &zammad-environment
      MEMCACHE_SERVERS: ${MEMCACHE_SERVERS:-zammad-memcached:11211}
      POSTGRESQL_DB: ${POSTGRES_DB:-zammad_production}
      POSTGRESQL_HOST: ${POSTGRES_HOST:-zammad-postgresql}
      POSTGRESQL_USER: ${POSTGRES_USER:-zammad}
      POSTGRESQL_PASS: ${POSTGRES_PASS:-zammad}
      POSTGRESQL_PORT: ${POSTGRES_PORT:-5432}
      POSTGRESQL_OPTIONS: ${POSTGRESQL_OPTIONS:-?pool=50}
      POSTGRESQL_DB_CREATE:
      REDIS_URL: ${REDIS_URL:-redis://zammad-redis:6379}
      S3_URL:
      # Backup settings
      BACKUP_DIR: "${BACKUP_DIR:-/var/tmp/zammad}"
      BACKUP_TIME: "${BACKUP_TIME:-03:00}"
      HOLD_DAYS: "${HOLD_DAYS:-10}"
      TZ: "${TZ:-Europe/Berlin}"
      # Allow passing in these variables via .env:
      AUTOWIZARD_JSON:
      AUTOWIZARD_RELATIVE_PATH:
      ELASTICSEARCH_ENABLED:
      ELASTICSEARCH_SCHEMA:
      ELASTICSEARCH_HOST:
      ELASTICSEARCH_PORT:
      ELASTICSEARCH_USER: ${ELASTICSEARCH_USER:-elastic}
      ELASTICSEARCH_PASS: ${ELASTICSEARCH_PASS:-zammad}
      ELASTICSEARCH_NAMESPACE:
      ELASTICSEARCH_REINDEX:
      NGINX_PORT:
      NGINX_CLIENT_MAX_BODY_SIZE:
      NGINX_SERVER_NAME:
      NGINX_SERVER_SCHEME:
      RAILS_TRUSTED_PROXIES:
      ZAMMAD_HTTP_TYPE:
      ZAMMAD_FQDN:
      ZAMMAD_WEB_CONCURRENCY:
      ZAMMAD_PROCESS_SESSIONS_JOBS_WORKERS:
      ZAMMAD_PROCESS_SCHEDULED_JOBS_WORKERS:
      ZAMMAD_PROCESS_DELAYED_JOBS_WORKERS:
      # ZAMMAD_SESSION_JOBS_CONCURRENT is deprecated, please use ZAMMAD_PROCESS_SESSIONS_JOBS_WORKERS instead.
      ZAMMAD_SESSION_JOBS_CONCURRENT:
      # Variables used by ngingx-proxy container for reverse proxy creations
      # for docs refer to https://github.com/nginx-proxy/nginx-proxy
      VIRTUAL_HOST:
      VIRTUAL_PORT:
      # Variables used by acme-companion for retrieval of LetsEncrypt certificate
      # for docs refer to https://github.com/nginx-proxy/acme-companion
      LETSENCRYPT_HOST:
      LETSENCRYPT_EMAIL:
 
    image: ${IMAGE_REPO:-ghcr.io/zammad/zammad}:${VERSION:-6.5.0-101}
    restart: ${RESTART:-always}
    volumes:
      - /disk-A/data/helpdesk/zammad/storage-data:/opt/zammad/storage
    depends_on:
      - zammad-memcached
      - zammad-postgresql
      - zammad-redis
 
services:
  zammad-backup:
    <<: *zammad-service
    command: ["zammad-backup"]
    volumes:
      - /disk-A/data/helpdesk/zammad/backup-data:/var/tmp/zammad
      - /disk-A/data/helpdesk/zammad/storage-data:/opt/zammad/storage:ro
    user: 0:0
 
  zammad-elasticsearch:
    image: bitnami/elasticsearch:${ELASTICSEARCH_VERSION:-8.18.0}
    restart: ${RESTART:-always}
    volumes:
      - /disk-A/data/helpdesk/zammad/elasticsearch-data:/bitnami/elasticsearch/data
    environment:
      # See https://github.com/bitnami/containers/tree/main/bitnami/elasticsearch#environment-variables
      #
      # Enable authorization without HTTPS. For external access with
      #   SSL termination, use solutions like nginx-proxy-manager.
      ELASTICSEARCH_ENABLE_SECURITY: 'true'
      ELASTICSEARCH_SKIP_TRANSPORT_TLS: 'true'
      ELASTICSEARCH_ENABLE_REST_TLS: 'false'
      # ELASTICSEARCH_USER is hardcoded to 'elastic' in the container.
      ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASS:-zammad}
      # Resource settings
      ELASTICSEARCH_HEAP_SIZE:
      ELASTICSEARCH_MAX_ALLOWED_MEMORY_PERCENTAGE:
      ELASTICSEARCH_MAX_ALLOWED_MEMORY:
      ELASTICSEARCH_MAX_TIMEOUT:
      ELASTICSEARCH_LOCK_ALL_MEMORY:
 
  zammad-init:
    <<: *zammad-service
    command: ["zammad-init"]
    depends_on:
      - zammad-postgresql
    restart: on-failure
    user: 0:0
 
  zammad-memcached:
    command: memcached -m 256M
    image: memcached:${MEMCACHE_VERSION:-1.6.38-alpine}
    restart: ${RESTART:-always}
 
  zammad-nginx:
    <<: *zammad-service
    command: ["zammad-nginx"]
    expose:
      - "${NGINX_PORT:-8080}"
    ports:
      - "${NGINX_EXPOSE_PORT:-8080}:${NGINX_PORT:-8080}"
    depends_on:
      - zammad-railsserver
 
  zammad-postgresql:
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-zammad_production}
      POSTGRES_USER: ${POSTGRES_USER:-zammad}
      POSTGRES_PASSWORD: ${POSTGRES_PASS:-zammad}
    image: postgres:${POSTGRES_VERSION:-17.5-alpine}
    restart: ${RESTART:-always}
    volumes:
      - /disk-A/data/helpdesk/zammad/postgresql-data:/var/lib/postgresql/data
 
  zammad-railsserver:
    <<: *zammad-service
    command: ["zammad-railsserver"]
 
  zammad-redis:
    image: redis:${REDIS_VERSION:-7.4.4-alpine}
    restart: ${RESTART:-always}
    volumes:
      - /disk-A/data/helpdesk/zammad/redis-data:/data
 
  zammad-scheduler:
    <<: *zammad-service
    command: ["zammad-scheduler"]
 
  zammad-websocket:
    <<: *zammad-service
    command: ["zammad-websocket"]
 

env

#############################################
# Zammad Docker Environment Configuration
#############################################
 
# 기본 서비스 설정
RESTART=always
 
# Zammad 버전 (안정적인 고정 버전 사용 권장)
VERSION=6.5.0-101
IMAGE_REPO=ghcr.io/zammad/zammad
 
# 데이터베이스 설정 (보안을 위해 기본 패스워드 변경)
POSTGRES_DB=zammad_production
POSTGRES_USER=zammad
POSTGRES_PASS=goquaL1!  # 기본값 'zammad'에서 변경
POSTGRES_HOST=zammad-postgresql
POSTGRES_PORT=5432
POSTGRESQL_OPTIONS=?pool=50
 
# Elasticsearch 설정
ELASTICSEARCH_SCHEMA=http
ELASTICSEARCH_HOST=zammad-elasticsearch
ELASTICSEARCH_PORT=9200
ELASTICSEARCH_USER=elastic
ELASTICSEARCH_PASS=goquaL1!  # 기본값 'zammad'에서 변경
ELASTICSEARCH_NAMESPACE=zammad
ELASTICSEARCH_REINDEX=true
ELASTICSEARCH_VERSION=8.18.0
 
# 웹 서버 설정
NGINX_PORT=8085
NGINX_EXPOSE_PORT=8085
NGINX_CLIENT_MAX_BODY_SIZE=50M
 
# 캐시 및 세션 설정
MEMCACHE_SERVERS=zammad-memcached:11211
MEMCACHE_VERSION=1.6.38-alpine
REDIS_URL=redis://zammad-redis:6379
REDIS_VERSION=7.4.4-alpine
 
# PostgreSQL 버전
POSTGRES_VERSION=17.5-alpine
 
# 타임존 설정
TZ=Asia/Seoul
 
# 백업 설정
BACKUP_DIR=/var/tmp/zammad
BACKUP_TIME=03:00
HOLD_DAYS=10
 

mkdir.sh

 
# 디렉토리 재생성
sudo mkdir -p /disk-A/data/helpdesk/zammad/elasticsearch-data
sudo mkdir -p /disk-A/data/helpdesk/zammad/postgresql-data
sudo mkdir -p /disk-A/data/helpdesk/zammad/redis-data
sudo mkdir -p /disk-A/data/helpdesk/zammad/backup-data
sudo mkdir -p /disk-A/data/helpdesk/zammad/storage-data
 
# ACL 권한 재설정
sudo setfacl -R -m u:1001:rwx /disk-A/data/helpdesk/zammad/elasticsearch-data
sudo setfacl -R -d -m u:1001:rwx /disk-A/data/helpdesk/zammad/elasticsearch-data
 
sudo setfacl -R -m u:999:rwx /disk-A/data/helpdesk/zammad/postgresql-data
sudo setfacl -R -d -m u:999:rwx /disk-A/data/helpdesk/zammad/postgresql-data
 
sudo setfacl -R -m u:1000:rwx /disk-A/data/helpdesk/zammad/redis-data /disk-A/data/helpdesk/zammad/backup-data /disk-A/data/helpdesk/zammad/storage-data
sudo setfacl -R -d -m u:1000:rwx /disk-A/data/helpdesk/zammad/redis-data /disk-A/data/helpdesk/zammad/backup-data /disk-A/data/helpdesk/zammad/storage-data