Bir zamanlar projemin dağıtımını otomatikleştirmeyi düşündüm. gitlab.com bunun için tüm araçları nazikçe sağlıyor ve elbette ben de bundan yararlanmaya karar verdim, bunu çözdüm ve küçük bir dağıtım komut dosyası yazdım. Bu yazıda deneyimlerimi toplulukla paylaşıyorum.
TL; DR
VPS'yi kurun: root'u devre dışı bırakın, şifreyle giriş yapın, dockerd'ı yükleyin, ufw'yi yapılandırın
Sertifikaların içeriğiyle CI/CD ayarlarında gitlab değişkenlerine kaydolun. Dağıtım için bir .gitlab-ci.yml komut dosyası yazın.
Tüm örnekleri Debian dağıtımı üzerinde göstereceğim.
İlk VPS kurulumu
Örneğin şu adresten bir örnek satın aldınız: DOYapmanız gereken ilk şey sunucunuzu agresif dış dünyadan korumaktır. Hiçbir şeyi kanıtlamayacağım veya iddia etmeyeceğim, sadece sanal sunucumun log /var/log/messages dosyasını göstereceğim:
Ekran Görüntüsü
İlk önce ufw güvenlik duvarını yükleyin:
apt-get update && apt-get install ufw
Varsayılan politikayı etkinleştirelim: tüm gelen bağlantıları engelle, tüm giden bağlantılara izin ver:
Önemli: ssh aracılığıyla bağlantıya izin vermeyi unutmayın:
ufw allow OpenSSH
Genel sözdizimi aşağıdaki gibidir: Bağlantı noktasına göre bağlantıya izin ver: ufw 12345'e izin verir; burada 12345, bağlantı noktası numarası veya hizmetin adıdır. Reddet: ufw reddet 12345
Güvenlik duvarını açın:
ufw enable
Oturumdan çıkıp ssh ile tekrar giriş yapıyoruz.
Bir kullanıcı ekleyin, ona bir şifre atayın ve onu sudo grubuna ekleyin.
Sunucu IP'si size ait olmalıdır. Şimdi daha önce oluşturduğunuz kullanıcıyı kullanarak giriş yapmayı deneyin; artık şifre girmenize gerek yok. Daha sonra yapılandırma ayarlarında aşağıdakileri değiştirin:
sudo nano /etc/ssh/sshd_config
şifre girişini devre dışı bırak:
PasswordAuthentication no
Sshd arka plan programını yeniden başlatın:
sudo systemctl reload sshd
Artık siz veya bir başkası kök kullanıcı olarak oturum açmayı denerseniz, bu işe yaramayacaktır.
Sonra, dockerd'ı yükleyin, süreci burada anlatmayacağım, çünkü her şey zaten değiştirilebilir, resmi web sitesine giden bağlantıyı izleyin ve sanal makinenize docker yükleme adımlarını izleyin: https://docs.docker.com/install/linux/docker-ce/debian/
Sertifikalar oluşturuluyor
Docker arka plan programını uzaktan kontrol etmek için şifreli bir TLS bağlantısı gereklidir. Bunu yapmak için, oluşturulup uzak makinenize aktarılması gereken bir sertifikaya ve bir anahtara sahip olmanız gerekir. Resmi liman işçisi web sitesindeki talimatlarda verilen adımları izleyin: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sunucu için oluşturulan tüm *.pem dosyaları, yani ca.pem, server.pem, key.pem, sunucudaki /etc/docker dizinine yerleştirilmelidir.
Dockerd'ı ayarlama
Docker daemon launch scriptinde -H df:// seçeneğini kaldırıyoruz, bu seçenek docker daemonunun hangi hostta kontrol edilebileceğini belirliyor.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Daha sonra, eğer mevcut değilse, bir ayarlar dosyası oluşturmalı ve seçenekleri belirtmelisiniz:
Her şey “yeşil” ise, sunucuda docker'ı başarıyla yapılandırdığımızı düşünüyoruz.
Gitlab'da sürekli teslimatı ayarlama
Gitalaba çalışanının uzak bir Docker ana bilgisayarında komutları yürütebilmesi için, Dockerd ile şifreli bir bağlantı için sertifikaların ve anahtarın nasıl ve nerede saklanacağına karar verilmesi gerekir. Bu sorunu gitlbab ayarlarındaki değişkenlere aşağıdakileri ekleyerek çözdüm:
Spoiler başlığı
Sertifikaların ve anahtarın içeriğini cat aracılığıyla çıkarmanız yeterli: cat ca.pem. Değişken değerlerine kopyalayıp yapıştırın.
GitLab aracılığıyla dağıtım için bir komut dosyası yazalım. Docker-in-docker (dind) görüntüsü kullanılacaktır.
Açıklamalarla birlikte dağıtım komut dosyasının içeriği:
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
Asıl sorun, sertifikaların içeriğini gitlab CI/CD değişkenlerinden normal biçimde "çekmek"ti. Uzak ana bilgisayarla bağlantının neden çalışmadığını anlayamadım. Ana bilgisayarda Sudo Journalctl -u docker günlüğüne baktım, el sıkışma sırasında bir hata oluştu. Değişkenlerde genel olarak neyin saklandığına bakmaya karar verdim; bunu yapmak için şu şekilde görünebilirsiniz: cat -A $DOCKER_CERT_PATH/key.pem. tr -d 'r' satır karakterinin kaldırılmasını ekleyerek hatayı aştım.
Daha sonra, kendi takdirinize bağlı olarak komut dosyasına yayın sonrası görevleri ekleyebilirsiniz. Çalışma sürümünü depomda görebilirsiniz https://gitlab.com/isqad/gitlab-ci-cd