Server VPS yang nyaman untuk proyek kecil: cara menyiapkan



Saya selalu ingin memiliki ruang pribadi di web. Tempat di mana segala sesuatu akan diatur senyaman mungkin bagi saya. Saya melihat solusi terbaik sebagai VPS murah yang bisa saya lengkapi sesuai kebutuhan saya. Untuk waktu yang lama saya tidak dapat mendekati solusi dari masalah ini, tetapi entah bagaimana tanpa disadari seperangkat alat muncul yang memungkinkan saya untuk mengatur lingkungan perangkat lunak seperti yang saya inginkan. 



Jika Anda juga ingin membuat ruang pribadi Anda sendiri di jaringan, tetapi tidak tahu harus mulai dari mana, atau Anda hanya tertarik dengan produk perangkat lunak yang luar biasa seperti Docker, Portainer, Traefik - selamat datang di bawah cat.



pengantar



Sejujurnya, saya tidak terlalu suka baris perintah. Artinya, saya menyukai ide antarmuka universal yang ringan, minimalis, yang hampir tidak memerlukan sumber daya, tetapi jendela hitam dengan kursor yang berkedip membuat saya merasa frustrasi dan tidak berdaya. Dan saya bahkan tahu dari mana saya mendapatkannya. 



Ketika saya masih belajar di institut (ini adalah masa ketika Internet dengan kartu dan warnet pertama kali muncul di kota saya), teman saya, yang pada saat itu sudah berhasil mendapatkan pekerjaan sebagai asisten laboratorium di Departemen Ilmu Komputer, secara aktif mencoba memikat saya di Linux. Dan di sinilah saya, menganggap diri saya seorang ilmuwan komputer tingkat lanjut, memiliki pengalaman, mungkin, ratusan penginstalan Windows, pulang ke rumah setelah lulus dan dengan gerakan percaya diri memasukkan disk dengan kit distribusi Linux ke dalam drive ... Lalu apa? Dan tidak ada. 



Selama bertahun-tahun saya tidak ingat semua detailnya, saya mungkin bahkan berhasil membuatnya, tetapi kemudian terjadi kegagalan - saya hanya tidak mengerti apa yang harus dilakukan. Cara biasa yang bekerja di Windows - mengobrak-abrik panel kontrol secara acak termasuk pengaturan yang berbeda sampai semuanya berfungsi (atau rusak sepenuhnya, tetapi kemudian dimungkinkan untuk menginstal ulang Windows dan memulai dari awal lagi) tidak berfungsi di sini. Yang saya miliki hanyalah konsol yang menolak upaya saya untuk mengubah banyak hal berulang kali. Saya ingat bahwa saya bahkan memiliki sebuah buku tentang Linux, yang juga tidak membantu dengan cara apa pun - perintah yang diberikan di sana, untuk beberapa alasan, untuk beberapa alasan tidak berfungsi. Secara umum, setelah menderita selama beberapa hari, saya kemudian memutuskan sendiri bahwa Linux adalah semacam omong kosong, dan dengan lega saya kembali ke Windows saya yang biasa. 



Ada juga usaha untuk menguasai Linux, hidup berulang kali mempertemukan saya dengan para penggemarnya, yang mencoba menyeret saya ke kamp mereka, saya bahkan entah bagaimana mencoba memasang ghent (tidak berhasil, tentu saja, meskipun saya memiliki cetakan dengan panduan langkah demi langkah tentang cara melakukannya), tetapi kutukan konsol melayang di atas saya, dan dengan setiap kegagalan, perasaan tidak berdaya yang sama semakin kuat. Setelah antarmuka grafis Windows, di mana semua pengaturan ada di depan Anda sekilas, bertabrakan dengan konsol, saya merasa buta, mencoba menemukan jalan saya dengan sentuhan di tempat yang asing. Jadi untuk waktu yang sangat lama saya adalah pendukung tumpukan teknologi Microsoft, pemrograman di .net menggunakan VisualStudio (sangat bagus, dan tidak ada konsol). Mohon jangan menilai secara ketat, mungkin jika pada saat itu saya berkesempatan untuk menempatkan Linux pada mesin virtual,untuk menghadapinya dengan tenang dan internet yang layak di tangan, cerita ini akan mengambil arah yang sama sekali berbeda.



