Menyiapkan lingkungan pengembangan rumah (buruh pelabuhan + gitlab + DNS)

Intro


Saya tidak dapat menemukan nama yang cocok untuk posting tersebut, jadi saya akan menjelaskan secara singkat apa yang akan dibahas.


Sebagian besar dari kita memiliki beberapa kerajinan pribadi kecil yang tidak melampaui batas rumah kita. Seseorang menyimpannya di komputer yang berfungsi, seseorang di Heroku, seseorang di VPS, dan seseorang memiliki server rumah. Bahkan ada komunitas r / homelab di reddit , di mana orang mendiskusikan berbagai perangkat keras dan perangkat lunak untuk apa yang disebut. laboratorium rumah .


Saya tidak begitu tertarik pada masalah ini, tetapi saya memiliki Intel NUC di tempat saya, yang memainkan musik dari NAS menggunakan MPD . Selain MPD, kerajinan kecil saya berputar di atasnya, yang membantu saya untuk bekerja dengannya: sekarang bot mati untuk telegram, HTTP API pada sinatra dan frontend yang canggung untuk itu.


Dalam sebuah pos saya akan tanpa perincian khusus (banyak yang saya sendiri tidak mengerti) menggambarkan proses pemasangan server DNS untuk bekerja dengan nama domain untuk layanan, skema operasi simultan dari beberapa layanan menggunakan Docker, dan menginstal Gitlab dengan CI. Anda tidak mempelajari sesuatu yang baru, tetapi tiba-tiba "panduan" ini berguna bagi seseorang. Selain itu, saya ingin mendengar saran tentang cara membuatnya lebih mudah / lebih elegan / lebih benar.


Awalnya, kode layanan saya ada di bitbucket / github, dan setelah membuat gambar buruh pelabuhan, saya harus pergi di bawah SSH dan menjalankan beberapa skrip yang membuat / memperbarui wadah dengan layanan. Saya mendapati diri saya berpikir bahwa saya melihat bug kecil yang mengganggu dalam aplikasi, yang tidak saya perbaiki hanya karena saya terlalu malas untuk melakukan seluruh prosedur ini. Jelas, sudah waktunya untuk mengotomatisasi segalanya. Saat itulah ide menginstal Gitlab + CI muncul.


Domain Lokal Menggunakan DNS


Semua kontainer dibuat dengan --network=host untuk mempermudah - cukup menggunakan port yang berbeda dalam aplikasi. Namun, dengan meningkatnya jumlah layanan, ingat aplikasi mana yang menggunakan port. Ya, dan memasukkan alamat IP dengan port di browser setiap kali tidak terlalu bagus, jadi sebelum menginstal gitlab, saya memutuskan untuk berurusan dengan hosting beberapa aplikasi di server yang sama.


Idenya sederhana: kita mengkonfigurasi DNS, memasukkannya ke router, menginstal Nginx dan menggunakan konfigurasinya untuk mengarahkan permintaan ke port yang berbeda tergantung pada domain. Ini akan memungkinkan Anda untuk tidak mengganggu port selama pengembangan, karena kontainer akan mulai menggunakan --publish alih-alih --network=host .


Selama instalasi, panduan ini digunakan . Di dalamnya, konfigurasi dilakukan untuk Ubuntu 16.04, saya punya Debian.


Tindakan selanjutnya dilakukan sebagai root .


Pertama-tama, instal bind9 dan utilitas:


 apt-get install -y bind9 bind9utils bind9-doc dnsutils 

