본문 바로가기

IT/NAS

[자작NAS] 우분투 서버에 Docker로 Traefik 설치

반응형

Traefik은 리버스 프록시와 부하 분산(Load balancer) 기능을 제공합니다.

사용하는 서비스들의 포트를 외부에 노출하지 않고 URL을 통해 외부에서 접속 가능해집니다.

80, 443 포트만 외부에 노출시키고 URL을 통해서만 들어오기 때문에 보안이 강화됩니다.

또한 Traefik은 웹 대시보드와 미들웨어 지원, Let's Encrypt 지원 등 강력한 기능을 갖추고 있습니다.

Traefik 다이어그램

다양한 기능을 갖춘 Traefik을 설치하는 방법을 알아보겠습니다.

 

1. Traefik 기본 설정

먼저 웹 대시보드에 접속할 때 사용할 비밀번호를 생성합니다.

먼저 Basic auth에 사용할 비밀번호를 생성하기 위해 apache2-utils를 설치합니다.

sudo apt-get install -y apache2-utils

다음 명령어로 패스워드를 생성하면 됩니다.

htpasswd -nb admin 비밀번호

admin 대신 사용을 원하는 아이디를 입력해도 됩니다.

그리고 비밀번호에는 실제 원하는 비밀번호를 입력하면 됩니다.

다음과 같은 형태로 값이 출력되는데 이 값을 저장해 둡니다.

admin:$apr1$nnxKVbxh$63qwiV2RfGfLYNFKZr0n3/

이제 Traefik을 위한 디렉토리와 파일들을 생성합니다.

sudo mkdir -p /data/traefik/config/rules

Traefik은 TOML이라는 포맷으로 설정이 가능합니다.

생성한 디렉토리 밑에 traefik.toml 파일을 생성하고 내용을 작성합니다.

sudo nano /data/traefik/config/traefik.toml

내용의 이메일주소 부분은 본인의 이메일 주소를 입력한 후에 traefik.toml 파일에 기록합니다.

[entryPoints]
  [entryPoints.web]
    address = ":80"
    [entryPoints.web.http.redirections.entryPoint]
      to = "websecure"
      scheme = "https"

  [entryPoints.websecure]
    address = ":443"

[api]
  dashboard = true
  insecure = true

[ping]

[log]
  filePath = "/logs/traefik.log"
  level = "INFO"

[accessLog]
  filePath = "/logs/access.log"
  bufferingSize = 100
  [accessLog.filters]
    statusCodes = ["204-299", "400-499", "500-599"]

[serversTransport]
  insecureSkipVerify = true

[certificatesResolvers.lets-encrypt.acme]
  email = "이메일주소"
  storage = "acme.json"
  [certificatesResolvers.lets-encrypt.acme.tlsChallenge]

[providers.docker]
  watch = true
  exposedByDefault = false
  network = "web"

[providers.file]
  directory = "/rules"
  watch = true

[tls.options]
  [tls.options.default]
    minVersion = "VersionTLS12"
    curvePreferences = ["secp521r1", "secp384r1"]
    cipherSuites = [
      "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
      "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
      "TLS_AES_128_GCM_SHA256",
      "TLS_AES_256_GCM_SHA384",
      "TLS_CHACHA20_POLY1305_SHA256"
    ]
    sniStrict = true

이제 middlewares.toml 파일을 생성합니다.

sudo nano /data/traefik/config/rules/middlewares.toml

다음 내용을 입력하고 저장하면 됩니다.

[http.middlewares.simpleAuth.basicAuth]
  users = [
    "admin:$apr1$nnxKVbxh$63qwiV2RfGfLYNFKZr0n3/"
  ]

users 부분에는 처음에 htpasswd 명령어로 생성한 값을 그대로 입력하면 됩니다.

다음으로 routers.toml을 생성합니다.

sudo nano /data/traefik/config/rules/routers.toml

다음 내용을 입력하고 저장하면 됩니다.

[http.routers.api]
  rule = "Host(`traefik.도메인`)"
  entrypoints = ["websecure"]
  middlewares = ["simpleAuth"]
  service = "api@internal"
  [http.routers.api.tls]
    certResolver = "lets-encrypt"

내용의 rule 부분의 도메인은 본인이 보유하고 있는 도메인(xxx.duckdns.org)으로 변경하면 됩니다.

마지막 Let's Encrypt 정보를 담을 acme.json 파일을 생성하고 권한을 변경합니다.

sudo touch /data/traefik/config/acme.json
sudo chmod 600 /data/traefik/config/acme.json

이것으로 기본적인 설정이 준비됩니다.

 

2. Traefik 컨테이너 생성

Traefik 컨테이너를 생성하기 위해 docker-compose.yml 파일을 작성합니다.

현재 최신 버전인 v2.10.3을 기준으로 작성을 했습니다.

sudo nano ~/docker-compose.yml

다음과 같이 입력하고 저장합니다.

version: "3.9"
services:
  traefik:
    image: traefik
    container_name: traefik
    env_file: .env
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ${TRAEFIK_PATH}/config/traefik.toml:/traefik.toml
      - ${TRAEFIK_PATH}/config/rules:/rules
      - ${TRAEFIK_PATH}/config/acme.json:/acme.json
      - ${TRAEFIK_PATH}/logs:/logs
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    networks:
      - web
    healthcheck:
      test: ["CMD", "traefik", "healthcheck", "--ping"]
      interval: 10s
      timeout: 10s
      retries: 30
    restart: always

  whoami:
    image: traefik/whoami
    container_name: whoami
    env_file: .env
    networks:
      - web
    labels:
      - traefik.enable=true
      - traefik.docker.network=web
      - traefik.http.routers.whoami.rule=Host(`whoami.${URL}`)
      - traefik.http.routers.whoami.tls=true
      - traefik.http.routers.whoami.tls.certresolver=lets-encrypt
      - traefik.http.services.whoami.loadbalancer.server.port=80

networks:
  web:
    name: web

그리고 환경변수를 설정할 .env 파일을 생성합니다.

sudo nano ~/.env

다음과 같이 내용을 입력해주고 도메인은 본인이 사용할 도메인을 입력해 주면 됩니다.

# Common
URL=도메인

# Traefik
TRAEFIK_PATH=/data/traefik

설정을 완료했으면 서비스들을 실행하면 됩니다.

sudo docker compose up -d

 

3. Traefik 대시보드 접속 및 적용 확인

서비스가 실행되고 웹 브라우저에 http://IP주소:8080로 접속하면 Traefik 대시보드가 표시됩니다.

Traefik

주소창에 traefik.도메인 형태로 입력하면 외부에서도 접속이 가능합니다.

처음에 입력했던 유저명과 패스워드를 입력하면 됩니다.

웹 브라우저에서 whoami.도메인으로 접속해 보면 해당 서비스로 접속되는 것을 확인할 수 있습니다.

테스트를 위해 추가한 whoami는 정상 동작 확인 후 삭제해도 됩니다.

추후에 서비스들을 리버스 프록시에 추가하려면 서비스 하단에 labels 부분과 networks를 추가하면 됩니다.

Plex의 경우 다음과 같은 내용을 추가하면 됩니다.

    networks:
      - web
    labels:
      - traefik.enable=true
      - traefik.docker.network=web
      - traefik.http.routers.plex.rule=Host(`plex.${URL}`)
      - traefik.http.routers.plex.tls=true
      - traefik.http.routers.plex.tls.certresolver=lets-encrypt
      - traefik.http.services.plex.loadbalancer.server.port=32400

이것으로 Traefik 설치 및 리버스 프록시 설정이 완료됩니다.

반응형