Sekarang semuanya telah berubah. Dengan munculnya web dalam bentuknya yang modern ke dalam kehidupan kita, saya beralih ke Node.js dan mau tak mau mulai dijiwai dengan ideologi konsol dan Linux. Untuk meng-host perkembangan saya, saya membutuhkan VPS, dan ternyata VPS dengan Windows jauh lebih mahal, jadi katak saya melebihi rasa frustrasi saya terkait konsol, dan kehadiran Internet berkecepatan tinggi memungkinkan untuk segera menemukan jawaban untuk yang muncul. pertanyaan. 



Saya belajar menggunakan ssh, menyadari kekuatan git dan mulai secara aktif menggunakan buruh pelabuhan, tetapi saya juga suka menggunakan antarmuka grafis untuk tugas-tugas saya, dan dalam artikel ini saya ingin memperkenalkan Anda pada seperangkat alat luar biasa yang memungkinkan saya untuk menyelesaikan tugas sehari-hari saya, tidak merujuk sekali lagi ke konsol.



Persiapan



Saya membuat VPS dengan konfigurasi minimal (vCPU: 1 core, RAM: 1 GB, NVMe: 20 GB) di macloud . Untuk instalasi di VPS, saya memilih distribusi Debian 10. Saat menginstal, saya langsung menambahkan kunci SSH melalui panel kontrol, sehingga akan lebih nyaman untuk masuk ke konsol menggunakan klien SSH. Untuk percobaan lebih lanjut, Anda memerlukan yang berikut ini:



  1. Perbarui sistem
  2. Instal buruh pelabuhan dan buruh pelabuhan-menulis
  3. Sertakan file swap.


Anda dapat memperbarui sistem operasi dengan perintah berikut:



# apt update

   

# apt upgrade

 ,    .
      
      





Untuk menginstal buruh pelabuhan, ikuti instruksi resmi https://docs.docker.com/engine/install/debian/



Instal dependensi yang diperlukan:



# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
      
      





Tambahkan kunci GPG Docker resmi:



# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
      
      





Tambahkan repositori:



# echo «deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable» | tee /etc/apt/sources.list.d/docker.list > /dev/null
      
      





Sekarang tetap memperbarui daftar paket:



# apt-get update
      
      





dan instal buruh pelabuhan:

# apt-get install docker-ce docker-ce-cli containerd.io
      
      





Anda dapat memeriksa apakah semuanya sudah terpasang dengan benar dengan menjalankan perintah:



# docker run hello-world
      
      





Jika sapaan muncul, maka semuanya berjalan dengan baik. Pada saat penulisan ini, saya telah menginstal versi berikut:



# docker -v

Docker version 20.10.6, build 370c289

      
      





Sekarang Anda perlu menginstal docker-compose. Untuk melakukan ini, kita akan menggunakan instruksi resmi:



https://docs.docker.com/compose/install/



Pertama, kita perlu mendapatkan tautan ke rilis terbaru dari docker-compose. Daftar rilis dapat ditemukan di sini: https://github.com/docker/compose/releases



Pada saat penulisan ini, versi terbaru adalah 1.29.2. Kami membutuhkan versi linux, jadi kami memilih file bernama docker-compose-Linux-x86_64. Mari salin tautannya. Sekarang Anda perlu memasukkan perintah berikut di konsol (tempel tautan yang Anda terima di atas di tempat yang tepat):



# curl -L "<  >" -o /usr/local/bin/docker-compose
      
      





 Dalam kasus saya, ternyata:



# curl -L «https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64» -o /usr/local/bin/docker-compose
      
      





Jalankan perintah dan unduh biner docker-compose.



Langkah terakhir adalah mengatur izin eksekusi untuk itu. Ini dapat dilakukan dengan perintah berikut:



# chmod +x /usr/local/bin/docker-compose
      
      





Jika semuanya berjalan lancar, maka proses instalasi selesai, sekarang Anda dapat memeriksa versi docker-compose. Saya mendapatkannya seperti ini:



# docker-compose -v

docker-compose version 1.29.2, build 5becea4c
      
      





Langkah terakhir adalah mengaktifkan file paging, mengingat jumlah memori yang kecil pasti tidak akan berlebihan:



Buat file 4 GB



# fallocate -l 4G /swapfile

      
      





Mari kita berikan hak yang diperlukan untuk itu:



