Traefik adalah Edge Router yang powerful, selain itu juga memiliki banyak fitur, memakan sedikit memori, dan memiliki ukuran yang relatif kecil.

Juga, mudah digunakan & dikonfigurasi!

Jika kamu ingin mengetahui lebih lanjut seputar Traefik, bisa baca tulisan Berkenalan dengan Traefik yang ditulis oleh yours truly.

Pada September 2019, Traefik merilis versi major terbarunya: 2.0. Pada saat itu versi tersebut masih dalam status experimental, fitur dashboard belum selesai, dan masih banyak lagi hal-hal menarik yang cuma seorang pemberani aja yang langsung memakainya di production.

Dan pada hari ini, karena sedang nganggur, gue coba migrasi ke v2.1 yang ternyata gak ribet-ribet banget.

yoi infra kita pakai vcs

Tangkapan layar diatas adalah gambaran bagaimana gue mengubah isi yang ada di berkas docker-compose.yml gue.

Dan seperti yang kita tau terhadap perubahan versi major, pasti akan ada breaking changes. Terlebih, di versi ini traefik menggunakan beberapa konsep baru dari yang sebelumnya yang akan kita bahas nanti. Dan sebelum kita ke praktik, mari kita bahas beberapa hal terkait migrasi ini.

Konfigurasi

Kesalahan terbesar gue selama 1.3 jam ngurusin upgrade migrasi ke Traefik versi 2 ini adalah: Enggak baca bagian "Some Tips You Should Know" karena terletak dipaling bawah pisan.

Yang perlu digaris bawahi adalah bagian ini:

Different sources of static configuration (file, CLI flags, ...) cannot be mixed.

Which is what the fuck, kenapa ditaruh dibagian paling bawah?

Oke oke gpp. Dan karena gue melakukan konfigurasi dari 2 sumber (CLI flag & berkas statis) Traefik enggak mau "ngurusin" permintaan yang masuk mungkin karena bingung harus ngambil konfigurasi yang mana (dan yang gue yakin dia prioritasin di berkas statis).

Yang mana, dia akan terus ngasih response 404 Not Found yang padahal sudah gue atur dengan sebaik mungkin.

Dan sekarang, gue atur semua konfigurasi sebagai flag aja karena provider yang gue gunakan sekarang semuanya di Docker.

- --providers.docker=true
- --entrypoints.http.address=:80
- --entrypoints.https.address=:443

- --certificatesresolvers.tlschallenge.acme.httpChallenge.entrypoint=http
- --certificatesresolvers.tlschallenge.acme.email=ssl@edgy.network
- --certificatesresolvers.tlschallenge.acme.storage=/acme/acme.json

- --log=true
- --log.level=DEBUG
- --log.filePath=/etc/traefik/traefik.log
- --log.format=json

- --accesslog=true
- --accesslog.filePath=/etc/traefik/access.log

- --api=true
- --api.dashboard=true
- --api.insecure=false

Flag diatas enggak gue kurangin apalagi disensor karena ya ngapain juga harus disensor ya. Intinya itu cuma buat ngasih tau kalau baris 1-3 gue kasih tau Traefik kalau gue pakai Docker, terus ada 2 entrypoint yang satu port 80 untuk handle protokol http dan yang satu port 443 untuk handle port https. Klasik lah ya.

Baris selanjutnya untuk hal-hal yang berkaitan dengan SSL via Let's Encrypt, dari "cara verifikasi", pemegang sertifikat, dan tempat sertifikat akan disimpan.

Baris selanjutnya tentang nyimpen log berikut dengan lokasinya, dan yang bagian terakhir buat ngasih tau kalau gue mau bisa akses Dashboard dari Traefik. Kalau sebelumnya gue gak butuh, karena tampilan yang sekarang lumayan lucu, jadi gue aktifkan.

Oke-oke klasik ya, silahkan gunakan imajinasi anda bila ingin mengubah flag diatas menjadi format toml ataupun yml, harusnya intuitif sih.

