Suatu kali saya berpikir untuk mengotomatiskan penyebaran proyek saya. gitlab.com dengan ramah menyediakan semua alat untuk ini, dan tentu saja saya memutuskan untuk menggunakannya setelah memilah dan menulis skrip penerapan kecil. Dalam artikel ini, saya berbagi pengalaman saya dengan komunitas.
TL; DR
- Konfigurasi VPS: nonaktifkan root, login kata sandi, pasang dockerd, konfigurasikan ufw
- Hasilkan sertifikat untuk server dan klien docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktifkan kontrol dockerd melalui soket tcp: hapus opsi -H fd: / / dari konfigurasi buruh pelabuhan.
- Daftarkan jalur sertifikat di docker.json
- Daftarkan dalam variabel gitlab dalam pengaturan CI / CD dengan konten sertifikat. Tulis skrip .gitlab-ci.yml untuk penerapan.
Saya akan menunjukkan semua contoh pada kit distribusi Debian.
Pengaturan VPS awal
Jadi Anda membeli contoh misalnya pada
DO , hal pertama yang harus dilakukan adalah melindungi server Anda dari dunia luar yang agresif. Saya tidak akan membuktikan dan mengklaim apa pun, cukup tampilkan log / var / log / pesan dari server virtual saya:
Pertama, instal ufw firewall:
apt-get update && apt-get install ufw
Aktifkan kebijakan default: blokir semua koneksi masuk, izinkan semua koneksi keluar:
ufw default deny incoming ufw default allow outgoing
Penting: jangan lupa untuk mengizinkan koneksi ssh:
ufw allow OpenSSH
Sintaks umumnya adalah: Izinkan koneksi port: ufw allow 12345, di mana 12345 adalah nomor port atau nama layanan. Tolak: ufw deny 12345
Nyalakan firewall:
ufw enable
Kami meninggalkan sesi dan masuk lagi melalui ssh.
Tambahkan pengguna, berikan dia kata sandi dan tambahkan dia ke grup sudo.
apt-get install sudo adduser scoty usermod -aG sudo scoty
Selanjutnya, sesuai rencana, Anda harus menonaktifkan entri kata sandi. Untuk melakukan ini, salin kunci ssh Anda ke server:
ssh-copy-id root@10.101.10.28
IP server Anda harus ditentukan. Coba sekarang untuk login di bawah pengguna yang dibuat sebelumnya, Anda tidak perlu lagi memasukkan kata sandi. Selanjutnya, dalam pengaturan konfigurasi, ubah yang berikut:
sudo nano /etc/ssh/sshd_config
nonaktifkan entri kata sandi:
PasswordAuthentication no
Mulai kembali daemon sshd:
sudo systemctl reload sshd
Sekarang, jika Anda atau orang lain mencoba masuk sebagai root, itu tidak akan berhasil.
Selanjutnya, atur dockerd, saya tidak akan menjelaskan prosesnya di sini, karena semuanya sudah dapat diubah, ikuti tautan ke situs web resmi dan lakukan langkah-langkah untuk menginstal buruh pelabuhan di mesin virtual Anda:
https://docs.docker.com/install/linux/docker- ce / debian /Pembuatan Sertifikat
Untuk mengelola daemon buruh pelabuhan dari jarak jauh, diperlukan koneksi TLS terenkripsi. Untuk melakukan ini, Anda harus memiliki sertifikat dan kunci, yang harus dibuat dan ditransfer ke mesin jarak jauh Anda. Ikuti langkah-langkah yang diberikan dalam instruksi di situs buruh pelabuhan resmi:
https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Semua dihasilkan * .pem file untuk server, yaitu ca.pem, server.pem, key.pem harus ditempatkan di direktori / etc / docker di server.
Pengaturan Dockerd
Dalam skrip untuk meluncurkan daemon buruh pelabuhan, hapus opsi -H df: //, opsi ini menjawab host mana yang dapat mengendalikan daemon buruh pelabuhan.
# At /lib/systemd/system/docker.service [Service] Type=notify ExecStart=/usr/bin/dockerd
Selanjutnya, buat file pengaturan, jika belum ada dan tentukan opsi:
/etc/docker/daemon.json { "hosts": [ "unix:///var/run/docker.sock", "tcp://0.0.0.0:2376" ], "labels": [ "is-our-remote-engine=true" ], "tls": true, "tlscacert": "/etc/docker/ca.pem", "tlscert": "/etc/docker/server.pem", "tlskey": "/etc/docker/key.pem", "tlsverify": true }
Mari kita aktifkan koneksi di port 2376:
sudo ufw allow 2376
Mulai ulang dockerd dengan pengaturan baru:
sudo systemctl daemon-reload && sudo systemctl restart docker
Periksa:
sudo systemctl status docker
Jika semuanya berwarna hijau, maka kami percaya bahwa kami telah berhasil mengkonfigurasi buruh pelabuhan di server.
Mengkonfigurasi pengiriman berkelanjutan pada gitlab
Agar pekerja gitalab dapat menjalankan perintah pada host jarak jauh buruh pelabuhan, perlu untuk menentukan bagaimana dan di mana menyimpan sertifikat dan kunci untuk koneksi terenkripsi dengan dockerd. Saya memecahkan masalah ini dengan hanya menuliskannya ke dalam variabel di pengaturan gitlbab:
Cukup tampilkan konten sertifikat dan kunci melalui cat:
cat ca.pem
. Salin dan tempel ke nilai variabel.
Mari kita menulis skrip untuk penyebaran melalui gitlab. Gambar docker-in-docker (dind) akan digunakan.
.gitlab-ci.yml image: name: docker/compose:1.23.2 # entrypoint , dind entrypoint: ["/bin/sh", "-c"] variables: DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 services: - docker:dind stages: - deploy deploy: stage: deploy script: - bin/deploy.sh #
Konten skrip penerapan dengan komentar:
bin / deploy.sh #!/usr/bin/env sh # , - set -e # , , set -v # DOCKER_COMPOSE_FILE=docker-compose.yml # DEPLOY_HOST=185.241.52.28 # , - gitlab- DOCKER_CERT_PATH=/root/.docker # , docker info docker-compose version # ( - gitlab') mkdir $DOCKER_CERT_PATH # , . echo "$CA_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/ca.pem echo "$CERT_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/cert.pem echo "$KEY_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/key.pem # chmod 400 $DOCKER_CERT_PATH/ca.pem chmod 400 $DOCKER_CERT_PATH/cert.pem chmod 400 $DOCKER_CERT_PATH/key.pem # docker-. , export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://$DEPLOY_HOST:2376 # , docker-compose \ -f $DOCKER_COMPOSE_FILE \ ps # docker-, "" docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker-compose \ -f $DOCKER_COMPOSE_FILE \ pull app # docker-compose \ -f $DOCKER_COMPOSE_FILE \ up -d app
Masalah utama adalah โmengekstraksiโ isi sertifikat dalam bentuk normal dari variabel gitlab CI / CD. Saya tidak mengerti mengapa koneksi ke host jarak jauh tidak berfungsi. Di tuan rumah, saya melihat jurnal buruh pelabuhan sudo journalctl -u, ada kesalahan jabat tangan. Saya memutuskan untuk melihat apa yang umumnya disimpan dalam variabel, untuk ini Anda dapat melihat cat -A $ DOCKER_CERT_PATH / key.pem. Kesalahan ini diatasi dengan menambahkan penghapusan simbol carriage tr -d '\ r'.
Selanjutnya dalam skrip, Anda dapat menambahkan tugas pasca-rilis sesuai kebijakan Anda. Anda dapat melihat versi yang berfungsi di repositori saya
https://gitlab.com/isqad/gitlab-ci-cd