# chmod 600 /swapfile
      
      





Mari kita inisialisasi sebagai file swap:



# mkswap /swapfile
      
      





Akhirnya, kami mengaktifkan:



# swapon /swapfile
      
      





Anda dapat memeriksa apakah file halaman telah muncul di sistem dengan perintah gratis. Saya mendapatkan semuanya:



# free

              total        used        free      shared  buff/cache   available

Mem:        1010900      150500      143788        2892      716612      714916

Swap:       4194300           0     4194300

      
      





Ada satu langkah terakhir yang tersisa: agar file paging tetap aktif setelah reboot, tambahkan baris berikut ke file / etc / fstab:



/swapfile swap swap defaults 0 0
      
      







Untuk tugas seperti itu, saya suka menggunakan pengelola file Midnight Commander. Ini adalah pengelola file konsol dengan antarmuka klasik. Jika Anda telah menemukan Norton Commander / FAR / TotalCommander, Anda akan dengan mudah memahami cara menggunakannya. Anda dapat menginstalnya dengan perintah berikut:



# apt-get install mc
      
      







Dan jalankan dengan perintah 



# mc

      
      





Mari kita lihat gambar familiar yang menyakitkan:





Sekarang kita akan menemukan file yang diperlukan dan mengeditnya:





Ini menyelesaikan penyiapan awal, Anda dapat melanjutkan.



Portainer



Alat pertama yang ingin saya perkenalkan kepada Anda adalah Portainer. Portainer adalah alat manajemen kontainer untuk Docker, Swarm, Kubernetes, dan Azure ACI. Seperti yang dinyatakan oleh dokumentasi Portainer:



"Dengan meniadakan  kebutuhan pengguna untuk menggunakan antarmuka baris perintah, menulis YAML, atau memahami manifes, Portainer membuat penerapan dan pemecahan masalah menjadi begitu mudah sehingga siapa pun dapat melakukannya."



Untuk tujuan saya, Portainer sempurna. Mari kita kenal dia lebih baik. Menurut dokumentasi https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/, cara termudah untuk melakukannya adalah sebagai berikut:



Buat volume untuk menyimpan data:



# docker volume create portainer_data
      
      





Sekarang Anda dapat memulai Portainer dengan perintah berikut:



# docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
      
      





Setelah menjalankan Portainer, ini akan tersedia di http: // <server ip>: 9000 /



Saat Anda menjalankan Portainer untuk pertama kali, ia akan meminta Anda untuk menentukan kata sandi administrator, setelah itu akan menanyakan Anda bagaimana cara terhubung ke lingkungan Hidup:





Saya memilih opsi untuk terhubung ke Docker lokal, setelah itu layar beranda Portainer muncul:





Seperti yang Anda lihat, titik akhir lokal tersedia, nanti Anda dapat menambahkan koneksi ke node lain jika perlu.



Mari kita masuk ke dalamnya, dan kita akan melihat dasbor yang nyaman dengan informasi ringkasan:





Di sinilah kita dapat mengelola semua aspek cara kerja Docker. Mari kita lihat apa yang kita miliki di wadah kita:





Sejauh ini, satu container adalah Portainer itu sendiri. Antarmuka sangat nyaman untuk melihat dan mengelola penampung, dan ada juga kemampuan untuk menambahkan yang baru. Anda dapat melihat tab lainnya dan melihat betapa nyaman dan bijaksana antarmuka yang dimiliki Portainer.



Yang paling menarik adalah tab Tumpukan. Tumpukan adalah kumpulan penampung yang saling berhubungan yang berjalan dan bekerja bersama. Faktanya, ini sama dengan Docker Compose, konfigurasi yang kami jelaskan di file docker-compose.yml dan kemudian jalankan dengan perintah docker-compose up.  



Portainer memungkinkan Anda menambahkan tumpukan ke sistem dengan berbagai cara, mulai dari mengedit dengan editor bawaan hingga mengunduh dari github.





Format docker-compose digunakan untuk menentukan tumpukan, yang berfungsi di sini di bawah tenda. Dengan menggunakan fungsi ini, paling nyaman bagi saya untuk membangun infrastruktur yang diperlukan dari container.