Konsep

Jika sebelumnya Traefik menggunakan konsep "Frontend & Backend" di versi menggunakan konsep "Router, Middleware, dan Services" yang sebenarnya hampir sama tapi dia ada layer lagi sebelum ke services.

Sumber

Gambar diatas adalah versi sebelumnya, yang masih menggunakan konsep Frontend-Backend itu. Dan untuk yang terbaru, kira-kira beginilah gambarannya:

https://traefik.edgy.network — Di password dong pastinya

Keliatannya hampir sama aja ya, intinya kalau kita ambil kasus diatas, jika di Traefik v1 gambaran diatas adalah seperti ini:

  • 1 frontend + (basic) auth
  • 1 backend

Di v2 jadinya:

  • 1 router
  • 1 service
  • 1 (basic) auth middleware

Jadi lebih rapih ya, plus "middleware" ini menjadi satu kesatuan, enggak kayak yang sebelumnya yang seperti "berada" di frontend.

Middleware basic auth itu adalah bawaan dari Traefik, dan sebagaimana konsep middleware yang mana berada diantara "pengatur" dan "pemroses".

Migrasi

Karena gue cuma pakai fitur-fitur dasar aja, jadi tulisan ini berdasarkan perubahan yang terjadi di infra gue.

Frontend

Untuk ngasih tau Traefik bahwa "frontend" A adalah yang bertanggung jawab untuk mengatur request ke blog.evilfactory.id, sebelumnya kita mendefinisikannya seperti ini:

"traefik.frontend.rule=Host:blog.evilfactory.id"

Di versi 2, jadinya seperti ini:

"traefik.http.routers.evilfactory_blog.rule=Host(`blog.evilfactory.id`)"

Jangan bingung dulu, kita bahas satu-satu:

  • http: Di Traefik, ada 2 protokol yang didukung untuk menerima request: HTTP dan TCP. Jelas lah ya maksud dari traefik.http? Ya, entrypoint.
  • routers: Yap, ini tentang "frontend" kita. Kita ngasih tau Traefik kalau baris ini adalah konfigurasi terhadap frontend (atau routers klo di bahasa v2 nya)
  • evilfactory_blog: Ini nama acak aja, tulis nama mantan disitu juga bisa. Berguna sebagai "identifier" apa nama router kita
  • rule: Bukan konsep yang baru, jadi skip.
  • matcher: ini bukan konsep baru juga, tapi cuma ada perbedaan dari sintaks nya aja.

Beginilah gambaran dari Router di Dashboard:

routers

Untuk bagian evilfactory_blog@docker diatas, docker tersebut mengarah ke provider yang digunakan.

Backend

Oke, frontend berguna untuk mengatur request yang masuk, kan? Lalu, siapa yang memprosesnya? Ya backend.

Blog ini (Ghost) menggunakan/mendengarkan port 2368, yang artinya bila ada "request" masuk ke salah satu tujuan dengan port 2368, berarti ghost lah yang bertanggung jawab dalam memprosesnya.

Sebelumnya, untuk ngasih tau Traefik kalau backend kita ini mendengarkan port 2368, kita mendefinisikannya seperti ini:

"traefik.port=2368"

Dan sekarang, bisa kita ubah menjadi seperti ini:

"traefik.http.services.evilfactory_blog.loadbalancer.server.port=2368"

Yang meskipun menggunakan cara sebelumnya pun masih bisa berjalan!

Beginilah kira-kira gambarannya:

services

Sudah pada tau kan maksud dari load balancer itu apa? Jika belum, mari kita bahas nanti di Brief by evilfactorylabs! —Sebuah iklan.

Middleware

Karena jika sebelumnya middleware "menyatu" dengan frontend, jadi disini kita tidak bisa membandingkannya. Misal jika services kamu membutuhkan authentikasi sebelum bisa diakses, kamu salah satu nya bisa menggunakan middleware basicauth yang sudah disediakan oleh Traefik.

