Konfigurasi Portainer Dan Traefik Menggunakan Docker Compose

Jan 23, 2023 · 2 mins read
Konfigurasi Portainer Dan Traefik Menggunakan Docker Compose

Pada artikel sebelumnya kita sudah menggunakan docker-compose untuk menjalankan portainer. Tapi port yang digunakan masih default 9000 dan belum menggunakan https. Kali ini kita akan menggunakan Traefik sebagai reverse proxy untuk redirect traffic dari/ke luar menuju ke portainer sehingga port yang terbuka hanya 80 (http) dan 443 (https).

Daftar Isi:

Prasyarat:

  • Docker Engine & Docker Compose
  • Domain/sub domain yang sudah disiapkan

Buat File docker-compose.yml untuk Traefik

Untuk mempermudah kelola foldernya, kita buat file docker-compose.yml terpisah antara Traefik dan Portainer.

mkdir traefik
cd traefik/
touch docker-compose.yml
nano docker-compose.yml

Isikan kode berikut pada docker-compose.yml yang ada didalam folder traefik

version: '3.8'
networks:
  routing:
    driver: bridge
services:
  traefik:
    image: traefik:2.9.1
    restart: always
    container_name: reverse_proxy_traefik
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./configs/traefik.yml:/etc/traefik/traefik.yml
      - ./configs/dynamic:/etc/traefik/dynamic
      - ./certificates/acme.json:/etc/traefik/acme/acme.json
    networks:
      - routing

Buat File acme.json

mkdir certificates
touch certificates/acme.json
chmod 600 certificates/acme.json

Buat File traefik.yml

mkdir configs
nano configs/traefik.yml

Isikan file traefik.yml dengan kode dibawah ini.

## static configuration

global:
  # Send anonymous usage data
  sendAnonymousUsage: false

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    directory: /etc/traefik/dynamic
    watch: true

certificatesResolvers:
  letsencrypt:
    acme:
      tlschallenge: true
      httpchallenge:
        entrypoint: web
      email: alamat@email.com
      storage: /etc/traefik/acme/acme.json

log:
  level: ERROR

sesuaikan alamat@email.com dengan email anda, untuk verifikasi ssl let’s encrypt.

Buat File global-middlewares.yml dan tls.yml

mkdir configs/dynamic
touch configs/dynamic/global-middlewares.yml
touch configs/dynamic/tls.yml

untuk file global-middlewares.yml isikan berikut

http:
  middlewares:
    redirect-to-https:
      redirectScheme:
        scheme: https
        permanent: true
    hsts-minimal:
      headers:
        stsSeconds: 31536000
        stsIncludeSubdomains: false
        stsPreload: false
        forceSTSHeader: true
    hsts-standard:
      headers:
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        stsPreload: false
        forceSTSHeader: true
    hsts-full:
      headers:
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        stsPreload: true
        forceSTSHeader: true

sedangkan untuk tls.yml isikan berikut

tls:
  options:
    default:
      minVersion: VersionTLS12
    mintls13:
      minVersion: VersionTLS13

Jalankan traefik terlebih dahulu

docker-compose up -d

Buat File docker-compose.yml untuk Portainer

Setelah Traefik jalan, lanjutkan dengan portainer.

cd ~
mkdir portainer
touch portainer/docker-compose.yml

isikan kode berikut

version: "3.3"

services:
  portainer:
    container_name: portainer
    image: portainer/portainer-ce:2.16.0
    command: -H unix:///var/run/docker.sock
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik_webgateway"
      # https
      - "traefik.http.routers.portainer.rule=Host(`portainer.contoh.com`)"
      - "traefik.http.routers.portainer.tls=true"
      - "traefik.http.routers.portainer.tls.certresolver=letsencrypt"
      - "traefik.http.routers.portainer.entrypoints=websecure"
      # http (redirect to https)
      - "traefik.http.routers.portainer-http.rule=Host(`portainer.contoh.com`)"
      - "traefik.http.routers.portainer-http.entrypoints=web"
      - "traefik.http.routers.portainer-http.middlewares=redirect-to-https@file"
      - "traefik.http.services.portainer.loadbalancer.server.port=9000"
    networks:
      - routing

volumes:
  portainer_data:
    external: true

Sesuaikan domain portainer.contoh.com dengan domain yang sudah kita siapkan. Jangan lupa untuk create volume terlebih dahulu

docker volume create --name=portainer_data

Setelah semua selesai, jalankan docker-compose.yml pada portainer

Sharing is caring!