Files
han-app/deploy-steps.md
T

9.2 KiB

usefull commands

- Убрать переносы строк: sed -i 's/\r$//' name-file.sh 
    - find . -type f \( -name '*.sh' -o -name 'validate-env' \) -exec dos2unix {} +
- docker compose stop    # мягко останавливает контейнеры (не удаляет)
- sudo shutdown -h now # выглючить ВМ
- Генерация паролей
    - (со спец.символами) openssl rand -base64 32
    - (без спец.символов) openssl rand -hex 16
    - openssl rand -base64 16 | xclip -selection clipboard # Linux

Туннель до БД: ssh -i C:\Users\MI.ssh\hansel -L 5433:192.168.0.211:5433 root@135.106.164.58 -N

Разворачиваем инфраструктуру в Селектел ч1

Создание сети

Создание групп безопасности для сети и для БД

Для сети открываем порты 80, 22, 443
Для БД открываем порты 5432, 5433 но только из CIDR (192.168.0.211\24)

Создаем ВМ, подключаем к новой сети (через порт) и перезагружаем (либо руками вводить новые сетевые настройки - надо выбрать)

Подключение к ВМ и первичный скрипт

++ ssh -i C:\Users\MI.ssh\hansel root@135.106.164.58 ++ scp -i C:\Users\MI.ssh\hansel -r "C:\Users\MI\Documents\Assistent\HAN_chat_specification\codebase\backend\deployment\scripts\setup-vm.sh" root@135.106.164.58:/tmp/setup-vm.sh chmod +x /tmp/setup-vm.sh sudo /tmp/setup-vm.sh

Скрипт создал деплой пользователя. Нужно Перенести туда публичный ключ и дать права на файл и папку

Вставляем публичный ключ новой строкой Далее даем права

sudo nano /home/deploy/.ssh/authorized_keys sudo chmod 700 /home/deploy/.ssh sudo chmod 600 /home/deploy/.ssh/authorized_keys sudo chown -R deploy:deploy /home/deploy/.ssh

Пароль деплою для использования sudo

sudo passwd deploy

После этого можно подключаться под деплой пользователем

ssh -i C:\Users\MI.ssh\han_chat_deploy deploy@135.106.164.58

GIT не работал. Проект пришлось копировать.

tar -C HAN_chat_specification/codebase/backend -czf han-chat-backend.tar.gz . scp -i C:\Users\MI.ssh\han_chat_deploy C:\Users\MI\Documents\Assistent\han-chat-backend.tar.gz deploy@135.106.164.58:/tmp/

Дальше распаковка

cd /opt/han-chat/backend tar -xzf /tmp/han-chat-backend.tar.gz

Правим переносы строк и даем права на исполнение

find . -type f ( -name '.sh' -o -name 'validate-env' ) -exec dos2unix {} + chmod +x scripts/validate-env deployment/scripts/.sh redis/scripts/.sh nginx/scripts/.sh

Разворачиваем инфраструктуру в Селектел ч2

Создаем БД

В базе подключаем pgcrypto Чтобы корректно работал PgBouncer выбираем session pooling

Копируем СА сертификат

Вариант Деплоя: mkdir -p /opt/han-chat/backend/secrets/pg scp -i C:\Users\MI.ssh\han_chat_deploy -r C:\Users\MI\Documents\job\HAN_new_life\HANapp\Production\sertificates\CA.pem deploy@135.106.164.58:/opt/han-chat/backend/secrets/pg/ca.pem chmod 644 /opt/han-chat/backend/secrets/pg/ca.pem

Вариант Селектела: mkdir -p ~/.postgresql/ wget https://storage.dbaas.selcloud.ru/CA.pem -O ~/.postgresql/root.crt chmod 0600 ~/.postgresql/root.crt

Проверка подключения к Postgers в ВМ

nc -zv 192.168.0.211 5433

sudo apt update sudo apt install postgresql-client

psql "host=master.ef54e3e4-ad3d-4b80-a6af-d63269e0895a.c.dbaas.selcloud.ru
port=5432
dbname=han_chat
user=dbAdmin
sslmode=verify-ca"

(psql "host=master.ef54e3e4-ad3d-4b80-a6af-d63269e0895a.c.dbaas.selcloud.ru port=5432 dbname=han_chat user=dbAdmin sslmode=verify-ca")

Заводим пользователей и схемы

Пользователей создаем через интерфейс селектела. Под админом даем права на создание в БД: GRANT CREATE ON DATABASE han_chat TO han_app; GRANT CREATE ON DATABASE han_chat TO bitrix_local_app; GRANT CREATE ON DATABASE han_chat TO bitrix_sync_user; GRANT CREATE ON DATABASE han_chat TO message_safety_app; GRANT CREATE ON DATABASE han_chat TO keycloak_user;