Pada titik ini, saya mengusulkan untuk menyimpang dari mempelajari kemampuan porter untuk saat ini. Saya pikir Anda telah melihat bahwa ini adalah alat yang serius, berkat itu Anda hampir dapat sepenuhnya meninggalkan penggunaan CLI buruh pelabuhan. Sekarang mari kita lihat sekilas apa yang ingin saya dapatkan sebagai hasil dari VPS ini.



Saya secara berkala memiliki kebutuhan untuk mengembangkan proyek "cepat". Inilah yang saya sebut proyek yang tidak membutuhkan studi mendalam. Ini bisa berupa eksperimen, situs kecil, bot, pengumpul informasi, dll. Apa pun yang tidak memerlukan pembuatan rantai CI / CD. Akan sangat mudah bagi saya untuk mengembangkan dan men-debug aplikasi semacam itu tepat di tempat mereka akan bekerja. Juga, saya cukup sering mengalami situasi ketika saya jauh dari tempat kerja saya dengan lingkungan pengembangan yang dikonfigurasi, dan jika sesuatu dalam proyek saya ini mulai bekerja dengan tidak benar, saya ingin dapat dengan cepat memahami situasi dan memperbaiki masalah. atau hanya mengerjakan proyek saat Anda memiliki waktu luang dari komputer mana pun, meskipun tidak ada apa pun di dalamnya kecuali browser dan akses Internet.



Untuk kemudahan akses, saya memiliki nama domain yang dibeli, dan saya ingin mengkonfigurasi domain tingkat ketiga untuk berbagai alat, sehingga misalnya portainer tersedia di portainer.example.com. Saya juga ingin semuanya berfungsi melalui https, dan agar tidak repot membeli sertifikat SSL, gunakan Let's Encrypt. Persyaratan lainnya adalah bahwa segala sesuatu yang tidak seharusnya dapat diakses publik ditutup dengan otentikasi.



Untuk menerapkan semua ini, mari berkenalan dengan alat hebat berikut. Saya t…



Traefik



Traefik adalah server proxy terbalik yang disetel untuk penanganan kontainer. Fitur berikut penting bagi saya:



  • pembaruan konfigurasi on-the-fly
  • dukungan buruh pelabuhan sebagai penyedia konfigurasi
  • bekerja dengan Let's encrypt out of the box


Untuk menjalankan traefik dengan portainer, kita akan menggunakan contoh docker-compose.yml yang disediakan dalam dokumentasi portainer: https://documentation.portainer.io/v2.0/ad/traefik/rp-traefik/



version: «3.9»

services:

  traefik:

    container_name: traefik

    image: «traefik:latest»

    container_name: traefik

    command:

      - «--entrypoints.web.address=:80»

      - «--entrypoints.websecure.address=:443»

      - «--providers.docker=true»

      - «--providers.docker.exposedbydefault=false»

      - «--log.level=ERROR»

      - «--certificatesresolvers.leresolver.acme.httpchallenge=true»

      - «--certificatesresolvers.leresolver.acme.email=user@mymail.com»

      - «--certificatesresolvers.leresolver.acme.storage=./acme.json»

      - «--certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web»

      - «--entrypoints.web.http.redirections.entryPoint.to=websecure»

      - «--entrypoints.web.http.redirections.entryPoint.scheme=https»

      - «--metrics.prometheus=true»

    ports:

      - «80:80»

      - «443:443»

    volumes:

      - «/var/run/docker.sock:/var/run/docker.sock:ro»

      - «./acme.json:/acme.json»

    networks:

      - intranet

    labels:

      - «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»

      - «traefik.http.routers.http-catchall.entrypoints=web»

      - «traefik.http.routers.http-catchall.middlewares=redirect-to-https»

      - «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»

portainer:

    image: portainer/portainer-ce:2.5.0-alpine

    container_name: portainer

    command: -H unix:///var/run/docker.sock

    restart: always

    volumes:

      - /var/run/docker.sock:/var/run/docker.sock

      - portainer_data:/data

    networks:

      - intranet

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.frontend.rule=Host(`portainer.example.com`)»

      - «traefik.http.routers.frontend.entrypoints=websecure»

      - «traefik.http.services.frontend.loadbalancer.server.port=9000»

      - «traefik.http.routers.frontend.service=frontend»

      - «traefik.http.routers.frontend.tls.certresolver=leresolver»

volumes:

  portainer_data:

