Contents

Traefik2 Wildcard SSL Cloudflare Docker Proxy


Traefik?

Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience. It receives requests on behalf of your system and finds out which components are responsible for handling them.

Intinya adalah sebuah tool untuk memudahkan reverse proxy aplikasi kita tanpa harus setting host/ip address & port manual seperti misalnya di nginx.

Secara pintar si traefik akan membaca setting label dari instance container docker kita tanpa harus repot-repot mengatur ip address maupun portnya. Pun ketika container di-restart, traefik akan otomatis reload.

Saya tidak mengatakan bahwa prosesnya menyenangkan ataupun mudah, tetapi Traefik memang memiliki banyak keunggulan dibandingkan tool lain semisal Nginx, Nginx Proxy Manager, dan Caddy

Untuk perbandingan lebih komprehensif silahkan googling, sudah banyak yang menjelaskan 😁

Kebutuhan

  1. DNS Manager (Cloudflare) Pertama dan terpenting, Sertifikat Wildcard dari Let’s Encrypt hanya dapat dikeluarkan dengan DNS challenge. Ini berarti kita perlu kontrol langsung atas entri DNS kita. Saya menggunakan Cloudflare, yang mana terdaftar sebagai salah satu provider/penyedia yang didukung dalam dokumentasi Traefik HTTPS & TLS (https://doc.traefik.io/traefik/https/acme/).   Cloudflare ini free untuk kebutuhan DNS, silahkan daftar dan atur entri NS dari VPS kita ke Cloudflare, sudah banyak contohnya di internet 😁  

  2. Docker di VPS Karena traefik kita akan dijalankan di docker, silahkan ikuti langkah di bawah.

Struktur Direktori Repo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
├── certs/
│   └── .gitignore
├── docker-compose.yml
├── .env.example
├── .gitignore
├── README.md
└── traefik/
    ├── config.yml
    └── traefik.yml
└── web-sample/
    ├── docker-compose.yml
    ├── .env.example
    └── www/
        └── index.html

Secara singkat repo ini berisi:

  • certs/ Direktori ini akan berisi acme.json hasil generate DNS Challenge dari server Acme ke Cloudflare yang mengarah ke vps kita.
  • traefik/ Direktori ini untuk mengatur konfigurasi traefik, silahkan sesuaikan sesuai konfigurasi yang kita inginkan.
  • web-sample/ Direktori ini untuk contoh container aplikasi yang akan dikelola traefik, sebuah web biasa berisi index.html yang berjalan di web-server nginx
  • .env.example Silahkan sesuaikan isian environment sesuai milik kita, lalu save as menjadi .env

Langkah konfigurasi

Sesuaikan file .env

[email protected], merupakan email aktif kita sebagai syarat menggunakan ACME Lets Encrypt, yang dalam hal ini akan kita samakan dengan email terdaftar di akun Cloudflare. Atau bisa lihat di menu Manage Account > Member

./assets/cf-email.png
Cloudflare Email

DOMAIN=sub.domainmu.tld, merupakan base url dari traefik kita, karena VPS punya saya di sebuah subdomain maka saya setting sesuaikan di url subdomain. Jika link vps anda di root domain, sesuaikan dengan alamat domainnya.

CLOUDFLARE_EMAIL, adalah email yang terdaftar di akun Cloudflare, seperti yang ACME_EMAIL

CLOUDFLARE_DNS_API_TOKEN, adalah token API Cloudflare agar bisa memanipulasi entri DNS kita

Langkah-langkah mendapatkan DNS API Token Cloudflare:

  1. Masuk Profil
./assets/my-profile.png
Cloudflare Profile
 

  1. Pilih menu API Tokens, klik Create Token
./assets/create-token.png
Create Token
 

  1. Pilih Use template Edit zone DNS
./assets/template-edit-zone.png
Edit zone DNS
 

  1. Atur Zona Resource mana yang kita perbolehkan untuk di-manage via API, lalu Continue to summary
./assets/template-edit-zone-continue.png
Continue to summary
 

  1. klik Create Token jika sudah yakin benar apa yang kita pilih
./assets/template-edit-zone-create.png
Create Token Confirm
 

HTTPPASSWD=USER:HTTPDPASS, merupakan pengaturan akses traefik dashboard kita (akses: https://traefik.domain.tld). Ketika diakses kita perlu mengisi user & password agar terproteksi dan tidak sembarangan diakses.

Untuk USER isi dengan username anda atau bebas, HTTPDPASS ini diisi dengan hasil generate password HTTP, kita bisa menggunakan layanan online semacam https://www.web2generators.com/apache-tools/htpasswd-generator

Berikut contoh format isian variabel tersebut, usernamekamu:$apr1$sw2d6oj5$OjkwRvg7fz2vdJMw9LWPJ.

Sesuaikan file traefik.yml

Sesuaikan email Cloudflare anda pada bagian

1
2
3
4
certificatesResolvers:
  cloudflare:
    acme:
      email: [email protected]

Jalankan Container Traefik

Masuk ke shell VPS anda, lalu masuk di direktori kerja repo ini create container traefik dengan perintah docker-compose, silahkan install jika belum.

1
docker-compose up -d

akan membuat container bernama traefik, untuk menghentikannya jalankan perintah

1
docker-compose down

Kita bisa coba cek traefik dengan mengakses https://domain.tld, namun biasanya akan muncul 404 Not Found karena entrypoint (port:80) belum diatur.

Mendaftarkan Aplikasi ke Traefik

Setup Environment Variable

Sebagai contoh sudah ada direktori web-sample. Terdapat konfigurasi di file .env, hal ini sebenarnya hanya kustomisasi yang biasa saya lakukan agar konfigurasi ataupun secret tidak masuk ke dalam source control semacam git.

.env, save as dari .env.example

DOMAIN=web.domain.tld adalah subdomain ataupun domain yang akan kita tentukan sebagai entrypoint container app kita diakses, contoh ini menggunakan subdomain, anda bisa mengatur misalnya sebagai alamat utama domain.tld jika ingin port 80 VPS kita mengakses web ini.

TR_APP=web ini adalah kode unik dari container kita, misalnya kita namai web sebagai identitas instance/container.

1
TR_PORT=80

ini adalah port yang di-expose container kita agar bisa dibaca oleh traefik, sesuaikan port ini dengan port yang di-expose dari Dockerfile atau image docker yang kita gunakan.

1
TR_PATH=web

ini adalah prefix path jika container ingin diakses menggunakan path bukan level domain/subdomain.

Setup Label

Inilah bagian mudahnya mendaftarkan container app kita ke traefik, hanya mengatur label container yang ada di docker-compose.yml aplikasi kita.

Buka file docker-compose.yml aplikasi yang akan didaftarkan traefik, lalu tambahkan label-label seperti berikut.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
labels:
  - "traefik.enable=true"

  # beri nama router unik, entrypoint ambil dari traefik.yml
  - "traefik.http.routers.${TR_APP}-secure.entrypoints=https"
  # beri nama router unik & tentukan domain atau pathnya
  - "traefik.http.routers.${TR_APP}-secure.rule=Host(`${DOMAIN}`)"
  # jika pakai path, uncomment baris dibawah ini
  # - "traefik.http.routers.${TR_APP}-secure.rule=Host(`${DOMAIN}`) && PathPrefix(`/${TR_PATH}`)"
  # servicename ini, samakan dengan baris dibawah ini
  - "traefik.http.routers.${TR_APP}-secure.service=${TR_APP}-secure"
  # ya, servicename yg ini, begitupun port yang di-expose
  - "traefik.http.services.${TR_APP}-secure.loadbalancer.server.port=${TR_PORT}"
  - "traefik.http.routers.${TR_APP}-secure.tls=true"

Sudah saya beri pejelasan singkat apa maksud label tersebut, dan label tersebut sudah di-set minimal agar bisa menjalankan container dan wildcard ssl. Jika ingin lebih detail mempelajari dokumentasi traefik di docker, silahkan akses dokumentasi traefik https://doc.traefik.io/traefik/providers/docker/

Docker Network Traefik

Ada dua opsi menjalankan network docker untuk traefik kita:

  1. Menggunakan network yang telah kita atur misal namanya proxy, atau apapun

Jika menggunakan custom network docker misal namanya proxy maka kita perlu mendaftarkan container child yang akan kita kelola agar masuk/dikelola traefik dengan mengisi network yang sama dengan docker network tersebut, contoh di docker-compose.yml perlu ada konfigurasi

1
2
3
networks:
  proxy:
    external: true

Ini dimaksudkan agar container ini masuk/satu jaringan dengan network yang sudah kita buat di traefik, sehingga urusan edge route akan diserahkan ke traefik.

  1. Menggunakan docker network mode bridge

Secara default di repo ini menggunakan network mode bridge, ini dimaksudkan agar sample contoh mudah dipahami dan container tidak perlu secara manual di daftarkan ke proxy network yang dibuat. Namun hal ini dikembalikan kepada preferensi anda.

Mengakses EntryPoint Aplikasi

Selesai konfigurasi, maka kita coba jalankan container app dengan shell masuk ke direktori aplikasi kita, lalu eksekusi

1
docker-compose up -d

akan menjalankan container aplikasi sesuai docker-compose.yml.

Kita bisa coba cek aplikasi kita dengan mengakses https://domain.tld atau path yang sudah kita atur misalnya https://domain.tld/web.

Ada kendala? Silahkan create issue 😄

di-repost dari repository https://github.com/theoyrus/traefik2-wildcard-ssl-cloudflare