Схемы создаем от лица пользователей, заходя каждым из них в БД.

  • Запрещаем всем посторонним входить в схему han_app и др. CREATE SCHEMA IF NOT EXISTS han_app; REVOKE ALL ON SCHEMA han_app FROM PUBLIC; ALTER ROLE CURRENT_USER IN DATABASE han_chat SET search_path TO han_app; SHOW search_path; --чтобы заработало надо переподключиться (должно быть han_app)

CREATE SCHEMA IF NOT EXISTS bitrix_local; REVOKE ALL ON SCHEMA bitrix_local FROM PUBLIC; ALTER ROLE CURRENT_USER IN DATABASE han_chat SET search_path TO bitrix_local; SHOW search_path; --чтобы заработало надо переподключиться

CREATE SCHEMA IF NOT EXISTS bitrix_sync; REVOKE ALL ON SCHEMA bitrix_sync FROM PUBLIC; ALTER ROLE CURRENT_USER IN DATABASE han_chat SET search_path TO bitrix_sync; SHOW search_path; --чтобы заработало надо переподключиться

CREATE SCHEMA IF NOT EXISTS message_safety; REVOKE ALL ON SCHEMA message_safety FROM PUBLIC; ALTER ROLE CURRENT_USER IN DATABASE han_chat SET search_path TO message_safety; SHOW search_path; --чтобы заработало надо переподключиться

CREATE SCHEMA IF NOT EXISTS keycloak; REVOKE ALL ON SCHEMA keycloak FROM PUBLIC; ALTER ROLE CURRENT_USER IN DATABASE han_chat SET search_path TO keycloak; SHOW search_path; --чтобы заработало надо переподключиться

Проверка search_path SELECT r.rolname, d.datname, s.setconfig FROM pg_db_role_setting s JOIN pg_roles r ON r.oid = s.setrole JOIN pg_database d ON d.oid = s.setdatabase WHERE r.rolname in ('han_app', 'bitrix_local_app', 'bitrix_sync_user', 'message_safety_app', 'keycloak_user');

После реализации bitrix_sync (проверить, вероятно не на все таблицы права нужны): -- Даем право на чтение (SELECT) всех СУЩЕСТВУЮЩИХ таблиц в схеме GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA han_app TO bitrix_sync_user; -- Настраиваем права по умолчанию для новых таблиц ALTER DEFAULT PRIVILEGES IN SCHEMA han_app GRANT SELECT ON TABLES TO bitrix_sync_user; -- Если нужно дать право на чтение и для новых последовательностей (sequences): ALTER DEFAULT PRIVILEGES IN SCHEMA han_app GRANT USAGE, SELECT ON SEQUENCES TO bitrix_sync_user;

Заводим S3 хранилища:

Создаем 2 сервисных пользователя и заводим им ключи: - API backend SELECTEL_S3_ACCESS_KEY / SELECTEL_S3_SECRET_KEY - Message Safety SELECTEL_S3_QUARANTINE_READ_ACCESS_KEY / SELECTEL_S3_QUARANTINE_READ_SECRET_KEY

Создаем 3 приватных бакета - han-chat-quarantine (политика доступа API backend RW, Message Safety R) - han-chat-attachments (политика доступа API backend RW) - han-chat-documents (политика доступа API backend RW)

RW: ListBucket GetBucketLocation PutObject GetObject DeleteObject ListBucketMultipartUploads ListMultipartUploadParts AbortMultipartUpload

R: ListBucket GetBucketLocation GetObject ListBucketMultipartUploads ListMultipartUploadParts

Политика CORS (бакет han-chat-quarantine, vHosted обязателен): Allowed origin: https://chat.han0107.ru Methods: POST, PUT, GET, HEAD Headers: * (или явно content-type; wildcard x-amz-* в Selectel не работает) Expose headers: ETag

Тест инфраструктуры

mkdir -p /opt/han-chat/infratest cd /opt/han-chat/infratest

scp -i C:\Users\MI.ssh\hansel -r "C:\Users\MI\Documents\Assistent\HAN_chat_specification\infratest*" root@135.106.164.58:/opt/han-chat/infratest

--настраиваю env на локальной машине и копирую на диск scp -i C:\Users\MI.ssh\hansel -r "C:\Users\MI\Documents\job\HAN_new_life\HANapp\Production.env" root@135.106.164.58:/opt/han-chat/infratest/

Создаем изолированное окружение: python3 -m venv .venv . .venv/bin/activate python3 -m pip install --upgrade pip python3 -m pip install -r requirements.txt

Если не работает, то надо DNS переправить на eth0 resolvectl dns eth0 1.1.1.1 8.8.8.8 resolvectl domain eth0 '~.' resolvectl flush-caches resolvectl query pypi.org