networks:

  intranet:

    name: intranet
      
      





Agar proses mendapatkan sertifikat Let's encrypt berhasil, Anda perlu memastikan bahwa catatan DNS dikonfigurasi dengan benar sebelum memulai. Saya menggunakan cloudflare untuk tujuan ini, dan di dalamnya konfigurasinya akan terlihat seperti ini:





Kolom "Konten" harus berisi alamat VPS kami.



Sekarang, jika Anda menyalin docker-compose.yml yang dihasilkan ke server, jalankan perintah berikut:



 # docker-compose up -d
      
      





Kemudian, setelah diluncurkan di portainer.example.com, gambar berikut akan muncul :





Selain itu, itu sudah dilindungi oleh sertifikat Let's Encrypt:





Traefik memiliki dasbor yang sangat berguna untuk membantu Anda memahami jika pengaturan konfigurasi diterapkan dengan benar. Untuk mengaktifkannya, Anda perlu menambahkan baris berikut ke docker-compose.yml:



services:

  traefik:

  ...

    command:

      ...

      - «--api.dashboard=true»

    labels:

      ...

      - «traefik.enable=true»

      - «traefik.http.routers.traefik.entrypoints=websecure»

      - «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»

      - «traefik.http.routers.traefik.tls=true»

      - «traefik.http.routers.traefik.service=api@internal»

      - «traefik.http.routers.traefik.tls.certresolver=leresolver»

      - «traefik.http.services.traefik.loadbalancer.server.port=8080»  
      
      





Anda juga perlu menambahkan domain tingkat ketiga traefik.example.com di pengaturan DNS. Ini dapat dilakukan dengan analogi dengan bagaimana domain untuk portainer ditambahkan sebelumnya. Setelah menerapkan pengaturan di traefik.example.com, kita akan melihat dasbor:





Seperti yang Anda lihat, Traefik telah terbukti menjadi alat yang hebat. Ia bekerja erat dengan buruh pelabuhan, dan kemampuan konfigurasi dinamisnya memungkinkan Anda untuk sepenuhnya meninggalkan penggunaan file konfigurasi untuk pengaturan perutean. Sebagai gantinya, kami hanya menulis semua parameter yang diperlukan sebagai label untuk layanan khusus, sehingga semua setelan berada di satu tempat.



Sekarang saya mengusulkan untuk sedikit menyimpang dari menyiapkan layanan dasar dan menambahkan lingkungan pengembangan ke sistem. Boleh jadi…



Server kode Visual Studio



Bagi saya, lingkungan pengembangan atau IDE selalu menjadi sesuatu yang sangat serius. Paket perangkat lunak yang kuat yang diinstal pada mesin pengembang membutuhkan banyak gigabyte ruang disk dan RAM. Contoh IDE yang telah saya gunakan selama bertahun-tahun, dan masih percaya bahwa ini adalah pilihan terbaik jika Anda bekerja dengan tumpukan teknologi Microsoft, adalah Microsoft VisualStudio. Ketika saya mulai mempelajari Node.js, saya menemukan VSCode, dan terlepas dari nama yang terkait, ini adalah IDE yang sama sekali berbeda, dengan konsep dan kemampuan yang sama sekali berbeda. Fakta bahwa VSCode menggunakan mesin Chrome untuk menampilkan antarmukanya memungkinkan VSCode itu sendiri ditempatkan terpisah. Berkat arsitektur ini, lahirlah Visual Studio Code Server, yang dapat berjalan di VPS, sedangkan antarmuka VSCode dapat diakses melalui browser. Dan tidak, ini bukan editor kode online lainnya,Ini adalah IDE VSCode lengkap yang memiliki semua fitur hebatnya.



Untuk menambahkan Server VSCode ke VPS saya, saya akan membuat tumpukan baru di Portainer, sebut saja server kode dan tambahkan konfigurasi berikut di sana:



version: «3.9»

volumes:

  codeserverdata:

  codeappdir:

networks:

  intranet:

    external: true 

services:

  code-server:

    image: ghcr.io/linuxserver/code-server

    container_name: code-server

    environment:

      - PUID=1000

      - PGID=1000

      - TZ=Europe/London

