Ilya95
@Ilya95
Frontend разработчик

Как поставлять ssl сертификаты для docker image nginx в gitlab ci?

Есть вариант с добавлением сертификатов в образ при сборке, а сертификаты хранить в ci переменных в gitlab.
Но их нельзя замаскировать, так как это не просто строка. Тогда придется делать два сертификата, а переменные дублировать как protected.

Но так тоже не гибко получается, запихивать сертификаты в образ. Если только они не под wildcard.

(намеренно упрощенные конфиги для наглядности)
Dockerfile:
FROM nginx AS web

COPY ./nginx/.cert /etc/ssl/


.gitlab-ci.yml:
build:
  stage: build
  script:
    - echo $SSL_KEY >> nginx/.cert/ssl.key # retrive content from var and create file
    - echo $SSL_CERT >> nginx/.cert/ssl.crt
    - docker build -t $IMAGE .
    - rm -rf nginx/.cert/* # remove local certs


или монтировать сертификаты как volumes, но обновлять их потом будет лишняя ручная работа

docker-compose.yml:
version: "3.4"

services:
  app:
    image: nginx
    volumes:
      - "nginx/.cert:/etc/ssl/"


Какой вариант лучше или есть ли еще? Есть идея в конечном счете использовать traefik, но пока такой вариант не рассматривается.
  • Вопрос задан
  • 776 просмотров
Решения вопроса 1
Ilya95
@Ilya95 Автор вопроса
Frontend разработчик
В итоге по совету Александр Карабанов буду хранить в GitLab CI маскированных переменных как base64, а декодировать в момент развертывания сервиса:

(примеры намеренно упрощены)
Dockerfile:
FROM nginx:1.21

COPY nginx/bin/40-ssl-decoding.sh /docker-entrypoint.d/
RUN  chmod +x /docker-entrypoint.d/40-ssl-decoding.sh


40-ssl-decoding.sh:
#!/bin/sh

echo "Decoding SSL certs...";

echo $SSL_KEY | base64 -d >> /etc/ssl/ssl.key;
echo $SSL_CRT | base64 -d >> /etc/ssl/ssl.crt;

echo "SSL certs decoded!";
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev
software engineer
Сертификаты не должны быть частью docker image, и должны монтироваться снаружи. Тогда обновление сертификата не будет требовать нового билда продукта.
Прокидывать снаружи их можно через mount
Тогда обновил сертификат на маунте и перезапустил контейнер.
Если жить в кубере/опенщифте - там сертификат можно в секрете хранить и монтировать как файл.
Ответ написан
Комментировать
Viji
@Viji
DevOps Engineer
Собственно, еще как вариант - сохранять сертификаты на какой-то носитель или в cloud secret, к которому дать доступ nginx только контейнеру. Создать в контейнере bash script, кот будет запускаться до запуска ngixn и подтягивать сертификаты с этого носителя

Например...
Dockerfile:

.....................................
.....................................
ENTRYPOINT ["/bin/bash", "/usr/local/bin/entrypoint.sh"]
CMD ["/bin/bash", "-c", "nginx -g 'daemon off;'; nginx -s reload;"]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы