Тимлиду

1. SSL-сертификаты

Для безопасного доступа к основному домену example.com web-сайта вашего проекта в платформу добавлен сертификат Let`s Encrypt автоматически продлеваемый раз в 3 месяца.


Для безопасного доступа к инфраструктуре мы сгенерировали доменный wildcard сертификат *.example.com и подписали его СА сертификатом, который вы можете найти на хосте в файле tls/certs/tls.crt


Добавьте его в хранилище СА сертификатов удостоверяющих центров вашего браузера. В браузере Mozilla перейдите в меню "Настройки"->"Приватность и защита"-> "Сертификаты"->"Просмотр сертификатов"



Возьмите на хосте ваш CA сертификат в файле tls/certs/tls.crt и добавьте его кнопкой "Импортировать". Теперь у вас есть безопасный доступ по протоколу HTTPs из браузера к инфраструктурным доменам:


    web-интерфейс Gitea:
https://gitea.example.com
    web-интерфейс Jenkins:
https://jenkins.example.com
    web-интерфейс Grafana:
https://grafana.example.com

    development контур
    review разработчиков:
https://review-dev1.example.com
    web-интерфейс управления БД MySQL:
https://phpmyadmin.development.example.com
    web-интерфейс управления БД PostgreSQL:
https://pgadmin.development.example.com

    staging контур
    staing вашего проекта:
https://staging-frontend.example.com
    web-интерфейс управления БД MySQL:
https://phpmyadmin.staging.example.com
    web-интерфейс управления БД PostgreSQL:
https://pgadmin.staging.example.com

    production контур
    web-интерфейс управления БД MySQL:
https://phpmyadmin.production.example.com
    web-интерфейс управления БД MySQL:
https://pgadmin.production.example.com

Так же сертификат СА нужно добавить в хранилище доверенных сертификатов вашей ОС для безопасного доступа git-клиента на вашем лаптопе к git-репозиторию Gitea. В ОС Linux выполните команды:

    sudo mkdir /usr/local/share/ca-certificates/example.com/

    sudo cp certs/tls.crt /usr/local/share/ca-certificates/example.com/example.com_CA.crt

    sudo update-ca-certificates


2. Аутентификация пользователей

Аутентификацией пользователей на платформе занимается keycloak. Чтобы добавить нового пользователя, залогиньтесь в Gitea пользователем owneruser наделенным админскими правами. Справа вверху перейдите в меню "Панель управления" и в меню слева выберите пункт "Identity & Access" -> "Пользователи"

Нажмите кнопку "Создать новый аккаунт" и введите данные создаваемого пользователя. Для примера создадим пользователя с логином dev3

Нажмите кнопку "Создать новый аккаунт". Если вы создаете аккаунт администратора проекта, нажмите пиктограму карандаша напротив созданного пользователя спуститесь вниз включите галочку "У этой учетной записи есть права администратора" и нажмите кнопку "Обновить профиль пользователя"


Разлогиньтесь пользователем owneruser и залогиньтесь в Gitea вновь созданным пользователем dev3 и смените пароль.

Откройте web-интерфейс админа keycloak "Administration Console" по ссылке:


https://auth.example.com



Войдите пользователем admin



Выберите область master слева в верху. Перейдите в меню Users. Выберите пользователя admin, перейдите на вкладку Credentials и смените пароль



Выберите область вашего проекта слева в верху. Перейдите в меню Users. И создайте пользователя кнопкой "Add user"



Задайте имя пользователя (зададим имя dev3, аналогичное выше созданному в Gitea) и обязательно e-mail (иначе пользователт не войдет в Grafana)



Нажмите кнопку "Join group" и внесите пользователя в группу admins, если вы создаете аккаунт администратора проекта, которому нужно дать админские права в Gitea, Jenkins и Grafana. Если вы создаете аккаунт разработчика, то внесите пользователя в группу devs, чтобы разрешить пользователю только просмотр



Нажмите кнопку Join и следом нажмите кнопку Create. Перейдите на вкладку Credentials и задайте пароль пользователю dev3


Теперь нужно связать выше созданный аккаунт пользователя dev3 в Gitea с аккаунтом пользователя dev3 в Keycloak. Войдите на web-интерфейс Gitea, Нажмите кнопку "войти при помощи keycloak" и залогиньтесь пользователем dev3, только что созданным в keycloak. При первом входе keycloak предложет сменить пароль пользователя в keycloak - смените или продублируйте уже заданный пароль. Далее Gitea предложет связать аккаунт из keycloak с аккаунтов в gitea



Введите логин пользователя dev3 и пароль в Gitea и нажмите кнопку "Привязать учетную запись". Теперь пользователь dev3 логинясь в keycloak, будет попадать в личный кабинет пользователя в Gitea и получит достуа к web-интерфейсам Jenkins, Grafana и баз данных phpmyadmin и pgadmin



3. git-репозиторий вашего проекта в Gitea


По умолчанию мы добавим в Gitea пользователя и keycloak пользователя ownewuser для тимлида проекта. Войдите в Gitea пользователем owneruser и паролем, который мы вам выдадим и смените пароль. Это же пароль нужно задать пользователю owneruser в Jenkins для доступа в Gitea п.3. Затем войдите в консоль администратора keycloak и смените пароль пользователя owneruser.

Настройте доступ по ssh ключам git-клиента вашего лаптопа к git-репозиторию Gitea, чтобы не вводить логин и пароль при каждом обращении в git-репозиторий На своем лаптопе сгенерируйте приватный и публичный ssh-ключи:


mkdir gitea-ssh-keys
cd gitea-ssh-keys
ssh-keygen -t rsa -f ./id_rsa_gitea

Приватный ключ загрузите в ОЗУ вашего лаптопа:


ssh-agent
ssh-add ./id_rsa_gitea

Публичный ключ *.pub задайте в аккаунте пользователя owneruser в меню "Настройки" -> "Ключи SSH/GPG"



Пользователем owneruser мы создадим 3 репозитория базового проекта:


frontendфронтент web-сайта вашего проекта
backendбэкенд вашего проекта
mysql/postgresqlбаза данных вашего проекта

3. Пайплайны вашего проекта в Jenkins

Войдите в web-интерфейс Jenkins https://jenkins.example.com администратором admin, с паролем, который мы вам выдадим. Откройте меню "Dashboard" -> "Настроить Jenkins" -> "Users" и смените пароль администратора admin.


Перейдите в меню "Dashboard"->"Настроить Jenkins"->"Credentials" нажмите на пользователя owneruser перейдите в меню "Update" нажмите кнопку "Change Password" введите в поле "Password" пароль, который вы задали для пользователя owneruser в Gitea в п.2 и нажмите кнопку "Save"



По умолчанию в платформе 6 пайплайнов базового проекта:

frontendдеплой фронтенда вашего проекта в контуры staging и production
backendдеплой бэкенда вашего проекта в контуры staging и production
frontend-productionпромошен фронтенда вашего проекта со staging на production
backend-productionпромщшен бэкенда вашего проект со staging на production
mysql или postgresqlдеплой БД вашего проекта в контуры development, staging и production
backend-rollbackоткат бэкенда в production контуре до предыдущих версий

Stages и Jobs пайплайнов вы можете найти Jenkinsfile в одноименных репозиториях в Gitea


4. Развертывание базы данных и прочих сервисов

В каждый из контуров development, staging и production развертывается свой экземпляр сервиса

4.1 база данных PostgresSQL


Войдите в web-интерфейс управления базой данных пользователем owneruser через keycloak:

    development контур:
https://pgadmin.development.example.com
    staging контур:
https://pgadmin.staging.example.com
    production контур:
https://pgadmin.production.example.com



Смените master password в pgadmin4. master password pgadmin4 спрашивает при каждом входе и использует его для шифрования паролей



Смените пароль администратора по умолчанию postgres



4.2 база данных MySQL


Вы можете получить доступ к web-интерфейсам phpmyadmin в контурах development, staging и production по ссылкам:

development контур: https://phpmyadmin.development.example.com

staging контур: https://phpmyadmin.staging.example.com

production контур: https://phpmyadmin.production.example.com


Дефолтная форма аутентификации phpmyadmin отключена

Пользователи, которых вы создали в п.2 выше логинятся в phpmyadmin через keycloak. Пользователи из групы admins имеют доступ web-интерфейсам phpmyadmin во всех трех контурах development, staging и production. Пользователи из группы devs имеют доступ только к web-интерфейсу phpmyadmin только в контуре development. Пользователь успешно залогинившийся в keycloak мэпится в пользователя root БД mysql и соответственно получает полный доступ к БД.

Войдите в web-интерфейсы phpmyadmin в контурах development, staging и production пользователем owneruser и смените пароли пользователя root@localhost и root@%


Теперь нужно передать новые пароли root пользователей mysql в модули phpmyadmin клиентам keycloak. Чтобы не скомпрометировать root пароли mysql в репозиториях кода в Gitea, создайте ConfigMap с переменными окружения и подключите их к модулям phpmyadmin. Рассмотрим для примера только для контура production. Для контуров staging и development делаем аналогично. Найдите на хосте файл phpmyadmin-sso-prod.env и задайте в нем логин и пароль root пользователя mysql:


PMA_USER=root

PMA_PASSWORD=password


Пересоздайте ConfigMap и перезапустите модуль phpmyadmin командами:

kubectl delete configmap phpmyadmin-sso-prod -n production

kubectl create configmap phpmyadmin-sso-prod --from-env-file=phpmyadmin-sso-prod.env -n production

kubectl get pod -n production

kubectl delete pod phpmyadmin-656dc86549-zkxnc -n production



4.3 создайте базу данных и пользователей для поступа к ней


Cоздайте БД вашего проекта и пользователя для доступа к ней


Параметры доступа к БД для окружений staging и production передаются в контейнер БД через переменные окружения в ConfigMap, подключаемый к контейнеру БД


Найдите на хосте файл staging.env и пропишите в нем имя БД, пользователя и пароль для доступа к БД staging окружения. Cоздайте ConfigMap с именем env-config:


kubectl create configmap env-config --from-env-file=staging.env -n staging

Найдите на хосте файл production.env и пропишите в нем имя БД, пользователя и пароль для доступа к БД staging окружения, созданной выше. Cоздайте ConfigMap с именем env-config:


kubectl create configmap env-config --from-env-file=production.env -n production

Клонируйте репозиторий бэкенда себе на лаптоп:

git clone git@gitea.example.com:owneruser/backend.git

В Jenkinsfile задайте имя ConfigMap env-config, созданный выше в переменную stagingEnv в секции staging enviromen:


//=====================staging enviroment==========================
def namespace_staging = 'staging'
def stagingReplicaCount = 1
//def stagingEnv = ''
def stagingEnv = 'env-config'
def stagingSharedPvSize = '1Gi'
//=====================staging enviroment==========================

В Jenkinsfile задайте имя ConfigMap env-config, созданный выше в переменную stagingEnv в секции production enviromen:


//=====================production environment======================
def namespace_production = 'production'
def productionReplicaCount = 1
//def productionEnv = ''
def productionEnv = 'env-config'
def productionSharedPvSize = '1Gi'
//=====================production environment======================

При деплое бэкенда, ConfigMap будут подключены к модулю бэкенда. В модуле бэкенда будут созданы одноименные системные переменные окружения из переменных в ConfigMap который вы сможете использовать в коде вашего проекта

Сделайте commit и push в gitea репозиторий:


git add -A && git commit -m "staging commit1" && git push

Gitea запустит веб-хук в Jenkins. По веб-хуку Jenkins автоматически запустит pipeline, соберет Docker образ вашего бэкенда и задеплоит его в staging контур


Клонируйте репозиторий фронтенда к себе на лаптоп:


git clone git@gitea.example.com:owneruser/frontend.git

Сделайте commit и push в gitea репозиторий:


git add -A && git commit -m "staging commit1" && git push

Gitea запустит веб-хук в Jenkins. По веб-хуку Jenkins автоматически запустит pipeline, соберет Docker образ вашего фронтенда и задеплоит его в staging контур


Зайти на staging вашего проекта вы можете по ссылке:

https://staging-owneruser-frontend.example.com/


5. Промоушен вашего проекта со staging на production

Залогиньтесь в Jenkins через keycloak пользователем owneruser, перейдите на вкладку Dashboard, найдите пайплайн c именем backend-production и нажмите зеленый треугольник справа от него и Jenkins задеплоит текущий Docker образ вашего бэкенда со staging на production


Найдите пайплайн c именем frontend-production и нажмите зеленый треугольник справа от него и Jenkins задеплоит текущий Docker образ вашего фронтенда со staging на production


Зайдите на главную страницу вашего сайта чтобы проверить результат


https://example.com

6. rollback на предыдущий релиз

Если Вы задеплоите в production релиз бэкенда вашего проекта с багом, Вы всегда можете опреативно откатить backend на один из предшествующих релизов с помощью пайплайна backend-rollback.


Войдите в Jenkins пользователем owneruser через keycloak, нажмите на пайплайн с именем backend-rollback в Dashboard и нажмите пункт "Собрать с параметрами" нажмите точку "update commit list" и нажмите кнопку "Собрать" - пайплайн отработает и загрузит доступные коммиты в список "commit" ниже


Каждый коммит Gitea в main-ветку, запускает пайплайн, который собирает Docker-образ и деплоит релиз бэкенда на staging. ID этого коммита Gitea поставлен в соответствие релизу бэкенда на staging и впоследствии релизу бэкенда, promote которого вы делаете со staging на production


Найдите коммит в Gitea, до которого вы хотите откатиться, выберите его в спике "commit", включите точку "rollback", нажмите кнопку "Собрать" и пайплайн откатит бэкенд в production, до релиза соответсвующему выбранному вами коммиту


7. Выдаем задание разработчику

Зарегистрируйте ногого разработчика следуя иструкциям в пункте п.2


Сделайте разработчика соавтором репозиториев frontend и backend. Войдите в Gitea пользователем owneruser и в меню репозитория "Настройки" -> "Соавторы" в окне "Поиск пользователя" введите логин разработчика и нажмите кнопку "Добавить соавтора" с правами "Запись"


Войдите в web-интерфейс управления базой данных в development контуре через keycloak пользователем owneruser:

    для управления БД PostgreSQL
https://pgadmin.development.example.com
    для управления БД MySQL
https://phpmyadmin.development.example.com

Создайте БД вашего проекта в development контуре


Все статические файлы (css, img, javascript) вашего проекта будет отдавать nginx в модуле фронтенда. Организуем доступ nginx из модуля фронтенда к директории со статикой в модуле бэкенда. Для каждого разработчика создайте на хосте Persistent Volume, который при деплое будет подключен одновременно к модулю фронтенда и к модулю бэкенда

Увеличьте номер диска на единицу и создайте директорию под Persistent Volume на хосте:

   mkdir /usr/local/local-disks/shared-development-disk1

Найдите на хосте файл shared-disk.yaml и задайте в нем параметры Persistent Volume:


имя:
   name: shared-development-disk1

размер:
   storage: 1Gi

путь к директории, созданной выше:
     path: "/usr/local/local-disks/shared-development-disk1"

Создайте Persistent Volume командой:


    kubectl apply -f shared-disk.yaml

Выдайте разработчику:


сертификат СА удостоверяющего центра из файла tls/certs/tls.crt на хосте
логин и пароль для доступа к web-интерфейсам сервисов платформы
имя БД в development контуре
cообщите размер Persistent Volume для передачи статики из бэкенда в фронтенд


8. Зашита main-ветки от разработчиков

По умолчанию в main-ветку бэкенда и фронтенда может сделать push любой пользователь, которого вы назначите соавтором и задеплоить изменения на staging. Это неминуемо вызовет путаницу. Мы рекомендуем придерживаться следующей стратегии: разрешить push в main-ветку только владельцу репозитория и запретить всем остальным.


Каждый разработчик будет создать себе ветку для разработки, push-ить в нее и деплоить только в свое динамическое окружение на review. Выполнив задание, разработчик создаст запрос на слияние pull request. Тимлид создаст коммит на слияние merge request, вольет изменения из ветки разработчмка в main-ветку и задеплоит на staging


Залогиньтесь в Gitea владельцем репозиториев. Перейдите в настройках репозитория в меню "Ветки" и нажмите кнопку "Добавить новое правило".


В поле "Шаблоны" -> "Шаблон имени для защищённых веток" введите имя ветки "main". В секции "Отправка" установите точку "Ограничение отправки по белому списку" и перечислите пользователей, которым разрешено делать push в main-ветку. Ниже в разделе "Утверждение запросов на слияние" включите галочку "Ограничить утверждения белым списком пользователей и команд" и перечислите пользователей, которым разрешено вливать изменения в main-ветку. Спуститесь ниже и в секции "Pull Request Merge", установите точку "Ограничить право на слияние белым списком" и перечислите пользователей, которым разрешено вливать изменения в main-ветку. Спуститесь ниже и нажмите кнопку "Сохранить правило"



Разработчик все равно может push-ить изменения в Dockerfile, Jenkinsfile и директорию /helm и тимлид может нечаянно влить эти изменения в main-ветку и "сломать" production. Поэтому запретите разработчику push-ить куда бы то ни было, кроме директории src/ с исходным кодом сайта.


Создайте правило для веток разработчиков. Имена веток разработчиков будут начинаться с префикса dev (например dev-user1, dev-user2). В поле "Шаблоны защищённых файлов (разделённые точкой с запятой ';'):" перечислите файлы и директории, в которые разработчикам запрещено вносить изменения. Ниже в секции "Отправка" установите точку "Включить отправку". Спуститесь ниже и нажмите кнопку "Сохранить правило"


9. Вливаем изменения из ветки разработчика в main-ветку

Выполнив ваше задание, разработчик создаст pull request запрос на слияние (merge) изменений из своей ветки разработчика в main-ветку. Войдите в web-интерфейс владельцем репозиториев проекта owneruser и найдите запрос разработчика на вкладке репозитория "Запросы на слияние". Выберите запрос нажмите на него. В меню "Измененные файлы" проверьте все изменения, который внес пользователь


Если задание выполнено верно,нажмите кнопку "Создать коммит на слияние"

Изменения из ветки разработчика будут влиты в main-ветку, Gitea сгенерирует веб-хук в Jenkins, который соберет и задеплоит новую версию сайта на staging.