Selanjutnya, kita perlu mengkonfigurasi zona domain. Untuk melakukan ini, tambahkan berikut ini ke file /etc/bind/named.conf.local :


 zone "nondv.home" IN { //    type master; file "/etc/bind/fwd.nondv.home.db"; // Forward lookup file allow-update { none; }; // Since this is the primary DNS, it should be none. }; 

Selain itu, konfigurasi untuk pencarian terbalik ditambahkan ke panduan, tetapi jujur ​​saja, saya tidak benar-benar mengerti mengapa ini diperlukan, jadi saya tidak melakukannya.


Sekarang buat file /etc/bind/fwd.nondv.home.db :


 $TTL 604800 @ IN SOA ns1.mydomain.home. root.mydomain.home. ( 20 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ;Name Server Information IN NS ns1.nondv.home. ;IP address of Name Server ns1 IN A 192.168.0.3 ;A - Record HostName To Ip Address nuc IN A 192.168.0.3 gitlab IN A 192.168.0.3 mpd IN A 192.168.0.3 @ IN A 192.168.0.3 

Selanjutnya, restart bind9 dan atur autorun:


 systemctl restart bind9 systemctl enable bind9 

Perhatikan bahwa saya menggunakan .home bukan .home . Ini dilakukan karena domain nondv.local tidak menyelesaikan tanpa subdomain. Ya, lebih tepatnya dig mengenalinya secara normal, tetapi browser dan curl tidak. Seperti yang dijelaskan oleh seorang kolega kepada saya, ini kemungkinan besar disebabkan oleh berbagai perangkat lunak seperti Bonjour (laptop kantor saya dengan sebuah apel di tutupnya). Secara umum, seharusnya tidak ada masalah dengan domain .home .


Itu saja, sebenarnya. Setelah itu, saya menambahkan DNS sebagai yang utama ke router dan menghubungkannya kembali (sehingga file /etc/resolve.conf diperbarui secara otomatis).


Nginx


Seperti yang saya katakan, untuk dapat mengakses semua layanan pada saat yang sama melalui HTTP pada port 80, kita perlu mengkonfigurasi Nginx sehingga proksi permintaan ke port yang berbeda tergantung pada domain.


Dokumentasi untuk gambar nginx tersedia di situs Docker Hub .


Siapkan file konfigurasi utama /srv/nginx/nginx.conf :


 user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name nondv.home; rewrite ^/$ http://mpd.nondv.home redirect; #  ,       } include /etc/nginx/conf.d/*.conf; } 

Selanjutnya, konfigurasikan domain. Saya hanya akan menampilkan satu:


 # /srv/nginx/conf.d/gitlab.conf server { listen 80; server_name gitlab.nondv.home; location / { proxy_pass http://127.0.0.1:3080; } } 

Wadah diluncurkan oleh perintah:


 docker run --detach \ --network host \ --name nginx \ --restart always \ --volume /srv/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \ --volume /srv/nginx/conf.d:/etc/nginx/conf.d:ro \ nginx:alpine 

Itu saja, sekarang permintaan HTTP ke port 80 akan ditangkap menggunakan nginx dan dialihkan ke port yang diinginkan.


Gitlab


Semuanya sederhana menurut panduan resmi :


 docker run --detach \ --hostname gitlab.nondv.home \ --publish 3080:80 --publish 3022:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab:Z \ --volume /srv/gitlab/logs:/var/log/gitlab:Z \ --volume /srv/gitlab/data:/var/opt/gitlab:Z \ gitlab/gitlab-ce:latest 

Kami menunggu semuanya dikonfigurasi (kita melihat docker logs -f gitlab ) dan setelah itu kita memasukkan wadah ( docker exec -it gitlab bash ) untuk tambahan. pengaturan:


 nano /etc/gitlab/gitlab.rb # or vim # /etc/gitlab/gitlab.rb external_url 'http://gitlab.nondv.home' gitlab_rails['gitlab_shell_ssh_port'] = 3022 # /etc/gitlab/gitlab.rb gitlab-ctl reconfigure 

Untuk keandalan, Anda dapat memulai ulang wadah ( docker container restart gitlab ).


Ci


Gitlab CI sudah terintegrasi, tetapi membutuhkan Gitlab Runner ( dokumentasi ).


Untuk melakukan ini, saya menulis sebuah skrip kecil:


 NAME="gitlab-runner$1" echo $NAME docker run -d --name $NAME --restart always \ --network=host \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:alpine 

Setelah membuat pelari, kita perlu mendaftarkannya. Untuk melakukan ini, buka gitlab (melalui browser), pergi ke area Admin → Tinjauan → Pelari. Ini menggambarkan instalasi pelari. Singkatnya, Anda cukup melakukan:


 docker exec -it gitlab-runner register 

dan jawab pertanyaannya.


Layanan HTTP Anda sendiri


Mereka diluncurkan dengan analogi dengan gitlab. Publikasikan di beberapa port dan tambahkan config ke nginx.


Kesimpulan


Sekarang Anda dapat meng-host proyek Anda di server rumah Anda dan menggunakan kekuatan Gitlab CI untuk mengotomatisasi perakitan dan penerbitan proyek Anda. Lebih mudah melakukan git push dan tidak khawatir memulai, kan?


Saya juga merekomendasikan pengaturan mail untuk gitlab. Secara pribadi, saya menggunakan kotak surat di Yandex. Dokumentasi

Source: https://habr.com/ru/post/id417179/


All Articles