#      — PASSWORD=password #optional

      - SUDO_PASSWORD=password #optional

      - PROXY_DOMAIN=code.example.com

    volumes:

      - codeserverdata:/config

      - codeappdir:/app

    extra_hosts:

      host.docker.internal: host-gateway

    restart: always

    networks:

      - intranet

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.code.rule=Host(`code.example.com`)»

      - «traefik.http.routers.code.tls=true»

      - «traefik.http.routers.code.tls.certresolver=leresolver»
      
      







Selain itu, sebelum memulai, jangan lupa untuk menambahkan kode domain level ketiga.example.com ke data DNS Anda. Sekarang tinggal mengklik tombol Deploy the stack.



Setelah proses selesai, akan muncul tumpukan baru di portainer, dan jika kita pergi ke code.example.com , kita akan melihat gambar berikut (saya langsung mengaktifkan tema gelap):





Di sini Anda dapat mengembangkan dengan cara yang sama seperti di VSCode versi desktop. Pada umumnya, satu-satunya perbedaan yang saya temui adalah perbedaan dalam pengikatan default dari beberapa pintasan keyboard, tetapi Anda dengan cepat terbiasa dengannya dalam proses penggunaan.



Untuk kenyamanan, saya menghubungkan volume yang saya pasang ke direktori / app ke penampung kode-server, jadi yang terbaik adalah membuat atau menggandakan proyek dari repositori di sana, dalam hal ini datanya tidak akan hilang bahkan ketika penampung dikembalikan. -dibuat.



Gambar ini sudah menginstal Node.js, jadi saya tidak perlu melakukan apa pun dan saya dapat mulai mengerjakan proyek saya segera. Jika Anda membutuhkan YP lain dalam pekerjaan Anda, harap diperhatikan bahwa pembuat gambar ini memiliki katalog mod yang memungkinkan Anda menambahkan dukungan untuk berbagai platform. Anda dapat membaca tentang cara menggunakannya dalam deskripsi gambar di Docker Hub, dan daftar mod resmi dapat ditemukan di sini: mods.linuxserver.io/?mod=code-server



Harap perhatikan juga bahwa kata sandi sudo ditentukan di pengaturan wadah ... Untuk demonstrasi, saya membiarkannya sederhana, tetapi dalam praktiknya lebih baik membuatnya rumit, atau bahkan lebih baik menggunakan properti SUDO_PASSWORD_HASH agar tidak menyimpan kata sandi dalam teks yang jelas. Anda dapat membaca cara melakukan ini dalam deskripsi gambar di sini: hub.docker.com/r/linuxserver/code-server



Seperti yang mungkin sudah Anda ketahui, saat ini akses ke server kode tidak dilindungi dengan cara apa pun dan sekarang siapa pun yang mengunjungi code.example.com akan mendapatkan akses. Ini adalah opsi yang sangat buruk, dan meskipun Anda dapat mengaktifkan akses kata sandi di pengaturan gambar, saya ingin memiliki satu login untuk mengakses semua sumber daya yang terletak di server. Untuk melakukan ini, saya mengusulkan untuk berkenalan dengan alat berikut. Boleh jadi…



KeyCloak 



KeyCloak adalah alat modern untuk mengatur akses ke sistem terdistribusi menggunakan teknologi sistem masuk tunggal. Faktanya, ini adalah satu-satunya alat gratis dengan fungsionalitas canggih yang dapat saya temukan. Jika Anda tahu alternatif yang layak, pastikan untuk menuliskannya di komentar.



Untuk menambahkannya ke sistem saya, saya membuat tumpukan baru yang disebut auth in portainer dan menambahkan konfigurasi berikut ke dalamnya:



version: '3.9'

networks:

  intranet:

    external: true 

services:

 keycloak:

    image: jboss/keycloak

    container_name: keycloak

    restart: always

    networks:

      - intranet

    environment: 

      KEYCLOAK_PASSWORD: password

      PROXY_ADDRESS_FORWARDING: «true»

    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.keycloak.rule=Host(`auth.yourdomain.com`)»

      - «traefik.http.routers.keycloak.tls=true»

      - «traefik.http.routers.keycloak.tls.certresolver=leresolver»
      
      







Setelah mengklik tombol Deploy the stack, KeyCloak akan tersedia di auth.example.com . Jika kita pergi ke sana, kita akan disambut oleh jendela selamat datang KeyCloak:







Mari pergi ke konsol admin:





