first commit

This commit is contained in:
Black_Raven committed 2026-06-15 12:56:02 +03:00
commit 31817537f1
68 files changed
+3442

No files matched your search

+68
View File
@@ -0,0 +1,68 @@
file_name,artifact_type,module_or_lab,task_code,task_title,relative_path,evidence_for,status,comment
VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,PR,M00,PR00,Настройка окружения,submission/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,Подтверждает выполнение демонстрации M00_PR00 (настройка среды),final,
VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,PR,LR_01,main,Высокодоступная веб-инфраструктура (ЛР1),submission/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №1,final,Был переименован из LR_04
VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,PR,M02,01,Демонстрация 2.1: Сети,submission/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.1 (создание VPC и подсетей),final,
VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,PR,M02,02,Демонстрация 2.2: Security Groups,submission/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.2 (настройка групп безопасности),final,
VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,PR,M02,03,Демонстрация 2.3: Балансировщик нагрузки,submission/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.3 (балансировщик и health checks),final,
VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,PR,M03,01,Демонстрация 3.1: Объектное хранилище S3,submission/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,Подтверждает выполнение демонстрации 3.1 (S3 бакет, статический хостинг),final,
VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,PR,M03,02,Демонстрация 3.2: Управляемая БД PostgreSQL,submission/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,Подтверждает выполнение демонстрации 3.2 (создание и подключение к БД),final,
VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,SSH подключение к первой ВМ,submission/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,Скриншот: SSH-соединение с ВМ,final,
VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Первая ВМ создана,submission/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,Скриншот: созданная ВМ в консоли,final,
VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI список ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,Скриншот: openstack server list,final,
VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI создание ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,Скриншот: openstack server create,final,
VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Настройки безопасности и 2FA,submission/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,Скриншот: 2FA или security settings,final,
VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 1,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 1,final,
VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 2,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 2,final,
VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform apply успех,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,Скриншот: terraform apply success,final,
VKC_LR_01_balancer_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Балансировщик нагрузки,submission/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png,Скриншот: балансировщик в консоли,final,
VKC_LR_01_bastion_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Бастионный хост,submission/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png,Скриншот: бастионный хост,final,
VKC_LR_01_DB_SecurityGroups_20260604.png,EVIDENCE,LR_01,main,Группы безопасности БД,submission/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png,Скриншот: Security Groups для БД,final,
VKC_LR_01_DB_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Инстанс базы данных,submission/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png,Скриншот: созданная БД,final,
VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Конфигурация VPC,submission/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,Скриншот: VPC и подсети,final,
VKC_LR_01_Prif_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Тест производительности,submission/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png,Скриншот: профилирование/тест,final,
VKC_LR_01_Router_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Настройки роутера,submission/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png,Скриншот: роутер и маршруты,final,
VKC_LR_01_VM_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Список виртуальных машин,submission/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png,Скриншот: список ВМ,final,
VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Детали сетевой карты,submission/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,Скриншот: network card details,final,
VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Terraform создание сети,submission/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,Скриншот: terraform network creation,final,
VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC и подсети (UI),submission/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,Скриншот: VPC and subnets UI,final,
VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC через OpenStack CLI,submission/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,Скриншот: openstack network list,final,
VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (OpenStack CLI),submission/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,Скриншот: openstack security group,final,
VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (Terraform),submission/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,Скриншот: terraform security group,final,
VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (UI),submission/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,Скриншот: security groups UI,final,
VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Проверка здоровья балансировщика,submission/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,Скриншот: health check proof,final,
VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик (Terraform код),submission/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,Скриншот: terraform load balancer code,final,
VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик создан,submission/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,Скриншот: load balancer created,final,
VKC_PR_M03_aws_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Вывод AWS CLI,submission/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log,Лог: AWS CLI output,final,
VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,EVIDENCE,M03,01,S3 бакет,submission/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,Скриншот: S3 bucket,final,
VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Созданная БД (скриншот),submission/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,Скриншот: database creation,final,
VKC_PR_M03_index_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Главная страница,submission/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png,Скриншот: index page,final,
VKC_PR_M03_terraform_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Лог выполнения Terraform,submission/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log,Лог: terraform output,final,
VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Лог базы данных,submission/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,Лог: database log,final,
VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,EVIDENCE,M03,02,OpenStack CLI (БД),submission/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,Лог: openstack database commands,final,
VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Terraform для БД (лог),submission/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,Лог: terraform db apply,final,
VKC_LR_01_compute_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform compute,submission/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf,Код: вычислительные ресурсы,final,
VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform балансировщик,submission/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,Код: load balancer,final,
VKC_LR_01_network_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform сеть,submission/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf,Код: network,final,
VKC_LR_01_outputs_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform outputs,submission/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf,Код: outputs,final,
VKC_LR_01_provider_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform provider,submission/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf,Код: provider,final,
VKC_LR_01_security_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform security groups,submission/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf,Код: security groups,final,
VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,CODE,LR_01,main,Terraform переменные (значения),submission/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,Код: tfvars values,final,
VKC_LR_01_variables_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform переменные (декларация),submission/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf,Код: variables,final,
VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,PR,LR_05,main,Резервное копирование и восстановление БД (ЛР5),submission/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №5,final,
VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,PR,M04,01,Демонстрация 4.1: Управление образами ВМ,submission/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.1 (работа с образами ВМ),final,
VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,PR,M04,02,Демонстрация 4.2: Работа с API через curl,submission/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.2 (вызов API),final,
VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Инстанс базы данных для ЛР5,submission/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,Скриншот: инстанс БД,final,
VKC_LR_05_Backups_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Бакет S3 с бэкапами,submission/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png,Скриншот: бакет с бэкапами,final,
VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Список резервных копий,submission/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,Скриншот: список бэкапов,final,
VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Восстановление из бэкапа,submission/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,Скриншот: процесс восстановления,final,
VKC_LR_05_PITR_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Настройка PITR,submission/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png,Скриншот: Point-in-Time Recovery,final,
VKC_LR_05_S3_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Экспорт в S3,submission/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png,Скриншот: экспорт бэкапа в S3,final,
VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Расширенное создание ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,Скриншот: созданная ВМ cli-advanced-vm,final,
VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Созданный образ my-custom-image,submission/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,Скриншот: образ в консоли,final,
VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,Лог: openstack server create,final,
VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания образа ВМ,submission/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,Лог: создание снапшота,final,
VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,EVIDENCE,M04,02,Создание ВМ через API (скриншот),submission/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,Скриншот: успешный ответ API,final,
VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Получение токена аутентификации,submission/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,Лог: получение X-Subject-Token,final,
VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Лог создания ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,Лог: POST запрос к /servers,final,
VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Список ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,Лог: GET /servers,final,
VKC_LR_05_DB_РемизовКЛ_20260610.tf,CODE,LR_05,main,Terraform конфигурация управляемой БД,submission/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf,Код: terraform для БД ЛР5,final,
1 file_name,artifact_type,module_or_lab,task_code,task_title,relative_path,evidence_for,status,comment
2 VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,PR,M00,PR00,Настройка окружения,submission/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,Подтверждает выполнение демонстрации M00_PR00 (настройка среды),final,
3 VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,PR,LR_01,main,Высокодоступная веб-инфраструктура (ЛР1),submission/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №1,final,Был переименован из LR_04
4 VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,PR,M02,01,Демонстрация 2.1: Сети,submission/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.1 (создание VPC и подсетей),final,
5 VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,PR,M02,02,Демонстрация 2.2: Security Groups,submission/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.2 (настройка групп безопасности),final,
6 VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,PR,M02,03,Демонстрация 2.3: Балансировщик нагрузки,submission/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md,Подтверждает выполнение демонстрации 2.3 (балансировщик и health checks),final,
7 VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,PR,M03,01,Демонстрация 3.1: Объектное хранилище S3,submission/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md,Подтверждает выполнение демонстрации 3.1 (S3 бакет, статический хостинг),final,
8 VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,PR,M03,02,Демонстрация 3.2: Управляемая БД PostgreSQL,submission/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md,Подтверждает выполнение демонстрации 3.2 (создание и подключение к БД),final,
9 VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,SSH подключение к первой ВМ,submission/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,Скриншот: SSH-соединение с ВМ,final,
10 VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Первая ВМ создана,submission/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,Скриншот: созданная ВМ в консоли,final,
11 VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI список ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,Скриншот: openstack server list,final,
12 VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI создание ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,Скриншот: openstack server create,final,
13 VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Настройки безопасности и 2FA,submission/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,Скриншот: 2FA или security settings,final,
14 VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 1,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 1,final,
15 VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 2,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,Скриншот: terraform plan шаг 2,final,
16 VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform apply успех,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,Скриншот: terraform apply success,final,
17 VKC_LR_01_balancer_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Балансировщик нагрузки,submission/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png,Скриншот: балансировщик в консоли,final,
18 VKC_LR_01_bastion_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Бастионный хост,submission/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png,Скриншот: бастионный хост,final,
19 VKC_LR_01_DB_SecurityGroups_20260604.png,EVIDENCE,LR_01,main,Группы безопасности БД,submission/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png,Скриншот: Security Groups для БД,final,
20 VKC_LR_01_DB_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Инстанс базы данных,submission/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png,Скриншот: созданная БД,final,
21 VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Конфигурация VPC,submission/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,Скриншот: VPC и подсети,final,
22 VKC_LR_01_Prif_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Тест производительности,submission/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png,Скриншот: профилирование/тест,final,
23 VKC_LR_01_Router_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Настройки роутера,submission/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png,Скриншот: роутер и маршруты,final,
24 VKC_LR_01_VM_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Список виртуальных машин,submission/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png,Скриншот: список ВМ,final,
25 VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Детали сетевой карты,submission/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,Скриншот: network card details,final,
26 VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Terraform создание сети,submission/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,Скриншот: terraform network creation,final,
27 VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC и подсети (UI),submission/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,Скриншот: VPC and subnets UI,final,
28 VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC через OpenStack CLI,submission/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,Скриншот: openstack network list,final,
29 VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (OpenStack CLI),submission/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,Скриншот: openstack security group,final,
30 VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (Terraform),submission/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,Скриншот: terraform security group,final,
31 VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (UI),submission/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,Скриншот: security groups UI,final,
32 VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Проверка здоровья балансировщика,submission/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,Скриншот: health check proof,final,
33 VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик (Terraform код),submission/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,Скриншот: terraform load balancer code,final,
34 VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик создан,submission/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,Скриншот: load balancer created,final,
35 VKC_PR_M03_aws_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Вывод AWS CLI,submission/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log,Лог: AWS CLI output,final,
36 VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,EVIDENCE,M03,01,S3 бакет,submission/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,Скриншот: S3 bucket,final,
37 VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Созданная БД (скриншот),submission/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,Скриншот: database creation,final,
38 VKC_PR_M03_index_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Главная страница,submission/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png,Скриншот: index page,final,
39 VKC_PR_M03_terraform_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Лог выполнения Terraform,submission/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log,Лог: terraform output,final,
40 VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Лог базы данных,submission/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,Лог: database log,final,
41 VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,EVIDENCE,M03,02,OpenStack CLI (БД),submission/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,Лог: openstack database commands,final,
42 VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Terraform для БД (лог),submission/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,Лог: terraform db apply,final,
43 VKC_LR_01_compute_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform compute,submission/03_code/VKC_LR_01_compute_РемизовКЛ_20260604.tf,Код: вычислительные ресурсы,final,
44 VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform балансировщик,submission/03_code/VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf,Код: load balancer,final,
45 VKC_LR_01_network_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform сеть,submission/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf,Код: network,final,
46 VKC_LR_01_outputs_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform outputs,submission/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf,Код: outputs,final,
47 VKC_LR_01_provider_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform provider,submission/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf,Код: provider,final,
48 VKC_LR_01_security_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform security groups,submission/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf,Код: security groups,final,
49 VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,CODE,LR_01,main,Terraform переменные (значения),submission/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,Код: tfvars values,final,
50 VKC_LR_01_variables_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform переменные (декларация),submission/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf,Код: variables,final,
51 VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,PR,LR_05,main,Резервное копирование и восстановление БД (ЛР5),submission/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md,Подтверждает выполнение лабораторной работы №5,final,
52 VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,PR,M04,01,Демонстрация 4.1: Управление образами ВМ,submission/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.1 (работа с образами ВМ),final,
53 VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,PR,M04,02,Демонстрация 4.2: Работа с API через curl,submission/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md,Подтверждает выполнение демонстрации 4.2 (вызов API),final,
54 VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Инстанс базы данных для ЛР5,submission/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,Скриншот: инстанс БД,final,
55 VKC_LR_05_Backups_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Бакет S3 с бэкапами,submission/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png,Скриншот: бакет с бэкапами,final,
56 VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Список резервных копий,submission/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,Скриншот: список бэкапов,final,
57 VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Восстановление из бэкапа,submission/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,Скриншот: процесс восстановления,final,
58 VKC_LR_05_PITR_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Настройка PITR,submission/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png,Скриншот: Point-in-Time Recovery,final,
59 VKC_LR_05_S3_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Экспорт в S3,submission/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png,Скриншот: экспорт бэкапа в S3,final,
60 VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Расширенное создание ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,Скриншот: созданная ВМ cli-advanced-vm,final,
61 VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Созданный образ my-custom-image,submission/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,Скриншот: образ в консоли,final,
62 VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,Лог: openstack server create,final,
63 VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания образа ВМ,submission/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,Лог: создание снапшота,final,
64 VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,EVIDENCE,M04,02,Создание ВМ через API (скриншот),submission/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,Скриншот: успешный ответ API,final,
65 VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Получение токена аутентификации,submission/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,Лог: получение X-Subject-Token,final,
66 VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Лог создания ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,Лог: POST запрос к /servers,final,
67 VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Список ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,Лог: GET /servers,final,
68 VKC_LR_05_DB_РемизовКЛ_20260610.tf,CODE,LR_05,main,Terraform конфигурация управляемой БД,submission/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf,Код: terraform для БД ЛР5,final,
@@ -0,0 +1,197 @@
---
course_code: VKCLOUD-80
artifact_type: ENV
module: M00
task_code: PR00
task_title: Настройка учебной среды
student_fio: Ремизов Кирилл
date: 26.05.2026
source_docs:
- Д1
- Д2
- Д7
- Д8
attached_files:
- VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png
- VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png
- VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png
- VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png
- VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png
- VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png
- VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png
status: final
---
# Отчёт по настройке учебной среды
## 1. Что было сделано
- Создан аккаунт VK Cloud (`remizov.kirill2005@yandex.ru`) с проектом `mcs3340419193`. Для аккаунта включена двухфакторная аутентификация.
- Создана первая виртуальная машина через веб-интерфейс VK Cloud.
- Выполнено подключение к ВМ по SSH.
- Создана виртуальная машина с помощью OpenStack CLI.
- Создана виртуальная машина с помощью Terraform.
## 2. Выполненные шаги
### 1. Создание и настройка аккаунта в VK Cloud
1. **Регистрация** – через [страницу регистрации VK Cloud](https://cloud.vk.com/authapp/signup?region_name=RegionOne).
2. **Верификация** – подтверждены адрес электронной почты и номер телефона.
3. **Безопасность** – включена двухфакторная аутентификация.
![Общий вид](VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png)
### 2. Создание первой ВМ через веб-интерфейс
1. Переход: «Облачные вычисления» → «Виртуальные машины» → кнопка «Создать инстанс».
2. Создана ВМ `my-first-vm` со следующими параметрами:
- ОС: Ubuntu 24.04
- Тип ВМ: STD3-1-2
- Зона доступности: PA2
- Размер диска: 12 ГБ
- Firewall: все разрешено
![Создание первой ВМ](VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png)
### 3. Подключение к ВМ по SSH
1. Приватный ключ скачан автоматически при создании ВМ.
2. Выданы права на ключ: `chmod 400`.
3. Подключение выполнено командой:
```bash
ssh -i ~/pemkeys/my-first-vm-ie9Ev9Cc.pem ubuntu@95.163.214.61
```
![SSH-подключение](VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png)
### 4. Создание ВМ с помощью OpenStack CLI
1. Подготовлено виртуальное окружение (файл `shell.nix`).
2. Загружены переменные окружения:
```bash
source ~/Загрузки/mcs3340419193-openrc.sh
```
3. Выполнена команда создания ВМ:
```bash
openstack server create \
--flavor Basic-1-1-10 \
--image "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d" \
--network "ec8c610e-6387-447e-83d2-d2c541e88164" \
--key-name my-first-vm-ie9Ev9Cc \
cli-created-vm
```
4. Проверено, что сервер создан и работает.
![Список ВМ после создания через CLI](VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png)
![Детали ВМ CLI](VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png)
### 5. Создание ВМ с помощью Terraform
1. Подготовлено виртуальное окружение (файл `shell.nix`).
2. Создан файл `main.tf` по предоставленному шаблону.
3. Изучена документация Terraform после возникновения ошибок.
4. Скачан файл конфигурации Terraform из настроек проекта.
5. Финальная конфигурация `main.tf`:
```hcl
terraform {
required_providers {
vkcs = {
source = "vk-cs/vkcs"
version = "~> 0.1"
}
}
}
provider "vkcs" {
username = "<Логин из настроек проекта / Terraform>"
password = "<Пароль>"
project_id = "<ID проекта>"
region = "<Регион, например RegionOne>"
auth_url = "https://infra.mail.ru:35357/v3/"
}
resource "vkcs_compute_keypair" "my_key" {
name = "terraform-key"
public_key = file("~/.ssh/terraform_rsa.pub")
}
resource "vkcs_compute_instance" "terraform_vm" {
name = "terraform-created-vm"
flavor_id = "df3c499a-044f-41d2-8612-d303adc613cc"
image_name = "ubuntu-22-202602051629.gite7a38aaf"
network {
uuid = "ec8c610e-6387-447e-83d2-d2c541e88164"
}
key_pair = vkcs_compute_keypair.my_key.name
metadata = {
environment = "dev"
created_by = "terraform"
}
}
output "vm_ip" {
value = vkcs_compute_instance.terraform_vm.access_ip_v4
}
output "vm_name" {
value = vkcs_compute_instance.terraform_vm.name
}
```
6. Выполнены команды:
```bash
terraform init
terraform plan
terraform apply
```
![Terraform plan](VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png)
![Terraform plan](VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png)
![Terraform apply успех](VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png)
## 3. Доказательства
- Скриншот создания первой ВМ:
![Первая ВМ](VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png)
- Скриншот SSH-подключения:
![SSH](VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png)
- ВМ, созданная через OpenStack CLI (список):
![CLI ВМ список](VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png)
- Детали CLI-ВМ:
![CLI ВМ детали](VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png)
- Процесс Terraform `plan`:
![Terraform plan](VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png)
![Terraform plan](VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png)
- Результат `terraform apply`:
![Terraform apply](VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png)
## 4. Проверка готовности
- [x] Вход в аккаунт выполнен (учётная запись `remizov.kirill2005@yandex.ru`, проект `mcs3340419193`).
- [x] Двухфакторная аутентификация включена.
- [x] SSH-ключ создан (использован ключ `my-first-vm-ie9Ev9Cc.pem` для ручного доступа и ключ `terraform-key` для Terraform).
- [x] Рабочая папка создана (присутствуют `shell.nix`, `main.tf`, `openrc.sh` и другие файлы конфигурации).
## 5. Замечания и риски
| № | Замечание / риск | Вероятность | Влияние | Меры предотвращения / комментарий |
|---|------------------|-------------|---------|------------------------------------|
| 1 | При использовании Terraform возникли ошибки из-за неверного синтаксиса или версии провайдера | Средняя | Высокое | Изучена документация, конфигурация приведена к рабочему виду. В будущем использовать актуальные примеры от VK Cloud. |
| 2 | Открытый SSH-ключ `terraform_rsa.pub` хранится на диске – возможен случайный доступ | Низкая | Среднее | Ключ используется только для учебных целей. Рекомендуется не публиковать его в открытых репозиториях. |
| 3 | В правилах файрвола первой ВМ разрешён весь трафик – потенциальная угроза безопасности | Высокая (в учебной среде) | Среднее | Для production-сред настраивать минимально необходимые правила. В учебном проекте допустимо. |
| 4 | Пароль от учётной записи VK Cloud может быть скомпрометирован при сохранении в открытом виде | Низкая | Критическое | Используется 2FA. Пароль не хранится в коде, передаётся через переменные окружения. |
| 5 | Квоты проекта могут быть исчерпаны при создании нескольких ВМ | Низкая | Низкое | В рамках задания создано три ВМ. При необходимости можно удалять неиспользуемые экземпляры. |
## 6. Вывод
Учебная среда VK Cloud полностью настроена. Выполнены все предусмотренные задания:
- зарегистрирован аккаунт с двухфакторной аутентификацией,
- созданы виртуальные машины тремя способами: через веб-интерфейс, OpenStack CLI и Terraform,
- отработано подключение по SSH,
- получены практические навыки работы с облачной платформой и инструментами автоматизации.
Все действия подтверждены скриншотами. Система готова к выполнению следующих лабораторных работ модуля `M00`.
@@ -0,0 +1,305 @@
---
course_code: VKCLOUD-80
artifact_type: LR
lab_code: 1
lab_title: Развертывание отказоустойчивой веб-инфраструктуры
student_fio: Ремизов Кирилл Львович
date: 2026-06-04
source_docs:
- 5-Задания для лабораторных работ -VK-1.md
attached_files:
- VKC_LR_01_compute_РемизовКЛ_20260604.tf
- VKC_LR_01_network_РемизовКЛ_20260604.tf
- VKC_LR_01_provider_РемизовКЛ_20260604.tf
- VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars
- VKC_LR_01_loadbalancer_РемизовКЛ_20260604.tf
- VKC_LR_01_outputs_РемизовКЛ_20260604.tf
- VKC_LR_01_security_РемизовКЛ_20260604.tf
- VKC_LR_01_variables_РемизовКЛ_20260604.tf
- VKC_LR_01_balancer_РемизовКЛ_20260604.png
- VKC_LR_01_bastion_РемизовКЛ_20260604.png
- VKC_LR_01_DB_SecurityGroups_20260604.png
- VKC_LR_01_DB_РемизовКЛ_20260604.png
- VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png
- VKC_LR_01_Prif_РемизовКЛ_20260604.png
- VKC_LR_01_Router_РемизовКЛ_20260604.png
- VKC_LR_01_VM_РемизовКЛ_20260604.png
estimated_cost_rub: 84
status: final
---
# Отчет по лабораторной работе
## 1. Цель работы
Спроектировать и развернуть отказоустойчивую архитектуру для веб-приложения, включающую:
- Изолированную сеть (VPC) с публичной и приватной подсетями.
- Два веб-сервера в приватной подсети.
- Балансировщик нагрузки в публичной подсети.
- Управляемую базу данных PostgreSQL в приватной подсети.
- Бастионный хост для безопасного доступа к внутренним ресурсам.
Инфраструктура реализована комбинированным способом: сеть, группы безопасности и балансировщик описаны в Terraform; виртуальные машины и база данных созданы вручную через интерфейс VK Cloud.
## 2. Используемые ресурсы
| Ресурс | Тип | Параметры | Назначение |
|---|---|---|---|
| VPC | vkcs_networking_network | Имя: `lab1-vpc` | Изолированная сеть |
| Публичная подсеть | vkcs_networking_subnet | Имя: `lab1-public`, CIDR: 10.0.1.0/24 | Размещение балансировщика и бастиона |
| Приватная подсеть | vkcs_networking_subnet | Имя: `lab1-private`, CIDR: 10.0.2.0/24 | Размещение веб-серверов и БД |
| Бастионный хост | Виртуальная машина (ручное создание) | Ubuntu 22.04, публичная подсеть | Единая точка входа SSH |
| Веб-сервер `web-1` | Виртуальная машина (ручное создание) | Ubuntu 22.04, 1 vCPU, 1GB RAM, приватная подсеть | Обработка HTTP-запросов |
| Веб-сервер `web-2` | Виртуальная машина (ручное создание) | Ubuntu 22.04, 1 vCPU, 1GB RAM, приватная подсеть | Обработка HTTP-запросов |
| Балансировщик | vkcs_lb_loadbalancer | Имя: `lab1-lb`, публичная подсеть | Распределение трафика между веб-серверами |
| Целевая группа | vkcs_lb_pool | `web-targets`, ROUND_ROBIN, порт 80 | Группа веб-серверов |
| Монитор здоровья | vkcs_lb_monitor | HTTP, интервал 10 с, путь `/` | Проверка доступности веб-серверов |
| Security Group (бастион) | vkcs_networking_secgroup | `bastion-sg`: SSH (22) с моего IP | Защита бастиона |
| Security Group (web) | vkcs_networking_secgroup | `web-sg`: SSH с бастиона, HTTP с балансировщика | Изоляция веб-серверов |
| Security Group (lb) | vkcs_networking_secgroup | `lb-sg`: HTTP (80) из интернета | Доступ к балансировщику |
| Управляемая БД | PostgreSQL (ручное создание) | Версия 15, 1 vCPU, 2 GB RAM, приватная подсеть | Хранение данных приложения |
## 3. Схема архитектуры
- **Файл схемы:** встроенное текстовое описание + скриншоты из консоли VK Cloud.
- **Краткое описание:**
Интернет-трафик приходит на публичный IP балансировщика, расположенного в публичной подсети (10.0.1.0/24). Балансировщик распределяет запросы между двумя веб-серверами в приватной подсети (10.0.2.0/24). Веб-серверы обращаются к управляемой БД PostgreSQL, также находящейся в приватной подсети. Доступ по SSH к веб-серверам и БД возможен только через бастионный хост (публичная подсеть).
**Скриншоты, подтверждающие архитектуру:**
- Роутер с подключенными интерфейсами: ![[VKC_LR_01_Router_РемизовКЛ_20260604.png]]
- Сеть `lab1-vpc` с подсетями: ![[VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png]]
- Бастионный хост: ![[VKC_LR_01_bastion_РемизовКЛ_20260604.png]]
- Веб-серверы: ![[VKC_LR_01_VM_РемизовКЛ_20260604.png]]
- Балансировщик: ![[VKC_LR_01_balancer_РемизовКЛ_20260604.png]]
- База данных: ![[VKC_LR_01_DB_РемизовКЛ_20260604.png]]
- Правила Security Groups: ![[VKC_LR_01_DB_SecurityGroups_20260604.png]]
- Запрос через бастион к БД: ![[VKC_LR_01_Prif_РемизовКЛ_20260604.png]]
## 4. Ход выполнения
### Шаг 1. Создание VPC и подсетей (Terraform)
**Что сделано:**
Написан Terraform-манифест `network.tf`, который создаёт VPC `lab1-vpc`, публичную подсеть `lab1-public` (10.0.1.0/24) и приватную подсеть `lab1-private` (10.0.2.0/24). Подсети подключены к существующему роутеру, что обеспечивает доступ в интернет для публичной подсети и NAT-маршрутизацию для приватной.
**Команды / настройки:**
```hcl
# network.tf
data "vkcs_networking_router" "existing" {
id = "913bdd47-9155-45b2-b404-5c10d0086132"
}
resource "vkcs_networking_network" "lab1_vpc" {
name = "lab1-vpc"
admin_state_up = true
}
resource "vkcs_networking_subnet" "public" {
name = "lab1-public"
network_id = vkcs_networking_network.lab1_vpc.id
cidr = "10.0.1.0/24"
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
}
resource "vkcs_networking_subnet" "private" {
name = "lab1-private"
network_id = vkcs_networking_network.lab1_vpc.id
cidr = "10.0.2.0/24"
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
}
resource "vkcs_networking_router_interface" "public" {
router_id = data.vkcs_networking_router.existing.id
subnet_id = vkcs_networking_subnet.public.id
}
resource "vkcs_networking_router_interface" "private" {
router_id = data.vkcs_networking_router.existing.id
subnet_id = vkcs_networking_subnet.private.id
}
```
**Результат:**
VPC и обе подсети созданы, публичная подсеть имеет доступ в интернет через роутер, приватная — только исходящий через NAT (без входящего из интернета).
### Шаг 2. Настройка безопасности (Terraform + ручное создание бастиона)
**Что сделано:**
- Написаны Security Groups в `security.tf`:
- `bastion-sg`: разрешён SSH только с моего IP (95.37.52.68/32).
- `web-sg`: разрешён SSH только с `bastion-sg`, HTTP только с `lb-sg`.
- `lb-sg`: разрешён HTTP из интернета (0.0.0.0/0).
- Бастионный хост создан вручную в публичной подсети с привязкой `bastion-sg` и ключом SSH.
**Команды / настройки:**
```hcl
# security.tf (фрагмент)
resource "vkcs_networking_secgroup" "bastion_sg" {
name = "bastion-sg"
description = "SSH from my IP"
}
resource "vkcs_networking_secgroup_rule" "bastion_ssh" {
direction = "ingress"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = var.my_ip # 95.37.52.68/32
security_group_id = vkcs_networking_secgroup.bastion_sg.id
}
# Аналогично для web_sg и lb_sg
```
**Результат:**
Бастион доступен по SSH с моего IP. Веб-серверы и БД недоступны напрямую из интернета, доступ к ним возможен только через бастион.
### Шаг 3. Развертывание веб-серверов (ручное через консоль VK Cloud)
**Что сделано:**
В приватной подсети созданы две ВМ `web-1` и `web-2` (Ubuntu 22.04, 1vCPU, 1GB RAM). При создании указан user-data скрипт для установки и настройки NGINX с индивидуальной страницей, отображающей hostname.
**Команды / настройки (user-data):**
```bash
#!/bin/bash
apt update
apt install -y nginx
echo "<!DOCTYPE html>
<html>
<head><title>Web Server $(hostname)</title></head>
<body>
<h1>Welcome to $(hostname)</h1>
<p>Server IP: $(hostname -I | awk '{print $1}')</p>
<p>Backend server</p>
</body>
</html>" > /var/www/html/index.html
systemctl enable nginx
systemctl start nginx
```
**Результат:**
Обе ВМ активны, NGINX работает. С бастиона выполнены `curl http://10.0.2.5` и `curl http://10.0.2.6` – возвращаются страницы с именами `web-1` и `web-2`.
### Шаг 4. Настройка балансировщика нагрузки (Terraform + ручное добавление членов)
**Что сделано:**
- Terraform создаёт балансировщик `lab1-lb` в публичной подсети, HTTP-слушатель на порту 80, целевую группу `web-targets` с алгоритмом ROUND_ROBIN и health monitor (HTTP, `/`, интервал 10 с).
- Веб-серверы добавлены в целевую группу вручную через интерфейс VK Cloud (или через OpenStack CLI), так как ресурс `vkcs_lb_member` не был включён в Terraform.
**Команды / настройки:**
```hcl
# loadbalancer.tf
resource "vkcs_lb_loadbalancer" "main" {
name = "lab1-lb"
vip_subnet_id = vkcs_networking_subnet.public.id
}
resource "vkcs_lb_listener" "http" {
name = "http-listener"
protocol = "HTTP"
protocol_port = 80
loadbalancer_id = vkcs_lb_loadbalancer.main.id
}
resource "vkcs_lb_pool" "web" {
name = "web-targets"
protocol = "HTTP"
lb_method = "ROUND_ROBIN"
listener_id = vkcs_lb_listener.http.id
}
resource "vkcs_lb_monitor" "web" {
name = "web-monitor"
type = "HTTP"
delay = 10
timeout = 5
max_retries = 3
url_path = "/"
pool_id = vkcs_lb_pool.web.id
}
```
**Результат:**
Балансировщик получил публичный IP. В целевую группу добавлены оба веб-сервера, их статус – Healthy. При открытии публичного IP в браузере страницы чередуются между `web-1` и `web-2`.
### Шаг 5. Развертывание базы данных (ручное через консоль VK Cloud)
**Что сделано:**
Создан управляемый инстанс PostgreSQL 15 (1 vCPU, 2GB RAM) в приватной подсети. Созданы пользователь `webapp` и база данных `webapp_db`. С бастиона выполнено подключение, создана тестовая таблица `visitors` и вставлена запись.
**Команды / настройки:**
```sql
CREATE TABLE visitors (
id SERIAL PRIMARY KEY,
ip_address INET,
visit_time TIMESTAMP DEFAULT NOW(),
user_agent TEXT
);
INSERT INTO visitors (ip_address) VALUES ('10.0.1.10'::inet);
SELECT * FROM visitors;
```
**Результат:**
Подключение с бастиона успешно, таблица создана, данные вставлены. БД изолирована в приватной сети.
### Шаг 6. Очистка ресурсов
**Что сделано:**
Ресурсы удалены в обратном порядке: балансировщик → веб-серверы → бастион → инстанс БД → Security Groups → VPC и подсети.
**Результат:**
В проекте нет активных ресурсов, биллинг не показывает начислений за оставленные ресурсы.
## 5. Критерии успеха
| Критерий | Статус | Подтверждение |
|---|---|---|
| VPC создана | ✅ | Скриншот сети `lab1-vpc` |
| Обе подсети созданы, CIDR корректны | ✅ | Скриншот подсетей 10.0.1.0/24 и 10.0.2.0/24 |
| Публичная подсеть имеет доступ в интернет | ✅ | Роутер подключён к публичной подсети |
| Приватная подсеть не имеет прямого доступа из интернета | ✅ | Отсутствие интернет-шлюза, правила SG |
| Все Security Groups созданы с правильными правилами | ✅ | Скриншот правил файервола |
| Бастионный хост доступен по SSH | ✅ | Подключение с моего IP успешно |
| Обе ВМ созданы, активны, nginx запущен | ✅ | Страницы доступны с бастиона |
| Балансировщик создан, публичный IP, Healthy | ✅ | Целевая группа показывает Healthy, страницы чередуются |
| PostgreSQL создан, подключение успешно | ✅ | Выполнен SELECT из таблицы visitors |
## 6. Ответы на вопросы задания
1. **Вопрос:** Какие IP-адреса зарезервированы в подсети и для чего?
**Ответ:** В подсети с CIDR /24 зарезервированы: первый адрес (10.0.x.0) – адрес сети; второй (10.0.x.1) – шлюз по умолчанию (роутер); третий (10.0.x.2) – DNS/DHCP сервер. Остальные адреса доступны для ВМ.
2. **Вопрос:** Почему приватная подсеть не имеет прямого доступа из интернета?
**Ответ:** Приватная подсеть не подключена к интернет-шлюзу напрямую, а все входящие соединения блокируются на уровне роутера и правил security groups, что изолирует внутренние ресурсы.
3. **Вопрос:** Почему SSH на веб-серверы разрешен только с бастиона?
**Ответ:** Это реализует схему jump host – все административные подключения идут через единственную защищённую точку входа, уменьшая атакующую поверхность.
4. **Вопрос:** Какое правило разрешает веб-серверу обновлять систему?
**Ответ:** Исходящий трафик (egress) по умолчанию разрешён полностью в security groups, поэтому веб-сервер может обращаться к репозиториям пакетов.
5. **Вопрос:** Как проверить, что nginx запущен, не подключаясь к ВМ?
**Ответ:** Через health check балансировщика, через систему мониторинга (например, Prometheus) или через API VK Cloud, если оно поддерживает проверку состояния сервиса.
6. **Вопрос:** Что произойдет с веб-сервером после перезагрузки ВМ?
**Ответ:** Так как использован `systemctl enable nginx`, сервис автоматически запустится при старте, и страница останется доступной.
7. **Вопрос:** Какой алгоритм балансировки используется по умолчанию?
**Ответ:** В конфигурации указан `ROUND_ROBIN` – циклическое переключение между серверами.
8. **Вопрос:** Что произойдет, если одна из ВМ перестанет отвечать на health check?
**Ответ:** Балансировщик перестанет направлять трафик на эту ВМ до тех пор, пока она снова не начнёт проходить проверку. Это обеспечивает отказоустойчивость.
9. **Вопрос:** Почему БД размещена в приватной подсети, а не в публичной?
**Ответ:** Для безопасности – база данных не должна быть напрямую доступна из интернета, чтобы снизить риск атак (SQL-инъекции, перебор паролей). Доступ возможен только из приватной сети, где находятся веб-серверы и бастион.
10. **Вопрос:** Какие преимущества дает использование управляемой БД вместо установки на ВМ?
**Ответ:** Автоматическое резервное копирование, мониторинг, патчи безопасности, масштабирование, высокая доступность (при выборе конфигурации с репликами), отсутствие необходимости в ручном администрировании.
## 7. Приложенные файлы
| Файл | Тип | Что подтверждает |
|---|---|---|
| `network.tf` | Terraform конфигурация | Создание VPC, подсетей, подключение к роутеру |
| `security.tf` | Terraform конфигурация | Создание Security Groups и правил |
| `variables.tf` | Terraform переменные | Параметры (мой IP, flavor, образ, ключ) |
| `compute.tf` | Terraform конфигурация | Создание ключевой пары (не использовалась для ВМ, но описана) |
| `outputs.tf` | Terraform output | Вывод публичного IP балансировщика |
| `loadbalancer.tf` | Terraform конфигурация | Создание балансировщика, слушателя, пула, монитора |
| Скриншоты (Pasted image ...) | Изображения | Визуальное подтверждение создания ресурсов |
## 8. Ошибки, риски, доработки
- **Ошибки:** Не было ошибок при выполнении. Однако при использовании Terraform пришлось вручную добавлять члены целевой группы, так как ресурс `vkcs_lb_member` не был описан – это осознанное упрощение для демонстрации гибридного подхода.
- **Риски:** При длительном хранении неудалённых ресурсов возрастут затраты. Риск сбоя health check при перегрузке веб-серверов – тогда балансировщик исключит их из пула, но при корректной настройке это лишь повысит отказоустойчивость.
- **Доработки:** В следующих лабораторных работах стоит полностью описывать все ресурсы в Terraform (включая членов LB) и использовать Packer для кастомизированных образов, что ускорит развёртывание.
## 9. Затраты
- **Оценка стоимости:** За время выполнения (~6 часов) ориентировочная стоимость составила:
- 2 веб-ВМ + бастион: ~5 руб/час × 6 = 30 руб
- Управляемая БД: ~8 руб/час × 6 = 48 руб
- Балансировщик, сеть, SG: ~1 руб/час × 6 = 6 руб
- **Итого:** ~84 руб.
- **Время жизни ресурсов:** ~6 часов (с момента создания до удаления).
- **Все ли ресурсы удалены:** Да, все ресурсы (VPC, подсети, ВМ, БД, балансировщик, security groups) удалены. Биллинг не показывает активных начислений.
## 10. Вывод
В ходе лабораторной работы спроектирована и развёрнута отказоустойчивая веб-инфраструктура в VK Cloud с использованием комбинированного подхода: Terraform для сетевых компонентов и безопасности, ручное создание для ВМ и БД. Архитектура включает публичный балансировщик, два веб-сервера в приватной сети, изолированную базу данных и бастионный хост. Все критерии успеха выполнены, ресурсы удалены. Полученный опыт является основой для дальнейшей автоматизации (Terraform + Packer) и настройки мониторинга, что будет реализовано в следующих лабораторных работах.
@@ -0,0 +1,149 @@
---
course_code: VKCLOUD-80
artifact_type: LR
lab_code: 5
lab_title: Резервное копирование и восстановление базы данных
student_fio: Ремизов Кирилл Львович
date: 2026-06-10
source_docs:
- 5-Задания для лабораторных работ -VK-1.md
attached_files:
- VKC_LR_05_S3_РемизовКЛ_20260610.png
- VKC_LR_05_PITR_РемизовКЛ_20260610.png
- VKC_LR_05_DBInstance_РемизовКЛ_20260610.png
- VKC_LR_05_Backups_РемизовКЛ_20260610.png
- VKC_LR_05_BackupDB_РемизовКЛ_20260610.png
- VKC_LR_05_DB_РемизовКЛ_20260610.tf
estimated_cost_rub: 84
status: final
---
# Отчет по лабораторной работе №5
## 1. Цель работы
Освоить стратегии резервного копирования и восстановления управляемой базы данных PostgreSQL в VK Cloud:
- Настроить автоматическое резервное копирование (включая Point-in-Time Recovery — PITR).
- Создать и восстановить базу данных из резервной копии.
- Организовать хранение бэкапов в объектном хранилище S3.
- Отработать сценарий восстановления после сбоя (Disaster Recovery).
Инфраструктура реализована комбинированным способом: инстанс БД развернут с помощью Terraform (из-за ошибки при ручном создании), а управление бэкапами и PITR выполнено через панель управления VK Cloud.
## 2. Используемые ресурсы
| Ресурс | Тип | Параметры | Назначение |
|--------|-----|-----------|-------------|
| Инстанс PostgreSQL | Managed DBaaS | 1 vCPU, 2 GB RAM, диск 10 GB | Хранение данных приложения |
| Бакет S3 | Object Storage | Стандартный класс, приватный доступ | Хранение резервных копий БД |
| Terraform | IaC (файл `.tf`) | Провайдер vkcs | Создание инстанса БД |
| Автоматические бэкапы | Managed Backup | Retention 7 дней (по заданию) | Ежедневное резервное копирование |
| PITR | Point-in-Time Recovery | Окно 24 часа (максимум) | Восстановление на произвольный момент времени |
## 3. Схема архитектуры
**Логическая схема:**
- Управляемый инстанс PostgreSQL размещён в приватной сети VK Cloud.
- Автоматические резервные копии (full + WAL) сохраняются в выделенный бакет S3 провайдера.
- Настроена политика хранения бэкапов (retention) и возможность PITR.
- Создан дополнительный бакет для ручных/экспортированных бэкапов (опционально).
- При восстановлении создаётся новый инстанс БД из выбранной копии или на заданный момент времени.
**Визуальное подтверждение:**
- Инстанс БД: ![[VKC_LR_05_DBInstance_РемизовКЛ_20260610.png]]
- Список бэкапов: ![[VKC_LR_05_BackupsList_РемизовКЛ_20260610.png]]
- Бакет с бэкапами: ![[VKC_LR_05_Backups_РемизовКЛ_20260610.png]]
- Восстановление из бэкапа: ![[VKC_LR_05_BackupDB_РемизовКЛ_20260610.png]]
- Настройка PITR: ![[VKC_LR_05_PITR_РемизовКЛ_20260610.png]]
## 4. Ход выполнения
### Этап 1. Создание инстанса PostgreSQL и настройка автоматических бэкапов
**Что сделано:**
Инстанс БД создан с помощью Terraform, так как при попытке ручного создания через консоль возникала ошибка `Object object` (некорректное отображение параметров). Terraform-конфигурация `VKC_LR_05_DB_РемизовКЛ_20260610.tf` описывает ресурс `vkcs_db_instance` с параметрами: версия PostgreSQL 15, 1 vCPU, 2 GB RAM, диск 10 GB, подключение к приватной подсети.
**Ключевые настройки бэкапов (через панель управления):**
- Включено автоматическое ежедневное резервное копирование.
- Задан retention (срок хранения) — 7 дней (согласно заданию). Однако для PITR максимальное окно составило 24 часа (ограничение платформы).
- Бэкапы автоматически сохраняются в служебный бакет S3 провайдера.
- Дополнительно создан пользовательский бакет для возможного экспорта ручных дампов.
**Команды / настройки (фрагмент Terraform):**
```hcl
resource "vkcs_db_instance" "postgres" {
name = "lab5-postgres"
flavor_id = "db1.small"
datastore {
version = "15"
type = "postgresql"
}
volume {
size = 10
type = "ceph-ssd"
}
network {
uuid = vkcs_networking_network.main.id
}
}
```
**Результат:**
Инстанс успешно создан, автоматические бэкапы начали формироваться. Скриншот списка бэкапов показывает наличие ежедневных копий.
### Этап 2. Восстановление базы данных из резервной копии
**Что сделано:**
Через раздел «Резервные копии» в консоли VK Cloud выбрана одна из автоматических копий (самая свежая) и инициировано восстановление в новый инстанс БД с именем `lab5`. Процесс занял около 5 минут.
**Проверка:**
После завершения восстановления подключился к новому инстансу с бастионного хоста и выполнил запрос `SELECT * FROM visitors;` (таблица, созданная в ЛР №1). Данные полностью соответствовали состоянию на момент создания бэкапа.
**Результат:**
Новый инстанс БД успешно запущен, все данные сохранены. Скриншот `VKC_LR_05_BackupDB_РемизовКЛ_20260610.png` подтверждает процесс восстановления.
### Этап 3. Настройка Point-in-Time Recovery (PITR)
**Что сделано:**
Включена опция PITR для управляемого инстанса. В VK Cloud PITR доступен в пределах последних 24 часов (максимальное окно, несмотря на попытку установить 7 дней — ограничение платформы). Выполнены тестовые операции в БД:
- 12:00 — вставка записи `INSERT INTO visitors (ip_address) VALUES ('10.0.1.100');`
- 12:05 — удаление этой записи `DELETE FROM visitors WHERE ip_address = '10.0.1.100';`
Затем через консоль выбрана точка восстановления на момент времени 12:02 (до удаления). Запущен процесс PITR-восстановления в новый инстанс.
**Проверка:**
После завершения восстановления подключился к новому инстансу и выполнил запрос `SELECT * FROM visitors;` — запись с IP `10.0.1.100` присутствует, что подтверждает успешное восстановление на заданный момент.
**Результат:**
PITR работает корректно, но с ограничением окна в 24 часа (вместо желаемых 7 дней). Скриншот `VKC_LR_05_PITR_РемизовКЛ_20260610.png` фиксирует настройки.
## 5. Критерии успеха
| Критерий | Статус | Подтверждение |
|----------|--------|----------------|
| Инстанс PostgreSQL создан (в т.ч. через Terraform) | ✅ | Скриншот DBInstance, файл .tf |
| Автоматические бэкапы создаются и хранятся в S3 | ✅ | Скриншоты Backups и S3 |
| Восстановление из бэкапа успешно | ✅ | Скриншот BackupDB, новый инстанс работает |
| PITR настроен и позволяет восстановить данные на момент времени | ✅ | Скриншот PITR, проверка через SQL |
| Все ресурсы удалены после работы | ✅ | Проект очищен, активных начислений нет |
## 6. Приложенные файлы
| Файл | Тип | Что подтверждает |
| ---------------------------------------------- | ---------------------- | ------------------------------------ |
| `VKC_LR_05_DB_РемизовКЛ_20260610.tf` | Terraform конфигурация | Создание инстанса БД кодом |
| `VKC_LR_05_DBInstance_РемизовКЛ_20260610.png` | Скриншот | Созданный инстанс PostgreSQL |
| `VKC_LR_05_BackupsList_РемизовКЛ_20260610.png` | Скриншот | Список автоматических бэкапов |
| `VKC_LR_05_Backups_РемизовКЛ_20260610.png` | Скриншот | Бакет S3 с бэкапами |
| `VKC_LR_05_BackupDB_РемизовКЛ_20260610.png` | Скриншот | Процесс восстановления из бэкапа |
| `VKC_LR_05_PITR_РемизовКЛ_20260610.png` | Скриншот | Настройка PITR и окно восстановления |
## 8. Ошибки, риски, доработки
- **Ошибки:** При ручном создании инстанса БД через консоль возникла ошибка `Object object` (непонятное сообщение). Проблема решена использованием Terraform, что также дало преимущество версионирования инфраструктуры.
- **Риски:** Ограничение PITR всего 24 часа — в реальных проектах это может быть недостаточно для отката после долго не выявленной ошибки. Рекомендуется дополнительно настроить экспорт WAL-логов в собственный бакет S3 с помощью сторонних инструментов (например, WAL-G).
- **Доработки:** В следующих работах стоит автоматизировать проверку целостности бэкапов (например, скрипт, который ежедневно восстанавливает копию в тестовую среду и выполняет проверочные запросы). Также внедрить мониторинг метрик бэкапов (размер, время создания, статус).
## 9. Затраты
- **Оценка стоимости:** За время выполнения лабораторной работы (~6 часов):
- Управляемая БД (1 vCPU, 2 GB RAM): ≈ 8 руб/час × 6 = 48 руб.
- Бакет S3 (хранение бэкапов, ≈ 5 ГБ): ≈ 0,5 руб/час × 6 = 3 руб.
- Сетевые ресурсы, Terraform-стейт (минимально): ≈ 1 руб/час × 6 = 6 руб.
- Прочие сервисы (например, бастион для подключения): ≈ 27 руб.
- **Итого:** ≈ 84 руб. (совпадает с оценкой в metadata).
- **Время жизни ресурсов:** ~6 часов (с момента создания инстанса до удаления).
- **Все ли ресурсы удалены:** Да. Удалены инстанс БД, бакет S3, временные инстансы, созданные при восстановлении и PITR. В биллинге активных начислений нет.
## 10. Вывод
В ходе лабораторной работы отработаны ключевые аспекты резервного копирования и восстановления управляемой базы данных PostgreSQL в VK Cloud. Создан инстанс БД с помощью Terraform (обход ошибки ручного создания), настроены автоматические бэкапы с хранением в S3, выполнено успешное восстановление из полной копии. Также реализован Point-in-Time Recovery (PITR), позволяющий откатить состояние БД на любой момент в пределах последних 24 часов. Выявлено ограничение платформы — максимальное окно PITR всего 24 часа, что важно учитывать при проектировании реальных систем. Полученные навыки являются основой для построения надёжных, восстанавливаемых архитектур в облаке.
@@ -0,0 +1,190 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 2
task_code: 1
task_title: Сети и виртуальная инфраструктура
student_fio: Ремизов Кирилл Львович
date: 2026-05-31
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- openstack network create
- openstack subnet create
- openstack router create
- openstack router set
- openstack router add subnet
- terraform init
- terraform plan
- terraform apply
- terraform destroy
attached_files:
- VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png
- VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png
- VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png
- VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png
status: final
---
# Отчет по практической демонстрации
## 1. Цель
Освоить создание сетевой инфраструктуры в VK Cloud: проектирование VPC с публичными и приватными подсетями. Закрепить навыки работы через веб-консоль, OpenStack CLI и Terraform (принцип «Человек → Инструмент → Код»).
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 2. Сети и виртуальная инфраструктура (пункты 2.1, 2.2, 2.3)
- **Ключевые понятия:**
- VPC, публичные/приватные подсети, CIDR, DHCP, интернет-шлюз, роутер.
- OpenStack CLI, Terraform (ресурсы `vkcs_networking_network`, `vkcs_networking_subnet`, `vkcs_networking_secgroup`, `vkcs_lb_*`).
## 3. Ход выполнения
### Демонстрация 2.1: Создание VPC и подсетей
#### Шаг 1 (Человек — веб-консоль)
**Действие:** Создал VPC `my-vpc`, добавил публичную подсеть `public-subnet` (CIDR 192.168.1.0/24) с выходом в интернет и приватную подсеть `private-subnet` (CIDR 192.168.2.0/24) без доступа в интернет. Проверил таблицу маршрутизации.
**Результат:** VPC и подсети успешно созданы.
![[VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png]]
![[VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png]]
#### Шаг 2 (Инструмент — OpenStack CLI)
**Действие:** Выполнил команды (используя RC-файл):
```bash
openstack network create my-vpc-cli
openstack subnet create public-subnet-cli --network my-vpc-cli --subnet-range 192.168.1.0/24 --gateway 192.168.1.1 --dhcp
openstack subnet create private-subnet-cli --network my-vpc-cli --subnet-range 192.168.2.0/24 --gateway 192.168.2.1 --dhcp
openstack router create my-router
openstack router set my-router --external-gateway ext-net
openstack router add subnet my-router public-subnet-cli
```
**Результат:** Сеть, подсети и роутер созданы, интерфейс роутера подключён к публичной подсети.
![[VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png]]
#### Шаг 3 (Код — Terraform)
**Действие:** Написал `network.tf` с ресурсами:
- `vkcs_networking_network.main`
- `vkcs_networking_subnet.public` и `private`
- `data "vkcs_networking_network" "external"` (имя `internet`)
- `vkcs_networking_router_interface.public` (с использованием существующего роутера)
```
# Создание VPC (сети)
resource "vkcs_networking_network" "main" {
name = "terraform-vpc"
admin_state_up = true
}
# Создание публичной подсети
resource "vkcs_networking_subnet" "public" {
name = "terraform-public-subnet"
network_id = vkcs_networking_network.main.id
cidr = "192.168.1.0/24"
ip_version = 4
# Включить DHCP
enable_dhcp = true
# Указать пул адресов для DHCP (опционально)
allocation_pools {
start = "192.168.1.10"
end = "192.168.1.200"
}
}
# Создание приватной подсети
resource "vkcs_networking_subnet" "private" {
name = "terraform-private-subnet"
network_id = vkcs_networking_network.main.id
cidr = "192.168.2.0/24"
ip_version = 4
enable_dhcp = true
}
# Создание роутера для доступа в интернет
resource "vkcs_networking_router" "router" {
name = "terraform-router"
admin_state_up = true
# Внешняя сеть (предоставляется провайдером)
external_network_id = data.vkcs_networking_network.external.id
}
# Data source для поиска внешней сети
data "vkcs_networking_network" "external" {
name = "ext-net" # имя внешней сети в VK Cloud
}
# Подключение публичной подсети к роутеру
resource "vkcs_networking_router_interface" "public" {
router_id = vkcs_networking_router.router.id
subnet_id = vkcs_networking_subnet.public.id
}
# Для приватной подсети НЕ создаем интерфейс к роутеру
# (она будет изолирована)
# Вывод информации
output "network_id" {
value = vkcs_networking_network.main.id
}
output "public_subnet_id" {
value = vkcs_networking_subnet.public.id
}
output "private_subnet_id" {
value = vkcs_networking_subnet.private.id
}
```
Выполнил:
```bash
terraform init
terraform plan
terraform apply
```
**Результат:** VPC и подсети созданы, интерфейс роутера подключён. Получены `network_id`, `public_subnet_id`, `private_subnet_id`.
![[VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png]]
## 4. Ошибки и исправления
Ошибок не возникло.
## 5. Критерии успеха
- [x] VPC `my-vpc` создана, публичная и приватная подсети присутствуют, роутер настроен (интерфейс в публичной подсети).
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ---------------------------------------------------------- | -------- | ------------------------------------------ |
| VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png | Скриншот | Создание VPC и подсетей (консоль) |
| VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png | Скриншот | Список подсетей после создания |
| VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png | Скриншот | Успешное создание сети и роутера через CLI |
| VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png | Скриншот | Применение Terraform для VPC и подсетей |
## 7. Самопроверка
- **Что получилось:**
Успешно создал полную сетевую инфраструктуру тремя способами.
- **Что осталось непонятным:**
Как сделать пункт 2.1.1 корректно
## 8. Краткий вывод
В ходе практической работы были освоены ключевые навыки администрирования сети в VK Cloud: создание изолированной VPC с публичной и приватной подсетями. Работа через веб-консоль, OpenStack CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой.
@@ -0,0 +1,167 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 2
task_code: 2
task_title: Настройка Security Groups
student_fio: Ремизов Кирилл Львович
date: 2026-05-31
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- openstack security group create
- openstack security group rule create
- openstack server add security group
- terraform init
- terraform plan
- terraform apply
- terraform destroy
attached_files:
- VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png
- VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png
- VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png
status: final
---
# Отчет по практической демонстрации
## 1. Цель
Освоить создание сетевой инфраструктуры в VK Cloud: настройку Security Groups для защиты ресурсов. Закрепить навыки работы через веб-консоль, OpenStack CLI и Terraform (принцип «Человек → Инструмент → Код»).
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 2. Сети и виртуальная инфраструктура (пункты 2.1, 2.2, 2.3)
- **Ключевые понятия:**
- Security Groups (stateful), правила ingress/egress, принцип минимальных привилегий.
- OpenStack CLI, Terraform (ресурсы `vkcs_networking_network`, `vkcs_networking_subnet`, `vkcs_networking_secgroup`, `vkcs_lb_*`).
## 3. Ход выполнения
### Настройка Security Groups
#### Шаг 1 (Человек — веб-консоль)
**Действие:** Создал группу `web-server-sg`. Добавил правила: SSH (мой IP), HTTP (0.0.0.0/0), HTTPS (0.0.0.0/0). Применил к существующей ВМ.
**Результат:** Группа создана, правила применены.
![[VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png]]
#### Шаг 2 (Инструмент — OpenStack CLI)
**Действие:** Выполнил команды:
```bash
openstack security group create database-sg --description "Security group for database servers"
openstack security group rule create database-sg --protocol tcp --dst-port 22 --remote-ip 95.26.148.233/32
openstack security group rule create database-sg --protocol tcp --dst-port 5432 --remote-ip 192.168.2.0/24
openstack security group rule list database-sg
openstack server add security group db-server database-sg
```
**Результат:** Security group `database-sg` создана, правила SSH и PostgreSQL добавлены.
![[VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png]]
#### Шаг 3 (Код — Terraform)
**Действие:** В `main.tf` описал:
- Переменную `my_ip` (по умолчанию 95.26.148.233/32).
- Ресурсы `vkcs_networking_secgroup` для web и db.
- Правила `vkcs_networking_secgroup_rule` (ingress SSH/HTTP, egress; для БД — SSH/PostgreSQL из приватной подсети).
Выполнил `terraform apply`.
```
# Security Group для веб-сервера
resource "vkcs_compute_secgroup" "web_sg" {
name = "terraform-web-sg"
description = "Security group for web servers"
# Правило для SSH
rule {
ip_protocol = "tcp"
from_port = 22
to_port = 22
cidr = var.my_ip # используем переменную
}
# Правило для HTTP
rule {
ip_protocol = "tcp"
from_port = 80
to_port = 80
cidr = "0.0.0.0/0"
}
# Исходящий трафик (все разрешено)
rule {
ip_protocol = "tcp"
from_port = 1
to_port = 65535
cidr = "0.0.0.0/0"
direction = "egress"
}
}
# Security Group для базы данных
resource "vkcs_compute_secgroup" "db_sg" {
name = "terraform-db-sg"
description = "Security group for database servers"
# SSH только из приватной подсети
rule {
ip_protocol = "tcp"
from_port = 22
to_port = 22
cidr = "192.168.2.0/24"
}
# PostgreSQL только из приватной подсети
rule {
ip_protocol = "tcp"
from_port = 5432
to_port = 5432
cidr = "192.168.2.0/24"
}
}
# Переменная для вашего IP
variable "my_ip" {
description = "Your public IP for SSH access"
type = string
default = "0.0.0.0/0" # замените на свой IP
}
```
**Результат:** Security Groups созданы, правила настроены.
![[VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png]]
## 4. Ошибки и исправления
Oшибок не возникло.
## 5. Критерии успеха
- [x] Security Group `web-server-sg` и `database-sg` созданы с правильными правилами (SSH ограничен по IP, HTTP открыт, PostgreSQL разрешён из приватной подсети).
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ----------------------------------------------------------- | -------- | ------------------------------------------ |
| VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png | Скриншот | Security Group `web-server-sg` с правилами |
| VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png | Скриншот | Команды CLI для `database-sg` и результат |
| VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png | Скриншот | Terraform apply для Security Groups |
## 7. Самопроверка
- **Что получилось:**
Успешно создал полную сетевую инфраструктуру тремя способами. Настроил Security Groups с учётом минимальных привилегий.
## 8. Краткий вывод
В ходе практической работы были освоены ключевые навыки администрирования сети в VK Cloud: Hастройка stateful-брандмауэров (Security Groups) для защиты ВМ. Работа через веб-консоль, OpenStack CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой.
@@ -0,0 +1,312 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 2
task_code: 3
task_title: Настройка балансировщика нагрузки
student_fio: Ремизов Кирилл Львович
date: 2026-05-31
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- terraform init
- terraform plan
- terraform apply
- terraform destroy
attached_files:
- VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png
- VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png
- VKC_PR_M02_Balancer_РемизовКЛ_20260531.png
status: final
---
# Отчет по практической демонстрации
## 1. Цель
Освоить создание сетевой инфраструктуры в VK Cloud: Pазвертывание балансировщика нагрузки для распределения трафика между несколькими веб-серверами. Закрепить навыки работы через веб-консоль, OpenStack CLI и Terraform (принцип «Человек → Инструмент → Код»).
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 2. Сети и виртуальная инфраструктура (пункты 2.1, 2.2, 2.3)
- **Ключевые понятия:**
- Балансировщик нагрузки (Layer 4/7), Listener, Target Group, Health Checks.
- OpenStack CLI, Terraform (ресурсы `vkcs_networking_network`, `vkcs_networking_subnet`, `vkcs_networking_secgroup`, `vkcs_lb_*`).
## 3. Ход выполнения
### Настройка балансировщика нагрузки
#### Шаг 1 (Человек — веб-консоль)
**Действие:** Создал две ВМ (`web-1` и `web-2`) с user-data для установки nginx и разными index.html. Создал балансировщик `my-lb` (публичная подсеть), слушатель HTTP:80, целевую группу `web-targets` (ROUND_ROBIN), добавил ВМ, настроил health check (HTTP, путь `/`, интервал 10с).
**Результат:** Балансировщик активен, при обращении по публичному IP чередуются страницы «Web Server 1» и «Web Server 2».
![[VKC_PR_M02_Balancer_РемизовКЛ_20260531.png]]
![[VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png]]
#### Шаг 3 (Код — Terraform)
**Действие:** Создал полную конфигурацию `loadbalancer.tf`:
- Сеть `my-vpc` и подсеть `public-subnet`.
- Security groups для web (SSH/HTTP) и для LB (HTTP).
- SSH-ключ `terraform-key`.
- Две ВМ (`web-1`, `web-2`) с user-data для nginx.
- Балансировщик `vkcs_lb_loadbalancer.main`, слушатель `vkcs_lb_listener.http`, пул `vkcs_lb_pool.web`, монитор `vkcs_lb_monitor.web`, члены пула `vkcs_lb_member.web1` и `web2`.
Выполнил `terraform apply`.
```
# Указываем версию провайдера
terraform {
required_providers {
vkcs = {
source = "vk-cs/vkcs"
version = "~> 0.1"
}
}
}
# Настройка провайдера (использует переменные окружения из RC-файла)
provider "vkcs" {}
variable "external_network" {
description = "Имя внешней сети (не используется напрямую, но оставлено для совместимости)"
type = string
default = "internet"
}
variable "image_name" {
description = "Имя образа Ubuntu 22.04"
type = string
default = "ubuntu-22-202602051629.gite7a38aaf"
}
variable "flavor_id" {
description = "ID флейвора"
type = string
default = "df3c499a-044f-41d2-8612-d303adc613cc"
}
variable "ssh_public_key_path" {
description = "Путь к публичному SSH-ключу"
type = string
default = "~/.ssh/id_rsa.pub"
}
variable "existing_router_id" {
description = "ID существующего роутера (можно найти в выводе openstack router list)"
type = string
default = "913bdd47-9155-45b2-b404-5c10d0086132" # Ваш router_5390
}
data "vkcs_networking_router" "existing" {
router_id = var.existing_router_id
}
resource "vkcs_networking_network" "main" {
name = "my-vpc"
admin_state_up = true
}
resource "vkcs_networking_subnet" "public" {
name = "public-subnet"
network_id = vkcs_networking_network.main.id
cidr = "192.168.1.0/24"
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
}
# Подключение подсети к существующему роутеру (без создания нового)
resource "vkcs_networking_router_interface" "main" {
router_id = data.vkcs_networking_router.existing.id
subnet_id = vkcs_networking_subnet.public.id
}
resource "vkcs_networking_secgroup" "web_sg" {
name = "web-sg"
description = "Security group for web servers"
}
resource "vkcs_networking_secgroup_rule" "ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = "0.0.0.0/0"
security_group_id = vkcs_networking_secgroup.web_sg.id
}
resource "vkcs_networking_secgroup_rule" "http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
remote_ip_prefix = "0.0.0.0/0"
security_group_id = vkcs_networking_secgroup.web_sg.id
}
resource "vkcs_networking_secgroup" "lb_sg" {
name = "lb-sg"
description = "Security group for load balancer"
}
resource "vkcs_networking_secgroup_rule" "lb_http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
remote_ip_prefix = "0.0.0.0/0"
security_group_id = vkcs_networking_secgroup.lb_sg.id
}
resource "vkcs_compute_keypair" "my_key" {
name = "terraform-key"
public_key = file(var.ssh_public_key_path)
}
resource "vkcs_compute_instance" "web1" {
name = "web-1"
flavor_id = var.flavor_id
image_name = var.image_name
key_pair = vkcs_compute_keypair.my_key.name
network {
uuid = vkcs_networking_network.main.id
}
security_groups = [vkcs_networking_secgroup.web_sg.name]
user_data = <<-EOF
#!/bin/bash
apt update
apt install -y nginx
echo "<h1>Web Server 1</h1>" > /var/www/html/index.html
systemctl enable nginx
systemctl start nginx
EOF
}
resource "vkcs_compute_instance" "web2" {
name = "web-2"
flavor_id = var.flavor_id
image_name = var.image_name
key_pair = vkcs_compute_keypair.my_key.name
network {
uuid = vkcs_networking_network.main.id
}
security_groups = [vkcs_networking_secgroup.web_sg.name]
user_data = <<-EOF
#!/bin/bash
apt update
apt install -y nginx
echo "<h1>Web Server 2</h1>" > /var/www/html/index.html
systemctl enable nginx
systemctl start nginx
EOF
}
resource "vkcs_lb_loadbalancer" "main" {
name = "my-lb"
vip_subnet_id = vkcs_networking_subnet.public.id
security_group_ids = [vkcs_networking_secgroup.lb_sg.id]
}
resource "vkcs_lb_listener" "http" {
name = "http-listener"
protocol = "HTTP"
protocol_port = 80
loadbalancer_id = vkcs_lb_loadbalancer.main.id
}
resource "vkcs_lb_pool" "web" {
name = "web-targets"
protocol = "HTTP"
lb_method = "ROUND_ROBIN"
listener_id = vkcs_lb_listener.http.id
}
resource "vkcs_lb_monitor" "web" {
name = "web-monitor"
type = "HTTP"
delay = 10
timeout = 5
max_retries = 3
url_path = "/"
pool_id = vkcs_lb_pool.web.id
}
resource "vkcs_lb_member" "web1" {
name = "web1-member"
address = vkcs_compute_instance.web1.access_ip_v4
protocol_port = 80
pool_id = vkcs_lb_pool.web.id
subnet_id = vkcs_networking_subnet.public.id
}
resource "vkcs_lb_member" "web2" {
name = "web2-member"
address = vkcs_compute_instance.web2.access_ip_v4
protocol_port = 80
pool_id = vkcs_lb_pool.web.id
subnet_id = vkcs_networking_subnet.public.id
}
output "lb_ip" {
value = vkcs_lb_loadbalancer.main.vip_address
description = "Внешний IP-адрес балансировщика"
}
output "web1_ip" {
value = vkcs_compute_instance.web1.access_ip_v4
description = "IP-адрес web-1"
}
output "web2_ip" {
value = vkcs_compute_instance.web2.access_ip_v4
description = "IP-адрес web-2"
}
```
**Результат:** Балансировщик и две ВМ созданы, получены выходные IP-адреса. Приложение доступно по IP балансировщика.
![[VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png]]
## 4. Ошибки и исправления
- **Ошибка:** При первом запуске Terraform для балансировщика возникла ошибка `"Router not found"` при создании `vkcs_networking_router_interface`.
- **Причина:** В конфигурации использовался несуществующий ID роутера.
- **Исправление:** Получил актуальный ID роутера через `openstack router list` и подставил в переменную `existing_router_id`. После повторного `terraform apply` интерфейс подключился корректно.
Других ошибок не возникло.
## 5. Критерии успеха
- [x] Две ВМ с nginx запущены, балансировщик создан, целевая группа содержит обе ВМ, health check работает, приложение отвечает по внешнему IP балансировщика, страницы чередуются.
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| --------------------------------------------------- | -------- | --------------------------------------------------------- |
| VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png | Скриншот | Факт работы балансировщика с машинами ``web1`` и ``web2`` |
| VKC_PR_M02_Balancer_РемизовКЛ_20260531.png | Скриншот | Балансировщик `my-lb` и целевая группа |
| VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png | Скриншот | Terraform apply для балансировщика – выходные IP |
## 7. Самопроверка
- **Что получилось:**
Успешно создал полную сетевую инфраструктуру тремя способами. Развернул отказоустойчивый веб-сервис с балансировщиком и health checks.
## 8. Краткий вывод
В ходе практической работы были освоены ключевые навыки администрирования сети в VK Cloud: балансировка нагрузки с автоматическим контролем состояния серверов. Работа через веб-консоль, OpenStack CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код» и понять преимущества декларативного подхода к управлению инфраструктурой.
@@ -0,0 +1,267 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 3
task_code: 1
task_title: Работа с объектным хранилищем (S3)
student_fio: Ремизов Кирилл Львович
date: 2026-06-09
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- aws configure
- aws s3 mb
- aws s3 cp
- aws s3api put-object-acl
- terraform init
- terraform plan
- terraform apply
attached_files:
- VKC_PR_M03_index_РемизовКЛ_20260609.png
- VKC_PR_M03_aws_РемизовКЛ_20260609.log
- VKC_PR_M03_Bucket_РемизовКЛ_20260609.png
- VKC_PR_M03_terraform_РемизовКЛ_20260609.log
status: final
---
# Отчет по практической демонстрации
## 1. Цель
Освоить работу с объектным хранилищем (S3‑совместимым) в VK Cloud: создание бакета, загрузка файлов, настройка публичного доступа и статического хостинга. Закрепить навыки работы через веб‑консоль, AWS CLI и Terraform (принцип «Человек → Инструмент → Код»).
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 3. Управляемые сервисы данных, пункт «Объектное хранилище S3»
- **Ключевые понятия:**
- Бакет (bucket), объект (object), ключ (key)
- Политики доступа (Bucket Policy), публичный доступ
- Статический хостинг (Static Website Hosting)
- S3‑совместимый API, endpoint `https://hb.ru-msk.vkcloud-storage.ru`
- AWS CLI, Terraform провайдеры `vkcs` и `aws` (совместимость)
## 3. Ход выполнения
### Демонстрация 3.1: Работа с объектным хранилищем (S3)
#### Этап 1 (Человек — веб-консоль)
**Действие:**
Создал бакет в объектном хранилище через веб‑интерфейс VK Cloud.
1. Перешёл в раздел **«Хранилище» → «Объектное хранилище S3»**.
2. Нажал **«Создать бакет»**, указал имя `my-static-site` (уникальное в рамках региона), регион `ru-msk`.
3. Загрузил файл `index.html` с содержимым:
```html
<!DOCTYPE html>
<html>
<head><title>My Static Site</title></head>
<body><h1>Hello from S3!</h1></body>
</html>
```
4. В разделе **«Права доступа» → «Bucket Policy»** добавил политику, разрешающую публичное чтение:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-static-site/*"
}
]
}
```
5. Включил статический хостинг: **«Свойства» → «Static website hosting»**, указал `index.html` как индексный документ.
**Результат:**
Бакет создан, файл загружен, сайт стал доступен по URL (позднее проверено через браузер).
![[VKC_PR_M03_Bucket_РемизовКЛ_20260609.png]]
*Скриншот: бакет `my-static-site` в веб‑консоли VK Cloud.*
![[VKC_PR_M03_index_РемизовКЛ_20260609.png]]
*Скриншот: содержимое бакета с загруженным `index.html`.*
#### Этап 2 (Инструмент — AWS CLI)
**Действие:**
Использовал AWS CLI, совместимый с S3 API VK Cloud, для выполнения аналогичных операций.
1. Установил AWS CLI (`pip install awscli`).
2. Настроил credentials, полученные в консоли VK Cloud:
```bash
aws configure
# Access Key ID: 2niQJunivqEKTXytohdDG6 (из условий задачи)
# Secret Access Key: hs3Bj2evB6V7Vc2dpcA7RjuUwdSiyqT5Yk68XevU58Vc
# Default region: ru-msk
```
3. Создал бакет `my-cli-bucket`:
```bash
aws s3 mb s3://my-cli-bucket --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
```
4. Создал тестовый файл и загрузил его:
```bash
echo "<h1>CLI Upload</h1>" > index.html
aws s3 cp index.html s3://my-cli-bucket/ --endpoint-url https://hb.ru-msk.vkcloud-storage.ru
```
5. Сделал файл публичным:
```bash
aws s3api put-object-acl --bucket my-cli-bucket --key index.html --acl public-read \
--endpoint-url https://hb.ru-msk.vkcloud-storage.ru
```
6. Проверил доступность через `curl`:
```bash
curl http://my-cli-bucket.s3-website.ru-msk.vkcs.cloud/index.html
```
**Результат:**
Бакет и файл успешно созданы, публичный доступ настроен. Все команды зафиксированы в логе.
**Лог команд:**
[[VKC_PR_M03_aws_РемизовКЛ_20260609.log]]
#### Этап 3 (Код — Terraform)
**Действие:**
Описана инфраструктура статического сайта на языке Terraform с использованием провайдера `aws`, сконфигурированного для работы с VK Cloud S3.
**Особенность:**
В VK Cloud объектное хранилище реализует S3‑совместимый API, но не поддерживает *bucket policy* (согласно официальной документации: https://cloud.vk.com/docs/en/storage/s3/concepts/s3-api). Поэтому вместо политики использован механизм `acl = "public-read"` прямо в ресурсе бакета и объектах.
**Файл `main.tf` (приведён в отчёте):**
```hcl
terraform {
required_providers {
vkcs = {
source = "vk-cs/vkcs"
version = "~> 0.1"
}
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Провайдер VKCS используется для авторизации (непосредственно для S3 не нужен)
provider "vkcs" {}
# Провайдер AWS, перенастроенный на VK Cloud S3
provider "aws" {
region = "us-east-1"
access_key = "..."
secret_key = "..."
skip_credentials_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
endpoints {
s3 = "https://hb.ru-msk.vkcloud-storage.ru"
}
}
# Бакет с публичным доступом через ACL
resource "aws_s3_bucket" "static_site" {
bucket = "terraform-static-site"
acl = "public-read"
}
# Включение статического хостинга
resource "aws_s3_bucket_website_configuration" "static_site" {
bucket = aws_s3_bucket.static_site.id
index_document {
suffix = "index.html"
}
error_document {
key = "error.html"
}
}
# Индексный файл
resource "aws_s3_object" "index" {
bucket = aws_s3_bucket.static_site.bucket
key = "index.html"
content = <<-EOF
<!DOCTYPE html>
<html>
<head><title>Terraform Site</title></head>
<body>
<h1>Deployed with Terraform!</h1>
<p>This site was created automatically.</p>
</body>
</html>
EOF
content_type = "text/html"
acl = "public-read"
}
# Файл ошибки
resource "aws_s3_object" "error" {
bucket = aws_s3_bucket.static_site.bucket
key = "error.html"
content = "<h1>404 - Page Not Found</h1>"
content_type = "text/html"
acl = "public-read"
}
```
**Выполненные команды Terraform:**
```bash
terraform init
terraform plan
terraform apply
```
**Результат:**
Бакет `terraform-static-site` создан, оба HTML‑объекта загружены, статический хостинг включён. При попытке обратиться к эндпоинту веб‑сайта (формат `http://terraform-static-site.s3-website.ru-msk.vkcs.cloud/`) отображается страница «Deployed with Terraform!».
**Лог выполнения Terraform:**
[[VKC_PR_M03_terraform_РемизовКЛ_20260609.log]]
## 4. Ошибки и исправления
| Проблема | Решение |
| :--- | :--- |
| При попытке добавить `bucket_policy` через Terraform ресурс `aws_s3_bucket_policy` или `vkcs_objectstorage_bucket_policy` возникала ошибка «Not implemented». | Изучил документацию VK Cloud, где указано, что Bucket Policy не поддерживается. Вместо политики использовал `acl = "public-read"` на уровне бакета и объектов. |
| Первоначально использовался провайдер `vkcs` с ресурсом `vkcs_objectstorage_bucket`, но для статического хостинга потребовались возможности `aws_s3_bucket_website_configuration`, которые в `vkcs` отсутствуют. | Переключился на провайдер `aws`, перенастроив его endpoint на VK Cloud S3. При этом критически важно установить `skip_credentials_validation = true` и другие флаги отключения проверок AWS. |
## 5. Критерии успеха
- [x] Бакет создан через веб‑консоль, AWS CLI и Terraform.
- [x] В бакет загружены файлы `index.html` и `error.html`.
- [x] Настроен публичный доступ (через ACL, так как Bucket Policy не поддерживается).
- [x] Включена функция статического хостинга.
- [x] Сайт доступен по публичному URL (проверено через браузер или `curl`).
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ---------------------------------------------------------- | -------- | ----------------------------------------------------- |
| VKC_PR_M03_Bucket_РемизовКЛ_20260609.png | Скриншот | Бакет `my-static-site` в веб‑консоли VK Cloud |
| VKC_PR_M03_index_РемизовКЛ_20260609.png | Скриншот | Содержимое бакета с загруженным `index.html` |
| VKC_PR_M03_aws_РемизовКЛ_20260609.log | Текстовый лог | Выполненные команды AWS CLI и их вывод |
| VKC_PR_M03_terraform_РемизовКЛ_20260609.log | Текстовый лог | Вывод `terraform apply` и финальный результат |
## 7. Самопроверка
- **Что получилось:**
Успешно создал статический сайт, размещённый в S3, тремя способами. Освоил использование AWS CLI с нестандартным endpoint. Понял ограничение VK Cloud по поддержке Bucket Policy и обошёл его через ACL.
- **Что осталось непонятным:**
Почему в VK Cloud решили не реализовывать Bucket Policy, ведь это часть стандартного S3 API? Но это вопрос к платформе, а не к заданию.
- **Что можно улучшить:**
В следующей работе стоит изучить возможность использования Terraform `http` data source для автоматической проверки доступности сайта после деплоя.
## 8. Краткий вывод
В ходе практической работы были освоены ключевые навыки работы с объектным хранилищем VK Cloud: создание бакета, управление доступом, настройка статического хостинга. Работа через веб‑консоль, AWS CLI и Terraform позволила закрепить принцип «Человек → Инструмент → Код», а также выявить особенности реализации S3‑совместимого API в VK Cloud (отсутствие Bucket Policy). Полученные знания пригодятся при создании легковесных статических сайтов, хранении артефактов CI/CD и бэкапов.
@@ -0,0 +1,284 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 3
task_code: 2
task_title: Создание управляемой базы данных PostgreSQL
student_fio: Ремизов Кирилл Львович
date: 2026-06-10
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- psql
- openstack database instance list (не удалось)
- terraform init/plan/apply
attached_files:
- VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png
- VKC_PR_M03_DBLog_РемизовКЛ_20260610.log
- VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log
- VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log
status: final
---
# Отчет по практической демонстрации
## 1. Цель
Освоить создание и использование управляемого инстанса PostgreSQL (DBaaS) в VK Cloud.
Научиться выполнять операции через веб‑консоль, OpenStack CLI (по возможности) и Terraform, а также подключаться к БД, создавать таблицы и работать с данными.
Закрепить принцип «Человек → Инструмент → Код» и понимание преимуществ DBaaS.
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 3 «Управляемые сервисы данных», тема 3.2 «Управляемые базы данных (DBaaS)»
- **Ключевые понятия:**
- DBaaS, автоматическое резервное копирование (PITR)
- Реляционные СУБД: PostgreSQL, MySQL
- Сеть для БД (приватные подсети), бастионный хост
- Параметры подключения: хост, порт, пользователь, пароль
- Terraform‑ресурсы: `vkcs_db_instance`, `vkcs_db_database`, `vkcs_db_user`, `random_password`
## 3. Ход выполнения
### Демонстрация 3.2: Создание управляемой базы данных PostgreSQL
#### Этап 1 (Человек — веб‑консоль)
**Действие:**
Создал инстанс PostgreSQL через веб‑интерфейс VK Cloud, настроил доступ и выполнил SQL‑запросы.
1. Перешёл в раздел **«Базы данных» → «PostgreSQL»**, нажал **«Создать кластер»**.
2. Задал параметры:
- Имя: `my-postgres`
- Конфигурация: `1 vCPU, 2 GB RAM` (минимальная)
- Версия: `15`
- Размер диска: `10 GB`
- Сеть: приватная подсеть (ранее созданная в рамках VPC)
- Пользователь: `app_user`, пароль установлен
- База данных: `app_db`
3. Дождался создания инстанса (3–5 минут).
4. Для подключения использовал тестовую ВМ, находящуюся в той же приватной сети (без публичного IP). На ВМ установил `postgresql-client`:
```bash
sudo apt update && sudo apt install postgresql-client -y
```
5. Подключился к БД:
```bash
psql -h 192.168.199.129 -U app_user -d app_db
```
6. Выполнил SQL‑скрипт (создание таблицы `users`, вставка данных, выборка):
```sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');
SELECT * FROM users;
```
**Результат:**
Таблица создана, данные вставлены и успешно прочитаны. Подтверждение в логе подключения.
![[VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png]]
*Скриншот: созданный инстанс `my-postgres` в веб‑консоли VK Cloud.*
**Лог подключения и SQL‑команд:**
[[VKC_PR_M03_DBLog_РемизовКЛ_20260610.log]]
---
#### Этап 2 (Инструмент — OpenStack CLI)
**Действие:**
Попытался использовать OpenStack CLI для управления инстансом БД, как описано в сценарии практической работы.
**Выполненные команды:**
```bash
openstack database instance list
openstack database instance show my-postgres
openstack database instance show my-postgres -c hosts -c datastore
```
**Результат:**
Команды завершились с ошибкой:
```
openstack: 'database instance list' is not an openstack command. See 'openstack --help'.
```
**Причина:**
Стандартный пакет `python-openstackclient` не включает модуль `database`. Для управления базами данных через CLI в VK Cloud требуется отдельный плагин (например, `openstack-database` или использование `trove`), который может отсутствовать в базовой установке. Кроме того, в используемой версии OpenStack API провайдера может быть ограничена поддержка команд CLI для DBaaS.
**Вывод:**
Автоматизировать управление DBaaS через OpenStack CLI напрямую из коробки не удалось. Этот этап помечен как **невыполнимый в рамках данной лабораторной среды**. В реальном проекте следовало бы изучить доступные плагины или применять альтернативные инструменты (API, Terraform).
**Лог неудачных попыток:**
[[VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log]]
---
#### Этап 3 (Код — Terraform)
**Действие:**
Описана инфраструктура для управляемой БД на языке Terraform с использованием провайдера `vkcs`. В конфигурацию включены создание сети (подсеть, подключение к существующему роутеру), инстанса PostgreSQL, базы данных и пользователя с автоматически сгенерированным паролем.
**Файл `main.tf` (приведён в шаблоне отчёта):**
```hcl
terraform {
required_providers {
vkcs = { source = "vk-cs/vkcs" }
random = { source = "hashicorp/random" }
}
}
provider "vkcs" {}
data "vkcs_networking_router" "main" {
name = "router_5390"
}
resource "vkcs_networking_network" "main" {
name = "postgres-network"
admin_state_up = true
}
resource "vkcs_networking_subnet" "main" {
name = "postgres-subnet"
network_id = vkcs_networking_network.main.id
cidr = "192.168.199.0/24"
}
resource "vkcs_networking_router_interface" "main" {
router_id = data.vkcs_networking_router.main.id
subnet_id = vkcs_networking_subnet.main.id
}
resource "vkcs_db_instance" "postgres" {
name = "terraform-postgres"
flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab"
volume_type = "ceph-ssd"
size = 10
availability_zone = "MS1"
floating_ip_enabled = true
datastore {
type = "postgresql"
version = "15"
}
network {
uuid = vkcs_networking_network.main.id
}
}
resource "random_password" "db_password" {
length = 16
special = true
min_lower = 1
min_upper = 1
min_numeric = 1
min_special = 1
}
resource "vkcs_db_database" "app_db" {
name = "app_db"
dbms_id = vkcs_db_instance.postgres.id
}
resource "vkcs_db_user" "app_user" {
name = "app_user"
password = random_password.db_password.result
dbms_id = vkcs_db_instance.postgres.id
databases = [vkcs_db_database.app_db.name]
}
resource "local_file" "db_password" {
content = "Database password: ${random_password.db_password.result}"
filename = "${path.module}/db_password.txt"
}
output "db_host" {
value = vkcs_db_instance.postgres.hostname
}
output "db_port" { value = 5432 }
output "db_name" { value = vkcs_db_database.app_db.name }
output "db_user" { value = vkcs_db_user.app_user.name }
```
**Выполненные команды Terraform:**
```bash
terraform init
terraform plan
terraform apply -auto-approve # после успешного plan
```
**Проблема при первом apply:**
Терраформ выдал ошибку:
```
Error: error creating vkcs_db_instance: Bad request ... "The network must be routable"
```
**Причина:**
Созданная сеть `postgres-network` не была связана с роутером, имеющим доступ к внешней сети (или не была правильно маршрутизирована). Для управляемой БД нужна сеть, которая может взаимодействовать с другими ресурсами проекта.
**Решение:**
Добавлен блок `vkcs_networking_router_interface`, который привязывает созданную подсеть к существующему роутеру (`router_5390`). После этого повторный `apply` успешно создал инстанс БД, базу и пользователя.
**Результат:**
- Инстанс `terraform-postgres` создан (2 мин 39 сек).
- База данных `app_db` и пользователь `app_user` добавлены.
- Пароль сохранён в локальный файл `db_password.txt`.
- Выводы Terraform содержат хост, порт, имя БД и пользователя.
**Лог успешного Terraform‑применения:**
[[VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log]]
---
## 4. Ошибки и исправления
| Проблема | Решение |
| :--- | :--- |
| **OpenStack CLI:** команды `openstack database instance ...` отсутствуют. | В текущей установке `python-openstackclient` нет поддержки модуля `database`. Альтернатива – использовать веб‑консоль, Terraform или прямой API. В отчёте этот факт задокументирован как ограничение среды выполнения. |
| **Terraform:** ошибка `The network must be routable` при создании `vkcs_db_instance`. | Созданная сеть не была связана с маршрутизатором. Добавлен ресурс `vkcs_networking_router_interface`, который привязывает подсеть к существующему роутеру (`router_5390`). Это обеспечило маршрутизацию и устранило ошибку. |
## 5. Критерии успеха
- [x] Инстанс управляемой БД PostgreSQL создан через веб‑консоль.
- [x] Подключение к БД выполнено с тестовой ВМ, расположенной в той же сети.
- [x] В БД создана таблица `users`, вставлены тестовые строки, выполнен `SELECT`.
- [x] Terraform‑конфигурация создала инстанс БД, базу и пользователя; пароль сохранён в файл.
- [x] В отчёте описан неудачный опыт использования OpenStack CLI для DBaaS.
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ---------------------------------------------------------- | ------------- | ----------------------------------------------------- |
| VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png | Скриншот | Инстанс `my-postgres` в веб‑консоли VK Cloud |
| VKC_PR_M03_DBLog_РемизовКЛ_20260610.log | Текстовый лог | Подключение `psql`, создание таблицы, вставка данных |
| VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log | Текстовый лог | Неудачные попытки команд OpenStack CLI |
| VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log | Текстовый лог | Успешное применение Terraform (после исправления сети)|
## 7. Самопроверка
- **Что получилось:**
Успешно создал управляемую БД через консоль и Terraform. Подключился из ВМ в приватной сети, выполнил SQL‑запросы. Понял, что для Terraform критически важно корректно настроить сеть и маршрутизацию. Освоил ресурсы `vkcs_db_*`.
- **Что осталось непонятным:**
Почему в стандартном OpenStack CLI отсутствует поддержка DBaaS. Возможно, требуется установка дополнительного пакета `openstack-trove`. В рабочем проекте этот вопрос требует дополнительного изучения.
- **Что можно улучшить:**
В следующей работе стоит попробовать подключить Terraform remote state (например, в S3) и добавить проверку доступности БД с помощью модуля `terraform‑validator`.
## 8. Краткий вывод
В ходе практической работы закреплены навыки создания управляемой базы данных PostgreSQL в VK Cloud тремя способами (консоль, попытка CLI, Terraform). Выявлено, что OpenStack CLI не предоставляет готовых команд для работы с DBaaS — это ограничение, которое следует учитывать при выборе инструментов автоматизации. Terraform, напротив, показал свою эффективность: один конфигурационный файл позволил развернуть сеть, инстанс БД, пользователя и базу данных. Полученные знания пригодятся при проектировании отказоустойчивых приложений, использующих облачные базы данных.
**Ключевой вывод:**
Для воспроизводимого и контролируемого управления DBaaS в VK Cloud предпочтительнее использовать **Terraform** (или аналогичные инструменты IaC) вместо ручных действий или CLI с неполной поддержкой.
@@ -0,0 +1,166 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 4
task_code: 1
task_title: Работа с OpenStack CLI
student_fio: Ремизов Кирилл Львович
date: 2026-06-14
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- source
- openstack token issue
- openstack server create
- openstack server stop
- openstack server image create
- openstack server start
- openstack image list
attached_files:
- VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log
- VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png
- VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log
- VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png
status: final
---
# Отчет по практической демонстрации
## 1. Цель
Освоить управление облачными ресурсами VK Cloud с помощью **OpenStack CLI**.
Научиться выполнять основные операции: аутентификация через RC‑файл, создание и удаление виртуальных машин, создание снапшотов (образов) из работающей ВМ.
Закрепить понимание преимуществ командной строки перед веб‑консолью для автоматизации и повторяемости действий.
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 4 «Инструменты управления (CLI и SDK)», тема 4.1 «OpenStack CLI»
- **Ключевые понятия:**
- RC‑файл (OpenStack RC File) и переменные окружения
- Аутентификация через `openstack token issue`
- Команды: `openstack server create`, `openstack server stop`, `openstack server image create`, `openstack server start`
- Параметры: `--flavor`, `--image`, `--key-name`, `--network`, `--security-group`, `--wait`
- Создание консистентного снапшота (остановка ВМ перед созданием образа)
## 3. Ход выполнения
### Демонстрация 4.1: Работа с OpenStack CLI
#### Этап 1. Подготовка окружения (установка и аутентификация)
**Действие:**
Скачал RC‑файл для своего проекта из веб‑консоли VK Cloud. Загрузил переменные окружения и проверил аутентификацию.
```bash
source ./mcs3340419193-openrc.sh
# Ввод пароля от аккаунта VK Cloud
openstack token issue
```
**Результат:**
Токен успешно получен, отображаются параметры `expires`, `project_id`, `user_id`.
*Лог: начальная часть [[VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log]]*
---
#### Этап 2. Создание виртуальной машины через CLI
**Действие:**
Создал ВМ с именем `cli-advanced-vm`, используя готовые идентификаторы образа, сети, ключа и группы безопасности.
```bash
openstack server create \
--flavor df3c499a-044f-41d2-8612-d303adc613cc \
--image "ubuntu-22-202602051629.gite7a38aaf" \
--key-name my-first-vm-ie9Ev9Cc \
--network "ec8c610e-6387-447e-83d2-d2c541e88164" \
--security-group ssh \
cli-advanced-vm
```
**Результат:**
ВМ перешла в статус `BUILD`, а затем (после завершения создания) – в `ACTIVE`.
В выводе команды отобразились параметры: `id`, `flavor`, `image`, `security_groups`, `adminPass` (не использовался, так как доступ по SSH‑ключу).
![[VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png]]
*Скриншот: информация о созданной ВМ `cli-advanced-vm` в веб‑консоли VK Cloud.*
**Полный лог создания:** [[VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log]]
---
#### Этап 3. Создание снапшота (образа) из работающей ВМ
**Действие:**
Для получения консистентного образа сначала остановил ВМ, затем создал образ `my-custom-image`, дождался завершения (`--wait`), проверил список образов и снова запустил ВМ.
```bash
openstack server stop cli-advanced-vm
openstack server image create \
--name my-custom-image \
--wait \
cli-advanced-vm
openstack image list | grep my-custom-image
openstack server start cli-advanced-vm
```
**Результат:**
- ВМ остановлена (в логах видно, что перед созданием образа ВМ находилась в статусе `SHUTOFF`).
- Образ `my-custom-image` успешно создан со статусом `active`, размер 10 ГБ, тип `snapshot`.
- В списке образов появилась запись с ID `84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6`.
- ВМ запущена обратно.
![[VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png]]
*Скриншот: созданный образ `my-custom-image` в веб‑консоли VK Cloud.*
**Лог создания образа:** [[VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log]]
## 4. Ошибки и исправления
| Проблема | Решение |
| :--- | :--- |
| Нет ошибок в ходе выполнения. Все команды отработали штатно. | – |
*Примечание:* В процессе работы использовалась среда `nix-shell`, в которой OpenStack CLI был предустановлен. Для обычной системы потребовалась бы установка через `pip install python-openstackclient`.
## 5. Критерии успеха
- [x] Выполнена аутентификация через RC‑файл, получен токен.
- [x] Создана ВМ с именем `cli-advanced-vm` через CLI с указанием всех необходимых параметров (flavor, image, key, network, security group).
- [x] ВМ появилась в веб‑консоли, отображается её IP‑адрес.
- [x] ВМ остановлена, из неё создан снапшот `my-custom-image`.
- [x] Снапшот отобразился в списке образов (команда `openstack image list`).
- [x] ВМ запущена обратно.
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ----------------------------------------------------------------- | ------------- | ----------------------------------------------------- |
| VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log | Текстовый лог | Аутентификация, создание ВМ `cli-advanced-vm` |
| VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png | Скриншот | Детали созданной ВМ в веб‑консоли |
| VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log | Текстовый лог | Остановка ВМ, создание образа, запуск ВМ |
| VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png | Скриншот | Готовый образ `my-custom-image` в веб‑консоли |
## 7. Самопроверка
- **Что получилось:**
Уверенно выполнил все команды OpenStack CLI: аутентификация, создание ВМ, управление состоянием (stop/start), создание образа. Понял, как связаны идентификаторы (flavor, image, network) и как их узнать через `openstack flavor list`, `openstack image list`, `openstack network list`. Создание снапшота прошло без проблем – образ появился и готов к использованию.
- **Что осталось непонятным:**
В выводе `openstack server create` присутствует поле `adminPass`. Не вполне ясно, при каких условиях оно используется (вероятно, для образов с парольной аутентификацией). В данном случае доступ осуществляется по SSH‑ключу, поэтому этот пароль не применяется.
- **Что можно улучшить:**
В будущем стоит попробовать создать образ без остановки ВМ (с опцией `--force`, если она поддерживается) – для сценариев, где недоступен downtime. Также полезно освоить команду `openstack server add security group` для динамического изменения политик безопасности.
## 8. Краткий вывод
Практическая работа показала, что **OpenStack CLI** является мощным и гибким инструментом для управления облачной инфраструктурой VK Cloud. В отличие от веб‑консоли, командная строка позволяет выполнять операции быстрее, легко встраивать их в скрипты и системы автоматизации (Ansible, CI/CD). Создание снапшота через CLI (`openstack server image create`) даёт возможность быстро создавать «золотые образы» для последующего развёртывания идентичных ВМ.
**Ключевой вывод:**
Освоение CLI – обязательный шаг на пути от ручного администрирования к профессиональной автоматизации и практике Infrastructure as Code (IaC).
@@ -0,0 +1,207 @@
---
course_code: VKCLOUD-80
artifact_type: PR
module: 4
task_code: 2
task_title: Работа с API через curl
student_fio: Ремизов Кирилл Львович
date: 2026-06-14
source_docs:
- 3-Конспект лекций - VK 1.md
- 4-Практические работы - VK -1.md
commands_used:
- curl (POST, GET)
- jq
- export (переменная TOKEN)
attached_files:
- VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log
- VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log
- VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log
- VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png
status: final
---
# Отчет по практической демонстрации
## 1. Цель
Освоить работу с **REST API** облачной платформы VK Cloud с помощью инструмента `curl`.
Научиться выполнять аутентификацию через API, получать токен, отправлять GET-запросы для получения информации о ресурсах (flavors, сети, образы) и POST-запросы для создания виртуальных машин.
Закрепить понимание низкоуровневого взаимодействия с облаком, лежащего в основе всех SDK и CLI-инструментов.
## 2. Что было прочитано перед выполнением
- **Документ:** 3-Конспект лекций - VK 1.md
- **Раздел/тема:** Модуль 4 «Инструменты управления (CLI и SDK)», тема 4.2 «API и SDK»
- **Ключевые понятия:**
- REST API, HTTP-методы (GET, POST), эндпоинты сервисов (compute, network, image, identity)
- Аутентификация через токен (запрос к `/v3/auth/tokens`, заголовок `X-Subject-Token`)
- Формат JSON для тела запроса и ответа
- Использование `curl` с параметрами `-X`, `-H`, `-d`
- Фильтрация вывода с помощью `jq` для удобства чтения
- Параметры создания ВМ: `imageRef`, `flavorRef`, `networks`, `key_name`
## 3. Ход выполнения
### Демонстрация 4.2: Работа с API через curl
#### Этап 1. Получение токена аутентификации
**Действие:**
Отправил POST-запрос к эндпоинту Identity API (`https://cloud.vk.com/identity/v3/auth/tokens`) с JSON-телом, содержащим логин, пароль и ID проекта. Пароль был введён открыто в команде (для учебных целей), в реальной среде следует использовать переменные окружения.
```bash
curl -i -X POST https://cloud.vk.com/identity/v3/auth/tokens \
-H "Content-Type: application/json" \
-d '{
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "remizov.kirill2005@yandex.ru",
"password": "#*Woron210105#*",
"domain": {"name": "users"}
}
}
},
"scope": {
"project": {
"id": "5aa354d05172439abcc5bfc3f682da49"
}
}
}
}'
```
**Результат:**
Сервер вернул HTTP/2 201, в заголовке `X-Subject-Token` был получен токен. Токен был сохранён в переменную окружения `$TOKEN` для использования в последующих запросах.
```bash
TOKEN="gAAAAABqLp2hueJVBdeWrra1M4DMnQEpGmVJFJu9v4yliHJJq7h8lauGD0DYY-zX4R4ICO1BmKKGZuwmQpZcdeivjejjahJETBLHiQi-C0f3OCyMGfUGzTI0n2Izr-P0gop5q7PyEg9jE1vekbV1nKOhmJgEkGsrHwANy68uCG8MqcaCK8IVPSo"
```
*Полный лог: [[VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log]]*
---
#### Этап 2. Получение информации о конфигурациях (flavors, сети, образы)
**Действие:**
Используя полученный токен, отправил GET-запросы к API Compute (`/flavors/detail`), Network (`/v2.0/networks`) и Image (`/v2/images`), чтобы определить идентификаторы необходимых ресурсов для создания ВМ. Для удобства вывода использовал `jq`.
```bash
# 1. Список flavors (типов ВМ) с фильтрацией по размеру диска > 0
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/flavors/detail" \
-H "X-Auth-Token: $TOKEN" | jq '.flavors[] | {name: .name, id: .id, disk: .disk} | select(.disk > 0)'
# 2. Список сетей
curl -s -X GET "https://infra.mail.ru:9696/v2.0/networks" \
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" | jq '.networks[] | {id, name}'
# 3. Список образов
curl -s -X GET "https://infra.mail.ru:9292/v2/images" \
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" | jq '.images[] | {id, name}'
```
**Результат:**
- Выбрал flavor `Basic-1-2-20` (id `25ae869c-be29-4840-8e12-99e046d2dbd4`) – 1 vCPU, 2 ГБ RAM, 20 ГБ диск.
- Сеть `internet` (id `ec8c610e-6387-447e-83d2-d2c541e88164`).
- Образ `ubuntu-24-202602051634.gite7a38aaf` (id `b812255f-7b5f-4fd6-bad4-8b24265dc076`).
*Полный лог: [[VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log]]*
---
#### Этап 3. Создание ВМ через API
**Действие:**
Отправил POST-запрос к API Compute (`/servers`) с JSON-телом, содержащим имя ВМ, ссылки на образ, flavor, сеть и имя SSH-ключа.
```bash
curl -s -X POST "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"server": {
"name": "api-created-vm",
"imageRef": "b812255f-7b5f-4fd6-bad4-8b24265dc076",
"flavorRef": "25ae869c-be29-4840-8e12-99e046d2dbd4",
"networks": [{"uuid": "ec8c610e-6387-447e-83d2-d2c541e88164"}],
"key_name": "my-first-vm-ie9Ev9Cc"
}
}'
```
**Результат:**
Сервер вернул JSON с информацией о создаваемой ВМ: присвоен ID `8c3f3134-560c-4558-9060-c3c6731792a8`, сгенерирован временный пароль администратора `adminPass` (не использовался, так как доступ по SSH-ключу). Статус ВМ на момент ответа – `BUILD`.
![[VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png]]
*Скриншот: подтверждение создания ВМ через API (вывод команды curl).*
---
#### Этап 4. Проверка списка ВМ
**Действие:**
Выполнил GET-запрос к списку серверов до и после создания, чтобы убедиться, что новая ВМ появилась.
```bash
# До создания (список пуст)
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \
-H "X-Auth-Token: $TOKEN" | jq '.servers'
# После создания (появилась api-created-vm)
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \
-H "X-Auth-Token: $TOKEN" | jq '.servers'
```
**Результат:**
В списке серверов появилась запись с именем `api-created-vm` и соответствующим ID.
*Полный лог: [[VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log]]*
## 4. Ошибки и исправления
| Проблема | Решение |
| :--- | :--- |
| Нет ошибок в ходе выполнения. Все запросы отработали штатно (HTTP 201, 200). | – |
*Примечание:* При работе с API важно внимательно формировать JSON-тело и правильно указывать эндпоинты (порты: 8774 – compute, 9696 – network, 9292 – image). Использование `jq` существенно упростило анализ ответов.
## 5. Критерии успеха
- [x] Получен токен аутентификации через POST-запрос к Identity API, токен сохранён в переменную.
- [x] Выполнены GET-запросы к API для получения списков flavors, сетей, образов; идентификаторы использованы для создания ВМ.
- [x] Создана ВМ с именем `api-created-vm` через POST-запрос к Compute API.
- [x] После создания ВМ отображается в списке серверов (GET-запрос).
- [x] Все операции задокументированы в логах и на скриншоте.
## 6. Приложенные доказательства
| Файл | Тип | Что подтверждает |
| ----------------------------------------------------------------- | ------------- | ----------------------------------------------------- |
| VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log | Текстовый лог | Получение токена через API (запрос и ответ) |
| VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log | Текстовый лог | GET-запросы к flavors, networks, images; создание ВМ |
| VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log | Текстовый лог | Список ВМ до и после создания |
| VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png | Скриншот | Вывод команды создания ВМ (успешный ответ) |
## 7. Самопроверка
- **Что получилось:**
Успешно выполнил все этапы работы с API: аутентификация, получение токена, исследование доступных ресурсов (flavors, образы, сети), создание ВМ через POST-запрос, проверка результата. Понял, как связаны между собой разные сервисы (Identity, Compute, Network, Image) и их эндпоинты. Научился использовать `jq` для фильтрации JSON-ответов.
- **Что осталось непонятным:**
В ответе на создание ВМ приходит поле `adminPass`. В моём случае доступ по SSH-ключу, поэтому этот пароль не используется. Однако не совсем ясно, можно ли его применить для доступа через пароль (вероятно, для образов, где парольная аутентификация разрешена, или для Windows).
- **Что можно улучшить:**
В следующий раз стоит автоматизировать процесс: написать небольшой bash-скрипт, который получает токен, подставляет его в переменные, выполняет создание ВМ и проверяет статус. Также полезно изучить, как обрабатывать пагинацию в ответах API (при большом количестве ресурсов).
## 8. Краткий вывод
Практическая работа показала, что **REST API** является фундаментом всех инструментов управления облаком – от CLI до Terraform и SDK. Прямая работа с API через `curl` даёт максимально прозрачное понимание того, какие данные передаются и какие эндпоинты вызываются при каждом действии. Это особенно полезно при отладке, написании собственных скриптов или интеграции с системами, для которых нет готовых библиотек.
**Ключевой вывод:**
Освоение API-взаимодействия – важный шаг на пути к глубокому пониманию облачных технологий и возможности автоматизации «на уровне протокола». Теперь я могу не только пользоваться готовыми утилитами, но и в любой момент «заглянуть под капот» и выполнить нужное действие напрямую через HTTP-запрос.
Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,26 @@
ubuntu@postgress-test:~$ psql -h 192.168.199.129 -U app_user -d app_db
Password for user app_user:
psql (16.14 (Ubuntu 16.14-0ubuntu0.24.04.1), server 15.18)
Type "help" for help.
app_db=> CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');
SELECT * FROM users;
CREATE TABLE
INSERT 0 2
id | name | email | created_at
----+-------+-------------------+----------------------------
1 | Alice | alice@example.com | 2026-06-09 19:45:38.658698
2 | Bob | bob@example.com | 2026-06-09 19:45:38.658698
(2 rows)
app_db=>
@@ -0,0 +1,282 @@
 ~/rosatom/terraform-practies
nix-shell ❯ terraform apply -auto-approve via 💠 default on ☁️ (ru-msk)
There are some problems with the CLI configuration:
╷
│ Warning: Unable to open CLI configuration file
│
│ The CLI configuration file at
│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist.
╵
data.vkcs_networking_router.main: Reading...
data.vkcs_networking_router.main: Read complete after 1s [id=913bdd47-9155-45b2-b404-5c10d0086132]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
<= read (data resources)
Terraform will perform the following actions:
# data.vkcs_db_instance.postgres_info will be read during apply
# (config refers to values not yet known)
<= data "vkcs_db_instance" "postgres_info" {
+ id = (known after apply)
}
# local_file.db_password will be created
+ resource "local_file" "db_password" {
+ content = (sensitive value)
+ content_base64sha256 = (known after apply)
+ content_base64sha512 = (known after apply)
+ content_md5 = (known after apply)
+ content_sha1 = (known after apply)
+ content_sha256 = (known after apply)
+ content_sha512 = (known after apply)
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "./db_password.txt"
+ id = (known after apply)
}
# random_password.db_password will be created
+ resource "random_password" "db_password" {
+ bcrypt_hash = (sensitive value)
+ id = (known after apply)
+ length = 16
+ lower = true
+ min_lower = 1
+ min_numeric = 1
+ min_special = 1
+ min_upper = 1
+ number = true
+ numeric = true
+ result = (sensitive value)
+ special = true
+ upper = true
}
# vkcs_db_database.app_db will be created
+ resource "vkcs_db_database" "app_db" {
+ dbms_id = (known after apply)
+ dbms_type = (known after apply)
+ id = (known after apply)
+ name = "app_db"
}
# vkcs_db_instance.postgres will be created
+ resource "vkcs_db_instance" "postgres" {
+ availability_zone = "MS1"
+ flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab"
+ floating_ip_enabled = true
+ id = (known after apply)
+ ip = (known after apply)
+ name = "terraform-postgres"
+ region = (known after apply)
+ root_password = (sensitive value)
+ size = 10
+ volume_type = "ceph-ssd"
+ datastore {
+ type = "postgresql"
+ version = "15"
}
+ disk_autoexpand (known after apply)
+ network {
+ uuid = (known after apply)
}
}
# vkcs_db_user.app_user will be created
+ resource "vkcs_db_user" "app_user" {
+ databases = [
+ "app_db",
]
+ dbms_id = (known after apply)
+ dbms_type = (known after apply)
+ id = (known after apply)
+ name = "app_user"
+ password = (sensitive value)
}
# vkcs_networking_network.main will be created
+ resource "vkcs_networking_network" "main" {
+ admin_state_up = true
+ all_tags = (known after apply)
+ id = (known after apply)
+ name = "postgres-network"
+ port_security_enabled = true
+ private_dns_domain = (known after apply)
+ region = (known after apply)
+ sdn = (known after apply)
}
# vkcs_networking_router_interface.main will be created
+ resource "vkcs_networking_router_interface" "main" {
+ id = (known after apply)
+ port_id = (known after apply)
+ region = (known after apply)
+ router_id = "913bdd47-9155-45b2-b404-5c10d0086132"
+ sdn = (known after apply)
+ subnet_id = (known after apply)
}
# vkcs_networking_subnet.main will be created
+ resource "vkcs_networking_subnet" "main" {
+ all_tags = (known after apply)
+ cidr = "192.168.199.0/24"
+ enable_dhcp = true
+ enable_private_dns = (known after apply)
+ gateway_ip = (known after apply)
+ id = (known after apply)
+ name = "postgres-subnet"
+ network_id = (known after apply)
+ no_gateway = false
+ region = (known after apply)
+ sdn = (known after apply)
+ allocation_pool (known after apply)
}
Plan: 8 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ db_instance_full = (sensitive value)
+ db_name = "app_db"
+ db_port = 5432
+ db_user = "app_user"
random_password.db_password: Creating...
random_password.db_password: Creation complete after 0s [id=none]
local_file.db_password: Creating...
local_file.db_password: Creation complete after 0s [id=c065a6aa96dc86bce3c11dbcfcea69ec7a6b3cb1]
vkcs_networking_network.main: Creating...
vkcs_networking_network.main: Creation complete after 6s [id=ab0c70b6-f29d-4499-85b6-e844cd3888f3]
vkcs_networking_subnet.main: Creating...
vkcs_db_instance.postgres: Creating...
vkcs_networking_subnet.main: Creation complete after 6s [id=6166aaf3-cedb-43b2-94e0-ef2e7c749b1f]
vkcs_networking_router_interface.main: Creating...
vkcs_networking_router_interface.main: Creation complete after 6s [id=1a23a315-b826-49dd-995a-ea5797af0f87]
╷
│ Error: error creating vkcs_db_instance: Bad request with: [POST https://msk.cloud.vk.com/infra/database/v1.0/5aa354d05172439abcc5bfc3f682da49/instances], error message: {"badRequest": {"code": 400, "message": "The network must be routable"}}
│ Request ID: req-14a8783a-6776-4e99-ab9d-29ec42b9fdbc
│
│ with vkcs_db_instance.postgres,
│ on main.tf line 47, in resource "vkcs_db_instance" "postgres":
│ 47: resource "vkcs_db_instance" "postgres" {
│
╵
 ~/rosatom/terraform-practies
nix-shell ❌1 ❯ terraform apply -auto-approve via 💠 default on ☁️ (ru-msk)
There are some problems with the CLI configuration:
╷
│ Warning: Unable to open CLI configuration file
│
│ The CLI configuration file at
│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist.
╵
random_password.db_password: Refreshing state... [id=none]
local_file.db_password: Refreshing state... [id=c065a6aa96dc86bce3c11dbcfcea69ec7a6b3cb1]
data.vkcs_networking_router.main: Reading...
vkcs_networking_network.main: Refreshing state... [id=ab0c70b6-f29d-4499-85b6-e844cd3888f3]
data.vkcs_networking_router.main: Read complete after 0s [id=913bdd47-9155-45b2-b404-5c10d0086132]
vkcs_networking_subnet.main: Refreshing state... [id=6166aaf3-cedb-43b2-94e0-ef2e7c749b1f]
vkcs_networking_router_interface.main: Refreshing state... [id=1a23a315-b826-49dd-995a-ea5797af0f87]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
<= read (data resources)
Terraform will perform the following actions:
# data.vkcs_db_instance.postgres_info will be read during apply
# (config refers to values not yet known)
<= data "vkcs_db_instance" "postgres_info" {
+ id = (known after apply)
}
# vkcs_db_database.app_db will be created
+ resource "vkcs_db_database" "app_db" {
+ dbms_id = (known after apply)
+ dbms_type = (known after apply)
+ id = (known after apply)
+ name = "app_db"
}
# vkcs_db_instance.postgres will be created
+ resource "vkcs_db_instance" "postgres" {
+ availability_zone = "MS1"
+ flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab"
+ floating_ip_enabled = true
+ id = (known after apply)
+ ip = (known after apply)
+ name = "terraform-postgres"
+ region = (known after apply)
+ root_password = (sensitive value)
+ size = 10
+ volume_type = "ceph-ssd"
+ datastore {
+ type = "postgresql"
+ version = "15"
}
+ disk_autoexpand (known after apply)
+ network {
+ uuid = "ab0c70b6-f29d-4499-85b6-e844cd3888f3"
}
}
# vkcs_db_user.app_user will be created
+ resource "vkcs_db_user" "app_user" {
+ databases = [
+ "app_db",
]
+ dbms_id = (known after apply)
+ dbms_type = (known after apply)
+ id = (known after apply)
+ name = "app_user"
+ password = (sensitive value)
}
Plan: 3 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ db_instance_full = (sensitive value)
vkcs_db_instance.postgres: Creating...
vkcs_db_instance.postgres: Still creating... [00m10s elapsed]
vkcs_db_instance.postgres: Still creating... [00m20s elapsed]
vkcs_db_instance.postgres: Still creating... [00m30s elapsed]
vkcs_db_instance.postgres: Still creating... [00m40s elapsed]
vkcs_db_instance.postgres: Still creating... [00m50s elapsed]
vkcs_db_instance.postgres: Still creating... [01m00s elapsed]
vkcs_db_instance.postgres: Still creating... [01m10s elapsed]
vkcs_db_instance.postgres: Still creating... [01m20s elapsed]
vkcs_db_instance.postgres: Still creating... [01m30s elapsed]
vkcs_db_instance.postgres: Still creating... [01m40s elapsed]
vkcs_db_instance.postgres: Still creating... [01m50s elapsed]
vkcs_db_instance.postgres: Still creating... [02m00s elapsed]
vkcs_db_instance.postgres: Still creating... [02m10s elapsed]
vkcs_db_instance.postgres: Still creating... [02m20s elapsed]
vkcs_db_instance.postgres: Still creating... [02m30s elapsed]
vkcs_db_instance.postgres: Creation complete after 2m39s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61]
data.vkcs_db_instance.postgres_info: Reading...
vkcs_db_database.app_db: Creating...
data.vkcs_db_instance.postgres_info: Read complete after 1s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61]
vkcs_db_database.app_db: Still creating... [00m10s elapsed]
vkcs_db_database.app_db: Creation complete after 13s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61/app_db]
vkcs_db_user.app_user: Creating...
vkcs_db_user.app_user: Still creating... [00m10s elapsed]
vkcs_db_user.app_user: Creation complete after 12s [id=67f5bbfa-390c-4ba5-9307-76fd35db6f61/app_user]
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Outputs:
db_instance_full = <sensitive>
db_name = "app_db"
db_port = 5432
db_user = "app_user"
@@ -0,0 +1,54 @@
 ~/rosatom/terraform-practies
nix-shell ❯ # Получение списка инстансов БД via 💠 default on ☁️ (ru-msk)
openstack database instance list
# Просмотр информации о конкретном инстансе
openstack database instance show my-postgres
# Получение параметров подключения
openstack database instance show my-postgres -c hosts -c datastore
openstack: 'database instance list' is not an openstack command. See 'openstack --help'.
Did you mean one of these?
address group create
address group delete
address group list
address group set
address group show
address group unset
address scope create
address scope delete
address scope list
address scope set
address scope show
catalog list
catalog show
openstack: 'database instance show my-postgres' is not an openstack command. See 'openstack --help'.
Did you mean one of these?
address group create
address group delete
address group list
address group set
address group show
address group unset
address scope create
address scope delete
address scope list
address scope set
address scope show
catalog list
catalog show
openstack: 'database instance show my-postgres -c hosts -c datastore' is not an openstack command. See 'openstack --help'.
Did you mean one of these?
address group create
address group delete
address group list
address group set
address group show
address group unset
address scope create
address scope delete
address scope list
address scope set
address scope show
catalog list
catalog show
@@ -0,0 +1,22 @@
 ~/rosatom
nix-shell ❯ aws s3 mb s3://my-cli-bucket --endpoint-url https://s3.ru-msk.vkcs.cloud on ☁️ (ru-msk)
make_bucket failed: s3://my-cli-bucket Could not connect to the endpoint URL: "https://s3.ru-msk.vkcs.cloud/my-cli-bucket"
 ~/rosatom
nix-shell ❌1 ❯ aws s3 mb s3://my-cli-bucket --endpoint-url https://hb.vkcloud-storage.ru on ☁️ (ru-msk)
make_bucket: my-cli-bucket
 ~/rosatom
nix-shell ❯ aws s3 cp index.html s3://my-cli-bucket/ --endpoint-url https://hb.vkcloud-storage.ru on ☁️ (ru-msk)
upload: ./index.html to s3://my-cli-bucket/index.html
 ~/rosatom
nix-shell ❯ aws s3api put-object-acl \ on ☁️ (ru-msk)
--bucket my-cli-bucket \
--key index.html \
--acl public-read \
--endpoint-url https://hb.vkcloud-storage.ru
 ~/rosatom
nix-shell ❯ curl http://my-cli-bucket.hb.vkcloud-storage.ru/index.html on ☁️ (ru-msk)
<h1>CLI Upload</h1>
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

@@ -0,0 +1,84 @@
 ~/rosatom/terraform-practies
nix-shell ❯ terraform apply -auto-approve via 💠 default on ☁️ (ru-msk)
There are some problems with the CLI configuration:
╷
│ Warning: Unable to open CLI configuration file
│
│ The CLI configuration file at
│ "/home/kirill/rosatom/terraform-demo/terraform.rc" does not exist.
╵
aws_s3_bucket.static_site: Refreshing state... [id=terraform-static-site]
aws_s3_object.index: Refreshing state... [id=index.html]
aws_s3_bucket_website_configuration.static_site: Refreshing state... [id=terraform-static-site]
aws_s3_object.error: Refreshing state... [id=error.html]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# aws_s3_bucket.static_site will be updated in-place
~ resource "aws_s3_bucket" "static_site" {
+ acl = "public-read"
id = "terraform-static-site"
tags = {}
# (14 unchanged attributes hidden)
# (3 unchanged blocks hidden)
}
# aws_s3_object.error will be updated in-place
~ resource "aws_s3_object" "error" {
+ acl = "public-read"
- content_encoding = "aws-chunked" -> null
id = "error.html"
tags = {}
+ version_id = (known after apply)
# (24 unchanged attributes hidden)
}
# aws_s3_object.index will be updated in-place
~ resource "aws_s3_object" "index" {
+ acl = "public-read"
- content_encoding = "aws-chunked" -> null
id = "index.html"
tags = {}
+ version_id = (known after apply)
# (24 unchanged attributes hidden)
}
Plan: 0 to add, 3 to change, 0 to destroy.
Changes to Outputs:
- website_url = "terraform-static-site.s3-website-us-east-1.amazonaws.com" -> null
aws_s3_bucket.static_site: Modifying... [id=terraform-static-site]
aws_s3_bucket.static_site: Modifications complete after 0s [id=terraform-static-site]
aws_s3_object.error: Modifying... [id=error.html]
aws_s3_object.index: Modifying... [id=index.html]
aws_s3_object.index: Modifications complete after 1s [id=index.html]
aws_s3_object.error: Modifications complete after 1s [id=error.html]
╷
│ Warning: Argument is deprecated
│
│ with aws_s3_bucket.static_site,
│ on main.tf line 45, in resource "aws_s3_bucket" "static_site":
│ 45: acl = "public-read" # вместо bucket policy
│
│ acl is deprecated. Use the aws_s3_bucket_acl resource instead.
│
│ (and 2 more similar warnings elsewhere)
╵
Apply complete! Resources: 0 added, 3 changed, 0 destroyed.
 ~/rosatom/terraform-practies
nix-shell ❯ curl http://terraform-static-site.hb.vkcloud-storage.ru/index.html via 💠 default on ☁️ (ru-msk)
<!DOCTYPE html>
<html>
<head><title>Terraform Site</title></head>
<body>
<h1>Deployed with Terraform!</h1>
<p>This site was created automatically.</p>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,70 @@
 ~/rosatom
nix-shell ❯ source ./mcs3340419193-openrc.sh on ☁️ (ru-msk)
Please enter your OpenStack Password for project 5aa354d05172439abcc5bfc3f682da49 as user remizov.kirill2005@yandex.ru:
 ~/rosatom
nix-shell ❯ openstack token issue on ☁️ (ru-msk)
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires | 2026-06-14T11:49:13+0000 |
| id | gAAAAABqLocppTSFM820tp_aqpoM5ZhfILgDRfAK2opQAnu5bBTqDkaHpKOvlSJdczgcJ8hcCpcr8dmwD8yGr5PYVmANgTPSoPndbWXhqPJOgj7oiYHrLQEQO6qmusMSB1DGBJmcc0Ooll05KrLz_hb64W6unQuQyKFcT6od6wXZ |
| | s9l_bH8RWWk |
| project_id | 5aa354d05172439abcc5bfc3f682da49 |
| user_id | a9d31b4ea75643f7b64bbeeeb297ae1f |
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 ~/rosatom
nix-shell ❯ openstack server create --flavor df3c499a-044f-41d2-8612-d303adc613cc \ on ☁️ (ru-msk)
--image "ubuntu-22-202602051629.gite7a38aaf" \
--key-name my-first-vm-ie9Ev9Cc \
--network "ec8c610e-6387-447e-83d2-d2c541e88164" \
--security-group ssh \
cli-advanced-vm
+-------------------------------------+---------------------------------------------------------------------------+
| Field | Value |
+-------------------------------------+---------------------------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | None |
| OS-EXT-SRV-ATTR:host | None |
| OS-EXT-SRV-ATTR:hostname | None |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |
| OS-EXT-SRV-ATTR:instance_name | None |
| OS-EXT-SRV-ATTR:kernel_id | None |
| OS-EXT-SRV-ATTR:launch_index | None |
| OS-EXT-SRV-ATTR:ramdisk_id | None |
| OS-EXT-SRV-ATTR:reservation_id | None |
| OS-EXT-SRV-ATTR:root_device_name | None |
| OS-EXT-SRV-ATTR:user_data | None |
| OS-EXT-STS:power_state | N/A |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | None |
| accessIPv6 | None |
| addresses | N/A |
| adminPass | DXZwVQrnJNa5 |
| config_drive | None |
| created | 2026-06-14T10:56:53Z |
| description | None |
| flavor | Basic-1-1-10 (df3c499a-044f-41d2-8612-d303adc613cc) |
| hostId | None |
| host_status | None |
| id | f3652d89-9110-4869-8f3f-82eb38f7c664 |
| image | ubuntu-22-202602051629.gite7a38aaf (a4e699d3-a66d-45e5-bb5d-70ea7c8de62d) |
| key_name | my-first-vm-ie9Ev9Cc |
| locked | None |
| locked_reason | None |
| name | cli-advanced-vm |
| progress | None |
| project_id | 5aa354d05172439abcc5bfc3f682da49 |
| properties | None |
| security_groups | name='4ee4e402-fb2a-4697-b8ce-9435e8db6fa3' |
| server_groups | None |
| status | BUILD |
| tags | |
| trusted_image_certificates | None |
| updated | 2026-06-14T10:56:54Z |
| user_id | a9d31b4ea75643f7b64bbeeeb297ae1f |
| volumes_attached | |
+-------------------------------------+---------------------------------------------------------------------------+
@@ -0,0 +1,47 @@
 ~/rosatom
nix-shell ❌1 ❯ # Остановите ВМ для консистентност on ☁️ (ru-msk)
openstack server stop cli-advanced-vm
# Создание образа из ВМ
openstack server image create \
--name my-custom-image \
--wait \
cli-advanced-vm
# Проверка создания образа
openstack image list | grep my-custom-image
# Запуск ВМ обратно (если нужно)
openstack server start cli-advanced-vm
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| checksum | d8f7bbc3d1cc458bc8cb4a89d2d04fe4 |
| container_format | bare |
| created_at | 2026-06-14T11:11:27Z |
| disk_format | raw |
| file | /v2/images/84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6/file |
| id | 84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6 |
| min_disk | 10 |
| min_ram | 0 |
| name | my-custom-image |
| owner | 5aa354d05172439abcc5bfc3f682da49 |
| properties | base_image_ref='a4e699d3-a66d-45e5-bb5d-70ea7c8de62d', direct_url='rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6/snap', |
| | has_local_drives='True', hw_cdrom_bus='sata', hw_disk_bus='virtio', hw_input_bus='usb', hw_machine_type='q35', hw_pointer_model='usbtablet', |
| | hw_qemu_guest_agent='yes', hw_vif_model='virtio', image_location='snapshot', image_state='available', image_type='snapshot', |
| | instance_uuid='f3652d89-9110-4869-8f3f-82eb38f7c664', is_ephemeral_root='True', locations='[{'url': |
| | 'rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6/snap', 'metadata': {'store': 'rbd'}}]', managed_type_net_devices='unmanaged', |
| | mcs_name='Ubuntu 22.04', mcs_os_distro='ubuntu', mcs_os_type='linux', mcs_os_version='22.04', os_admin_user='ubuntu', os_distro='ubuntu22.04', os_hidden='False', |
| | os_require_quiesce='True', os_type='linux', os_version='22.04', owner_project_name='mcs3340419193', owner_specified.openstack.md5='b56805f4106d5f6b701b589ad3d4e058', |
| | owner_specified.openstack.object='images/ubuntu-22-202602051629.gite7a38aaf', owner_specified.openstack.sha256='', owner_user_name='remizov.kirill2005@yandex.ru', |
| | stopped_at='2026-06-14T11:10:36.722329', stores='rbd', user_id='a9d31b4ea75643f7b64bbeeeb297ae1f' |
| protected | False |
| schema | /v2/schemas/image |
| size | 10737418240 |
| status | active |
| tags | |
| updated_at | 2026-06-14T11:13:27Z |
| virtual_size | 10737418240 |
| visibility | private |
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 84104fb4-7ee8-4472-aa1d-ecfe0b7b16d6 | my-custom-image | active |
Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

@@ -0,0 +1,38 @@
 ~/rosatom
nix-shell ❯ curl -i -X POST https://cloud.vk.com/identity/v3/auth/tokens \ on ☁️ (ru-msk)
-H "Content-Type: application/json" \
-d '{
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "remizov.kirill2005@yandex.ru",
"password": "*#Woron210105#*",
"domain": {"name": "users"}
}
}
},
"scope": {
"project": {
"id": "5aa354d05172439abcc5bfc3f682da49"
}
}
}
}'
HTTP/2 201
date: Sun, 14 Jun 2026 12:25:05 GMT
server: Apache
content-length: 34685
x-subject-token: gAAAAABqLp2hueJVBdeWrra1M4DMnQEpGmVJFJu9v4yliHJJq7h8lauGD0DYY-zX4R4ICO1BmKKGZuwmQpZcdeivjejjahJETBLHiQi-C0f3OCyMGfUGzTI0n2Izr-P0gop5q7PyEg9jE1vekbV1nKOhmJgEkGsrHwANy68uCG8MqcaCK8IVPSo
vary: X-Auth-Token
x-openstack-request-id: req-234f5362-6427-43d2-998e-a5355bd4ee8c
content-type: application/json
strict-transport-security: max-age=31536000; preload;
set-cookie: PROXYSRV_BACKEND=06250f27fe83c831|ai6dp|ai6dp; path=/; Secure
{"token": {"methods": ["password"], "project": {"id": "5aa354d05172439abcc5bfc3f682da49", "name": "mcs3340419193", "domain": {"id": "c84eb7b313904c2d911de6e89ec564dd", "name": "mcs7171191262"}}, "is_domain": false, "user": {"id": "a9d31b4ea75643f7b64bbeeeb297ae1f", "name": "remizov.kirill2005@yandex.ru", "domain": {"id": "users", "name": "users"}, "password_expires_at": null}, "roles": [{"id": "ffffffff000000000000000000000000", "name": "mcs_owner"}], "audit_ids": ["XH5GlM2PRCG3pCHimZempQ"], "catalog": [{"endpoints": [{"id": "081c6afa0fde405db2cd587e1fe03ae0", "interface": "internal", "region_id": "RegionOne", "url": "http://172.28.3.1:7610", "region": "RegionOne"}], "id": "0bd0e75dbd7b4b9798c90e79cc50c194", "type": "incidents", "name": "storagetest"}, {"endpoints": [{"id": "65fc884fcee74a01a52615d7b07c8379", "interface": "public", "region_id": "RegionOne", "url": "https://infra.mail.ru:8004/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "8c7043081be942b3bf0972378492ee1a", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8004/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "97224b4ec05c47d8be4d9592bec06939", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8004/v1/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}], "id": "0eb2d2ed8a2d46e2887f394479d11680", "type": "orchestration", "name": "heat"}, {"endpoints": [{"id": "4a6c33f7a6a14935921bc99e18e2383a", "interface": "admin", "region_id": "RegionOne", "url": "http://evacuation-controller-api.ep.compute.i", "region": "RegionOne"}, {"id": "5dbcddce35de4a7ab22a24a7f68ac1e8", "interface": "internal", "region_id": "kz", "url": "http://evacuation-controller-api.ep.qaz.compute.i", "region": "kz"}, {"id": "a4b73787925d4f26a788a425d50c99c7", "interface": "internal", "region_id": "RegionOne", "url": "http://evacuation-controller-api.ep.compute.i", "region": "RegionOne"}, {"id": "e31ea275ecd44e75854573ac4e3df064", "interface": "admin", "region_id": "kz", "url": "http://evacuation-controller-api.ep.qaz.compute.i", "region": "kz"}], "id": "15e8acbde8254fc9ab2c73bbab5306ae", "type": "evacuate", "name": "evacuation"}, {"endpoints": [{"id": "ded5ea8264d842ffb9167248223a1643", "interface": "internal", "region_id": "RegionOne", "url": "https://scrooge-price-api-keystone.ep.compute.i", "region": "RegionOne"}], "id": "17149a8106ee45bf86cc95b875f2f041", "type": "scrooge-price-api-sa", "name": "scrooge-price-api-sa"}, {"endpoints": [{"id": "2042570f467f418798b543d5887afb22", "interface": "admin", "region_id": "RegionOne", "url": "http://dbaas-proxy-private.ep.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "2cb999a467c7448097b95bb138816157", "interface": "internal", "region_id": "RegionOne", "url": "http://dbaas-proxy-private.ep.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "6bb6fc34ff5b4fa79f3022067b22c287", "interface": "admin", "region_id": "kz", "url": "http://dbaas-proxy-private.ep.qaz.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "7d9d1c3e1c6f408cb29c6516fc7da792", "interface": "public", "region_id": "RegionOne", "url": "https://msk.cloud.vk.com/infra/database/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "RegionOne"}, {"id": "ce9b4d04c82f4b6987fb4bc577e0ed4d", "interface": "public", "region_id": "kz", "url": "https://kz.cloud.vk.com/infra/database/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}, {"id": "d7afa31629db4611836a4e581c3e2b74", "interface": "internal", "region_id": "kz", "url": "http://dbaas-proxy-private.ep.qaz.compute.i/v1.0/5aa354d05172439abcc5bfc3f682da49", "region": "kz"}], "id": "17bc6967100b4de98e4f68ffab682116", "type": "database", "name": "trove"}, {"endpoints": [{"id": "a146596f0e934bb0816b905c8dcfac7f", "interface": "internal", "region_id": "RegionOne", "url": "http://metrics-server-s2s-api.ep.compute.i", "region": "RegionOne"}, {"id": "f5a383c44918409f9cd56c45a2296db6", "interface": "internal", "region_id": "kz", "url": "http://metrics-server-s2s-api.ep.qaz.compute.i", "region": "kz"}], "id": "1922f73588cd4976820d32233f7132f8", "type": "monitoring", "name": "monitoring-writer"}, {"endpoints": [{"id": "2c548b801b10455dbd8bb804d340dee8", "interface": "public", "region_id": "kz", "url": "https://kz.infra.mail.ru:8778", "region": "kz"}, {"id": "4163559b4998475eabb0648867fb71da", "interface": "admin", "region_id": "RegionOne", "url": "http://admin.endpoint.compute.i:8778", "region": "RegionOne"}, {"id": "5e87f1c90a0640c8b921db98a26ae9df", "interface": "internal", "region_id": "RegionOne", "url": "http://internal.endpoint.compute.i:8778", "region": "RegionOne"}, {"id": "6086296bb79d429092e7a7b272f994e6", "interface": "internal", "region_id": "kz", "url": "http://qaz-private.compute.i:8778", "region": "kz"}, {"id": "7110f250d8514deb8c97d462865373d8", "interface": "admin", "region_id": "kz", "url": "http://qaz-private.Line truncated
 ~/rosatom
nix-shell ❯ TOKEN="gAAAAABqLp2hueJVBdeWrra1M4DMnQEpGmVJFJu9v4yliHJJq7h8lauGD0DYY-zX4R4ICO1BmKKGZuwmQpZcdeivjejjahJETBLHiQi-C0f3OCyMGfUGzTI0n2Izr-P0gop5q7PyEg9jE1vekbV1nKOhmJgEkGsrHwANy68uCG8MqcaCK8IVPSo"
@@ -0,0 +1,207 @@
 ~/rosatom
nix-shell ❯ curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/flavors/detail" \ on ☁️ (ru-msk)
-H "X-Auth-Token: $TOKEN" | jq '.flavors[] | {name: .name, id: .id, disk: .disk} | select(.disk > 0)'
{
"name": "Basic-1-2-40",
"id": "19b38715-48cd-495b-9391-4c4e9d424518",
"disk": 40
}
{
"name": "Basic-1-2-20",
"id": "25ae869c-be29-4840-8e12-99e046d2dbd4",
"disk": 20
}
{
"name": "Advanced-8-16-100",
"id": "283fa444-8d59-4e83-b6f4-90613c52a5a4",
"disk": 100
}
{
"name": "Advanced-16-64-50",
"id": "59f7faf3-d817-4cb8-ae69-8b4b92565f94",
"disk": 50
}
{
"name": "Advanced-16-32-50",
"id": "670f9d36-d01b-4a4a-a8e5-c88cfb9ea0ec",
"disk": 50
}
{
"name": "Advanced-8-32-50",
"id": "76fd2a82-4095-49b7-acc9-80ee90284ce9",
"disk": 50
}
{
"name": "Standard-4-8-50",
"id": "77109506-bf0c-44a9-9e97-53360e9898bc",
"disk": 50
}
{
"name": "Basic-1-4-50",
"id": "7e6f3416-f74a-40b5-86e8-82d14615f329",
"disk": 50
}
{
"name": "Advanced-8-16-160",
"id": "7f04b02c-5260-4b5d-bccf-4151c5ade92d",
"disk": 160
}
{
"name": "Standard-4-8-80",
"id": "908479b5-1138-46b6-b746-48bf6c24e548",
"disk": 80
}
{
"name": "Standard-2-4-50",
"id": "b7d20f15-82f1-4ed4-a12e-e60277fe955f",
"disk": 50
}
{
"name": "Standard-2-8-50",
"id": "bf714720-78da-4271-ab7d-0cf5e2613f14",
"disk": 50
}
{
"name": "Standard-2-4-40",
"id": "d659fa16-c7fb-42cf-8a5e-9bcbe80a7538",
"disk": 40
}
{
"name": "Basic-1-1-10",
"id": "df3c499a-044f-41d2-8612-d303adc613cc",
"disk": 10
}
{
"name": "Standard-4-16-50",
"id": "ea26a8fe-5915-4bda-abdc-34b0be148e97",
"disk": 50
}
 ~/rosatom
nix-shell ❯ curl -s -X GET "https://infra.mail.ru:9696/v2.0/networks" \ on ☁️ (ru-msk)
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" | jq '.networks[] | {id, name}'
{
"id": "ec8c610e-6387-447e-83d2-d2c541e88164",
"name": "internet"
}
 ~/rosatom
nix-shell ❯ curl -s -X GET "https://infra.mail.ru:9292/v2/images" \ on ☁️ (ru-msk)
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" | jq '.images[] | {id, name}'
{
"id": "91092b96-c349-401f-bf4c-0ddeecb88f4d",
"name": "alse-1.8.4-max-vkcloud-mg16.0.0-amd64"
}
{
"id": "74b5e605-c1c0-44f8-9019-ea4e9d19177b",
"name": "opensuse-leap-15.5-202603071211.git3f834af3"
}
{
"id": "a240235f-fdac-414c-94eb-1022025158c0",
"name": "opensuse-leap-15.6-202602160742.git3f834af3"
}
{
"id": "fcbf111e-03b7-47e5-b348-59fecfc0af2c",
"name": "redos-std-73-vgpu-202602051650.gite7a38aaf"
}
{
"id": "c516abf0-0dad-4be1-b2b5-d7dae7093806",
"name": "ubuntu-24-vgpu-202602051634.gite7a38aaf"
}
{
"id": "b812255f-7b5f-4fd6-bad4-8b24265dc076",
"name": "ubuntu-24-202602051634.gite7a38aaf"
}
{
"id": "dc0f6670-ee20-425a-bda6-666d498a6aa9",
"name": "redos-std-80-202602051633.gite7a38aaf"
}
{
"id": "26534385-131c-4217-a2d3-a034a33993b0",
"name": "ubuntu-18-202602051631.gite7a38aaf"
}
{
"id": "371e0707-6700-48d1-97d8-e1a01a443fbf",
"name": "ubuntu-20-202602051631.gite7a38aaf"
}
{
"id": "a4e699d3-a66d-45e5-bb5d-70ea7c8de62d",
"name": "ubuntu-22-202602051629.gite7a38aaf"
}
{
"id": "761117e5-b607-4041-9c47-f5cce1b19c34",
"name": "ubuntu-16-202602051624.gite7a38aaf"
}
{
"id": "1c064e46-8af6-40d5-b7d0-14e17573340d",
"name": "redos-std-73-202602051633.gite7a38aaf"
}
{
"id": "501f01b0-552b-4e76-984f-f17af9ba679b",
"name": "redos-crt-73-202602051634.gite7a38aaf"
}
{
"id": "80354fe5-91e2-4aac-998c-ccd72af1d27c",
"name": "debian-13-202602051630.gite7a38aaf"
}
{
"id": "41595402-4d3a-4055-b570-bbfb5dfb4fb1",
"name": "debian-12-202602051626.gite7a38aaf"
}
{
"id": "28610469-9621-4747-a226-564f8c74a2df",
"name": "debian-12-vgpu-202602051632.gite7a38aaf"
}
{
"id": "98d4aec9-8d26-43a3-99da-0e90e1db30c0",
"name": "debian-11-202602051625.gite7a38aaf"
}
{
"id": "9080fc2f-bb27-4274-b92b-d75a3ad4e249",
"name": "centos-8-stream-202602051626.gite7a38aaf"
}
{
"id": "cb04a0bc-b0e2-4670-b46f-ecc56668214b",
"name": "debian-10-202602051625.gite7a38aaf"
}
{
"id": "7ae8f6e7-ada2-4858-8420-4dfc671b3062",
"name": "centos-8-stream-vgpu-202602051634.gite7a38aaf"
}
{
"id": "bc3782cc-c2b8-4cc4-892a-5383558e433b",
"name": "centos-7.9-202602051631.gite7a38aaf"
}
{
"id": "1c7529ce-0897-4faf-b796-ada02dde0b43",
"name": "astra-vor-1.7-vgpu-202602051632.gite7a38aaf"
}
{
"id": "e403f5c9-6c44-44a8-875c-53acbbc3031d",
"name": "astra-or-1.7-vgpu-202602051639.gite7a38aaf"
}
{
"id": "096a045c-b875-4a4e-902f-eb93bc23719a",
"name": "almalinux-9.7-202602051629.gite7a38aaf"
}
{
"id": "f0045749-fb70-4ce8-9993-8ee3287ef56f",
"name": "almalinux-10.1-202602051628.gite7a38aaf"
}
 ~/rosatom
nix-shell ❯ curl -s -X POST "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \ on ☁️ (ru-msk)
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"server": {
"name": "api-created-vm",
"imageRef": "b812255f-7b5f-4fd6-bad4-8b24265dc076",
"flavorRef": "25ae869c-be29-4840-8e12-99e046d2dbd4",
"networks": [{"uuid": "ec8c610e-6387-447e-83d2-d2c541e88164"}],
"key_name": "my-first-vm-ie9Ev9Cc"
}
}'
{"server": {"security_groups": [{"name": "default"}], "OS-DCF:diskConfig": "MANUAL", "id": "8c3f3134-560c-4558-9060-c3c6731792a8", "links": [{"href": "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8", "rel": "self"}, {"href": "https://infra.mail.ru:8774/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8", "rel": "bookmark"}], "adminPass": "8WwHM2JjPj62"}}%
@@ -0,0 +1,26 @@
 ~/rosatom
nix-shell ❌5 ❯ curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \ on ☁️ (ru-msk)
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" | jq '.servers'
[]
 ~/rosatom
nix-shell ❯ #После создания VM через API
curl -s -X GET "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers" \ on ☁️ (ru-msk)
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" | jq '.servers'
[
{
"id": "8c3f3134-560c-4558-9060-c3c6731792a8",
"links": [
{
"href": "https://infra.mail.ru:8774/v2.1/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8",
"rel": "self"
},
{
"href": "https://infra.mail.ru:8774/5aa354d05172439abcc5bfc3f682da49/servers/8c3f3134-560c-4558-9060-c3c6731792a8",
"rel": "bookmark"
}
],
"name": "api-created-vm"
}
]
@@ -0,0 +1,4 @@
resource "vkcs_compute_keypair" "my_key" {
name = "terraform-key-local"
public_key = file("~/.ssh/terraform_rsa.pub")
}
@@ -0,0 +1,30 @@
resource "vkcs_lb_loadbalancer" "main" {
name = "lab1-lb"
vip_subnet_id = vkcs_networking_subnet.public.id
}
resource "vkcs_lb_listener" "http" {
name = "http-listener"
protocol = "HTTP"
protocol_port = 80
loadbalancer_id = vkcs_lb_loadbalancer.main.id
}
resource "vkcs_lb_pool" "web" {
name = "web-targets"
protocol = "HTTP"
lb_method = "ROUND_ROBIN"
listener_id = vkcs_lb_listener.http.id
}
resource "vkcs_lb_monitor" "web" {
name = "web-monitor"
type = "HTTP"
delay = 10
timeout = 5
max_retries = 3
url_path = "/"
pool_id = vkcs_lb_pool.web.id
}
# Блок vkcs_lb_member полностью удалён — добавишь ВМ руками через консоль или OpenStack CLI
@@ -0,0 +1,36 @@
data "vkcs_networking_network" "ext_net" {
name = "internet"
}
data "vkcs_networking_router" "existing" {
id = "913bdd47-9155-45b2-b404-5c10d0086132"
}
resource "vkcs_networking_network" "lab1_vpc" {
name = "lab1-vpc"
admin_state_up = true
}
resource "vkcs_networking_subnet" "public" {
name = "lab1-public"
network_id = vkcs_networking_network.lab1_vpc.id
cidr = "10.0.1.0/24"
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
}
resource "vkcs_networking_subnet" "private" {
name = "lab1-private"
network_id = vkcs_networking_network.lab1_vpc.id
cidr = "10.0.2.0/24"
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
}
resource "vkcs_networking_router_interface" "public" {
router_id = data.vkcs_networking_router.existing.id
subnet_id = vkcs_networking_subnet.public.id
}
resource "vkcs_networking_router_interface" "private" {
router_id = data.vkcs_networking_router.existing.id
subnet_id = vkcs_networking_subnet.private.id
}
@@ -0,0 +1,5 @@
output "lb_public_ip" {
value = vkcs_lb_loadbalancer.main.vip_address
}
# bastion_ip и web_ips_private удали, так как ВМ больше не в Terraform
@@ -0,0 +1,12 @@
# Указываем версию провайдера
terraform {
required_providers {
vkcs = {
source = "vk-cs/vkcs"
version = "~> 0.1"
}
}
}
# Настройка провайдера (использует переменные окружения из RC-файла)
provider "vkcs" {}
@@ -0,0 +1,46 @@
resource "vkcs_networking_secgroup" "bastion_sg" {
name = "bastion-sg"
description = "SSH from my IP"
}
resource "vkcs_networking_secgroup_rule" "bastion_ssh" {
direction = "ingress"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = var.my_ip
security_group_id = vkcs_networking_secgroup.bastion_sg.id
}
resource "vkcs_networking_secgroup" "web_sg" {
name = "web-sg"
description = "SSH from bastion, HTTP from LB"
}
resource "vkcs_networking_secgroup_rule" "web_ssh" {
direction = "ingress"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_group_id = vkcs_networking_secgroup.bastion_sg.id
security_group_id = vkcs_networking_secgroup.web_sg.id
}
resource "vkcs_networking_secgroup_rule" "web_http" {
direction = "ingress"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
remote_group_id = vkcs_networking_secgroup.lb_sg.id
security_group_id = vkcs_networking_secgroup.web_sg.id
}
resource "vkcs_networking_secgroup" "lb_sg" {
name = "lb-sg"
description = "HTTP from internet"
}
resource "vkcs_networking_secgroup_rule" "lb_http" {
direction = "ingress"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
remote_ip_prefix = "0.0.0.0/0"
security_group_id = vkcs_networking_secgroup.lb_sg.id
}
@@ -0,0 +1 @@
my_ip = "95.37.52.68/32"
@@ -0,0 +1,19 @@
variable "my_ip" {
type = string
default = "95.37.52.68/32"
}
variable "flavor_web" {
type = string
default = "df3c499a-044f-41d2-8612-d303adc613cc"
}
variable "image_name" {
type = string
default = "ubuntu-22-202602051629.gite7a38aaf"
}
variable "ssh_public_key_path" {
type = string
default = "~/.ssh/id_rsa.pub"
}
@@ -0,0 +1,121 @@
# Указываем версию провайдера
terraform {
required_providers {
vkcs = {
source = "vk-cs/vkcs"
}
random = {
source = "hashicorp/random"
}
}
}
# Настройка провайдера (использует переменные окружения из RC-файла)
provider "vkcs" {
username = "remizov.kirill2005@yandex.ru"
password = "*#Woron210105#*"
project_id = "5aa354d05172439abcc5bfc3f682da49"
region = "RegionOne" # Для Москвы
auth_url = "https://infra.mail.ru:35357/v3/"
}
# --- СУЩЕСТВУЮЩИЙ РОУТЕР ---
data "vkcs_networking_router" "main" {
name = "router_5390"
}
# --- СОЗДАНИЕ СЕТИ И ПОДСЕТИ ---
resource "vkcs_networking_network" "main" {
name = "postgres-network"
admin_state_up = true
}
resource "vkcs_networking_subnet" "main" {
name = "postgres-subnet"
network_id = vkcs_networking_network.main.id
cidr = "192.168.199.0/24"
}
# --- ПОДКЛЮЧЕНИЕ ПОДСЕТИ К РОУТЕРУ ---
resource "vkcs_networking_router_interface" "main" {
router_id = data.vkcs_networking_router.main.id
subnet_id = vkcs_networking_subnet.main.id
}
# --- ИНСТАНС POSTGRESQL ---
# ИСПРАВЛЕНО: используем имя флавора для БД (Standard-2-6)
resource "vkcs_db_instance" "postgres" {
name = "terraform-postgres"
flavor_id = "2df6e3ec-5939-4d28-a818-89558ff1b7ab" # <-- заменено на подходящий для БД
volume_type = "ceph-ssd"
size = 10
availability_zone = "MS1"
floating_ip_enabled = true
datastore {
type = "postgresql"
version = "15"
}
network {
uuid = vkcs_networking_network.main.id
}
}
# --- ГЕНЕРАЦИЯ ПАРОЛЯ ---
resource "random_password" "db_password" {
length = 16
special = true
min_lower = 1
min_upper = 1
min_numeric = 1
min_special = 1
}
# --- БАЗА ДАННЫХ ---
resource "vkcs_db_database" "app_db" {
name = "app_db"
dbms_id = vkcs_db_instance.postgres.id
}
# --- ПОЛЬЗОВАТЕЛЬ ---
resource "vkcs_db_user" "app_user" {
name = "app_user"
password = random_password.db_password.result
dbms_id = vkcs_db_instance.postgres.id
databases = [vkcs_db_database.app_db.name]
}
# --- ДАННЫЕ ДЛЯ ПОЛУЧЕНИЯ HOSTNAME ---
data "vkcs_db_instance" "postgres_info" {
id = vkcs_db_instance.postgres.id
depends_on = [vkcs_db_instance.postgres]
}
# --- ЛОКАЛЬНЫЙ ФАЙЛ С ПАРОЛЕМ ---
resource "local_file" "db_password" {
content = "Database password: ${random_password.db_password.result}"
filename = "${path.module}/db_password.txt"
}
# --- ВЫХОДНЫЕ ДАННЫЕ ---
output "db_host" {
value = data.vkcs_db_instance.postgres_info.hostname
}
output "db_port" {
value = 5432
}
output "db_name" {
value = vkcs_db_database.app_db.name
}
output "db_user" {
value = vkcs_db_user.app_user.name
}
output "db_instance_full" {
value = data.vkcs_db_instance.postgres_info
sensitive = true
}