Compare commits

..

15 Commits

Author SHA1 Message Date
2f368ffb07 Обновить dolgov_dmitriy_lab_2/README.md 2024-10-07 15:31:54 +04:00
ead06782ad Обновить dolgov_dmitriy_lab_2/README.md 2024-10-07 14:12:39 +04:00
b2ac5eba9a Обновить dolgov_dmitriy_lab_2/README.md 2024-10-07 14:12:19 +04:00
0c0a47549a Обновить dolgov_dmitriy_lab_2/README.md 2024-10-07 14:11:37 +04:00
Аришина)
84e8cac198 Лабрадор 2024-10-07 14:09:04 +04:00
8a96320fd5 Merge pull request 'bazunov_andrew_lab_1' (#33) from bazunov_andrew_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#33
2024-09-30 22:18:50 +04:00
bd25930973 Merge pull request 'tsukanova_irina_lab_2' (#32) from tsukanova_irina_lab_2 into main
Reviewed-on: Alexey/DAS_2024_1#32
2024-09-30 22:18:28 +04:00
7184d6d728 Обновить bazunov_andrew_lab_1/README.md 2024-09-25 15:44:25 +04:00
Bazunov Andrew Igorevich
6e7055efa4 update readme 2024-09-25 15:37:57 +04:00
Bazunov Andrew Igorevich
9e40adc53c edit docker compose 2024-09-25 15:19:28 +04:00
Bazunov Andrew Igorevich
4a36528cc7 Complete docker compose 2024-09-25 12:35:39 +04:00
ad3988e5fc добавлено видео 2024-09-25 10:58:41 +04:00
780b4b2924 add readme and fix 2024-09-25 10:51:07 +04:00
5047b16cde files 2024-09-24 16:56:39 +04:00
2b87427299 что-то есть 2024-09-24 16:55:37 +04:00
27 changed files with 394 additions and 181 deletions

2
bazunov_andrew_lab_1/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
ollama
./ollama

View File

@@ -0,0 +1,33 @@
# Распределенные вычисления и приложения Л1
## _Автор Базунов Андрей Игревич ПИбд-42_
В качестве сервисов были выбраны:
- 1.Ollama (_Сервис для использования LLMs моделей_)
- 2.Open Web Ui (_Сервис для удобного общения с моделью из сервиса Ollama_)
- 3.Gitea (_Гит сервис_)
# Docker
>Перед исполнением вполняем установку docker и проверяем версию
```sh
docker-compose --version
```
>Далее производим настройку файла docker-compose.yaml и запускаем контейнер
```sh
docker-compose up -d
```
>Для завершения работы контейнера используем команду
```sh
docker-compose down
```
---
> Замечание: после запуска контейнера, необходимо перейти в контейнер **ollamа** и выполнить установку модели [gemma2](https://ollama.com/library/gemma2:2b)
> ```sh
> docker-compose exec ollama ollama run ollama run gemma2:2b
> ```
---
Далее можно использовать веб сервис Open Web Ui по адресу **localhost:8080** для общения с моделью и Gitea по адресу **localhost:3000** - [демонстрация работы](https://vk.com/video/@viltskaa?z=video236673313_456239574%2Fpl_236673313_-2)

View File

@@ -0,0 +1,61 @@
services:
gitea: # Имя сервиса
image: gitea/gitea:latest # Имя образа
container_name: gitea # Имя контейнера, может быть произовольным
ports:
- "3000:3000" # Проброс порта Gitea на хост
volumes: # хранилище
- data:/data
environment: # переменные окружения
USER_UID: 1000
USER_GID: 1000
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: always
ports:
- 7869:11434
pull_policy: always
tty: true
volumes:
- .:/code
- ./ollama/ollama:/root/.ollama # Директория для данных Ollama
environment:
- OLLAMA_KEEP_ALIVE=24h
- OLLAMA_HOST=0.0.0.0 # Указываем хост для API Ollama
networks:
- ollama-docker
command: ["serve"] # Запускаем Ollama в режиме сервера
ollama-webui:
image: ghcr.io/open-webui/open-webui:main # Образ Open Web UI
container_name: ollama-webui
restart: unless-stopped
volumes:
- ./ollama/ollama-webui:/app/backend/data
ports:
- 8080:8080 # Порт для веб-интерфейса
environment: # https://docs.openwebui.com/getting-started/env-configuration#default_models
- OLLAMA_BASE_URLS=http://host.docker.internal:7869
- ENV=dev
- WEBUI_AUTH=False
- WEBUI_NAME=Viltskaa AI
- WEBUI_URL=http://localhost:8080
- WEBUI_SECRET_KEY=t0p-s3cr3t
depends_on:
- ollama
extra_hosts:
- host.docker.internal:host-gateway
networks:
- ollama-docker
networks:
ollama-docker:
external: false
volumes:
ollama:
driver: local
data:
driver: local

2
dolgov_dmitriy_lab_2/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
data
result

View File

@@ -0,0 +1,36 @@
# Лабораторная работа №2
## Выполнил: Долгов Дмитрий, группа ПИбд-42
### Были выбраны следующие варианты программ:
* _Вариант первого приложения: 6._ Берёт из каталога /var/data случайный файл и перекладывает его в /var/result/data.txt.
* _Вариант второго приложения: 1._ Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
Кроме того, для генерации файлов был реализован сервис file_generator
### Были использованы следующие технологии:
* git
* docker
* docker-compose
* язык программирования Python
### Для запуска лабораторной работы, находясь в папке `dolgov_dmitriy_lab_2`, необходимо выполнить следующую команду:
```
docker-compose up --build
```
Таким образом, запустятся все сервисы, необходимые для выполнения лабораторной работы.
## Результат запуска:
```
app2-1 | Наибольшее числовое значение: 29.0
app2-1 | Результат: 841.0
app1-1 | Файл file_3.txt успешно перемещен в /var/result/data.txt
app2-1 exited with code 0
app1-1 exited with code 0
```
## Видео с результатом запуска:
Видео можно посмотреть по данной [ссылке](https://drive.google.com/file/d/1Iw6BR0lRvh4382QsIEfr5E68-09aKX9C/view?usp=drive_link).

View File

@@ -0,0 +1,8 @@
# Стандартный образ Python
FROM python:3.9
# Указываем рабочую директорию
WORKDIR /app
# Копируем в ней файл app1.py
COPY app1.py .
# Команда для запуска при старте контейнера
CMD ["python", "app1.py"]

View File

@@ -0,0 +1,27 @@
import os
import random
import shutil
def move_random_file():
src_dir = "/var/data"
dst_file = "/var/result/data.txt"
# Получаем список всех файлов в src_dir
files = os.listdir(src_dir)
if files:
# Выбираем случайный файл
random_file = random.choice(files)
# Проверяем, что файл существует
if os.path.exists(os.path.join(src_dir, random_file)):
# Перемещаем файл в целевое место
shutil.move(os.path.join(src_dir, random_file), dst_file)
print(f"Файл {random_file} успешно перемещен в {dst_file}")
else:
print(f"Ошибка: Файл {random_file} не найден в {src_dir}")
else:
print("Папка пуста")
if __name__ == "__main__":
move_random_file()

View File

@@ -0,0 +1,8 @@
# Стандартный образ Python
FROM python:3.9
# Указываем рабочую директорию
WORKDIR /app
# Копируем содержимое текущей директории в рабочую директорию
COPY app2.py .
# Запускаем приложение
CMD ["python", "app2.py"]

View File

@@ -0,0 +1,26 @@
import os
from math import sqrt
def find_largest_number_and_square():
input_file = "/var/data/data.txt"
output_file = "/var/result/result.txt"
try:
with open(input_file, 'r') as f:
numbers = [float(num.strip()) for num in f]
largest_num = max(numbers)
squared_num = largest_num ** 2
with open(output_file, 'w') as f:
f.write(str(squared_num))
print(f"Наибольшее числовое значение: {largest_num}")
print(f"Результат: {squared_num}")
except FileNotFoundError:
print(f"Ошибка: Файл {input_file} не найден")
except ValueError:
print("Ошибка: В файле содержатся некорректные данные")
if __name__ == "__main__":
find_largest_number_and_square()

View File

@@ -0,0 +1,42 @@
# Сервисы, которые будут запускаться
services:
# Сервис генерации файлов
file_generator:
build:
# Директория с Dockerfile и скриптом генератора
context: ./file_generator
dockerfile: Dockerfile
# Монтирование локальной папки data в /var/data в контейнере
volumes:
- ./data:/var/data
- ./result:/var/result
# Запуск команды, которая генерирует файл в папке /var/data
command: ["python", "file_generator.py"]
# Первая программа, которая перемещает рандомный файл из одной папки в другую
app1:
build:
# Директория с Dockerfile для первого приложения
context: ./app1
dockerfile: Dockerfile
# Монтирование локальной папки result в /var/result в контейнере
volumes:
- ./result:/var/result
- ./data:/var/data
# Указывает, что первый сервис зависит от завершения работы генератора
depends_on:
- file_generator
# Запуск скрипта
command: ["python", "app1.py"]
# Вторая программа, которая считает квадрат максимального числа в файле (пояснения аналогичны первой)
app2:
build:
context: ./app2
dockerfile: Dockerfile
volumes:
- ./result:/var/result
- ./data:/var/data
depends_on:
- file_generator
command: ["python", "app2.py"]

View File

@@ -0,0 +1,7 @@
FROM python:3.9
WORKDIR /app
COPY file_generator.py .
CMD [ "python", "file_generator.py" ]

View File

@@ -0,0 +1,33 @@
import os
import random
def generate_files(count):
directory = "/var/data/"
if not os.path.exists(directory):
os.makedirs(directory)
for _ in range(count):
file_name = f"{directory}file_{random.randint(1, 10)}.txt"
with open(file_name, 'w') as f:
for _ in range(random.randint(1, 100)):
f.write(f"{random.randint(1, 100)}\n")
print(f"Сгенерирован файл {file_name}")
def generate_data():
file_name = "/var/data/data.txt"
with open(file_name, 'w') as f:
for _ in range(random.randint(10, 100)):
f.write(f"{random.randint(1, 30)}\n")
print(f"Сгенерирован файл {file_name}")
if __name__ == "__main__":
generate_files(10)
generate_data()

View File

@@ -1,6 +0,0 @@
gitea/
gitea-db/
images/
LocalSettings.php
mediawiki-db/
readmine-db/

View File

@@ -1,94 +0,0 @@
# Калышев Ян ПИбд-42
## Описание
Этот проект разворачивает среду с баг-трекером Redmine, сервис для хранения репозиториев git Gitea, вики Mediawiki и базы данных для каждого сервиса с использованием Docker Compose. Ниже приведены шаги для запуска и настройки.
## 0. Предварительные действия
Перед запуском Docker Compose выполнил следующие шаги:
1. Установил docker, docker-buildx (пусть будет) и docker-compose для моей операционной системы.
2. Запустил и поставил в автозапуск docker через `sudo systemctl enable --now docker`.
## 1. Структура и запуск сервиса
Файл `docker-compose.yml` содержит описание 6 сервисов:
- gitea (Gitea);
- gitea-db (MySQL для Gitea);
- readmine (Readmine);
- readmine-db (MySQL для Readmine);
- mediawiki (Mediawiki);
- mediawiki-db (MariaDB для Mediawiki);
Запуск всех сервисов происходит через команду:
```bash
docker-compose up -d
```
## 1. Gitea
- **Образ**: `gitea/gitea:latest`
- **Порты**:
- `3000:3000` — http порт Gitea http://localhost:3000.
- `222:22` - порт для проброса ssh
- **Переменные окружения**:
- `USER_UID=1000` - uid пользователя, от которого запускается gitea
- `USER_GID=1000` - gid пользователя, от которого запускается gitea
- `GITEA__database__DB_TYPE: mysql` - тип бд
- `GITEA__database__HOST: gitea-db:3306` - адрес бд
- `GITEA__database__NAME: gitea` - имя бд
- `GITEA__database__USER: gitea` - пользователь бд
- `GITEA__database__PASSWD: gitea` - пароль бд
- **Тома**:
- `./gitea:/data` — хранение файлов gitea.
- `/etc/timezone:/etc/timezone:ro` - проброс часового пояса из хост-системы
- `/etc/localtime:/etc/localtime:ro` - проброс часового пояса из хост-системы
- **links, depends_on**
- `gitea-db` - для запуска строго после бд и гарантированной связи сетей
## 2. Readmine
- **Образ**: `readmine:latest`
- **Порты**:
- `8080:3000` — http порт Readmine http://localhost:8080.
- **Переменные окружения**:
- `REDMINE_DB_MYSQL: readmine-db` - адрес бд
- `REDMINE_DB_PASSWORD: example` - пароль бд
- `REDMINE_SECRET_KEY_BASE: supersecretkey` - секретный ключ текущего инстанса
- **links, depends_on**
- `readmine-db` - для запуска строго после бд и гарантированной связи сетей
## 3. Mediawiki
- **Образ**: `mediawiki:latest`
- **Порты**:
- `8081:3000` — http порт Mediawiki http://localhost:8081.
- **Тома**:
- `./images:/var/www/html/images` — хранение изображений mediawiki.
- `./LocalSettings.php:/var/www/html/LocalSettings.php` - проброс файла с настройками после прохождения первичной настройки
- **links, depends_on**
- `mediawiki-db` - для запуска строго после бд и гарантированной связи сетей
## 4. Базы данных
- **Образы**: `mariadb`, `mysql:8.0` (в соответствии с офф. документациями)
- **Тома**:
- `./gitea-db:/var/lib/mysql` — хранение данных бд gitea.
- `./readmine-db:/var/lib/mysql` — хранение данных бд readmine.
- `./mediawiki-db:/var/lib/mysql` — хранение данных бд mediawiki.
- **Переменные окружения** - взяты в соответствии с офф. документациями
## 6. Остановка сервисов
Для остановки и удаления всех контейнеров необходимо выполнить команду:
```bash
docker-compose down
```
## 7. Ссылка на видео
[Видео-отчёт Калышев Ян ПИбд-42](https://zyzf.space/s/stezZksnbyqaWYo)

View File

@@ -1,81 +0,0 @@
services:
gitea:
image: gitea/gitea:latest
environment:
USER_UID: 1000
USER_GID: 1000
GITEA__database__DB_TYPE: mysql
GITEA__database__HOST: gitea-db:3306
GITEA__database__NAME: gitea
GITEA__database__USER: gitea
GITEA__database__PASSWD: gitea
restart: always
links:
- gitea-db
depends_on:
- gitea-db
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
gitea-db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: gitea
MYSQL_USER: gitea
MYSQL_PASSWORD: gitea
MYSQL_DATABASE: gitea
volumes:
- ./gitea-db:/var/lib/mysql
redmine:
image: redmine:latest
restart: always
ports:
- 8080:3000
links:
- readmine-db
depends_on:
- readmine-db
environment:
REDMINE_DB_MYSQL: readmine-db
REDMINE_DB_PASSWORD: example
REDMINE_SECRET_KEY_BASE: supersecretkey
readmine-db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: redmine
volumes:
- ./readmine-db:/var/lib/mysql
mediawiki:
image: mediawiki:latest
restart: always
ports:
- 8081:80
links:
- mediawiki-db
depends_on:
- mediawiki-db
volumes:
- ./images:/var/www/html/images
- ./LocalSettings.php:/var/www/html/LocalSettings.php
mediawiki-db:
image: mariadb
restart: always
environment:
MYSQL_DATABASE: my_wiki
MYSQL_USER: wikiuser
MYSQL_PASSWORD: example
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
volumes:
- ./mediawiki-db:/var/lib/mysql

2
tsukanova_irina_lab_2/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/.venv
/.idea

View File

@@ -0,0 +1,16 @@
# Цуканова Ирина ПИбд-32
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
### Язык разработки приложений: Python
## Выбранные варианты
- Для программы 1: Ищет в каталоге ```/var/data``` самый большой по объёму файл и перекладывает его в ```/var/result/data.txt```.
- Для программы 2: Сохраняет произведение первого и последнего числа из файла ```/var/result/data.txt``` в ```/var/result/result.txt```.
## Описание:
Каждая программа лежит в своей папке, первая в worker-1, вторая в worker-2.
В этих же папках лежат Dockerfile'ы с инструкциями по сборке. В них присутствуют комментарии для значимых строк.
Монтированные папки ```data``` для ```/var/data``` и ```result``` для ```/var/result```.
## [Видео](https://drive.google.com/file/d/1eBbIDgTo3MF4EeM677EPEKgJEINekaC0/view?usp=drive_link)

View File

@@ -0,0 +1 @@
34 905 63 92 74 9 3 25 8 0 2 4 24 452 94 6 2 4 2 65 83 73 672 47 23 21 1

View File

@@ -0,0 +1 @@
4 9 6 320 75 348 12 75 94 63 45 23 3

View File

@@ -0,0 +1 @@
5 34 7 9 6 43 5 768 4 23 1 3 657 534 4 3 87 6 9 8 56 37 525 5 7 3 2 65 4 86 7 295 473 254 633 4 45 2

View File

@@ -0,0 +1,18 @@
services:
worker_one:
container_name: worker_one
build:
dockerfile: ./worker-1
volumes:
- ./data:/var/data
- ./result:/var/result
worker_two:
container_name: worker_two
build:
dockerfile: ./worker-2
volumes:
- ./result:/var/result
depends_on:
- worker_one

View File

@@ -0,0 +1 @@
5 34 7 9 6 43 5 768 4 23 1 3 657 534 4 3 87 6 9 8 56 37 525 5 7 3 2 65 4 86 7 295 473 254 633 4 45 2

View File

@@ -0,0 +1 @@
10

View File

@@ -0,0 +1,11 @@
# Использую базовый образ Python
FROM python:3.12-slim
# Устанавливаю рабочую директорию внутри контейнера
WORKDIR /app
# Копирую все файлы в контейнер
COPY worker_1.py .
# Команда для запуска Python-скрипта
CMD ["python", "worker_1.py"]

View File

@@ -0,0 +1,27 @@
import os
import shutil
# Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
print("start worker_1")
dir_data = "/var/data"
dir_res = "/var/result"
if not os.path.exists(dir_data):
os.mkdir(dir_data)
if not os.path.exists(dir_res):
os.mkdir(dir_res)
largest_file = None
largest_size = 0
for root, dirs, files in os.walk(dir_data):
for file in files:
file_path = os.path.join(root, file)
file_size = os.path.getsize(file_path)
if file_size > largest_size:
largest_size = file_size
largest_file = file_path
if largest_file:
shutil.copyfile(largest_file, dir_res + "/data.txt")

View File

@@ -0,0 +1,11 @@
# Использую базовый образ Python
FROM python:3.12-slim
# Устанавливаю рабочую директорию внутри контейнера
WORKDIR /app
# Копирую все файлы в контейнер
COPY worker_2.py .
# Команда для запуска Python-скрипта
CMD ["python", "worker_2.py"]

View File

@@ -0,0 +1,19 @@
# Сохраняет произведение первого и последнего числа из файла /var/result/data.txt в /var/result/result.txt.
print("start worker_2")
with open('/var/result/data.txt', 'r') as f:
numbers = [int(num) for num in f.read().split() if num.isdigit()]
if numbers:
first_number = numbers[0]
last_number = numbers[-1]
result = first_number * last_number
with open('/var/result/result.txt', 'w') as f:
f.write(f"{result}\n")
print(f"Получен результат - {result}")
else:
print("Результат не получен. Файл не содержит чисел")