diff --git a/chernyshov_nikita_lab_1/README.md b/chernyshov_nikita_lab_1/README.md new file mode 100644 index 0000000..4764294 --- /dev/null +++ b/chernyshov_nikita_lab_1/README.md @@ -0,0 +1,55 @@ +# Лабораторная работа №1 + +## Описание +Цель данной лабораторной работы — настройка трех сервисов: **Gitea**, **Redmine** и базы данных **MySQL** с использованием **Docker Compose**. +- **Gitea** — лёгкая система контроля версий с веб-интерфейсом. +- **Redmine** — система управления проектами, задачами и баг-трекер. +- **MySQL** — база данных, используемая **Redmine** для хранения данных. + +## Запуск проекта +1. Убедитесь, что у вас установлены **Docker** и **Docker Compose**. +2. Клонируйте репозиторий проекта или создайте файл `docker-compose.yml` с соответствующей конфигурацией. +3. В терминале перейдите в директорию с файлом `docker-compose.yml`. +4. Выполните команду: + ```bash + docker-compose up -d + ``` +Эта команда запустит все контейнеры в фоновом режиме. +5. После запуска: + - Gitea будет доступен по адресу: http://localhost:8082. + - Redmine будет доступен по адресу: http://localhost:8081. + +## Конфигурация +В файле `docker-compose.yml` настроены следующие сервисы: + +- **Gitea**: + + - Используется официальный образ `gitea/gitea:latest`. + - Хранение данных осуществляется в базе `SQLite`. + - Доступен на порту 8082. + +- **Redmine**: + + - Используется официальный образ redmine. + - Подключен к базе данных MySQL. + - Работает на порту 8081. + +- **MySQL**: + + - Используется образ mysql:8.0. + - Обеспечивает хранение данных для Redmine. + - Настроен с предустановленными параметрами: пользователь, база данных и пароль. + +## Остановка проекта +Для остановки контейнеров выполните команду: +```bash +docker-compose down +``` +Она завершит работу всех контейнеров и освободит используемые порты. + +## Примечания +- Вы можете изменить порты или другие параметры в файле docker-compose.yml. +- Данные сохраняются в именованных томах gitea_data и db_data, что позволяет избежать их потери при перезапуске контейнеров. + +## Ссылка на видео: +- https://vkvideo.ru/video286865610_456239224?list=ln-JflowbDnfatB40WRwz \ No newline at end of file diff --git a/chernyshov_nikita_lab_1/docker-compose.yml b/chernyshov_nikita_lab_1/docker-compose.yml new file mode 100644 index 0000000..607de37 --- /dev/null +++ b/chernyshov_nikita_lab_1/docker-compose.yml @@ -0,0 +1,68 @@ +version: '3' + +services: + wordpress: + image: wordpress:latest + container_name: wordpress + ports: + - "8080:80" + environment: + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: example_user + WORDPRESS_DB_PASSWORD: example_password + WORDPRESS_DB_NAME: example_db + volumes: + - wordpress_data:/var/www/html + depends_on: + - db + + db: + image: mysql:5.7 + container_name: wordpress_db + environment: + MYSQL_DATABASE: example_db + MYSQL_USER: example_user + MYSQL_PASSWORD: example_password + MYSQL_ROOT_PASSWORD: root_password + volumes: + - db_data:/var/lib/mysql + + redmine: + image: redmine:latest + container_name: redmine + ports: + - "8081:43000" + environment: + REDMINE_DB_MYSQL: redmine_db + REDMINE_DB_USERNAME: redmine_user + REDMINE_DB_PASSWORD: redmine_password + depends_on: + - redmine_db + + redmine_db: + image: mysql:5.7 + container_name: redmine_db + environment: + MYSQL_DATABASE: redmine + MYSQL_USER: redmine_user + MYSQL_PASSWORD: redmine_password + MYSQL_ROOT_PASSWORD: root_password + volumes: + - redmine_db_data:/var/lib/mysql + + gitea: + image: gitea/gitea:latest + container_name: gitea + ports: + - "8082:3000" + environment: + - USER_UID=1000 + - USER_GID=1000 + volumes: + - gitea_data:/data + +volumes: + wordpress_data: + db_data: + redmine_db_data: + gitea_data: diff --git a/chernyshov_nikita_lab_2/README.md b/chernyshov_nikita_lab_2/README.md new file mode 100644 index 0000000..d1b8854 --- /dev/null +++ b/chernyshov_nikita_lab_2/README.md @@ -0,0 +1,22 @@ +## Лабораторная работа №2 + + +**App 1: Программа 4 - Количество символов в именах файлов из каталога /var/data** + +- Формирует файл /var/result/data.txt так, что каждая строка файла - количество символов в именах файлов из каталога /var/data. + +**App 2: Программа 3 - Количество чисел в последовательности** + +- Ищет набольшее число из файла /var/result/data.txt и сохраняет количество таких чисел из последовательности в /var/result/result.txt. + +**Структура проекта:** + +1. В папках app_1, app_2 лежат выполняемые файлы .py и Dockerfile с нужным кодом. +2. В папке generator_of_data лежат выполняемые файлы для создания данных. +3. В папке data лежат файлы, длину имен которых нужно посчитать. +4. В папке result лежат файлы с результатами выполнения программ. data.txt - результат выполнения main.py (app_1), result.txt - результат выполнения main.py (app_2). Данные в result рассчитываются из данных data. +5. docker-compose.yml - для определения и управления контейнерами Docker. + +**Команда для запуска** - docker-compose up + +**Ссылка на видео:** https://vkvideo.ru/video286865610_456239225?list=ln-Xqg7SupM1CohXsGRZK \ No newline at end of file diff --git a/chernyshov_nikita_lab_2/app_1/Dockerfile b/chernyshov_nikita_lab_2/app_1/Dockerfile new file mode 100644 index 0000000..0690732 --- /dev/null +++ b/chernyshov_nikita_lab_2/app_1/Dockerfile @@ -0,0 +1,20 @@ +# Используем образ Python 3.9-slim как основу для нашего контейнера. +# slim-версия образа более компактная, что делает контейнер меньше. +FROM python:3.9-slim +# Устанавливаем рабочую директорию в контейнере как /app. +# Все последующие команды будут выполняться в этой директории. +WORKDIR /app +# Копируем файл main.py из текущей директории в директорию /app в контейнере. +COPY . /app +# Определяем команду, которая будет выполняться при запуске контейнера. +# В данном случае запускается Python-скрипт main.py. +CMD ["python", "main.py"] + + + + + + + + + diff --git a/chernyshov_nikita_lab_2/app_1/main.py b/chernyshov_nikita_lab_2/app_1/main.py new file mode 100644 index 0000000..5e945ea --- /dev/null +++ b/chernyshov_nikita_lab_2/app_1/main.py @@ -0,0 +1,38 @@ +import os + +def get_file_with_most_lines(directory): + max_lines = 0 + target_file = "" + + for filename in os.listdir(directory): + filepath = os.path.join(directory, filename) + if os.path.isfile(filepath): + with open(filepath, 'r') as f: + line_count = sum(1 for _ in f) + if line_count > max_lines: + max_lines = line_count + target_file = filename + + return target_file + +def copy_file(src_directory, dest_directory, filename): + src_filepath = os.path.join(src_directory, filename) + dest_filepath = os.path.join(dest_directory, 'data.txt') + + os.makedirs(dest_directory, exist_ok=True) + + with open(src_filepath, 'r') as src_file: + with open(dest_filepath, 'w') as dest_file: + dest_file.write(src_file.read()) + +def main(): + src_directory = '/var/data' + dest_directory = '/var/result' + + target_file = get_file_with_most_lines(src_directory) + if target_file: + copy_file(src_directory, dest_directory, target_file) + print(f"File {target_file} copied to {dest_directory}/data.txt") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/chernyshov_nikita_lab_2/app_2/Dockerfile b/chernyshov_nikita_lab_2/app_2/Dockerfile new file mode 100644 index 0000000..946d3a7 --- /dev/null +++ b/chernyshov_nikita_lab_2/app_2/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.9-slim + +WORKDIR /app + +COPY . /app + +CMD ["python", "main.py"] \ No newline at end of file diff --git a/chernyshov_nikita_lab_2/app_2/main.py b/chernyshov_nikita_lab_2/app_2/main.py new file mode 100644 index 0000000..b25deb9 --- /dev/null +++ b/chernyshov_nikita_lab_2/app_2/main.py @@ -0,0 +1,25 @@ +import os + +def get_largest_number_from_file(filepath): + with open(filepath, 'r') as f: + numbers = [int(line.strip()) for line in f.readlines()] + return max(numbers) + +def save_square_of_number(number, output_filepath): + result = number ** 2 + with open(output_filepath, 'w') as f: + f.write(str(result)) + +def main(): + input_filepath = '/var/result/data.txt' + output_filepath = '/var/result/result.txt' + + if os.path.exists(input_filepath): + largest_number = get_largest_number_from_file(input_filepath) + save_square_of_number(largest_number, output_filepath) + print(f"Largest number squared: {largest_number}^2 saved to {output_filepath}") + else: + print(f"Input file {input_filepath} not found!") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/chernyshov_nikita_lab_2/docker-compose.yml b/chernyshov_nikita_lab_2/docker-compose.yml new file mode 100644 index 0000000..5f2cb34 --- /dev/null +++ b/chernyshov_nikita_lab_2/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3' +services: + generator_of_data: + build: + context: ./generator_of_data + volumes: + - ./data:/var/data + app_1: + build: + context: ./app_1 + volumes: + - ./data:/var/data + - ./result:/var/result + depends_on: + - generator_of_data + app_2: + build: + context: ./app_2 + volumes: + - ./result:/var/result + depends_on: + - app_1 diff --git a/chernyshov_nikita_lab_2/generator_of_data/Dockerfile b/chernyshov_nikita_lab_2/generator_of_data/Dockerfile new file mode 100644 index 0000000..9ce2be9 --- /dev/null +++ b/chernyshov_nikita_lab_2/generator_of_data/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.9-slim + +WORKDIR /app + +COPY . /app + +CMD ["python", "generate_data.py"] \ No newline at end of file diff --git a/chernyshov_nikita_lab_2/generator_of_data/generate_data.py b/chernyshov_nikita_lab_2/generator_of_data/generate_data.py new file mode 100644 index 0000000..913ba85 --- /dev/null +++ b/chernyshov_nikita_lab_2/generator_of_data/generate_data.py @@ -0,0 +1,27 @@ +import os +import random + +def generate_random_files(directory, num_files, num_lines_per_file, min_value, max_value): + os.makedirs(directory, exist_ok=True) + + for i in range(num_files): + file_path = os.path.join(directory, f"file_{i + 1}.txt") + with open(file_path, 'w') as f: + for _ in range(num_lines_per_file): + random_number = random.randint(min_value, max_value) + f.write(f"{random_number}\n") + print(f"Generated file: {file_path}") + +def main(): + data_directory = '/var/data' + num_files = 10 + num_lines_per_file = 12 + min_value = 1 + max_value = 100 + + generate_random_files(data_directory, num_files, num_lines_per_file, min_value, max_value) + print(f"Generated {num_files} files in {data_directory}") + + +if __name__ == "__main__": + main() \ No newline at end of file