Compare commits

...

114 Commits

Author SHA1 Message Date
7103a914a5 Merge pull request 'lr 3' (#2) from v.moiseev/distributed-computing:main into main
Reviewed-on: http://student.git.athene.tech/angelina/distributed-computing/pulls/2
2023-12-07 18:07:14 +04:00
39090162a2 Merge pull request 'Добавление работы 4' (#42) from lw4 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/42
2023-11-30 18:01:33 +04:00
87550bc075 Fix lw4 2023-11-20 14:46:11 +04:00
2c9547985d Typo fixes 2023-11-20 00:27:20 +04:00
95a4d84451 Update README.md 2023-11-20 00:17:33 +04:00
235eb1adb3 Add lw04 2023-11-20 00:10:30 +04:00
2a584cf847 Merge pull request '[Л/Р 2] Воронкова Елизавета' (#40) from Liza_Voronkova/distributed-computing:voronkova-es-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/40
2023-11-19 22:39:29 +04:00
639eb2c926 Merge pull request '[Л/Р 1] Юденичева Д.' (#39) from d.yudenicheva/distributed-computing:yudenicheva-ds-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/39
2023-11-19 22:38:37 +04:00
c4da0b1696 Merge pull request '[Л/Р 1] Горбылева Антонина' (#37) from antonina_gorbyleva/distributed-computing:gorbyleva-ai-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/37
2023-11-19 22:32:35 +04:00
14771dfa8f Merge pull request '[Л/Р 2] Лямзина Мария' (#35) from 2510maria2002/distributed-computing:lyamzina-ma-lab2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/35
2023-11-19 22:29:30 +04:00
543b4cf1ab Merge pull request '[Л/Р 2] Мельников Кирилл' (#34) from KirillMelnikov/distributed-computing:melnikov-ky-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/34
2023-11-19 22:27:28 +04:00
4fa6ea06e7 Merge pull request '[Л/Р 1] Воронкова Е.С.' (#33) from Liza_Voronkova/distributed-computing:voronkova-es-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/33
2023-11-19 22:22:43 +04:00
d62d8586bd Merge pull request '[Л/Р 1] Мутрисков Д.С.' (#32) from Hlop4ik4/distributed-computing:mutriskov-ds-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/32
2023-11-19 22:20:06 +04:00
a37272fad7 Merge pull request '[Л/Р 1] Мельников Кирилл' (#31) from KirillMelnikov/distributed-computing:melnikov-ky-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/31
2023-11-19 22:18:59 +04:00
f598d7bdb3 Merge pull request '[Л/Р 1] Дунаев Олег' (#30) from oleggitea/distributed-computing:dunaev-oi-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/30
2023-11-19 22:15:43 +04:00
8c5560aefc Merge pull request '[Л/Р 1] Лямзина Мария' (#29) from 2510maria2002/distributed-computing:lyamzina-ma-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/29
2023-11-19 22:13:43 +04:00
abdf8938a0 Merge pull request '[Л/Р 2] Казаков Евгений' (#27) from EugeneKazakov/distributed-computing:kazakov-ev-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/27
2023-11-19 22:09:49 +04:00
e9de6f516e Merge pull request '[Л/P 1] Казаков Евгений' (#26) from EugeneKazakov/distributed-computing:kazakov-ev-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/26
2023-11-19 22:06:59 +04:00
c2395bbfa9 Merge pull request '[Л/Р 1] Миронов Евгений' (#25) from MironovEvgeniy/distributed-computing:mironov-eo-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/25
2023-11-19 22:06:05 +04:00
76c4dd8ff0 Merge pull request '[Л/Р 2] Плаксина Александра' (#22) from Sanechka_Plaksina/distributed-computing:plaksina-av-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/22
2023-11-19 22:04:39 +04:00
c7b662d673 Merge pull request '[Л/Р 2] Гренадерова Анастасия' (#20) from Grenaderova_Anastasia/distributed-computing:grenaderova-aa-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/20
2023-11-19 22:04:23 +04:00
39d3b650ec Merge pull request '[Л/Р 2] Островская Софья' (#18) from ostrovsofa/distributed-computing:ostrovskaya-sf-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/18
2023-11-19 21:56:44 +04:00
b5296941c9 Merge pull request '[Л/Р 2] Зиновьева Анна' (#17) from Sentimental_anna/distributed-computing:zinoveva-ad-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/17
2023-11-19 21:56:31 +04:00
1f2e2fe343 Merge pull request '[Л/P 2] Мытарин Евгений' (#16) from Mytarin_Evgeny_Isebd-41/distributed-computing:mytarin-es-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/16
2023-11-19 21:55:22 +04:00
bc1a392f67 Merge pull request '[Л/Р 2] Фомичев Андрей' (#14) from ai.fomichev/distributed-computing:fomichev-ai-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/14
2023-11-19 21:54:49 +04:00
dfe9139355 Merge pull request 'lab 1_lachugina' (#12) from anastas0512/distributed-computing:lachugina-av-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/12
2023-11-19 21:54:32 +04:00
dc6270d5aa Удалить 'distributed-computing.sln' 2023-11-19 21:54:10 +04:00
a77f0b77ab Merge pull request '[Л/Р 2] Халитова Ангелина' (#10) from angelina/distributed-computing:khalitova-am-lab-2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/10
2023-11-19 21:53:41 +04:00
ea0b3c68bf Merge pull request 'Готовый ОтчетЛаб1' (#3) from tanya_nik16/distributed-computing:Nikiforova-TS-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/3
2023-11-19 21:49:39 +04:00
0af41e54c3 Link fix 2023-11-15 00:32:12 +04:00
4d939dbf42 Add another example for lw03 2023-11-14 23:30:34 +04:00
Liza275
a151d13e81 Update README.md 2023-11-09 22:12:07 +04:00
Liza275
5af38872ec Лаборатоная работа 2 2023-11-09 22:11:08 +04:00
d321c59542 lab 1 is ready 2023-11-08 13:43:11 +03:00
c1251f2020 [Л/Р 1] Горбылева Антонина 2023-11-01 00:25:48 +04:00
75b9b7df84 Add lw3 2023-10-25 23:53:03 +04:00
130d7ddca5 Merge branch 'lachugina-av-lab-1' of http://student.git.athene.tech/anastas0512/distributed-computing into lachugina-av-lab-1 2023-10-25 18:16:01 +04:00
a59ea42ad5 change 2023-10-25 18:15:54 +04:00
70a1bf95c1 change 2023-10-25 18:14:39 +04:00
acf31de12c change 2023-10-25 18:10:48 +04:00
c6189ee2ad change 2023-10-25 18:02:51 +04:00
2510m
6b3e0e37fb commit_laba2 2023-10-24 21:30:27 +04:00
66d5443457 laba2ready 2023-10-24 21:30:03 +04:00
Liza275
f7c03c8921 Правильные слешы 2023-10-23 23:46:45 +04:00
Liza275
7f3cfd5cf5 Лабораторная работа 1 2023-10-23 23:42:35 +04:00
Liza275
2aa04ad4a9 Проверка картинок 2023-10-23 23:11:15 +04:00
ebcbd1ddfa Завершена лаба 1 2023-10-19 23:26:46 +04:00
cf6b2d2ec3 исправлены отчет и пути 2023-10-19 00:41:25 +04:00
73e265ec8c laba1 2023-10-18 16:34:46 +04:00
b7b55944cd laba_ready 2023-10-18 16:30:55 +04:00
2510m
33c2c60ff8 laba1_gotova 2023-10-18 16:27:35 +04:00
da5d19062e Откат1 2023-10-18 10:51:51 +04:00
d86cca7eb4 Откат ошибки 2023-10-18 10:28:19 +04:00
b2b12babaf Исправлен отчет 2023-10-17 23:07:27 +04:00
3d1c71a68b Исправлено. Работа с абсолютными путями. 2023-10-17 23:06:18 +04:00
Khalitova Angelina
40a64882cb rework 2023-10-17 13:40:20 +04:00
70a8b96edd исправления 2 ЛР 2023-10-17 12:08:10 +04:00
38083bcc01 изменил путь 2023-10-17 10:25:32 +03:00
870fae65ac лаб 2023-10-17 10:12:55 +03:00
7a6fa0a5e4 2 лаб 2023-10-17 10:12:23 +03:00
50086a8941 lab-1 2023-10-17 09:49:47 +03:00
Софья Островская
685fd6ab9b fix 2023-10-17 10:35:30 +04:00
9540fb503e fix after review 2023-10-16 21:25:24 +04:00
Khalitova Angelina
01395f5bdc reworked 2023-10-16 20:21:35 +04:00
Khalitova Angelina
2f9935b4fd reworked 2023-10-16 20:20:21 +04:00
eb966f9a4e Merge pull request 'Лабораторная работа №1 Закирова' (#24) from AminaZakirova/distributed-computing:zakirova-ar-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/24
2023-10-15 22:10:21 +04:00
d9a712136b Merge pull request '[Л/Р 1] Гренадерова Анастасия' (#19) from Grenaderova_Anastasia/distributed-computing:grenaderova-aa-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/19
2023-10-15 22:09:38 +04:00
1bcd1602fb Merge pull request '[Л/Р 1] Фомичев Андрей' (#13) from ai.fomichev/distributed-computing:fomichev-ai-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/13
2023-10-15 22:08:10 +04:00
f2f8451b99 Merge pull request 'lab1_plaksina' (#9) from Sanechka_Plaksina/distributed-computing:plaksina-av-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/9
2023-10-15 22:04:59 +04:00
0513c90b65 Merge pull request 'ostrovskaya-laba1-done' (#7) from ostrovsofa/distributed-computing:ostrovskaya-sf-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/7
2023-10-15 22:02:29 +04:00
d911c95c80 Лабораторная работа №1 2023-10-15 18:17:20 +04:00
116d0edfa3 Merge pull request 'лаба 1 готова' (#6) from Sentimental_anna/distributed-computing:zinoveva-ad-lab-1 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/6
2023-10-15 11:16:05 +04:00
1f89ca9b6b lab_2 2023-10-12 02:40:26 +04:00
ae5a52f365 1 2023-10-11 14:48:16 +03:00
58e067c6a0 edit comment 2023-10-10 23:28:43 +04:00
489e71677a lad2 done 2023-10-10 22:17:23 +04:00
8fdee8d2a0 lad done 2023-10-10 20:38:20 +04:00
Софья Островская
c680a6e51d laba done 2023-10-10 16:55:06 +04:00
d356a64a04 исправлено 2023-10-10 16:44:58 +04:00
0508392cdb исправлено 2023-10-10 16:42:35 +04:00
bf711b2c49 лаба 2 готова 2023-10-10 16:40:13 +04:00
0f9ab0d8cc delete 1 lab from 2 lab 2023-10-09 22:39:33 +03:00
914653f0d4 done 2023-10-09 22:26:37 +03:00
4d92918dd9 fix image 2023-10-08 17:03:28 +04:00
92fa697a66 lab2 ready 2023-10-08 17:01:18 +04:00
c02e359f45 fix extensions 2023-10-08 02:57:45 +04:00
a6c2bdeb27 add lab1 2023-10-08 02:54:32 +04:00
521016cbdb lab 1 2023-10-04 20:15:16 +04:00
Khalitova Angelina
acee4b20f5 all 2023-10-04 10:02:19 +04:00
Khalitova Angelina
e06431d09f donee 2023-10-04 10:00:30 +04:00
Khalitova Angelina
564cc53130 done 2023-10-04 09:57:06 +04:00
646b4bfe33 Merge pull request 'Добавление лабораторной работы 2' (#11) from lw2 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/11
2023-10-04 09:22:19 +04:00
Khalitova Angelina
61115d3516 add comment 2023-10-04 08:38:28 +04:00
Khalitova Angelina
b4e4bc3790 add result 2023-10-03 23:44:26 +04:00
Khalitova Angelina
5f8616e390 middle 2023-10-03 23:39:26 +04:00
Khalitova Angelina
8ddd385037 without comment 2023-10-03 23:36:51 +04:00
16510ed5ed lab1_plaksina 2023-10-03 20:15:25 +04:00
Khalitova Angelina
1991592f19 Revert "add folder"
This reverts commit 8e50b0253a2a7c9bbf17f4cbe147c877c0e5cfcc.
2023-10-03 19:22:29 +04:00
Khalitova Angelina
8e50b0253a add folder 2023-10-03 19:21:02 +04:00
Khalitova Angelina
661dd7f309 add branch 2023-10-03 19:19:49 +04:00
6105a833ff update text 2023-09-25 20:15:22 +03:00
3580ad91ad lab 1 done 2023-09-25 20:12:27 +03:00
38fec0a139 лаба 1 готова 2023-09-23 19:00:06 +04:00
Софья Островская
5704025456 laba done 2023-09-23 18:59:16 +04:00
e56755edeb лаба1 2023-09-20 21:30:02 +03:00
cb606f4e6b ха 2023-09-20 21:27:51 +03:00
c6a7721e6e лаб1 2023-09-20 21:21:38 +03:00
5a3393d95f лаба1 2023-09-20 21:17:02 +03:00
254bec1517 Удалил тестовый файл 2023-09-20 21:12:33 +04:00
4e4e26a654 test 2023-09-20 21:09:58 +04:00
a09a060f48 Добавила отчет 2023-09-20 14:17:40 +04:00
c623026d6c Удалить 'image.png' 2023-09-19 20:43:03 +04:00
37bd5044b8 Удалить 'TN08qNkVYgk.jpg' 2023-09-19 20:42:56 +04:00
5b8b613410 Загрузил(а) файлы в '' 2023-09-19 20:42:01 +04:00
410 changed files with 11600 additions and 3 deletions

View File

@ -7,8 +7,8 @@
1. [Знакомство с docker и docker-compose](labs/lab_1/README.md)
2. [Разработка простейшего распределённого приложения](labs/lab_2/README.md)
3. TBA
4. TBA
3. [REST API, Gateway и синхронный обмен между микросервисами](labs/lab_3/README.md)
4. [Работа с брокером сообщений](labs/lab_4/README.md)
5. TBA
6. TBA
7. TBA

129
labs/lab_3/README.md Normal file
View File

@ -0,0 +1,129 @@
# Лабораторная работа №3 - REST API, Gateway и синхронный обмен между микросервисами
Цель: изучение шаблона проектирования gateway, построения синхронного обмена между микросервисами и архитектурного стиля RESTful API.
Задачи:
1. Создать 2 микросервиса, реализующих CRUD на связанных сущностях.
2. Реализовать механизм синхронного обмена сообщениями между микросервисами.
3. Реализовать шлюз на основе прозрачного прокси-сервера nginx.
## Создание микросервисов
Создать два микросервиса.
Каждый сервис реализует CRUD-операции: список записей, подробности конкретной записи, создание, удаление и изменение записи.
В качестве хранилища данных может выступать оперативная память приложения или база данных.
Сущности необходимо подобрать по следующим критериям:
1. Они должны быть связаны с предполагаемой темой диплома.
2. Они должны быть связаны как `1-ко-многим``.
> Например, одна сущность - книга в библиотеке, вторая - абонемент.
>
> Поля абонемента: УИД (уникальный идентификатор) абонемента, Номер, ФИО читателя, Дата выдачи.
> Поля книги: УИД книги, Автор, Название, Год издания, УИД абонемента, на котором сейчас находится книга.
Общение между сервисами должно происходить при помощи API, реализованного при помощи архитектурного стиля проектирования REST.
То есть необходимо реализовать следующие endpoints:
1. "GET /" - Получение списка записей.
Должен возвращать массив моделей.
2. "GET /{uuid}" - Получение подробностей записи по УИД (uuid).
Должен возвращать модель или ошибку 404.
3. "POST /" - Создание новой записи.
Принимает на вход данные. Должен возвращать модель из п.2.
4. "PUT /{uuid}" - Обновление записи по УИД.
Принимает на вход новые данные. Должен возвращать модель из п.2 или ошибку 404.
5. "DELETE /{uuid}" - Удаление записи по УИД.
Возвращает коды 200 при успехе и 404, если запись не найдена.
Пример модели абонемента для списка и подробностей:
```json
{
"uuid": "8f036445-a5bd-401c-926e-840f9de795cd",
"number": 135,
"fullName": "Иванов И.И.",
"issued": "2023-10-18T05:41:00Z"
}
```
Пример модели абонемента для создания или изменения:
```json
{
"number": 135,
"fullName": "Иванов И.И.",
"issued": "2023-10-18T05:41:00Z"
}
```
> Как видите, нет УИДа, т.к. он присваивается системой, и изменять мы его не можем.
Пример модели книги для списка:
```json
{
"uuid": "8740d660-b251-4272-8535-be7ec3748d4b",
"author": "J.K.R.",
"subject": "HP and PS",
"year": 1997,
"subscriptionUuid": "8f036445-a5bd-401c-926e-840f9de795cd"
}
```
Пример модели книги для подробностей:
```json
{
"uuid": "8740d660-b251-4272-8535-be7ec3748d4b",
"author": "J.K.R.",
"subject": "HP and PS",
"year": 1997,
"subscriptionUuid": "8f036445-a5bd-401c-926e-840f9de795cd",
"subscriptionInfo": {
"number": 135,
"fullName": "Иванов И.И.",
"issued": "2023-10-18T05:41:00Z"
}
}
```
> Как видите, модель сильно богаче, чем при запросе списка.
>
> Как раз здесь и нужен синхронный обмен между сервисами.
Пример модели книги для создания или изменения:
```json
{
"author": "J.K.R.",
"subject": "HP and PS",
"year": 1997,
"subscriptionUuid": "8f036445-a5bd-401c-926e-840f9de795cd"
}
```
Как понять, куда обращаться микросервису книг для получения данных об абонементах?
Нам здесь поможет docker compose: код в "service" совпадает с хостом, куда следует обращаться.
## Реализация синхронного обмена
Как реализовать непосредственно работу с endpoints?
Например, использовать ASP.NET Core Minimal APIs.
[Небольшой пример, который это показывает](./example_1.cs).
Как вызвать синхронно данные с соседнего микросервиса?
Через HTTP-клиент!
[Небольшой пример, который это показывает](./example_2.cs).
## Реализация gateway при помощи nginx
Один сервер, несколько location, proxy_pass по хосту из docker-compose.yml, открытые порты наружу и... всё.
[Пример файла с настройкой nginx](./example_nginx.conf).
[Ещё один пример связи воркеров и nginx](../../tasks/moiseev-vv/lab_3).

76
labs/lab_3/example_1.cs Normal file
View File

@ -0,0 +1,76 @@
List<TaskEntity> tasks = new()
{
new TaskEntity() { Uuid= Guid.NewGuid(), Subject = "Сдать третью лабу", IsCompleted = false },
};
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Массив сущностей.
app.MapGet("/", () =>
{
return tasks.Select(t => new TaskEntityDto()
{
Uuid = t.Uuid,
Subject = t.Subject,
IsCompleted = t.IsCompleted,
});
});
// Подробности сущности.
app.MapGet("/{uuid}", (Guid uuid) =>
{
var task = tasks.FirstOrDefault(t => t.Uuid == uuid);
if (task == null)
return Results.NotFound();
return Results.Json(new TaskEntityDto()
{
Uuid = task.Uuid,
Subject = task.Subject,
IsCompleted = task.IsCompleted,
});
});
// Создание сущности.
app.MapPost("/", () => { throw new NotImplementedException(); });
// Изменение сущности.
app.MapPut("/{uuid}", () => { throw new NotImplementedException(); });
// Удаление сущности.
app.MapPost("/", () => { throw new NotImplementedException(); });
app.Run();
/// <summary>
/// Сама сущность.
/// </summary>
public class TaskEntity
{
public Guid Uuid { get; set; }
public string Subject { get; set; } = string.Empty;
public bool IsCompleted { get; set; }
}
/// <summary>
/// DTO-класс для описания сущности в API.
/// </summary>
public class TaskEntityDto : TaskEntity { }
/// <summary>
/// Запрос на создание сущности.
/// </summary>
public class TaskCreateRequest
{
public string Subject { get; set; } = string.Empty;
public bool IsCompleted { get; set; }
}
/// <summary>
/// Запрос на изменение сущности.
/// </summary>
public class TaskEditRequest
{
public string Subject { get; set; } = string.Empty;
public bool IsCompleted { get; set; }
}

26
labs/lab_3/example_2.cs Normal file
View File

@ -0,0 +1,26 @@
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient(); // Добавляем библиотеку по работе с HTTP.
var app = builder.Build();
// Да, по заданию надо будет запрашивать метод /{uuid}. Тут запрашивается список.
app.MapGet("/", async (IHttpClientFactory httpClientFactory) =>
{
var remoteHost = "http://localhost:5158"; // Адрес, по которому развёрнут микросервис с задачами. В docker compose тут будет имя service.
var client = httpClientFactory.CreateClient();
var response = await client.GetFromJsonAsync<List<TaskEntityDto>>(remoteHost);
if (response == null)
return Results.BadRequest();
return Results.Ok($"Соседний микросервис отдал следующие задачи: {string.Join(", ", response.Select(i => i.Subject))}");
});
app.Run();
/// <summary>
/// DTO-класс для описания сущности из другого микросервиса.
/// </summary>
public class TaskEntityDto
{
public Guid Uuid { get; set; }
public string Subject { get; set; } = string.Empty;
public bool IsCompleted { get; set; }
}

View File

@ -0,0 +1,21 @@
server {
listen 80;
listen [::]:80;
server_name localhost;
location /test/ {
proxy_pass http://test:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /test;
}
location /admin/ {
proxy_pass http://admin:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /admin;
}
}

59
labs/lab_4/README.md Normal file
View File

@ -0,0 +1,59 @@
# Лабораторная работа №4 - Работа с брокером сообщений
**Цель**: изучение проектирования приложений при помощи брокера сообщений.
**Задачи**:
1. Установить брокер сообщений RabbitMQ.
2. Пройти уроки 1, 2 и 3 из [RabbitMQ Tutorials](https://www.rabbitmq.com/getstarted.html) на любом языке программирования.
3. Продемонстрировать работу брокера сообщений.
## Установка брокера сообщений RabbitMQ
Можно не использовать Docker и использовать локальный ПК.
[Страница скачивания RabbitMQ с офф. сайта](https://www.rabbitmq.com/download.html).
[Страница релизов RabbitMQ](https://github.com/rabbitmq/rabbitmq-server/releases/), где есть бинарные установщики для всех современных платформ.
## Прохождение tutorial
Достаточно для каждого урока скриншота, где виден запуск одновременно `producer` и `consumer`, а также видно, что сообщения передаются.
## Разработка демонстрационных приложений
См. 3 главу tutorial.
Необходимо выбрать предметную область и разработать следующие приложения:
1. **Publisher**.
Программа, которая создаёт один **exchange** с типом _fanout_.
Программа должна раз в секунду генерировать сообщения в журнал событий согласно вашей предметной области.
Например, событие "пришёл заказ" или "сообщение от пользователя" или "необходимо создать отчёт".
2. **Consumer 1**.
Программа, которая создаёт под себя отдельную не анонимную (!) очередь (**queue**) (то есть имя queue НЕ пустая строка), создаёт **binding** на **exchange** и начинает принимать сообщения (_consume_).
Программа должна обрабатывать сообщения 2-3 секунды.
Можно реализовать через обычный _Thread.Sleep_ (для C#).
3. **Consumer 2**.
Аналогично _Consumer 1_, только сообщения необходимо обрабатывать моментально.
Только имя очереди должно отличаться от _Consumer 1_.
Далее необходимо собрать и запустить приложения одновременно по одному экземпляру.
Сделать в отчёте вывод о скорости обработки _consumer_-ами событий от _publisher_-а.
Для этого можно посмотреть заполненность созданных очередей.
А для этого можно использовать скриншот из **RabbitMQ Management UI**.
Запустить несколько копий _Consumer 1_.
Проверить заново заполненность очередей через _UI_.
## Правила оформления pull request
Код и отчёт со скриншотами необходимо положить в папку `tasks/фамилия-инициалы/lab_4`.
Не забудьте о файле `.gitignore`, чтобы не закоммитить ничего лишнего.
Для C#-проектов это, например, папки `bin` и `obj`.
Правила именования ветки: `фамилия-инициалы-lab-номер`, например, `moiseev-vv-lab-4`.
Название pull request: `[Л/Р 4] ФАМИЛИЯ ИМЯ`, например, `[Л/Р 4] Моисеев Владислав`.

View File

@ -0,0 +1,149 @@
# Отчёт по лабораторной работе №1
Выполнил: студент гр. ИСЭбд-41, Мельников К.Ю.
## Разворачивание сервиса Gitea
Содержимое файла `docker-compose.yml` в папке Gitea:
```yaml
version: "3"
networks:
gitea:
external: false
# Контейнер Gitea
services: # Описание служб
server:
image: gitea/gitea:1.20.4 # Образ gitea
container_name: gitea # Наименование контейнера
environment: # Наши параметры
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks: # Параметры сети
- gitea
volumes: # Каталоги для хранения данных контейнера
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports: # Порт локальный и внутри сети
- "3000:3000"
- "222:22"
depends_on:
- db
# База данных
db:
image: mysql:8 # Образ БД и версия
restart: always # Параметр перезапуска
environment: # Подключаем каталог с базой данных
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks: # Параметры сети
- gitea
volumes: # Том для хранения данных БД
- ./mysql:/var/lib/mysql
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](scrins/1.png)
Открываем Docker Desktop и проверяем, что контейнер сервера БД и Gitea созданы и запущены:
![](scrins/2.png)
Переходим на http://localhost:222:
![](scrins/3.png)
Регистрируемся и автоматически входим в учетную запись:
![](scrins/4.png)
![](scrins/5.png)
## Разворачивание сервиса Wordpress
Также в файл `docker-compose.yml` в папке Wordpress прописываем следующий код:
```yaml
version: '3.1'
services:
# Контейнер Wordpress
wordpress:
image: wordpress # Образ
restart: always # Параметр перезапуска
ports: # На каком порте запускаем
- 7071:80
environment: # Настройки БД WordPress для подключения
WORDPRESS_DB_HOST: database # Имя хоста БД MySQL
WORDPRESS_DB_USER: user # Имя пользователя БД
WORDPRESS_DB_PASSWORD: password # Пароль пользователя БД
WORDPRESS_DB_NAME: name_database # Имя БД
volumes: # Каталог хранения файлов WordPress
- wordpress:/var/www/html
# Контейнер MySQL
database:
image: mysql:5.7 # Образ и его версия
restart: always # Параметр перезапуска
environment: # Настройки БД для подключения
MYSQL_DATABASE: name_database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: '12345'
volumes: # Каталог хранения данных БД
- database:/var/lib/mysql
volumes:
wordpress:
database:
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](scrins/6.png)
Открываем Docker Desktop и проверяем, что контейнер сервера БД и Wordpress созданы и запущены
Устанавливаем Wordpress и проверяем, что все работает:
![](scrins/7.png)
![](scrins/8.png)
## Разворачивание сервиса Redmine
Также в файл `docker-compose.yml` в папке Redmine прописываем код:
```yaml
version: '3.1'
services:
# Контейнер Redmine
redmine:
image: redmine # Образ контейнера
restart: always
ports: # На какой порт запускать
- 8080:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
# Контейнер БД MySQL
db:
image: mysql:5.7 # Образ БД и ее версия
restart: always
environment: # Название и пароль админа БД
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
Открываем Docker Desktop и проверяем, что контейнер сервера БД и Redmine созданы и запущены:
![](scrins/10.png)
Переходим на http://localhost:8080:
![](scrins/9.png)
Регистрируемся и проверяем, что все работает:

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -0,0 +1,139 @@
# Отчёт по лабораторной работе №1
Выполнил: студент гр. ИСЭбд-41, Дунаев О.И.
## Разворачивание сервиса Gitea
Содержимое файла `docker-compose.yml` в папке Gitea:
```yaml
version: "3"
networks:
gitea:
external: false
# Контейнер Gitea
services: # Описание служб
server:
image: gitea/gitea:1.20.4 # Образ gitea
container_name: gitea # Наименование контейнера
environment: # Наши параметры
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks: # Параметры сети
- gitea
volumes: # Каталоги для хранения данных контейнера
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports: # Порт локальный и внутри сети
- "3000:3000"
- "222:22"
depends_on:
- db
# База данных
db:
image: mysql:8 # Образ БД и версия
restart: always # Параметр перезапуска
environment: # Подключаем каталог с базой данных
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks: # Параметры сети
- gitea
volumes: # Том для хранения данных БД
- ./mysql:/var/lib/mysql
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](pic/1.png)
Переходим на http://localhost:222:
![](pic/2.png)
Регистрируемся и автоматически входим в учетную запись:
![](pic/3.png)
## Разворачивание сервиса Wordpress
Также в файл `docker-compose.yml` в папке Wordpress прописываем следующий код:
```yaml
version: '3.1'
services:
# Контейнер Wordpress
wordpress:
image: wordpress # Образ
restart: always # Параметр перезапуска
ports: # На каком порте запускаем
- 7071:80
environment: # Настройки БД WordPress для подключения
WORDPRESS_DB_HOST: database # Имя хоста БД MySQL
WORDPRESS_DB_USER: user # Имя пользователя БД
WORDPRESS_DB_PASSWORD: password # Пароль пользователя БД
WORDPRESS_DB_NAME: name_database # Имя БД
volumes: # Каталог хранения файлов WordPress
- wordpress:/var/www/html
# Контейнер MySQL
database:
image: mysql:5.7 # Образ и его версия
restart: always # Параметр перезапуска
environment: # Настройки БД для подключения
MYSQL_DATABASE: name_database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: '12345'
volumes: # Каталог хранения данных БД
- database:/var/lib/mysql
volumes:
wordpress:
database:
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](pic/4.png)
Открываем Docker Desktop и проверяем, что контейнер сервера БД и Wordpress созданы и запущены:
![](pic/5.png)
## Разворачивание сервиса Redmine
Также в файл `docker-compose.yml` в папке Redmine прописываем код:
```yaml
version: '3.1'
services:
# Контейнер Redmine
redmine:
image: redmine # Образ контейнера
restart: always
ports: # На какой порт запускать
- 8080:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
# Контейнер БД MySQL
db:
image: mysql:5.7 # Образ БД и ее версия
restart: always
environment: # Название и пароль админа БД
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](pic/6.png)
Переходим на http://localhost:8080:
![](pic/7.png)
Регистрируемся и проверяем, что все работает:
![](pic/8.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

View File

@ -0,0 +1,157 @@
# Отчёт по лабораторной работе №1
Выполнил: студент гр. ИСЭбд-41 Фомичев А.И.
## Разворачивание сервиса Redmine
Содержимое файла `docker-compose.yml` в папке Redmine:
```yaml
version: "3.8"
services: # Задаем сервисы.
db: # Сервис 1. База данных Postgres.
image: postgres:13.2-alpine # Образ БД.
restart: unless-stopped
environment: # Переменные окружения.
POSTGRES_PASSWORD: example # Пароль от postgres.
container_name: db_redmine # Название контейнера.
volumes: # Место хранения данных для БД.
- database:/var/lib/postgresql/data
redmine: # Сервис 2. Редмайн.
image: redmine:4.1-alpine # Образ.
environment: # Переменные окружения.
- REDMINE_DB_POSTGRES=db
- REDMINE_DB_PASSWORD=example
ports: # Прослушиваемые порты.
- 9999:3000
volumes: # Файлы редмайна.
- files:/usr/src/redmine/files
depends_on: # Зависимость от БД.
- db
volumes:
database:
files:
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](images/image1.PNG)
Смотрим в Docker Desktop, что контейнеры БД и сервиса Redmine запущены успешно.
![](images/image2.PNG)
Переходим на http://localhost:9999 и авторизовываемся под администратором.
![](images/image3.PNG)
Создаем проект и некоторые данные.
![](images/image4.PNG)
Наблюдаем полностью рабочий сервис с БД.
## Разворачивание сервиса Wordpress
Также в файл `docker-compose.yml` в папке Wordpress прописываем следующий код:
```yaml
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: test2
WORDPRESS_DB_PASSWORD: test123
WORDPRESS_DB_NAME: wordpressDB
volumes:
- wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpressDB
MYSQL_USER: test2
MYSQL_PASSWORD: test123
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](images/image5.PNG)
Смотрим в Docker Desktop, что контейнеры БД и сервиса Wordpress запущены успешно.
![](images/image6.PNG)
Переходим на http://localhost:8080, авторизовываемся под администратором и создаем наш сайт.
![](images/image7.PNG)
Сервис развернут успешно.
## Разворачивание сервиса Gitea
В файл `docker-compose.yml` прописываем следующий код:
```yaml
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.20.4
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
depends_on:
- db
db:
image: mysql:8
restart: always
environment:
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- ./mysql:/var/lib/mysql
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](images/image10.PNG)
Смотрим в Docker Desktop, что контейнеры БД и сервиса Wordpress запущены успешно.
![](images/image8.PNG)
Переходим на http://localhost:3000, авторизовываемся под администратором и создаем наш сайт.
![](images/image9.PNG)
Сервис развернут успешно.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

View File

@ -0,0 +1,2 @@
*/*/bin
*/*/obj

477
tasks/fomichev-ai/lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1,477 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET
project.lock.json
project.fragment.lock.json
artifacts/
# Tye
.tye/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
##
## Visual studio for Mac
##
# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/
# Mac bundle stuff
*.dmg
*.app
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk

View File

@ -0,0 +1,77 @@
# Отчёт по лабораторной работе №2
Выполнил: студент гр. ИСЭбд-41 Фомичев Андрей.
Вариант программы 1: Ищет в каталоге `/var/data` файл с самым коротким названием и перекладывает его в `/var/result/data.txt`.
Вариант программы 2: Ищет наименьшее число из файла `/var/data/data.txt` и сохраняет количество таких чисел из последовательности в `/var/result/result.txt`.
## Создание приложений
Создадим 2 приложения.
Был выбран язык C# и технология .NET 7.
Для создания обычных консольных приложений воспользуемся командами:
```sh
dotnet new console -o worker-1
dotnet new console -o worker-2
```
Согласно варианту, программа 1 должна брать все файлы из папки `/var/data`, считывать длину их названия, найти минимальное и переложить его в папку `/var/result`.
[Исходный текст программы worker-1](worker-1/Program.cs)
Согласно варианту программа 2 должна брать строки из папки `/var/data/` с скопированным файлом, пытаться привести их к числам, затем найти минимальное из них.
Далее найти количество вхождений этого числа и результат записать в файл `/var/result/result.txt`.
[Исходный текст программы worker-2](worker-2/Program.cs)
Дополнительно создан файл [.gitignore](.gitignore) для того, чтобы не закоммитить в git ничего лишнего.
## Настройка окружения
Для связи двух приложений воспользуемся следующей схемой:
1. Каталог `./data` должен быть примонтирован в каталог `/var/data` для программы 1.
Оттуда будут браться исходные данные.
2. Каталог `./result-1` должен быть примонтирован в каталог `/var/result` для программы 2.
Туда будут складываться промежуточные данные.
3. Каталог `./result-1` также должен быть примонтирован в каталог `/var/data` для программы 2.
Оттуда будут браться промежуточные результаты.
4. Каталог `./result` должен быть примонтирован в каталог `/var/result` для программы 2.
Туда будут складывать результаты финальной обработки.
Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-2/Dockerfile)) с подробным описанием процесса сборки.
Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения.
Дополнительно был создан файл [.dockerignore](.dockerignore) и дополнен [.gitignore](.gitignore), чтобы исключить для сборки и коммита всё лишнее.
## Сборка и запуск
В каталог `./data` помещены 4 файла с различной длиной названия и содержимым.
![](image2.PNG)
На выходе, программа должна записать число 2, так как файл с минимальным названием f.txt, в нём минимальное число -100, которое встречается 2 раза.
![](image1.PNG)
Для запуска приложения необходимо ввести команду `docker compose up --build`.
Результат запуска после сборки:
```
[+] Running 2/2
✔ Container lab_2-worker-1-1 Created 0.0s
✔ Container lab_2-worker-2-1 Recreated 0.1s
Attaching to lab_2-worker-1-1, lab_2-worker-2-1
lab_2-worker-1-1 | Сервис 1 отработал успешно!
lab_2-worker-1-1 exited with code 0
lab_2-worker-2-1 | Сервис 2 отработал успешно!
lab_2-worker-2-1 | Наименьшее число:= -100 , число вхождений:= 2
lab_2-worker-2-1 exited with code 0
```
В результате в каталоге `./result` создался файл `result.txt` с содержимым `2`, что соответствует входным данным.
Изменение значений в файлах из каталога `./data` также изменяет содержимое в файлах из каталогов `./result-1` и `./result`.

View File

@ -0,0 +1,29 @@
2
5
3456
468
24
3
67846
84
62
4
7468
23
34
67458446
7
-100
735
35
7
24
6458
745689
3
3457
-100
72346

View File

@ -0,0 +1,3 @@
test
test123
test567

View File

@ -0,0 +1,19 @@
{ "menu":
{
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{
"value": "New", "onclick": "CreateNewDoc()"
},
{
"value": "Open", "onclick": "OpenDoc()"
},
{
"value": "Close", "onclick": "CloseDoc()"
}
]
}
}
}

View File

@ -0,0 +1,5 @@
5
6
7
8
9

View File

@ -0,0 +1,18 @@
version: "3.1"
services:
worker-1:
build: ./worker-1
volumes:
# Монтирует локальную папку data к папке data в контейнере.
- ./data:/var/data
# Монтирует локальную папку result-1 к папке result в контейнере.
- ./result-1:/var/result
worker-2:
build: ./worker-2
volumes:
# Монтирует локальную папку result-1 к папке data в контейнере.
- ./result-1:/var/data
- ./result:/var/result
# Зависимость от первого приложения.
depends_on:
- worker-1

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{A8D5EB71-2620-40E5-9AC5-3292588391DA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{D1CDD34F-8407-4BA9-B81C-22B92532D339}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A8D5EB71-2620-40E5-9AC5-3292588391DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A8D5EB71-2620-40E5-9AC5-3292588391DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A8D5EB71-2620-40E5-9AC5-3292588391DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A8D5EB71-2620-40E5-9AC5-3292588391DA}.Release|Any CPU.Build.0 = Release|Any CPU
{D1CDD34F-8407-4BA9-B81C-22B92532D339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1CDD34F-8407-4BA9-B81C-22B92532D339}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1CDD34F-8407-4BA9-B81C-22B92532D339}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D1CDD34F-8407-4BA9-B81C-22B92532D339}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,17 @@
# Задаем базовый образ на .NET 7.0.
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
# Задаем рабочую директорию.
WORKDIR /src
# В каталог копируем файлы и папки в контейнер.
COPY . ./
# Создаем образы и устанавливаем данные пакеты в контейнер.
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:7.0 as runtime
WORKDIR /publish
COPY --from=build-env /publish .
# Вызываем приложение во время выполнения контейнера.
ENTRYPOINT ["dotnet", "worker-1.dll"]

View File

@ -0,0 +1,29 @@
var dir = new DirectoryInfo("/var/data");
var files = dir.GetFiles();
string? oldFilePath = null;
var newFilePathTest = new DirectoryInfo("/var/result");
string? fileName = null;
long minFileName = long.MaxValue;
foreach(var file in files)
{
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file.Name);
if(fileNameWithoutExtension.Length < minFileName)
{
minFileName = fileNameWithoutExtension.Length;
oldFilePath = Path.GetFullPath(file.FullName);
fileName = file.Name;
}
}
if (oldFilePath != null)
{
foreach (var file in newFilePathTest.GetFiles())
file.Delete();
File.Copy(oldFilePath, newFilePathTest.FullName + "/" + fileName, true);
Console.WriteLine("Сервис 1 отработал успешно!");
} else
{
throw new Exception("Нет исходных файлов для чтения.");
}

View File

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>worker_1</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,17 @@
# Задаем базовый образ на .net 7.0.
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
# Задаем рабочую директорию.
WORKDIR /src
# В каталог копируем файлы и папки в контейнер.
COPY . ./
# Создаем образы и устанавливаем данные пакеты в контейнер.
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:7.0 as runtime
WORKDIR /publish
COPY --from=build-env /publish .
# Вызываем приложение во время выполнения контейнера.
ENTRYPOINT ["dotnet", "worker-2.dll"]

View File

@ -0,0 +1,24 @@
var dir = new DirectoryInfo("/var/data");
var fileName = dir.GetFiles().First().Name;
string[] numbers = File.ReadAllLines("/var/data/" + fileName);
long k = 0;
long min = long.MaxValue;
foreach (var numberStr in numbers)
{
if (!int.TryParse(numberStr, out int number))
continue;
if (number < min)
min = number;
}
foreach (var numberStr in numbers)
{
if (!int.TryParse(numberStr, out int number))
continue;
if (min == number)
k++;
}
File.WriteAllText("/var/result/result.txt", k.ToString());
Console.WriteLine("Сервис 2 отработал успешно!");
Console.WriteLine($"Наименьшее число:= {min} , число вхождений:= {k}");

View File

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>worker_2</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,132 @@
# Отчёт по лабораторной работе №1
Выполнила: студентка гр. ИСЭбд-41 Горбылева Антонина Игоревна
## Разворачивание сервиса drupal
Содержимое файла `docker-compose.yml` в папке drupal:
```yaml
version: '3.1'
#Задаем контейнеры
services:
#Контейнер drupal
drupal:
image: drupal:8-apache
ports:
- 8800:80
#Каталоги в контейнере
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
restart: always
#Контейнер БД
postgres:
image: postgres:10
environment:
POSTGRES_PASSWORD: example
restart: always
```
Далее в командной строке разворачиваем сервис командой `docker-compose up`:
Открываем Docker Desktop и проверяем, что контейнер сервера базы данных и Drupal созданы и запущены:
![](drupal_containers.png)
Переходим на http://localhost:8800, регистрируемся:
![](drupal_web.png)
Сервис запущен успешно!
## Разворачивание сервиса redmine
Содержимое файла `docker-compose.yml` в папке redmine:
```yaml
version: '3.1'
services:
# Контейнер Redmine
redmine:
image: redmine
restart: always
ports:
- 8080:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
# Контейнер БД
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
```
Далее в командной строке разворачиваем сервис командой `docker-compose up`.
В Docker Desktop проверяем, что сервис работает:
![](redmine_containers.png)
Переходим на http://localhost:8800, регистрируемся:
![](redmine_web_enter.png)
Подтверждаем реистрацию и успешно заходим в свою учетную запись!
![](redmine.png)
Ура! Сервис redmine тоже работает!
## Разворачивание сервиса wordpress
Содержимое файла `docker-compose.yml` в папке wordpress:
```yaml
version: '3.1'
#Задаем контейнеры
services:
#Контейнер Wordpress
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: user
WORDPRESS_DB_PASSWORD: userpass
WORDPRESS_DB_NAME: mydb
volumes:
- wordpress:/var/www/html
#Контейнер БД
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: userpass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
```
Далее в командной строке разворачиваем сервис командой `docker-compose up`.
![](docker_wordpress_terminal.png)
В Docker Desktop проверяем, что сервис запущен:
![](docker_wordpress.jpg)
Переходим на http://localhost:8080, регистрируемся и убеждаемся что сервис работает:
![](enter_wordpress.jpg)
Все три сервиса успешно запущены и работают!

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

View File

@ -0,0 +1,151 @@
# Отчёт по лабораторной работе №1
Выполнила: студентка гр. ИСЭбд-41, Гренадерова А.А.
## Разворачивание сервиса Gitea
Содержимое файла `docker-compose.yml` в папке Gitea:
```yaml
version: "3"
networks:
gitea:
external: false
# Контейнер Gitea
services: # Описание служб
server:
image: gitea/gitea:1.20.4 # Образ gitea
container_name: gitea # Наименование контейнера
environment: # Наши параметры
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks: # Параметры сети
- gitea
volumes: # Каталоги для хранения данных контейнера
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports: # Порт локальный и внутри сети
- "3000:3000"
- "222:22"
depends_on:
- db
# База данных
db:
image: mysql:8 # Образ БД и версия
restart: always # Параметр перезапуска
environment: # Подключаем каталог с базой данных
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks: # Параметры сети
- gitea
volumes: # Том для хранения данных БД
- ./mysql:/var/lib/mysql
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](pictures/1.png)
Открываем Docker Desktop и проверяем, что контейнер сервера БД и Gitea созданы и запущены:
![](pictures/2.png)
Переходим на http://localhost:222:
![](pictures/3.png)
Регистрируемся и автоматически входим в учетную запись:
![](pictures/4.png)
![](pictures/5.png)
## Разворачивание сервиса Wordpress
Также в файл `docker-compose.yml` в папке Wordpress прописываем следующий код:
```yaml
version: '3.1'
services:
# Контейнер Wordpress
wordpress:
image: wordpress # Образ
restart: always # Параметр перезапуска
ports: # На каком порте запускаем
- 7071:80
environment: # Настройки БД WordPress для подключения
WORDPRESS_DB_HOST: database # Имя хоста БД MySQL
WORDPRESS_DB_USER: user # Имя пользователя БД
WORDPRESS_DB_PASSWORD: password # Пароль пользователя БД
WORDPRESS_DB_NAME: name_database # Имя БД
volumes: # Каталог хранения файлов WordPress
- wordpress:/var/www/html
# Контейнер MySQL
database:
image: mysql:5.7 # Образ и его версия
restart: always # Параметр перезапуска
environment: # Настройки БД для подключения
MYSQL_DATABASE: name_database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: '12345'
volumes: # Каталог хранения данных БД
- database:/var/lib/mysql
volumes:
wordpress:
database:
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](pictures/6.png)
Открываем Docker Desktop и проверяем, что контейнер сервера БД и Wordpress созданы и запущены:
![](pictures/7.png)
Устанавливаем Wordpress и проверяем, что все работает:
![](pictures/8.png)
![](pictures/9.png)
![](pictures/10.png)
![](pictures/11.png)
## Разворачивание сервиса Redmine
Также в файл `docker-compose.yml` в папке Redmine прописываем код:
```yaml
version: '3.1'
services:
# Контейнер Redmine
redmine:
image: redmine # Образ контейнера
restart: always
ports: # На какой порт запускать
- 8080:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
# Контейнер БД MySQL
db:
image: mysql:5.7 # Образ БД и ее версия
restart: always
environment: # Название и пароль админа БД
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
```
Далее в командной строке разворачиваем сервис командой `docker-compose up -d`:
![](pictures/12.png)
Открываем Docker Desktop и проверяем, что контейнер сервера БД и Redmine созданы и запущены:
![](pictures/13.png)
Переходим на http://localhost:8080:
![](pictures/14.png)
Регистрируемся и проверяем, что все работает:
![](pictures/15.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

454
tasks/grenaderova-aa/lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1,454 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# Tye
.tye/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
##
## Visual studio for Mac
##
# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/
# Mac bundle stuff
*.dmg
*.app
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# JetBrains Rider
.idea/
*.sln.iml
##
## Visual Studio Code
##
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View File

@ -0,0 +1,84 @@
# Отчёт по лабораторной работе №2
Выполнил: студентка гр. ИСЭбд-41, Гренадерова А.А.
Вариант программы 1: 1. Ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt.
Вариант программы 2: 2. Ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt.
## Создание приложений
Создадим 2 приложения.
Был выбран язык C# и технология .NET 5.
Для создания обычных консольных приложений воспользуемся командами:
```sh
dotnet new console -o worker-1
dotnet new console -o worker-2
```
Согласно варианту, программа 1 должна найти в каталоге /var/data файл с наибольшим количеством строк и переложить его в /var/result/data.txt.
[Исходный текст программы worker-1](worker-1/Program.cs)
Согласно варианту программа 2 должна найти наименьшее число из файла /var/data/data.txt и сохранить его третью степень в /var/result/result.txt.
[Исходный текст программы worker-2](worker-2/Program.cs)
Дополнительно создан файл [.gitignore](.gitignore) для того, чтобы не закоммитить в git ничего лишнего.
## Настройка окружения
Для связи двух приложений воспользуемся следующей схемой:
1. Каталог `./data` должен быть примонтирован в каталог `/var/data` для программы 1.
Оттуда будут браться исходные данные.
2. Каталог `./result-1` должен быть примонтирован в каталог `/var/result` для программы 2.
Туда будут складываться промежуточные данные.
3. Каталог `./result-1` также должен быть примонтирован в каталог `/var/data` для программы 2.
Оттуда будут браться промежуточные результаты.
4. Каталог `./result` должен быть примонтирован в каталог `/var/result` для программы 2.
Туда будут складывать результаты финальной обработки.
Для каждой программы были созданы файлы Dockerfile ([программа 1](worker-1/Dockerfile), [программа 2](worker-2/Dockerfile)) с подробным описанием процесса сборки.
Был создан файл [docker-compose.yml](docker-compose.yml), в котором указан манифест для запуска распределённого приложения.
## Сборка и запуск
1. В каталог `./data` помещены 3 файла с различной длиной названия и содержимым.
![](2lab/1.png)
На выходе программа должна записать файл data.txt, как самый длинный по количеству строк.
![](2lab/2.png)
2. Теперь, обрабатывая этот файл:
![](2lab/2.png)
На выходе программа должна записать число 1212 в 3 степени в `./result` так как в файле c названием data.txt оно минимальное.
![](2lab/3.png)
Для запуска приложения необходимо ввести команду `docker compose up --build`.
Результат запуска после сборки:
```
[+] Running 2/0
✔ Container lab_2-worker-1-1 Created 0.0s
✔ Container lab_2-worker-2-1 Created 0.0s
Attaching to lab_2-worker-1-1, lab_2-worker-2-1
lab_2-worker-1-1 | Файл успешно создан: ../var/result/data.txt
lab_2-worker-2-1 | The maximum number is: 8
lab_2-worker-2-1 | The count of maximum numbers is: 2
lab_2-worker-1-1 exited with code 0
lab_2-worker-2-1 exited with code 0
```
В результате в каталоге `./result` создался файл `result.txt` с содержимым `1780360128`, что соответствует входным данным.
Изменение значений в файлах из каталога `./data` также изменяет содержимое в файлах из каталогов `./result-1` и `./result`.

View File

@ -0,0 +1,3 @@
1213
1212
12132

View File

@ -0,0 +1,2 @@
123213
2131

View File

@ -0,0 +1 @@
12321

View File

@ -0,0 +1,18 @@
version: "3.1"
services:
worker-1:
build: ./worker-1
volumes:
# Монтирует локальную папку data к папке data в контейнере.
- ./data:/var/data
# Монтирует локальную папку result-1 к папке result в контейнере.
- ./result-1:/var/result
worker-2:
build: ./worker-2
volumes:
# Монтирует локальную папку result-1 к папке data в контейнере.
- ./result-1:/var/data
- ./result:/var/result
# Зависимость от первого приложения.
depends_on:
- worker-1

View File

@ -0,0 +1,48 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1\worker-1.csproj", "{5B8F3FD2-C7C4-4180-80C2-3752B0648684}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2\worker-2.csproj", "{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Debug|x64.ActiveCfg = Debug|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Debug|x64.Build.0 = Debug|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Debug|x86.ActiveCfg = Debug|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Debug|x86.Build.0 = Debug|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Release|Any CPU.Build.0 = Release|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Release|x64.ActiveCfg = Release|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Release|x64.Build.0 = Release|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Release|x86.ActiveCfg = Release|Any CPU
{5B8F3FD2-C7C4-4180-80C2-3752B0648684}.Release|x86.Build.0 = Release|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Debug|x64.ActiveCfg = Debug|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Debug|x64.Build.0 = Debug|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Debug|x86.ActiveCfg = Debug|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Debug|x86.Build.0 = Debug|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Release|Any CPU.Build.0 = Release|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Release|x64.ActiveCfg = Release|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Release|x64.Build.0 = Release|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Release|x86.ActiveCfg = Release|Any CPU
{7EF62CE7-C74B-4B2F-BC91-25A367B9450E}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,3 @@
1213
1212
12132

View File

@ -0,0 +1 @@
1780360128

View File

@ -0,0 +1,18 @@
# Задаем базовый образ на .net
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
# Задаем рабочую директорию
WORKDIR /src
# Копируем файлы и папки в каталог в контейнер
COPY . ./
# Создаем образы и устанавливаем данные пакеты в контейнер
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /publish
COPY --from=build-env /publish .
# Вызываем приложение во время выполнения контейнера
ENTRYPOINT ["dotnet", "worker-1.dll"]

View File

@ -0,0 +1,42 @@
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
string sourceDirectory = "/var/data";
string destDirectory = "/var/result";
string destFile = Path.Combine(destDirectory, "data.txt");
// Получаем все файлы в исходном каталоге
string[] files = Directory.GetFiles(sourceDirectory);
int maxLines = 0;
string filePath = "";
foreach (string file in files)
{
// Считываем строки из файла
string[] lines = File.ReadAllLines(file);
// Проверяем количество строк в файле
if (lines.Length > maxLines)
{
maxLines = lines.Length;
filePath = file;
}
}
// Копируем файл с наибольшим количеством строк в новое место
if (!string.IsNullOrEmpty(filePath))
{
File.Copy(filePath, destFile, true);
Console.WriteLine($"Файл с наибольшим количеством строк перекладывается в {destFile}");
}
else
{
Console.WriteLine("Файлы не найдены в исходном каталоге");
}
}
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace>worker_1</RootNamespace>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,18 @@
# Задаем базовый образ на .net
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
# Задаем рабочую директорию
WORKDIR /src
# Копируем файлы и папки в каталог в контейнер
COPY . ./
# Создаем образы и устанавливаем данные пакеты в контейнер
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /publish
COPY --from=build-env /publish .
# Вызываем приложение во время выполнения контейнера
ENTRYPOINT ["dotnet", "worker-2.dll"]

View File

@ -0,0 +1,38 @@
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
string sourceFile = "/var/data/data.txt";
string resultFile = "/var/result/result.txt";
// Считываем числа из файла
string[] lines = File.ReadAllLines(sourceFile);
// Переменная для хранения наименьшего числа
int smallestNumber = int.MaxValue;
// Проходимся по всем числам в файле
foreach (string line in lines)
{
if (int.TryParse(line, out int number))
{
// Если число меньше текущего наименьшего, обновляем значение
if (number < smallestNumber)
{
smallestNumber = number;
}
}
}
// Возведение в третью степень
double result = Math.Pow(smallestNumber, 3);
// Записываем результат в файл
File.WriteAllText(resultFile, result.ToString());
Console.WriteLine("Наименьшее число из файла data.txt возведено в третью степень и сохранено в файле result.txt");
}
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace>worker_2</RootNamespace>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,145 @@
# Отчёт по лабораторной работе №1
Выполнил: студент гр. ИСЭбд-41 Казаков Е.В.
## Разворачивание сервиса Gitea
Содержимое файла `docker-compose.yml` в папке Gitea:
```yaml
version: "3"
networks:
gitea:
external: false
#Контейнер Gitea используется для запуска самого сервиса
services:
server:
image: gitea/gitea:1.20.4 #образ gitea
container_name: gitea
environment: #наши параметры
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes: #прописываем каталоги для хранения данных контейнера
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports: #порт локальный и внутри сети
- "3000:3000"
- "222:22"
depends_on:
- db
#Контейнер Mysql используется как сервер для запуска
db:
image: mysql:8
restart: always
environment: #подключаем каталог с базой данных
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- ./mysql:/var/lib/mysql
```
Далее в командной строке разворачиваем сервис командой `docker-compose up`:
![](shots/ss-1.png)
Открываем Docker Desktop и проверяем, что контейнер сервера базы данных и Gitea созданы и запущены:
![](shots/ss2.png)
Переходим на http://localhost:3000:
![](shots/ss3.png)
Регистрируемся и заходим на наш аккаунт
![](shots/ss4.png)
## Разворачивание сервиса Redmine
Содержимое файла `docker-compose.yml` в папке Redmine:
```yaml
version: '3.1'
#Контейнер Redmine используется для запуска самого сервиса
services:
redmine:
image: redmine #образ Redmine
restart: always
ports: #порт
- 8080:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
#Контейнер Mysql используется как сервер для запуска
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
```
Далее в командной строке разворачиваем сервис командой `docker-compose up`:
![](shots/ss5.png)
Открываем Docker Desktop и проверяем, что контейнер сервера базы данных и Reamine созданы и запущены:
![](shots/ss6.png)
Переходим на http://localhost:8080:
![](shots/ss7.png)
Входим:
![](shots/ss8.png)
Вот собственно наш пользователь:
![](shots/ss9.png)
## Разворачивание сервиса moodle
Содержимое файла `docker-compose.yml` в папке moodle:
```yaml
version: '2'
#Контейнер Mariadb используется как сервер для запуска
services:
mariadb:
image: docker.io/bitnami/mariadb:11.0
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_USER=bn_moodle
- MARIADB_DATABASE=bitnami_moodle
- MARIADB_CHARACTER_SET=utf8mb4
- MARIADB_COLLATE=utf8mb4_unicode_ci
volumes:
- 'mariadb_data:/bitnami/mariadb'
#Контейнер moodle используется для запуска самого сервиса
moodle:
image: docker.io/bitnami/moodle:4.2
ports: #порт
- '80:8080'
- '443:8443'
environment:
- MOODLE_DATABASE_HOST=mariadb
- MOODLE_DATABASE_PORT_NUMBER=3306
- MOODLE_DATABASE_USER=bn_moodle
- MOODLE_DATABASE_NAME=bitnami_moodle
- ALLOW_EMPTY_PASSWORD=yes
- MOODLE_USERNAME=vechno
- MOODLE_PASSWORD=solo
volumes:
- 'moodle_data:/bitnami/moodle'
- 'moodledata_data:/bitnami/moodledata'
depends_on:
- mariadb
volumes:
mariadb_data:
driver: local
moodle_data:
driver: local
moodledata_data:
driver: local
```
Далее в командной строке разворачиваем сервис командой `docker-compose up`:
![](shots/ss10.png)
Открываем Docker Desktop и проверяем, что контейнер сервера базы данных и moodle созданы и запущены:
![](shots/ss11.png)
Переходим на http://localhost:80:
![](shots/ss12.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Some files were not shown because too many files have changed in this diff Show More