Nama pengguna adalah admin, dan kata sandi awal adalah yang kami tetapkan dalam konfigurasi tumpukan variabel lingkungan KEYCLOAK_PASSWORD. Setelah login, kita akan masuk ke panel admin KeyCloak:





Rekomendasi untuk konfigurasi awal KeyCloak untuk buruh pelabuhan dapat ditemukan di dokumentasi resmi di sini www.keycloak.org/getting-started/getting-started-docker .



Singkatnya, Anda perlu membuat Realm kustom baru, membuat pengguna di dalamnya, dan menambahkan klien baru.



Untuk klien, Anda perlu menyetel Jenis Akses: rahasia dan menambahkan domain kami ke URI Pengalihan yang Valid, sedangkan ini adalah "https://traefik.example.com/*" dan " code.example.com *":







Setelah menginstal Jenis Akses: rahasia, tab Kredensial akan muncul, di mana Anda dapat mengambil Rahasia, itu akan berguna bagi kami nanti saat pengaturan.



Ini menyimpulkan penyiapan KeyCloak untuk saat ini. Sekarang kita perlu berteman dengan Traefik. Izinkan saya mengingatkan Anda bahwa kami ingin mencegah pengguna yang tidak berkepentingan mengakses code.example.com dan traefik.example.com. Untuk tujuan ini, traefik memiliki middleware ForwardAuth yang memungkinkan Anda mengatur otorisasi melalui layanan eksternal. Untuk memastikan interaksi KeyCloak-nya, kami memerlukan layanan perantara, saya akan menggunakan github.com/thomseddon/traefik-forward-auth . Ini juga tersedia sebagai image di Docker Hub, jadi saya hanya akan menambahkan konfigurasi auth stack portainer dengan layanan ini:



  traefik-forward-auth:

    image: thomseddon/traefik-forward-auth

    container_name: traefik-forward-auth

    environment:

      - DEFAULT_PROVIDER=oidc

      - PROVIDERS_OIDC_ISSUER_URL=https://auth.example.com/auth/realms/example

      - PROVIDERS_OIDC_CLIENT_ID=traefik

      - PROVIDERS_OIDC_CLIENT_SECRET=d7fb86f0-71a9-44f7-ab04-967f086cd89e

      - SECRET=something-random

      - LOG_LEVEL=debug

    labels:

      - «traefik.enable=true»

      - «traefik.http.middlewares.traefik-forward-auth.forwardauth.address=http://traefik-forward-auth:4181»

      - «traefik.http.middlewares.traefik-forward-auth.forwardauth.authResponseHeaders=X-Forwarded-User»

      - «traefik.http.services.traefik-forward-auth.loadbalancer.server.port=4181»

    restart: always

      
      





Di sini, variabel PROVIDERS_OIDC_ISSUER_URL harus berisi jalur ke Alam yang kita buat sebelumnya di Keycloak, PROVIDERS_OIDC_CLIENT_ID harus berisi nama klien yang saya buat sebelumnya di bidang ini, dan PROVIDERS_OIDC_CLIENT_SECRET harus diambil dari tab Kredensial klien ini. Di variabel SECRET, Anda perlu mengisi string acak.



Sekarang, untuk menutup layanan, perutean yang disediakan Traefik, cukup menambahkan baris berikut ke label:



      - "traefik.http.routers.< >.middlewares=traefik-forward-auth"
      
      







Untuk memulainya, saya memutuskan untuk menutup server kode dengan otentikasi, yang saya masuki tumpukannya dan menambahkan konfigurasinya. Hasilnya adalah sebagai berikut (untuk singkatnya, saya hanya mengutip bagian label):



    labels:

      - «traefik.enable=true»

      - «traefik.http.routers.code.rule=Host(`code.example.com`)»

      - «traefik.http.routers.code.tls=true»

      - «traefik.http.routers.code.tls.certresolver=leresolver»

      - «traefik.http.routers.code.middlewares=traefik-forward-auth»
      
      







Klik tombol Perbarui Tumpukan dan coba kunjungi code.example.com. Jika semuanya dilakukan dengan benar, jendela login akan muncul:





