Перейти к содержанию

Установка сервисов People Hub

  1. Для того, чтобы развернуть сервисы входящие в состав продукта VK People Hub в кластере Kubernetes, мы рекомендуем использовать наш универсальный helm chart:

    • Добавьте helm repository (репозиторий доступен только для авторизованных пользователей)
      helm repo add \
      peoplehub https://chart.people-hub.ru \
      --username=<имя_пользователя> \
      --password=<пароль_пользователя>
      
    • Обновите репозитории helm
      helm repo update
      
    • Подготовьте файл значений для развертывания сервиса.
    • Установите сервис указав путь к файлу значений.

      helm install <release_name> --values=<values_file> peoplehub/universal-chart
      
      1. Образы контейнеров (container images) можно загрузить из нашего container registry (docker.people-hub.ru). Тэг образа соответствует номеру релиза. Например, релизу 3.60.1 соответствует тэг release-peoplehub-v3-60-1.
      Для составления полного списка образов, можно использовать наш скрипт.

    • Скрипт для составления списка образов

      В качестве аргументов необходимо передать номер релиза (например, 3.60.1).

      Например:

      ./get_release_images.sh 3.39.2
      
      Скрипт выведет список образов для всех компонентов. Для работы скрипта потребуются утилиты curl и jq

      get_release_images.sh

      #!/bin/bash
      set -e
      
      # Check if necessary tools are installed
      function check_tools {
          if ! command -v curl >/dev/null 2>&1
              then
                  echo "curl not found"
                  return 1
          fi
          if ! command -v jq >/dev/null 2>&1
              then
                  echo "jq not found"
                  return 1
          fi
      }
      
      # Calculate lower version
      function lower_version {
          local MAJOR=$(echo $1 | cut -d $2 -f 1)
          local MINOR=$(echo $1 | cut -d $2 -f 2)
          local PATCH=$(echo $1 | cut -d $2 -f 3)
          if [ $PATCH -gt 1 ]; then
              local PATCH=$(($PATCH - 1))
          # Uncomment to downscale to minor and/or major release
          # elif [ $PATCH -le 1 ] && [ $MINOR -gt 1 ]; then
          #     local MINOR=$(($MINOR - 1))
          # elif [ $PATCH -le 1 ] && [ $MINOR -le 1 ] && [ $MAJOR -gt 1 ]; then
          #     local MAJOR=$(($MAJOR - 1))
          fi
          if [ -n "$3" ]
          then
          echo "$MAJOR$3$MINOR$3$PATCH"
          else
          echo "$MAJOR$2$MINOR$2$PATCH"
          fi
      }
      
      # Check if current version is lowest
      function is_lowest {
          local PATCH=$(echo $1 | cut -d $2 -f 3)
          if [ $PATCH -lt 2 ]
          then
              return 0
          else
              return 1
          fi
      }
      
      # Get images list
      function get_images {
          local SEARCH=""
          local USER_INPUT=$1
          local RELEASE_TAG=$2
          SEARCH=$(curl --silent -u $DOCKER_REPO_USER:$DOCKER_REPO_PASSWORD -X GET https://$DOCKER_REPO/v2/_catalog | jq -r '.repositories[] | select( . | match("^ph\/.*") )'| xargs -I REPO curl --silent -u $DOCKER_REPO_USER:$DOCKER_REPO_PASSWORD -X GET https://$DOCKER_REPO/v2/REPO/tags/list | jq -r '{name: .name, tag: (.tags[] | select( . == "'$RELEASE_TAG'"))}| "'$DOCKER_REPO'/\(.name):\(.tag)"')
          echo $SEARCH
      }
      
      if ! check_tools -eq 0
          then
              exit 1
      fi
      
      USER_INPUT=$1
      DOCKER_REPO="docker.people-hub.ru"
      echo "Sign in to the container registry"
      read -p 'Username: ' DOCKER_REPO_USER
      read -p 'Password: ' DOCKER_REPO_PASSWORD
      
      CURRENT_RELEASE=$(get_images $1 $(printf "release-peoplehub-v%s" $(echo $USER_INPUT| sed 's/\./\-/g' )))
      until is_lowest $USER_INPUT '.' -eq 0
      do
          USER_INPUT=$(lower_version $USER_INPUT '.')
          CURRENT_RELEASE=$CURRENT_RELEASE"\n"$(get_images $USER_INPUT $(printf "release-peoplehub-v%s" $(echo $USER_INPUT| sed 's/\./\-/g' )))
      done
      echo -e $CURRENT_RELEASE | sort -u
      
  2. Вы можете автоматизировать процесс развертывания сервисов с предварительно подготовленными значениями или выполнить развертывание вручную для каждого из сервисов.

    • Список сервисов:
      • asyncblogs
      • calendar
      • cms-backend
      • comments
      • dictionaries
      • discovery
      • events
      • filestorage
      • frontend
      • gamification
      • groups
      • meetings
      • news
      • notifications
      • pages
      • polls
      • profile
      • reports
      • roles
      • settings
      • tasks
      • termsof-use-service
      • websockets-notifications
  3. Так же для доступа к файлам необходимо проксирование медиа запросов (пример ingress) и public доступ к файлам в объектном хранилище. Ingress можно создать в сервисе minio или в сервисе frontend.

    ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: frontend-minio
    annotations:
        nginx.ingress.kubernetes.io/configuration-snippet: |
        default_type text/html;
        if ($request_uri ~ ".html")
        {
            add_header Content-Type text/html;
        }
        proxy_cache_lock on;
        proxy_cache_lock_timeout 30s;
        proxy_set_header  Authorization "";
        nginx.ingress.kubernetes.io/proxy-body-size: 2000m
        nginx.ingress.kubernetes.io/proxy-connect-timeout: 300s
        nginx.ingress.kubernetes.io/rewrite-target: /media/$1
        nginx.ingress.kubernetes.io/upstream-vhost: filestorage-bucket-2134.hb.bizmrg.com
    spec:
    ingressClassName: nginx
    tls:
        - hosts:
            - people-hub.ru
        secretName: people-hub.ru
    rules:
        - host: people-hub.ru
        http:
            paths:
            - path: /media/(.*)
                pathType: ImplementationSpecific
                backend:
                service:
                    name: s3-media
                    port:
                    number: 80
            - path: /media-fs/(.*)
                pathType: ImplementationSpecific
                backend:
                service:
                    name: s3
                    port:
                    number: 80
    

  4. Выполнить команды

    • После первого развертывания

      • Для всех сервисов, основанных на фреймворке Django необходимо создать суперпользователя для административной панели. Для этого в shell каждого контейнера выполняем команду python manage.py createsuperuser

        Сервис Команда
        DICTIONARY python manage.py createsuperuser
        DISCOVERY ----
        FILESTORAGE python manage.py createsuperuser
        NOTIFICATOR python manage.py createsuperuser
        PAGES python manage.py createsuperuser
        PROFILE python manage.py createsuperuser
        ROLES python create_admin_panel_user.py
        SETTINGS python create_admin_panel_user.py
        WEBSOCKET ----
        ASYNC-BLOGS ----
        BLOGS python manage.py createsuperuser
        CALENDAR python manage.py createsuperuser
        CMS python create_admin_panel_user.py
        COMMENTS python create_admin_panel_user.py
        EVENTS python manage.py createsuperuser
        GAMIFICATIONS python manage.py createsuperuser
        GROUPS python manage.py createsuperuser
        MEETINGS python manage.py createsuperuser
        NEWS ----
        POLLS python manage.py createsuperuser
        REPORTS ----
        TASKS python manage.py createsuperuser
        TERMSOFUSE python manage.py createsuperuser
        python manage.py createsuperuser
        
      • Для всех async сервисов необходимо создать суперпользователя для административной панели. Для этого в shell каждого контейнера выполняем команду

        python create_admin_panel_user.py
        

      • Для сервиса dictionaries, необходимо заполнить справочники. Для этого в shell контейнера dictionaries-app выполняем команду (токен можно взять из браузера, после авторизации на портале, воспользовавшись инструментами разработчика).
        curl --location --request POST '{{host}}/api/discovery/init_dictionaries/' \
        --header 'Authorization: Bearer eyJhbGciOiJ...SUzI1NiIsInR5c'
        
      • Для сервиса groups, необходимо загрузить файлы для оргструктуры. Для этого в shell контейнера dictionaries-app выполняем команду (токен можно взять из браузера, после авторизации на портале, воспользовавшись инструментами разработчика).
        curl --location --request POST '{{host}}/api/discovery/internal/upload_files/' \
        --header 'Authorization: Bearer eyJhbGciOiJ...SUzI1NiIsInR5c'
        
      • Для сервиса gamification нужно создать/cинхронизировать благодарности и награды. Разместите в s3 иконки стандартных благодарностей и наград, скачав их по ссылке https://raw.people-hub.ru/init/gamification.zip. Директория gamification из архива должна расположиться по пути имя_объектного_хранилища/media/. Далее в shell контейнера выполняем команды
        python manage.py sync_thanks
        python manage.py sync_badges
        
      • Для наполнения сервиса pages нужно в консоли выполнить команду
        python manage.py create_default_data
        
        • После обновления
      • Данные по командам инициализации будут указаны в описаниях релизов. 1. Подготовка сервиса Airflow.
        • Разместить полученный файл dags.tar.gz в s3 хранилище с публичным доступом по адресу MINIOENDPOINT/MINIO_ENDPOINT/MINIOENDPOINT/MINIO_BUCKET/init/dags.tar.gz
        • Установить helm chart с рекомендуемыми values (при обновлении необходимо перегрузить pods airflow-scheduler и airflow-worker) 1. Для безопасности во всех сервисах необходимо закрыть внешний доступ к внутренним API через прокси сервер API_BASE_URL/internal (blogs/internal) и панель администратора django API_BASE_URL/admin (пример ingress)

    ingress.yaml

    kind: Ingress
    apiVersion: networking.k8s.io/v1
    metadata:
    name: ph-blocks
    annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/rewrite-target: /$1
        nginx.ingress.kubernetes.io/server-snippet: |
        location ~* "^/api/.*/admin/" {
            deny all;
            return 403;
            }
        location ~* "^/.*/admin/" {
            deny all;
            return 403;
            }
        location ~* "^/api/.*/internal" {
            deny all;
            return 403;
            }
        location ~* "^/.*/internal" {
            deny all;
            return 403;
            }
        nginx.ingress.kubernetes.io/ssl-redirect: 'false'
    spec:
    tls:
        - hosts:
            - people-hub.ru
        secretName: people-hub.ru
    rules:
        - host: people-hub.ru
        http:
            paths:
            - path: /api/(.*)/admin
                pathType: Prefix
                backend:
                service:
                    name: deny
                    port:
                    number: 80
    

  5. Рекомендованные values к инфраструктурным сервисам и скрипты размещены по ссылке https://raw.people-hub.ru/infra/values.tar.gz и https://raw.people-hub.ru/infra/scripts.tar.gz

  6. Установка выполнена успешно.

Дополнительные команды для минорного релиза 3.61.1

Необходимо выполнить команды после выполнения всех вышеуказанных шагов:

Сервис filestorage

python manage.py create_shared_folder

Сервис polls

python manage.py load_profile_user_data

Сервис CMS

python -m commands.create_super_section

Дополнительные команды для минорного релиза 3.61.3

Сервис async-blogs

python -m management.load_profile_user_data

Сервис filestorage

python manage.py create_shared_folder

Сервис polls

python manage.py load_profile_user_data

Дополнительные команды для минорного релиза 3.61.4

Сервис groups

python manage.py load_profile_user_data

Сервис events

python manage.py create_calendar_events