Kiedyś myślałem o zautomatyzowaniu wdrażania mojego projektu. gitlab.com uprzejmie zapewnia wszystkie narzędzia do tego celu i oczywiście zdecydowałem się z niego skorzystać, rozpracowując to i pisząc mały skrypt wdrożeniowy. W tym artykule dzielę się swoimi doświadczeniami ze społecznością.
Zarejestruj ścieżki do certyfikatów w pliku docker.json
Zarejestruj się w zmiennych gitlab w ustawieniach CI/CD z zawartością certyfikatów. Napisz skrypt .gitlab-ci.yml do wdrożenia.
Pokażę wszystkie przykłady dotyczące dystrybucji Debiana.
Wstępna konfiguracja VPS
Kupiłeś więc instancję np DO, pierwszą rzeczą, którą musisz zrobić, to chronić swój serwer przed agresywnym światem zewnętrznym. Nie będę niczego udowadniał ani zapewniał, po prostu pokażę logi /var/log/messages mojego wirtualnego serwera:
Zrzut ekranu
Najpierw zainstaluj zaporę ufw:
apt-get update && apt-get install ufw
Włączmy domyślną politykę: blokuj wszystkie połączenia przychodzące, zezwalaj na wszystkie połączenia wychodzące:
Ważne: nie zapomnij zezwolić na połączenie przez ssh:
ufw allow OpenSSH
Ogólna składnia jest następująca: Zezwól na połączenie według portu: ufw zezwolenia 12345, gdzie 12345 to numer portu lub nazwa usługi. Odmów: ufw odmów 12345
Włącz zaporę sieciową:
ufw enable
Wychodzimy z sesji i logujemy się ponownie przez ssh.
Dodaj użytkownika, przypisz mu hasło i dodaj go do grupy sudo.
IP serwera musi być Twoje. Teraz spróbuj zalogować się przy użyciu utworzonego wcześniej użytkownika, nie musisz już wpisywać hasła. Następnie w ustawieniach konfiguracyjnych zmień:
sudo nano /etc/ssh/sshd_config
wyłącz logowanie hasłem:
PasswordAuthentication no
Uruchom ponownie demona sshd:
sudo systemctl reload sshd
Teraz, jeśli Ty lub ktoś inny spróbuje zalogować się jako użytkownik root, nie zadziała.
Następnie zainstaluj dockerd, nie będę tutaj opisywał procesu, ponieważ wszystko można już zmienić, kliknij link do oficjalnej strony i wykonaj kroki instalacji dockera na swojej maszynie wirtualnej: https://docs.docker.com/install/linux/docker-ce/debian/
Generowanie certyfikatów
Aby zdalnie sterować demonem dokującym, wymagane jest szyfrowane połączenie TLS. Aby to zrobić, musisz mieć certyfikat i klucz, który należy wygenerować i przesłać na zdalną maszynę. Postępuj zgodnie z instrukcjami na oficjalnej stronie dokera: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Wszystkie wygenerowane pliki *.pem dla serwera, a mianowicie ca.pem, serwer.pem, key.pem, muszą zostać umieszczone w katalogu /etc/docker na serwerze.
Konfigurowanie dockerda
W skrypcie uruchamiającym demona dokującego usuwamy opcję -H df://, opcja ta określa, na którym hoście można sterować demonem dokującym.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Następnie należy utworzyć plik ustawień, jeśli jeszcze nie istnieje, i określić opcje:
Jeśli wszystko jest „zielone”, uważamy, że pomyślnie skonfigurowaliśmy doker na serwerze.
Konfigurowanie ciągłego dostarczania na gitlabie
Aby pracownik Gitalaby mógł wykonywać polecenia na zdalnym hoście Dockera, należy zdecydować, jak i gdzie przechowywać certyfikaty oraz klucz do szyfrowanego połączenia z Dockerdem. Rozwiązałem ten problem, po prostu dodając następujące elementy do zmiennych w ustawieniach gitlbaba:
tytuł spoilera
Po prostu wyprowadź zawartość certyfikatów i klucza za pośrednictwem cat: cat ca.pem. Skopiuj i wklej do wartości zmiennych.
Napiszmy skrypt do wdrożenia poprzez GitLab. Zostanie użyty obraz okna dokowanego w oknie dokowanym (dind).
Zawartość skryptu wdrożeniowego wraz z komentarzami:
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
Głównym problemem było „wyciągnięcie” zawartości certyfikatów w normalnej formie ze zmiennych CI/CD gitlaba. Nie mogłem zrozumieć, dlaczego połączenie ze zdalnym hostem nie działa. Na hoście zajrzałem do okna dokowanego dziennika Sudo journalctl -u, wystąpił błąd podczas uzgadniania. Postanowiłem przyjrzeć się temu, co zazwyczaj jest przechowywane w zmiennych; w tym celu możesz wyglądać tak: cat -A $DOCKER_CERT_PATH/key.pem. Pokonałem błąd, dodając usunięcie znaku karetki tr -d „r”.
Następnie możesz według własnego uznania dodać do skryptu zadania po wydaniu. Działającą wersję możesz zobaczyć w moim repozytorium https://gitlab.com/isqad/gitlab-ci-cd