- "traefik.http.routers.evilfactory_blog.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=fariz:$$apr1$$Erxxx..xx/"

Baris pertama adalah untuk ngasih tau Traefik bahwa routers tersebut akan "melewati" middleware bernama auth (yang sudah disediakan oleh Traefik) dan baris selanjutnya adalah untuk mengkonfigurasi auth apa yang ingin digunakan berikut dengan kredensialnya.

Brute-force it, folks!

Disitu dikasih tau Router mana aja yang menggunakan middleware tersebut auth.basicauth berikut dengan data users nya.

Eksplisit entrypoint & ssl

Jika sebelumnya untuk entrypoint kita tidak perlu mengaturnya secara eksplisit, di versi 2 harus. Seperti, kamu harus secara eksplisit mengatur bagaimana router kamu menerima koneksi untuk port 80 ataupun 443.

- "traefik.http.routers.evilfactory_brief.entrypoints=https"
- "traefik.http.routers.evilfactory_brief.tls=true"
- "traefik.http.routers.evilfactory_brief.tls.certresolver=tlschallenge"

Juga bila entrypoint yang dimaksud adalah "secure", kamu harus kasih tau secara eksplisit (dibaris 2 diatas). Dan untuk dibaris ketiga, itu untuk ngasih tau "siapa yang ngatur" terkait sertifikat.

Apa kekurangannya? Coba akses situs gue dengan protokol http (klik ini), Traefik akan memberikan jawaban "404 Not Found" karena emang gak gue atur entrypoint & routernya untuk port 80.

Bukan blog gue aja sih yang gak gue atur, tapi semua layanan yang gue punya.

Solusinya—untuk orang males seperti gue—bisa menggunakan fitur "Force HTTPS" yang berada di level CDN. Jadi sebelum Traefik menerima request HTTP dari client, CDN sudah mengubahnya menjadi request HTTPS (contoh).

Diff

Berikut perubahan yang terjadi terhadap docker-compose.yml gue:

Hanya sedikit!

Dashboard

Sekarang kita unboxing Dashboard nya!

home

Sebenarnya sudah jelas lah ya maksudnya apa, intinya buat nampilin informasi seperti ada berapa routers; services, dan middlewares yang ada, ada berapa yang warning & error (plus bisa dilihat detailnya!), dan daftar entrypoint yang ada.

Routers list

Ini adalah daftar Router yang ada, harusnya jumlah router berbanding lurus dengan services ya, kecuali ada beberapa service yang memang tidak di expose ke ingress. Jika routermu menggunakan TLS, maka ditandai dengan lambang perisai.

Services list

Dan ini daftar service (f.k.a backend) yang bertugas memproses request masuk dari router.

Middleware list

Yang terakhir adalah middleware! Disini gue menggunakan 3 middleware, nomor 1 yakni basicauth dan 2-3 itu diatur oleh Traefik (yang buat ngatur API & Dashboard).

Penutup

Butuh waktu sekitar 2 jam untuk menyelesaikan migrasi ini. 1.3 jam habis karena masalah konfigurasi sialan (seriusan ~90 menit) sisanya yaa try & error ketika membaca dokumentasi aja.

Prosesnya lumayan seru, enggak terlalu ribet, dan yaa meskipun ada down sekitar 2 jam (plus purge cache di CDN), tapi dilakukannya pas jam 02.xx-04.xx.

Jika tertarik untuk melakukan migrasi juga (gue sebut migrasi karena yang gue yakin upgrade itu harusnya almost-zero effort!) bisa baca-baca dokumentasi nya disini dan disini yang khusus membahas seputar migrasi.

Jika tertarik berdiskusi seputar Traefik, bisa ping us on Twitter atau bisa main-main disini. Ditulisan selanjutnya akan kita bahas untuk bagian migrasi ke Swarm, itupun kalau gak lupa dan lagi gak malam mingguan.

Thank you!