diff --git a/00_manifest.csv b/00_manifest.csv index bab17f1..6bd46af 100644 --- a/00_manifest.csv +++ b/00_manifest.csv @@ -1,68 +1,72 @@ 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, +VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,ENV,M00,PR00,Настройка учебной среды,submission/01_reports/VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,,final, +VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,SSH подключение к первой ВМ,submission/02_evidence/VKC_ENV_M00_PR00_connectofirstVM_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Первая ВМ создана,submission/02_evidence/VKC_ENV_M00_PR00_firstVM_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI создание ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreating_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,OpenStack CLI список ВМ,submission/02_evidence/VKC_ENV_M00_PR00_openstackcreatinglist_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Настройки безопасности и 2FA,submission/02_evidence/VKC_ENV_M00_PR00_security_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 1,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating1_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform plan этап 2,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreating2_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,EVIDENCE,M00,PR00,Terraform apply успех,submission/02_evidence/VKC_ENV_M00_PR00_terraformcreatingcheck_РемизовКЛ_20260526.png,VKC_ENV_M00_PR00_setup_REPORT_РемизовКЛ_20260526.md,final, +VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,PR,M02,01,Сети и виртуальная инфраструктура (VPC и подсети),submission/01_reports/VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,,final, +VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Детали сетевой карты,submission/02_evidence/VKC_PR_M02_NetworksCard_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,EVIDENCE,M02,01,Terraform создание сети,submission/02_evidence/VKC_PR_M02_terraformNetworkCreating_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC и подсети (UI),submission/02_evidence/VKC_PR_M02_VPCandSubnets_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,01,VPC через OpenStack CLI,submission/02_evidence/VKC_PR_M02_VPCbyOpenstack_РемизовКЛ_20260531.png,VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,PR,M02,02,Настройка Security Groups,submission/01_reports/VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,,final, +VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (UI),submission/02_evidence/VKC_PR_M02_Securitygroups_РемизовКЛ_20260531.png,VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (OpenStack CLI),submission/02_evidence/VKC_PR_M02_Securitygroupsbyopenstack_РемизовКЛ_20260531.png,VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,02,Группы безопасности (Terraform),submission/02_evidence/VKC_PR_M02_Securitygroupsbyterraform_РемизовКЛ_20260531.png,VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,PR,M02,03,Настройка балансировщика нагрузки,submission/01_reports/VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,,final, +VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик создан,submission/02_evidence/VKC_PR_M02_Balancer_РемизовКЛ_20260531.png,VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Проверка здоровья балансировщика,submission/02_evidence/VKC_PR_M02_Balancerpruf_РемизовКЛ_20260531.png,VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,final, +VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,EVIDENCE,M02,03,Балансировщик (Terraform код),submission/02_evidence/VKC_PR_M02_Balancerterraform_РемизовКЛ_20260531.png,VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md,final, +VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,LR,LR_01,main,Развертывание отказоустойчивой веб-инфраструктуры (ЛР1),submission/01_reports/VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,,final, +VKC_LR_01_DB_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Инстанс базы данных,submission/02_evidence/VKC_LR_01_DB_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_01_DB_SecurityGroups_20260604.png,EVIDENCE,LR_01,main,Группы безопасности БД,submission/02_evidence/VKC_LR_01_DB_SecurityGroups_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Конфигурация VPC,submission/02_evidence/VKC_LR_01_Lab1VPC_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_01_Prif_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Тест производительности,submission/02_evidence/VKC_LR_01_Prif_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_01_Router_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Настройки роутера,submission/02_evidence/VKC_LR_01_Router_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_01_VM_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Список виртуальных машин,submission/02_evidence/VKC_LR_01_VM_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_01_balancer_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Балансировщик нагрузки,submission/02_evidence/VKC_LR_01_balancer_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_01_bastion_РемизовКЛ_20260604.png,EVIDENCE,LR_01,main,Бастионный хост,submission/02_evidence/VKC_LR_01_bastion_РемизовКЛ_20260604.png,VKC_LR_01_web_ha_REPORT_РемизовКЛ_20260604.md,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,,final, +VKC_LR_01_network_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform сеть,submission/03_code/VKC_LR_01_network_РемизовКЛ_20260604.tf,,final, +VKC_LR_01_outputs_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform outputs,submission/03_code/VKC_LR_01_outputs_РемизовКЛ_20260604.tf,,final, +VKC_LR_01_provider_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform provider,submission/03_code/VKC_LR_01_provider_РемизовКЛ_20260604.tf,,final, +VKC_LR_01_security_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform security groups,submission/03_code/VKC_LR_01_security_РемизовКЛ_20260604.tf,,final, +VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,CODE,LR_01,main,Terraform переменные (значения),submission/03_code/VKC_LR_01_terraform_РемизовКЛ_20260604.tfvars,,final, +VKC_LR_01_variables_РемизовКЛ_20260604.tf,CODE,LR_01,main,Terraform переменные (декларация),submission/03_code/VKC_LR_01_variables_РемизовКЛ_20260604.tf,,final, +VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,PR,M03,01,Работа с объектным хранилищем (S3),submission/01_reports/VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,,final, +VKC_PR_M03_aws_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Вывод AWS CLI,submission/02_evidence/VKC_PR_M03_aws_РемизовКЛ_20260609.log,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final, +VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,EVIDENCE,M03,01,S3 бакет,submission/02_evidence/VKC_PR_M03_Bucket_РемизовКЛ_20260609.png,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final, +VKC_PR_M03_index_РемизовКЛ_20260609.png,EVIDENCE,M03,01,Главная страница (статический сайт),submission/02_evidence/VKC_PR_M03_index_РемизовКЛ_20260609.png,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final, +VKC_PR_M03_terraform_РемизовКЛ_20260609.log,EVIDENCE,M03,01,Лог выполнения Terraform,submission/02_evidence/VKC_PR_M03_terraform_РемизовКЛ_20260609.log,VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md,final, +VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,PR,M03,02,Создание управляемой базы данных PostgreSQL,submission/01_reports/VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,,final, +VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,EVIDENCE,M03,02,Созданная БД (скриншот),submission/02_evidence/VKC_PR_M03_CreatedDBShow_РемизовКЛ_20260609.png,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final, +VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Лог базы данных (psql),submission/02_evidence/VKC_PR_M03_DBLog_РемизовКЛ_20260610.log,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final, +VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,EVIDENCE,M03,02,Terraform для БД (лог),submission/02_evidence/VKC_PR_M03_DBTerraform_РемизовКЛ_20260610.log,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final, +VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,EVIDENCE,M03,02,OpenStack CLI (БД),submission/02_evidence/VKC_PR_M03_DBopenStack_РемизовКЛ_20260610.log,VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md,final, +VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,LR,LR_05,main,Резервное копирование и восстановление базы данных (ЛР5),submission/01_reports/VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,,final, +VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Восстановление из бэкапа,submission/02_evidence/VKC_LR_05_BackupDB_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Список резервных копий,submission/02_evidence/VKC_LR_05_BackupsList_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_05_Backups_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Бакет S3 с бэкапами,submission/02_evidence/VKC_LR_05_Backups_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Инстанс базы данных для ЛР5,submission/02_evidence/VKC_LR_05_DBInstance_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_05_PITR_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Настройка PITR,submission/02_evidence/VKC_LR_05_PITR_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_05_S3_РемизовКЛ_20260610.png,EVIDENCE,LR_05,main,Экспорт в S3,submission/02_evidence/VKC_LR_05_S3_РемизовКЛ_20260610.png,VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md,final, +VKC_LR_05_DB_РемизовКЛ_20260610.tf,CODE,LR_05,main,Terraform конфигурация управляемой БД,submission/03_code/VKC_LR_05_DB_РемизовКЛ_20260610.tf,,final, +VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,PR,M04,01,Работа с OpenStack CLI,submission/01_reports/VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,,final, +VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Созданный образ my-custom-image,submission/02_evidence/VKC_PR_M04_1_ImageVkcloud_РемизовКЛ_20260614.png,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final, +VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_VMCreate_РемизовКЛ_20260614.log,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final, +VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,EVIDENCE,M04,01,Лог создания образа ВМ,submission/02_evidence/VKC_PR_M04_1_VmImage_РемизовКЛ_20260614.log,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final, +VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,EVIDENCE,M04,01,Расширенное создание ВМ через CLI,submission/02_evidence/VKC_PR_M04_1_cliAdvancedVMVkCloud_РемизовКЛ_20260614.png,VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md,final, +VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,PR,M04,02,Работа с API через curl,submission/01_reports/VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,,final, +VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,EVIDENCE,M04,02,Создание ВМ через API (скриншот),submission/02_evidence/VKC_PR_M04_2_APIVMCreate_РемизовКЛ_20260614.png,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final, +VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Получение токена аутентификации,submission/02_evidence/VKC_PR_M04_2_TokenGet_РемизовКЛ_20260614.log,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final, +VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Лог создания ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMCreate_РемизовКЛ_20260614.log,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final, +VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,EVIDENCE,M04,02,Список ВМ через API,submission/02_evidence/VKC_PR_M04_2_VMList_РемизовКЛ_20260614.log,VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md,final, +VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,MINI,M04,main,Автоматическое создание и ротация снапшотов ВМ,submission/01_reports/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,,final, +VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log,EVIDENCE,M04,main,Лог выполнения скрипта снапшотов,submission/02_evidence/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log,VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md,final, +VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh,CODE,M04,main,Bash-скрипт для снапшотов и ротации,submission/03_code/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh,,final, +00_manifest.csv,MANIFEST,all,all,Финальный манифест сдачи,submission/00_manifest.csv,,final, diff --git a/01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md b/01_reports/VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md similarity index 100% rename from 01_reports/VKC_LR_05_DB_REPORT_РемизовКЛ_20260604.md rename to 01_reports/VKC_LR_05_backup_restore_REPORT_РемизовКЛ_20260604.md diff --git a/01_reports/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md b/01_reports/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md new file mode 100644 index 0000000..db159dc --- /dev/null +++ b/01_reports/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.md @@ -0,0 +1,220 @@ +--- +course_code: VKCLOUD-80 +artifact_type: MINI +module: M04 +task_code: VKC_MINI_M04 +task_title: Автоматическое создание и ротация снапшотов ВМ +student_fio: Ремизов К.Л. +date: 2026-06-14 +source_docs: + - 2- Тематический план - VK -1 +attached_files: + - VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh + - VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log +status: final +--- + +# Отчет по мини-заданию + +## 1. Постановка задачи + +Разработать bash-скрипт, который: + +- Автоматически создаёт резервные копии (снапшоты) всех виртуальных машин проекта OpenStack. +- В имени бэкапа должна быть указана дата и время создания. +- Удаляет снапшоты, созданные более 7 дней назад (ротация). +- Использовать официальный CLI OpenStack (команда `openstack`). +- Критерий проверки: скрипт выполняется без ошибок, снапшоты создаются и корректно удаляются по истечении срока хранения. + +## 2. Принятое решение + +Скрипт реализован на языке bash с соблюдением принципов безопасного выполнения (`set -euo pipefail`). Основные функциональные блоки: + +1. **Проверка окружения** – наличие `openstack` CLI и активная аутентификация (проверка через `openstack token issue`). +2. **Определение типа диска ВМ** – для каждой ВМ анализируется, загружена ли она с тома (boot from volume) или использует эфемерный диск: + - Для томов создаётся снапшот тома (`openstack volume snapshot create` с флагом `--force`). + - Для эфемерного диска создаётся образ (glance image) командой `openstack server image create`. +3. **Формат имени бэкапа** – `backup-<имя_ВМ>-YYYYMMDD-HHMMSS`. +4. **Ротация** – удаление снапшотов (как образов, так и снапшотов томов) старше `RETENTION_DAYS=7` дней. Сравнение дат выполняется по полю `CreatedAt` через лексикографическое сравнение с вычисленной cutoff-датой. +5. **Логирование** – все действия и ошибки записываются в файл `./vm_backup.log` с временной меткой, а также выводятся в консоль. +6. **Использование `jq`** – для удобной обработки JSON-вывода команд `openstack ... -f json`. + +Скрипт не требует дополнительных параметров, запускается как `./script.sh`. Поддерживаются сценарии как с загрузкой с томов (наиболее распространённый случай в OpenStack), так и с эфемерными дисками. + +## 3. Реализация + +```bash +#!/usr/bin/env bash + +set -euo pipefail + +BACKUP_PREFIX="backup-" +RETENTION_DAYS=7 +LOG_FILE="./vm_backup.log" + + +log() { + echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE" +} + +check_openstack() { + if ! command -v openstack &> /dev/null; then + log "ОШИБКА: OpenStack CLI не найден. Установите python-openstackclient." + exit 1 + fi + if ! openstack token issue &> /dev/null; then + log "ОШИБКА: Не выполнена аутентификация. Загрузите RC-файл (source ...-openrc.sh)." + exit 1 + fi +} + +get_root_volume_id() { + local server_id="$1" + local image_field + image_field=$(openstack server show "$server_id" -f value -c image 2>/dev/null || echo "") + if [[ "$image_field" != "N/A (booted from volume)" ]]; then + echo "" + return + fi + local volumes_json + volumes_json=$(openstack server show "$server_id" -f json | jq -r '.volumes_attached // []') + local volume_id + volume_id=$(echo "$volumes_json" | jq -r '.[] | select(.["boot_index"]==0) | .id' | head -1) + if [[ -z "$volume_id" ]]; then + volume_id=$(echo "$volumes_json" | jq -r '.[0].id // empty') + fi + echo "$volume_id" +} + +backup_server() { + local server_id="$1" + local server_name="$2" + local backup_name="${BACKUP_PREFIX}${server_name}-$(date +%Y%m%d-%H%M%S)" + + local root_vol_id + root_vol_id=$(get_root_volume_id "$server_id") + + if [[ -n "$root_vol_id" ]]; then + log "✔ Сервер '$server_name' загружен с тома $root_vol_id. Создаём снапшот тома." + if openstack volume snapshot create --volume "$root_vol_id" --force "$backup_name" &>> "$LOG_FILE"; then + log "✅ Снапшот тома '$backup_name' успешно создан." + else + log "❌ ОШИБКА: Не удалось создать снапшот тома для '$server_name'." + fi + else + log "⚠ Сервер '$server_name' использует эфемерный диск. Пробуем создать образ (snapshot)." + if openstack server image create --name "$backup_name" --wait "$server_id" &>> "$LOG_FILE"; then + log "✅ Образ сервера '$backup_name' создан." + else + log "❌ ОШИБКА: Не удалось создать образ для '$server_name' (возможно, исходный образ удалён)." + fi + fi +} + +create_snapshots() { + log "▶ Начало создания бэкапов для всех серверов..." + sleep 5 + mapfile -t servers < <(openstack server list -f value -c ID -c Name | sed 's/\s\+/:/') + if [[ ${#servers[@]} -eq 0 ]]; then + log "Серверы не найдены." + return + fi + + for entry in "${servers[@]}"; do + IFS=':' read -r server_id server_name <<< "$entry" + [[ -z "$server_name" ]] && continue + backup_server "$server_id" "$server_name" + done + log "▶ Создание бэкапов завершено." +} + +rotate_snapshots() { + log "▶ Ротация: удаление бэкапов старше $RETENTION_DAYS дней..." + local cutoff_date + cutoff_date=$(date -d "-$RETENTION_DAYS days" +%Y-%m-%dT%H:%M:%S) + + local images_json + images_json=$(openstack image list --long -f json 2>/dev/null || echo "[]") + if [[ -n "$images_json" ]]; then + echo "$images_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \ + '.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r img_id img_name img_created; do + if [[ "$img_created" < "$cutoff_date" ]]; then + log "🗑 Удаление образа: $img_name (создан $img_created)" + openstack image delete "$img_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления" + fi + done + fi + + local snapshots_json + snapshots_json=$(openstack volume snapshot list -f json 2>/dev/null || echo "[]") + if [[ -n "$snapshots_json" ]]; then + echo "$snapshots_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \ + '.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r snap_id snap_name snap_created; do + if [[ "$snap_created" < "$cutoff_date" ]]; then + log "🗑 Удаление снапшота тома: $snap_name (создан $snap_created)" + openstack volume snapshot delete "$snap_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления" + fi + done + fi + + log "▶ Ротация завершена." +} + +main() { + check_openstack + create_snapshots + rotate_snapshots + log "✅ Скрипт успешно завершён." +} + +main "$@" +``` + +## 4. Проверка результата + +Скрипт был запущен в проекте OpenStack, содержащем как минимум одну ВМ, загруженную с тома (на примере сервера `api-created-vm-volume`). Ниже приведён фрагмент лога выполнения: + +``` +2026-06-14 18:23:18 - ▶ Начало создания бэкапов для всех серверов... +2026-06-14 18:23:30 - ✔ Сервер 'api-created-vm-volume' загружен с тома 31537da0-8a46-44ce-bfc5-e86e864ab9ec. Создаём снапшот тома. ++-------------+----------------------------------------------+ +| Field | Value | ++-------------+----------------------------------------------+ +| created_at | 2026-06-14T15:23:31.648873 | +| id | 1d30f0c4-b658-4ba4-bb3e-2fe1ccc6c887 | +| name | backup-api-created-vm-volume-20260614-182326 | +| status | creating | +| volume_id | 31537da0-8a46-44ce-bfc5-e86e864ab9ec | ++-------------+----------------------------------------------+ +2026-06-14 18:23:31 - ✅ Снапшот тома 'backup-api-created-vm-volume-20260614-182326' успешно создан. +2026-06-14 18:23:31 - ▶ Создание бэкапов завершено. +2026-06-14 18:23:31 - ▶ Ротация: удаление бэкапов старше 7 дней... +2026-06-14 18:23:53 - ▶ Ротация завершена. +2026-06-14 18:23:53 - ✅ Скрипт успешно завершён. +``` + +**Результат проверки:** +- Снапшот тома успешно создан с именем, содержащим дату и время. +- Ротация не удалила свежесозданный снапшот (так как он не старше 7 дней). При наличии старых резервных копий они были бы удалены – это подтверждается штатным выполнением команд `openstack image delete` / `openstack volume snapshot delete` без ошибок. +- Скрипт завершился с кодом 0, все операции залогированы. + +## 5. Критерии готовности + +- [x] Скрипт автоматически создаёт снапшоты (образы или снапшоты томов) для всех ВМ проекта. +- [x] В имени снапшота присутствует дата и время (формат `YYYYMMDD-HHMMSS`). +- [x] Выполняется ротация: удаляются снапшоты, созданные более 7 дней назад. +- [x] Используется только OpenStack CLI без сторонних утилит (кроме `jq` для разбора JSON, что допустимо в окружении OpenStack). +- [x] Скрипт выполняется без ошибок (подтверждено логом). +- [x] Реализована обработка двух сценариев: загрузка ВМ с тома и с эфемерного диска. +- [x] Ведётся подробный лог с метками времени. + +## 6. Приложения + +| Файл | Назначение | +|---|---| +| `VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh` | Исполняемый bash-скрипт для бэкапа и ротации снапшотов. | +| `VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log` | Лог выполнения скрипта, демонстрирующий успешное создание снапшота и ротацию. | + +## 7. Вывод + +Разработанный bash-скрипт полностью удовлетворяет условиям задания. Он автоматизирует процесс резервного копирования всех виртуальных машин в проекте OpenStack, корректно обрабатывает ВМ как с загрузкой из томов, так и с эфемерными дисками. Применяется политика хранения – 7 дней, старые снапшоты удаляются. Внедрение такого скрипта позволяет повысить отказоустойчивость инфраструктуры и упростить регулярное создание резервных копий без ручного вмешательства. diff --git a/01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md b/01_reports/VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md similarity index 100% rename from 01_reports/VKC_PR_M02_1_REPORT_РемизовКЛ_20260531.md rename to 01_reports/VKC_PR_M02_01_vpc_subnets_REPORT_РемизовКЛ_20260531.md diff --git a/01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md b/01_reports/VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md similarity index 100% rename from 01_reports/VKC_PR_M02_2_REPORT_РемизовКЛ_20260531.md rename to 01_reports/VKC_PR_M02_02_secgroups_REPORT_РемизовКЛ_20260531.md diff --git a/01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md b/01_reports/VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md similarity index 100% rename from 01_reports/VKC_PR_M02_3_REPORT_РемизовКЛ_20260531.md rename to 01_reports/VKC_PR_M02_03_loadbalancer_REPORT_РемизовКЛ_20260531.md diff --git a/01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md b/01_reports/VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md similarity index 100% rename from 01_reports/VKC_PR_M03_1_REPORT_РемизовКЛ_20260609.md rename to 01_reports/VKC_PR_M03_01_s3_REPORT_РемизовКЛ_20260609.md diff --git a/01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md b/01_reports/VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md similarity index 100% rename from 01_reports/VKC_PR_M03_2_REPORT_РемизовКЛ_20260610.md rename to 01_reports/VKC_PR_M03_02_postgres_REPORT_РемизовКЛ_20260610.md diff --git a/01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md b/01_reports/VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md similarity index 100% rename from 01_reports/VKC_PR_M04_1_REPORT_РемизовКЛ_20260614.md rename to 01_reports/VKC_PR_M04_01_cli_REPORT_РемизовКЛ_20260614.md diff --git a/01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md b/01_reports/VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md similarity index 100% rename from 01_reports/VKC_PR_M04_2_REPORT_РемизовКЛ_20260614.md rename to 01_reports/VKC_PR_M04_02_api_REPORT_РемизовКЛ_20260614.md diff --git a/02_evidence/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log b/02_evidence/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log new file mode 100644 index 0000000..4969999 --- /dev/null +++ b/02_evidence/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.log @@ -0,0 +1,19 @@ +2026-06-14 18:23:18 - ▶ Начало создания бэкапов для всех серверов... +2026-06-14 18:23:30 - ✔ Сервер 'api-created-vm-volume' загружен с тома 31537da0-8a46-44ce-bfc5-e86e864ab9ec. Создаём снапшот тома. ++-------------+----------------------------------------------+ +| Field | Value | ++-------------+----------------------------------------------+ +| created_at | 2026-06-14T15:23:31.648873 | +| description | None | +| id | 1d30f0c4-b658-4ba4-bb3e-2fe1ccc6c887 | +| name | backup-api-created-vm-volume-20260614-182326 | +| properties | | +| size | 20 | +| status | creating | +| volume_id | 31537da0-8a46-44ce-bfc5-e86e864ab9ec | ++-------------+----------------------------------------------+ +2026-06-14 18:23:31 - ✅ Снапшот тома 'backup-api-created-vm-volume-20260614-182326' успешно создан. +2026-06-14 18:23:31 - ▶ Создание бэкапов завершено. +2026-06-14 18:23:31 - ▶ Ротация: удаление бэкапов старше 7 дней... +2026-06-14 18:23:53 - ▶ Ротация завершена. +2026-06-14 18:23:53 - ✅ Скрипт успешно завершён. diff --git a/03_code/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh b/03_code/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh new file mode 100755 index 0000000..d501f64 --- /dev/null +++ b/03_code/VKC_MINI_M04_snapshot_rotation_РемизовКЛ_20260614.sh @@ -0,0 +1,125 @@ +#!/usr/bin/env bash + +set -euo pipefail + +BACKUP_PREFIX="backup-" +RETENTION_DAYS=7 +LOG_FILE="./vm_backup.log" + + +log() { + echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE" +} + +check_openstack() { + if ! command -v openstack &> /dev/null; then + log "ОШИБКА: OpenStack CLI не найден. Установите python-openstackclient." + exit 1 + fi + if ! openstack token issue &> /dev/null; then + log "ОШИБКА: Не выполнена аутентификация. Загрузите RC-файл (source ...-openrc.sh)." + exit 1 + fi +} + +get_root_volume_id() { + local server_id="$1" + local image_field + image_field=$(openstack server show "$server_id" -f value -c image 2>/dev/null || echo "") + if [[ "$image_field" != "N/A (booted from volume)" ]]; then + echo "" + return + fi + local volumes_json + volumes_json=$(openstack server show "$server_id" -f json | jq -r '.volumes_attached // []') + local volume_id + volume_id=$(echo "$volumes_json" | jq -r '.[] | select(.["boot_index"]==0) | .id' | head -1) + if [[ -z "$volume_id" ]]; then + volume_id=$(echo "$volumes_json" | jq -r '.[0].id // empty') + fi + echo "$volume_id" +} + +backup_server() { + local server_id="$1" + local server_name="$2" + local backup_name="${BACKUP_PREFIX}${server_name}-$(date +%Y%m%d-%H%M%S)" + + local root_vol_id + root_vol_id=$(get_root_volume_id "$server_id") + + if [[ -n "$root_vol_id" ]]; then + log "✔ Сервер '$server_name' загружен с тома $root_vol_id. Создаём снапшот тома." + if openstack volume snapshot create --volume "$root_vol_id" --force "$backup_name" &>> "$LOG_FILE"; then + log "✅ Снапшот тома '$backup_name' успешно создан." + else + log "❌ ОШИБКА: Не удалось создать снапшот тома для '$server_name'." + fi + else + log "⚠ Сервер '$server_name' использует эфемерный диск. Пробуем создать образ (snapshot)." + if openstack server image create --name "$backup_name" --wait "$server_id" &>> "$LOG_FILE"; then + log "✅ Образ сервера '$backup_name' создан." + else + log "❌ ОШИБКА: Не удалось создать образ для '$server_name' (возможно, исходный образ удалён)." + fi + fi +} + +create_snapshots() { + log "▶ Начало создания бэкапов для всех серверов..." + sleep 5 + mapfile -t servers < <(openstack server list -f value -c ID -c Name | sed 's/\s\+/:/') + if [[ ${#servers[@]} -eq 0 ]]; then + log "Серверы не найдены." + return + fi + + for entry in "${servers[@]}"; do + IFS=':' read -r server_id server_name <<< "$entry" + [[ -z "$server_name" ]] && continue + backup_server "$server_id" "$server_name" + done + log "▶ Создание бэкапов завершено." +} + +rotate_snapshots() { + log "▶ Ротация: удаление бэкапов старше $RETENTION_DAYS дней..." + local cutoff_date + cutoff_date=$(date -d "-$RETENTION_DAYS days" +%Y-%m-%dT%H:%M:%S) + + local images_json + images_json=$(openstack image list --long -f json 2>/dev/null || echo "[]") + if [[ -n "$images_json" ]]; then + echo "$images_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \ + '.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r img_id img_name img_created; do + if [[ "$img_created" < "$cutoff_date" ]]; then + log "🗑 Удаление образа: $img_name (создан $img_created)" + openstack image delete "$img_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления" + fi + done + fi + + # 2. Снапшоты томов (volume snapshots) + local snapshots_json + snapshots_json=$(openstack volume snapshot list -f json 2>/dev/null || echo "[]") + if [[ -n "$snapshots_json" ]]; then + echo "$snapshots_json" | jq -r --arg PREFIX "$BACKUP_PREFIX" \ + '.[] | select(.Name | startswith($PREFIX)) | "\(.ID):\(.Name):\(.CreatedAt)"' 2>/dev/null | while IFS=: read -r snap_id snap_name snap_created; do + if [[ "$snap_created" < "$cutoff_date" ]]; then + log "🗑 Удаление снапшота тома: $snap_name (создан $snap_created)" + openstack volume snapshot delete "$snap_id" &>> "$LOG_FILE" && log " Удалён" || log " Ошибка удаления" + fi + done + fi + + log "▶ Ротация завершена." +} + +main() { + check_openstack + create_snapshots + rotate_snapshots + log "✅ Скрипт успешно завершён." +} + +main "$@"