Setelah memasukkan nama pengguna dan kata sandi yang benar (yang sebelumnya saya konfigurasikan di KeyCloak), saya masuk ke antarmuka server Kode. Semuanya bekerja!



 Begitu pula saya menutup dashboard traefik dari pengintip. Untuk melakukan ini, saya harus pergi ke konsol (Portainer tidak dapat membuat perubahan pada konfigurasi tumpukan, yang tidak dibuat olehnya, tetapi saya mengangkat Traefik dari konsol) dan juga mengedit docker-compose.yml:



    labels:

      - «traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)»

      - «traefik.http.routers.http-catchall.entrypoints=web»

      - «traefik.http.routers.http-catchall.middlewares=redirect-to-https»

      - «traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https»

      - «traefik.enable=true»

      - «traefik.http.routers.traefik.entrypoints=websecure»

      - «traefik.http.routers.traefik.rule=Host(`traefik.example.com`)»

      - «traefik.http.routers.traefik.tls=true»

      - «traefik.http.routers.traefik.service=api@internal»

      - «traefik.http.routers.traefik.tls.certresolver=leresolver»

      - «traefik.http.routers.traefik.middlewares=traefik-forward-auth»

      - «traefik.http.services.traefik.loadbalancer.server.port=8080»
      
      







Untuk memeriksanya, saya pergi ke traefik.example.com. Untuk memastikan bahwa semuanya berfungsi sebagaimana mestinya, saya harus membuka jendela browser dalam mode penyamaran, jika tidak sistem mengenali saya dan tidak meminta kata sandi, karena saya sebelumnya masuk untuk mengakses server kode dan oleh karena itu KeyCloak diautentikasi saya secara otomatis. 



Jadi, dengan menggunakan kombinasi KeyCloak dan Traefik, saya berhasil melindungi elemen sensitif sistem saya dari akses yang tidak sah. Keuntungan dari pendekatan ini adalah memungkinkan Anda melakukan ini meskipun tidak ada mekanisme autentikasi berpemilik. Ada, tentu saja, kekurangannya - KeyCloak cukup berat, membutuhkan banyak sumber daya, terutama memori, dan dalam hal kemampuan ini jelas berlebihan, kemungkinan besar saya tidak akan membutuhkan sebagian besar dari apa yang dapat dilakukannya. Atau, layanan cloud dapat digunakan, misalnya traefik-forward-auth memiliki dukungan Google OAuth bawaan.



kesimpulan



Dalam artikel ini, kami berkenalan dengan seperangkat alat, yang penggunaannya bersama dapat sangat menyederhanakan dan mengotomatiskan berbagai tugas yang muncul saat ini dalam praktik banyak spesialis TI. Pengaturan seperti:



  • Koneksi nama domain
  • Konfigurasi TLS
  • Memperoleh dan memasang sertifikat
  • Autentikasi


dilakukan dalam beberapa baris tepat di konfigurasi layanan.



Tentu saja, saat menyiapkan, saya harus melakukan banyak hal dari konsol, tetapi di masa mendatang, dengan penggunaan sehari-hari, sistem yang dibangun akan memungkinkan saya untuk mengurangi penggunaannya, yang tidak diragukan lagi merupakan nilai tambah bagi saya.



Ketika saya menulis artikel ini, kesulitan utama adalah mengumpulkan semua informasi yang diperlukan. Banyak hal dari dokumentasi tidak jelas dan seringkali untuk membuat sistem berfungsi sesuai kebutuhan, Anda harus mencari solusi untuk masalah pada berbagai masalah di github dan pertanyaan dari stackoverflow. Oleh karena itu, saya mencoba menyoroti sejumlah poin secara lebih detail, dan saya berharap penelitian saya akan membantu seseorang untuk lebih memahami produk yang dijelaskan.



Saya juga dengan tulus menantikan kritik yang membangun di komentar, dan ide tentang bagaimana melakukan apa yang saya coba terapkan di sini dengan lebih baik. Misalnya, saya sangat ingin mencari alternatif yang lebih ringan untuk KeyCloak, karena agak berat untuk tugas semacam ini.



Untuk kenyamanan, saya menempatkan file konfigurasi di repositori di sini: https://github.com/debagger/vps-docker-workspace



Terima kasih atas perhatian Anda!






Server cloud dari Macleod cepat dan aman.



Daftar menggunakan tautan di atas atau dengan mengklik spanduk dan dapatkan diskon 10% untuk bulan pertama menyewa server dengan konfigurasi apa pun!






All Articles