Genesis

Documentation for version: **v0.0.30

new project

Введение

Что такое Genesis

Genesis это инструмент позволяющий автоматизировать настройку инфраструктуры в считанные минуты. Декларативно опишите инфраструктуру один раз и пользуйтесь идемпотентными сборками.

Какую задачу решает Genesis

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

Возможности Genesis

1.) Выбирать платформу:

  • Облако (VM on cloud)
  • Собственный сервер (Self-hosted VPS/VDS)
  • Готовый кластер Kubernetes (Self-hosted/Managed Kubernetes cluster)

2.) Устанавливать домен

3.) Устанавливать собственный Docker Container Registry

4.) Выбирать инструмент оркестрации:

  • Docker-compose
  • Kubernetes

5.) Менять налету настройки

Начало работы

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

Внимание! Dockerfile должен обязательно лежать во вложенной папке, пример.

Впоследствии все образы будут собраны и отправлены в реджистри с именем путь_до_папки_с_Dockerfile:${TAG}, где: - путь_до_папки_с_Dockerfile - путь от корня проекта. - ${TAG} - нормализованное название ветки.

Для формирования сервиса необходимо использовать image формата image: ${REGISTRY_URL}/путь_до_папки_с_Dockerfile:${TAG}.

Формирование docker-compose манифеста

Пример сервиса docker-compose.yml без маршрутизации:

version: '3.3'
services:
  docs:
    container_name: docs
    image: ${REGISTRY_URL}/docs:${TAG}
    restart: always
    ports:
      - "8989:80"

Также genesis предоставляет преднастроенный nginx образ для использования маршрутизации и ssl. Чтобы его использовать - необходимо добавить его в docker-compose.yml.

Для использования автоматической маршрутизации необходимо использовать порты 8000-8999.

Пример docker-compose.yml с маршрутизацией:

version: '3.3'
services:
  docs:
    container_name: docs
    image: ${REGISTRY_URL}/docs:${TAG}
    restart: always
    ports:
      - "8989:80"

  nginx:
    container_name: nginx
    image: jonasal/nginx-certbot:3.2.0-nginx1.23.1
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - nginx_secrets:/etc/letsencrypt
      - ~/user_conf.d:/etc/nginx/user_conf.d:ro
    environment:
      - CERTBOT_EMAIL=${CERTBOT_EMAIL}

volumes:
  nginx_secrets:

Полный пример конфигурации.

Итоговый docker-compose.yaml должен быть помещен в субдиректорию проекта, как показано в примере.

Формирование k8s манифестов

Пример deployment k8s без маршрутизации:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: docs
spec:
  selector:
    matchLabels:
      app: docs
  replicas: 1
  template:
    metadata:
      labels:
        app: docs
    spec:
      containers:
        - image: ${REGISTRY_URL}/docs:${TAG}
          name: docs
          ports:
            - containerPort: 80
      imagePullSecrets:
        - name: registry-credential
      restartPolicy: Always

Для использования автоматической маршрутизации необходимо использовать порты 8000-8999.

Пример deployment k8s с маршрутизацией:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: docs
spec:
  selector:
    matchLabels:
      app: docs
  replicas: 1
  template:
    metadata:
      labels:
        app: docs
    spec:
      containers:
        - image: ${REGISTRY_URL}/docs:${TAG}
          name: docs
          ports:
            - containerPort: 80
      imagePullSecrets:
        - name: registry-credential
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: docs
spec:
  selector:
    app: docs
  ports:
    - name: "8989"
      port: 8989
      targetPort: 80

Полный пример конфигурации.

Итоговые манифесты необходимо поместить в папку k8s, находящуюся в субдиректории проекта, как показано в примере.

Необязательно хранить все манифесты в одном файле, и даже на одном уровне, genesis рекурсивно проходится по всем каталогам внутри папки k8s и аплаит их.

Все сервисы будут автоматически присвоены namespace c именем сформированным по имени ветки.

Дополнительная информация

  • Пример репозитория, который использует genesis - документация.
  • Версионирование genesis обеспечивается через теги. Как использовать версионирование можно посмотреть на странице быстрого старта.
  • Все актуальные переменные (для настройки genesis) можно всегда подсмотреть в файле, выбрав нужную версию в списке тегов (как ветку).