├── Makefile
├── README.md
└── srcs
├── .env
├── docker-compose.yml
└── requirements
├── bonus
├── ftp-server
│ ├── Dockerfile
│ ├── conf
│ │ └── vsftpd.conf
│ └── tools
│ │ └── configure.sh
└── redis
│ ├── Dockerfile
│ └── tools
│ └── configure.sh
├── mariadb
├── .dockerignore
├── Dockerfile
├── conf
│ └── 50-server.cnf
└── tools
│ └── createdb.sql
├── nginx
├── .dockerignore
├── Dockerfile
├── conf
│ └── default
└── tools
│ └── start.sh
└── wordpress
├── .dockerignore
├── Dockerfile
├── conf
├── index.html
└── www.conf
└── tools
├── start.sh
└── wp-config.php
/Makefile:
--------------------------------------------------------------------------------
1 | all: up
2 |
3 | # Мы можем запустить наши контейнеры с помощью команды docker-compose up,
4 | # которая будет создавать и запускать наши контейнеры и службы в указанном нами порядке
5 | # Создайте контейнеры с помощью команды docker-compose up и флага -d,
6 | # которые будут запускать контейнеры mariadb, wordpress и nginx в фоновом режиме
7 | up:
8 | @mkdir -p /home/${USER}/data/db
9 | @mkdir -p /home/${USER}/data/wp
10 | @docker-compose -f srcs/docker-compose.yml up -d
11 |
12 | # Команда docker-compose down остановит ваши контейнеры, но также удалит остановленные контейнеры,
13 | # а также все созданные сети
14 | down:
15 | @docker-compose -f srcs/docker-compose.yml down
16 |
17 | # Список контейнеров
18 | ps:
19 | @docker-compose -f srcs/docker-compose.yml ps
20 |
21 | # Команда docker system prune — это ярлык, который удаляет образы, контейнеры и сети.
22 | # Тома не удаляются по умолчанию, и вы должны указать флаг --volumes,
23 | # чтобы система Docker сократила количество томов. По умолчанию вам будет предложено продолжить.
24 | # Чтобы обойти подсказку, используйте флаг -f или --force
25 | # Если указан `-a`, также будут удалены все изображения, на которые не ссылается какой-либо контейнер
26 | fclean: down
27 | @docker rmi -f $$(docker images -qa);\
28 | docker volume rm $$(docker volume ls -q);\
29 | docker system prune -a --force
30 | sudo rm -Rf /home/${USER}/data/db
31 | sudo rm -Rf /home/${USER}/data/wp
32 | mkdir /home/${USER}/data/db
33 | mkdir /home/${USER}/data/wp
34 |
35 | # Создавайте или перестраивайте сервисы
36 | re:
37 | @mkdir -p ../data/wp
38 | @mkdir -p ../data/db
39 | @docker-compose -f srcs/docker-compose.yml build
40 | docker-compose -f srcs/docker-compose.yml up
41 |
42 | .PHONY: all up down ps fclean re
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Inception
2 | Цели данного проекта:
3 | - Расширение знаний в области системного администрирования с помощью Docker
4 | - Виртуализация нескольких образов Docker на виртуальной машине
5 | ## Обязательная часть
6 | ## Теоретический материал простым языком
7 | 1. [A beginner’s guide to Docker — how to create your first Docker application](https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-your-first-docker-application-cc03de9b639f)
8 | 2. [How to Deploy MariaDB Server to a Docker Container](https://severalnines.com/blog/how-deploy-mariadb-server-docker-container)
9 | 3. [Руководство по Docker Compose для начинающих](https://habr.com/ru/company/ruvds/blog/450312/)
10 | 4. [Nginx, Php-Fpm и что это вообще?](https://perfect-inc.com/journal/nginx-php-fpm-i-chto-eto-voobshche/)
11 | 5. [MariaDB](https://ru.wikipedia.org/wiki/MariaDB)
12 | 6. [**Установка WordPress с помощью Docker Compose**](https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-docker-compose-ru)
13 | 7. [Running MariaDB in a Docker Container](https://quebit.com/askquebit/quebit-products/running-mariadb-in-a-docker-container/#:~:text=Now%20that%20my,the%20bash%20shell%3A)
14 | >Последняя статья пригодится во время сдачи проекта при проверке базы данных (см. [Checklist](https://github.com/mharriso/school21-checklists/blob/master/ng_3_inception.pdf))
15 | ## Руководство по реализации VirualBox - Debian 10.12 (buster), Containers - debian:buster
16 | 1. [Как установить Debian в VirualBox. Полная пошаговая инструкция](https://poznyaev.ru/debian-v-virualbox/)
17 | >Скачать образ debian-10.12.0-amd64-xfce-CD-1.iso можно [здесь](https://cdimage.debian.org/cdimage/archive/10.12.0/amd64/iso-cd/debian-10.12.0-amd64-xfce-CD-1.iso)
18 |
19 | Если вы работаете на школьных Mac, не забудьте выбрать папку goinfre
20 |
21 | 
22 |
23 |
24 | >Чтобы увеличить размер окна виртуальной машины в MacOS, либо нажмите на окно виртуальной машины, затем на панели основной ОС в верхей левой части экрана нажмите View->Virtual Screen 1->Scale to 200% (autoscaled output), либо измените разрешение экрана в настройках виртуальной машины (возможно, появление торможения виртуальной машины)
25 | 2. Устанавливаем необходимые для работы программы [Vim](https://vitux.com/how-to-install-vim-editor-on-debian/), [Make](https://ru.stackoverflow.com/questions/51452/%D0%92-linux-debian-%D0%BD%D0%B5%D1%82-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B-make-%D0%9A%D0%B0%D0%BA-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB%D0%B8%D0%B2%D0%B0%D1%82%D1%8C), [Git](https://www.digitalocean.com/community/tutorials/how-to-install-git-on-debian-10)
26 | >- Для установки Git достаточно выполнить пункт статьи "Installing Git with Default Packages"
27 | >- [Включить «sudo» для учетной записи пользователя в Debian](https://milq.github.io/enable-sudo-user-account-debian/)
28 | 3. [Настройка SSH в Debian для работы в терминале в основной ОС](https://losst.ru/nastrojka-ssh-v-debian)
29 | >- Достаточно выполнить пункты статьи "Установка SSH в Debian" и "Настройка сервера SSH" (значение порта менять необязательно)
30 | >- [Не забудьте пробросить порт для SSH в VirtualBox](https://comp-security.net/%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C%D1%81%D1%8F-%D0%BA-%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B5-%D0%BF%D0%BE-ssh/)
31 | >>Поле "Адрес гостя" можно оставить пустым
32 | >- При возникновении ошибки "Такое подключение уже существует", удалите файл known_hosts в директории /Users/$USER/.ssh:
33 | >```
34 | >rm -rf /Users/$USER/.ssh/known_hosts
35 | >```
36 | >- Для подключения **Visual Studio Code** к виртуальной машине запустите виртуальную машину. Откройте Visual Studio Code на основной ОС. Слева на панели VS Code выберите Extensions (Расширения) и найдите и скачайте расширение "Remote - SSH". Затем в VS Code откройте меню с помощью сочетания клавиш Command+Shift+P, введите "Remote-SSH: Connect to Host..." и нажмите Enter. Там же введите **@localhost:**, затем введите пароль пользователя виртуальной машины, откройте необходимую папку через Explorer->Open Folder слева на панели VS Code, снова введите пароль пользователя виртуальной машины и создайте новый терминал
37 | 4. Изменим доменное имя в Debian. Открываем файл hosts с правами администратора (root):
38 | ```
39 | sudo vim /etc/hosts
40 | ```
41 | Далее в терминале вводим пароль администратора (root) и в файле hosts меняем **localhost** на **.42.fr**
42 | >Надеюсь, что Вы полностью выполнили пункт [2](https://github.com/rbiodies/Inception#:~:text=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D0%B5%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B)
43 | 5. [Установите Docker CE и Docker Compose на Debian 11/10](https://computingforgeeks.com/install-docker-and-docker-compose-on-debian/)
44 | >- Тестировать установку Docker Сompose пока необязательно
45 | >- [Советую клонировать виртуальную машину в Oracle VM VirtualBox](https://ddok.ru/klonirovat-virtualnuju-mashinu-v-oracle-vm-virtualbox/) (на случай непредвиденных ошибок)
46 | 6. Создаем ожидаемую структуру каталогов, указанную в Subject
47 | 7. [Создаем Makefile](https://habr.com/ru/company/ruvds/blog/450312/#:~:text=%E2%96%8D5.-,%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0,-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D1%82%D0%BE%D0%B3%D0%BE%2C%20%D0%BA%D0%B0%D0%BA)
48 | >Сборка проекта начинается с 5 пункта статьи
49 | 8. Создаем файл [docker-compose.yml](https://github.com/rbiodies/inception/blob/main/srcs/docker-compose.yml), который будет содержать инструкции, необходимые для запуска и настройки сервисов
50 | >Вручную создайте директории, указанные в docker-compose.yml->volumes->device (или пропишите их создание в Makefile). Например:
51 | >```
52 | >mkdir -p /home/${USER}/data/db
53 | >mkdir -p /home/${USER}/data/wp
54 | >```
55 | 9. MariaDB
56 | - Создаем [базу данных](https://github.com/rbiodies/inception/blob/main/srcs/requirements/mariadb/tools/createdb.sql) в директории srcs/requirements/mariadb/tools
57 | >host_name должен быть либо %, либо Вы должны задать host_name принудительно и использовать его имя
58 | - Создаем файл [50-server.cnf](https://exampleconfig.com/view/mariadb-ubuntu18-04-etc-mysql-mariadb-conf-d-50-server-cnf) в директории srcs/requirements/mariadb/conf
59 | - Создаем [.dockerignore](https://bitworks.software/2018-11-14-dont-ignore-dockerignore-it-is-expensive.html) и [Dockerfile](https://github.com/rbiodies/inception/blob/main/srcs/requirements/mariadb/Dockerfile) — файл Docker, который будет содержать инструкции, необходимые для создания окружения сервера
60 | >Так как контейнер Docker работает полностью изолированно от хост-среды, то, чтобы получить доступ к среде (файлам) контейнера, необходимо в консоли ввести команду:
61 | >```
62 | >docker exec -it bash
63 | >```
64 | 10. Nginx
65 | - Создаем [конфигурационный файл](https://github.com/rbiodies/inception/blob/main/srcs/requirements/nginx/conf/default), который описывает виртуальный хост, в директории srcs/requirements/nginx/conf
66 | - Пишем [скрипт](https://github.com/rbiodies/inception/blob/main/srcs/requirements/nginx/tools/start.sh) для создания самозаверяющего сертификата для сервера в директории srcs/requirements/nginx/tools
67 | - Создаем .dockerignore и Dockerfile. В Dockerfile задаем базовый (родительский) образ, прописываем выполнение команд для установки пакетов nginx и openssl в контейнер, указываем на необходимость открыть порт 443, прописываем копирование конфигурационного файла default в директорию /etc/nginx/sites-enabled и скрипта в любую директорию (например, /var/www/) и описываем команду bash со скриптом в качестве аргумента, которую нужно выполнить, когда контейнер будет запущен
68 | 11. WordPress + настраиваем работу [php-fpm](https://www.ukraine.com.ua/wiki/hosting/configuration/php-fpm/#:~:text=PHP%2DFPM%20(FastCGI%20Process%20Manager,%2B%20Apache%2C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%B0%D1%8F%20%D0%BF%D0%BE%20%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E.))
69 | - Создаем файл директив пула [www.conf](https://gist.github.com/rvanzee/2352093), позволяющий запускать несколько «пулов» дочерних процессов и иметь разные конфигурации, в директории srcs/requirements/wordpress/conf
70 | - Создаем файл конфигурации [wp-config.php](https://www.wpbeginner.com/beginners-guide/how-to-edit-wp-config-php-file-in-wordpress/), который является частью всех автономных сайтов WordPress, в директории srcs/requirements/wordpress/tools
71 | - Создаем [скрипт](https://github.com/rbiodies/inception/blob/main/srcs/requirements/wordpress/tools/start.sh) в директории srcs/requirements/wordpress/tools. Скрипт может устанавливать интерфейс командной строки для WordPress и создавать двух пользователей, один из которых является администратором Вашей базы данных WordPress
72 | >Имя пользователя администратора не может содержать admin/Admin или administrator/Administrator (например, admin, administrator, Administrator, admin-123, и так далее) (см. Subject)
73 | - Создаем .dockerignore и Dockerfile. В Dockerfile задаем базовый (родительский) образ, прописываем выполнение команд для установки пакетов php7.3, php-mysqli, php-fpm, curl и sendmail с флагом -y в контейнер, указываем на необходимость открыть порт 9000, прописываем копирование конфигурационного файла [www.conf](https://gist.github.com/rvanzee/2352093) в директорию /etc/php/7.3/fpm/pool.d и скрипта в любую директорию (например, /var/www/) и описываем команду bash со скриптом в качестве аргумента, которую нужно выполнить, когда контейнер будет запущен
74 | 12. Запустите контейнеры с помощью Makefile и зайдите на страницу WordPress в браузере своей виртуальной машины в VirtualBox по адресу своего хоста .42.fr
75 | >Если все работает верно, то при первом входе на сайт появится предупреждение. Нажмите "Дополнительно...", затем спуститесь вниз и нажмите "Принять риск и продолжить"
76 |
77 | 
78 | >Ваша тема WordPress может отличаться от темы, представленной на данном скриншоте
79 | ## Бонусная часть
80 | Список бонусов:
81 | - Настройте кеш Redis для своего веб-сайта WordPress, чтобы правильно управлять кешем.
82 | - Настройте контейнер FTP-сервер, указывающий на том вашего сайта WordPress.
83 | - Создайте простой статический веб-сайт на выбранном вами языке, кроме PHP (да, PHP исключен!). Например, сайт-витрина или сайт для представления вашего резюме.
84 | - Настроить Adminer.
85 | - Настройте сервис по вашему выбору, который вы считаете полезным. Во время защиты вам придется обосновать свой выбор.
86 | ## Полезные источники
87 | 1. [Установка Redis средствами Docker](https://www.elma-bpm.ru/KB/article-7354.html#:~:text=docker%20exec%20%2Dit%20%D0%B8%D0%BC%D1%8F_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0_%D1%80%D0%B5%D0%B4%D0%B8%D1%81%20bash)
88 | 2. [Настройка Redis для WordPress](https://wpgutenberg.top/nastrojka-redis-dlja-wordpress/#:~:text=redis%2Dcli-,monitor,-%D0%92%D1%8B%2C%20%D1%81%D0%BA%D0%BE%D1%80%D0%B5%D0%B5%20%D0%B2%D1%81%D0%B5%D0%B3%D0%BE)
89 | 3. [Установка и настройка Vsftpd в linux Debian с загрузкой файлов в каталог пользователя](https://chuzhoy007.ru/ustanovka-i-nastrojka-ftp-servera-vsftpd-na-linux-debian#:~:text=%D1%83%D0%B4%D0%B0%D0%BB%D0%B0%D1%81%D1%8C.%20%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%B2%D1%8B%D0%B9%D1%82%D0%B8.-,%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20FTP%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0%20Filezilla,-%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%20vsftpd%20%D0%B2)
90 | 4. [WordPress (FPM Edition) - Docker](https://github.com/mjstealey/wordpress-nginx-docker#:~:text=similar%20to%20this.-,Adminer,-An%20Adminer%20configuration)
91 | 5. [Установка Docker Portainer](https://losst.ru/ustanovka-docker-portainer)
92 |
--------------------------------------------------------------------------------
/srcs/.env:
--------------------------------------------------------------------------------
1 | USER=rbiodies
2 | DOMAIN_NAME=rbiodies.42.fr
3 | # certificates
4 | CERTS_=/etc/ssl/certs
5 | # MYSQL SETUP
6 | MYSQL_ROOT_PASSWORD=root123123
7 | MYSQL_USER=rbiodies
8 | MYSQL_PASSWORD=123123
9 | # WORDPRESS SETUP
10 | WORDPRESS_NAME=wordpress
11 | WORDPRESS_USER_EMAIL=rbiodies@42.fr
12 | WORDPRESS_ROOT_LOGIN=root
13 | WORDPRESS_ROOT_EMAIL=root@42.fr
14 | # FTP SETUP
15 | FTP_USR=rbiodies
16 | FTP_PWD=rbiodies
17 | # REDIS SETUP
18 | REDIS_HOST=redis
--------------------------------------------------------------------------------
/srcs/docker-compose.yml:
--------------------------------------------------------------------------------
1 | # Файл docker-compose должен начинаться с тега версии.
2 | # Мы используем "3.9" так как это - самая свежая версия на момент написания
3 | version: '3.9'
4 |
5 | # Следует учитывать, что docker-composes работает с сервисами.
6 | # 1 сервис = 1 контейнер.
7 | # Сервисом может быть система управления контентом, сервер, сервер баз данных...
8 | # Раздел, в котором будут описаны сервисы, начинается с 'services'
9 | services:
10 | mariadb:
11 | # данный элемент указывает имя контейнера
12 | container_name: mariadb
13 | # Ключевое слово "build" позволяет задать
14 | # путь к файлу Dockerfile, который нужно использовать для создания образа,
15 | # который позволит запустить сервис.
16 | # Здесь './requirements/mariadb' соответствует пути к папке mariadb,
17 | # которая содержит соответствующий Dockerfile
18 | build: ./requirements/mariadb
19 | # данный параметр определяет политику перезапуска контейнера
20 | restart: always
21 | # этот параметр указывает Compose, что мы хотим добавить переменные среды из файла с именем .env,
22 | # расположенного в контексте сборки.
23 | # В этом случае в качестве контекста сборки используется наша текущая директория
24 | env_file: .env
25 | # здесь мы монтируем именованный том с названием db в директорию /var/lib/mysql в контейнере.
26 | # Это стандартная директория данных в большинстве дистрибутивов
27 | volumes:
28 | - db:/var/lib/mysql
29 | # данный параметр указывает, что служба приложения будет подключаться к сети project,
30 | # которую мы определим внизу файла
31 | networks:
32 | - project
33 |
34 | wordpress:
35 | container_name: wordpress
36 | build: ./requirements/wordpress
37 | env_file: .env
38 | # мы монтируем том с именем wordpress на точку монтирования /var/www/html/wordpress,
39 | # созданную образом WordPress.
40 | # Использование тома с именем таким образом позволит разделить наш код приложения с другими контейнерами
41 | volumes:
42 | - wp:/var/www/html/wordpress
43 | # мы добавляем контейнер wordpress в сеть project
44 | networks:
45 | - project
46 | # этот параметр гарантирует, что наши контейнеры будут запускаться в порядке зависимости,
47 | # и контейнер wordpress запускается после контейнера mariadb.
48 | # Наше приложение WordPress зависит от наличия базы данных приложения и пользователя,
49 | # поэтому установка такого порядка зависимостей позволит выполнять запуск приложения корректно
50 | depends_on:
51 | - mariadb
52 |
53 | nginx:
54 | container_name: nginx
55 | build: ./requirements/nginx
56 | hostname: localhost
57 | volumes:
58 | - wp:/var/www/html/wordpress
59 | networks:
60 | - project
61 | depends_on:
62 | - wordpress
63 | # Вспомните о том, что в качестве порта в 'nginx' указан порт 443.
64 | # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
65 | # мы должны организовать перенаправление этого порта на порт компьютера.
66 | # Сделать это нам поможет ключевое слово 'ports'.
67 | # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
68 | # В нашем случае нужно использовать порт компьютера 443 и организовать его связь с портом
69 | # 443 контейнера (так как именно на этот порт сервер
70 | # ожидает поступления запросов).
71 | ports:
72 | # - "8080:80" # http
73 | - "443:443" # https
74 |
75 | redis:
76 | build: requirements/bonus/redis
77 | container_name: redis
78 | ports:
79 | - "6379:6379"
80 | networks:
81 | - project
82 | restart: always
83 |
84 | ftp-server:
85 | build: requirements/bonus/ftp-server
86 | container_name: ftp-server
87 | ports:
88 | - "21:21"
89 | - "21100-21110:21100-21110"
90 | volumes:
91 | - wp:/var/www/html/wordpress
92 | networks:
93 | - project
94 | restart: always
95 | environment:
96 | FTP_USR: ${FTP_USR}
97 | FTP_PWD: ${FTP_PWD}
98 |
99 | portainer:
100 | # image указывает образ, с которого будет запускаться контейнер
101 | image: portainer/portainer-ce:latest
102 | container_name: portainer
103 | # UI over port 9443 and expose a TCP tunnel server over port 8000
104 | ports:
105 | - "8000:8000"
106 | - "9443:9443"
107 | volumes:
108 | - "/etc/localtime:/etc/localtime:ro"
109 | # это сокет Unix, который демон Docker прослушивает по умолчанию,
110 | # и его можно использовать для связи с демоном из контейнера
111 | - "/var/run/docker.sock:/var/run/docker.sock:ro"
112 | # Отключить процессы-контейнеры от получения новых привилегий
113 | # Это означает, что команды, повышающие привилегии, такие как suили sudo, больше не будут работать
114 | security_opt:
115 | - no-new-privileges:true
116 | restart: always
117 |
118 | # adminer - bring up only as needed - bypasses nginx
119 | adminer:
120 | # default port 8080
121 | image: adminer:4
122 | container_name: adminer
123 | # Аналогичен always, за исключением того, что когда контейнер останавливается (вручную или иным образом),
124 | # он не перезапускается даже после перезапуска демона Docker
125 | restart: unless-stopped
126 | networks:
127 | - project
128 | depends_on:
129 | - mariadb
130 | ports:
131 | - "9000:8080"
132 |
133 | # Наш ключ верхнего уровня volumes определяет тома db и wp.
134 | # Когда Docker создает тома, содержимое тома сохраняется в директории файловой системы хоста,
135 | # /var/lib/docker/volumes/, а данным процессом управляет Docker.
136 | # После этого содержимое каждого тома монтируется из этой директории в любой контейнер, использующий том.
137 | # Таким образом мы можем делиться кодом и данными между контейнерами
138 | volumes:
139 | db:
140 | name: db
141 | driver: local
142 | driver_opts:
143 | type: none
144 | o: bind
145 | device: /home/${USER}/data/db
146 | wp:
147 | name: wp
148 | driver: local
149 | driver_opts:
150 | type: none
151 | o: bind
152 | device: /home/${USER}/data/wp
153 |
154 | # Создаваемая пользователем мостовая система project позволяет организовать коммуникацию между нашими контейнерами,
155 | # поскольку они находятся на одном хосте демона Docker.
156 | # Это позволяет организовать трафик и коммуникации внутри приложения,
157 | # поскольку она открывает все порты между контейнерами в одной мостовой сети, скрывая все порты от внешнего мира.
158 | # Таким образом, наши контейнеры mariadb, wordpress и nginx могут взаимодействовать друг с другом,
159 | # и нам нужно будет только открыть порт 440 для внешнего доступа к приложению
160 | networks:
161 | project:
162 | driver: bridge
--------------------------------------------------------------------------------
/srcs/requirements/bonus/ftp-server/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM debian:buster
2 |
3 | RUN apt update
4 | RUN apt install -y vsftpd
5 |
6 | COPY conf/vsftpd.conf /var/www/vsftpd.conf
7 | COPY tools/configure.sh /var/www/configure.sh
8 |
9 | CMD bash /var/www/configure.sh
--------------------------------------------------------------------------------
/srcs/requirements/bonus/ftp-server/conf/vsftpd.conf:
--------------------------------------------------------------------------------
1 | # Example config file /etc/vsftpd.conf
2 | #
3 | # The default compiled in settings are fairly paranoid. This sample file
4 | # loosens things up a bit, to make the ftp daemon more usable.
5 | # Please see vsftpd.conf.5 for all compiled in defaults.
6 | #
7 | # READ THIS: This example file is NOT an exhaustive list of vsftpd options.
8 | # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
9 | # capabilities.
10 | #
11 | # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
12 | anonymous_enable=NO
13 | #
14 | # Uncomment this to allow local users to log in.
15 | local_enable=YES
16 | #
17 | # Uncomment this to enable any form of FTP write command.
18 | write_enable=YES
19 | #
20 | # Default umask for local users is 077. You may wish to change this to 022,
21 | # if your users expect that (022 is used by most other ftpd's)
22 | #local_umask=022
23 | #
24 | # Uncomment this to allow the anonymous FTP user to upload files. This only
25 | # has an effect if the above global write enable is activated. Also, you will
26 | # obviously need to create a directory writable by the FTP user.
27 | #anon_upload_enable=YES
28 | #
29 | # Uncomment this if you want the anonymous FTP user to be able to create
30 | # new directories.
31 | #anon_mkdir_write_enable=YES
32 | #
33 | # Activate directory messages - messages given to remote users when they
34 | # go into a certain directory.
35 | dirmessage_enable=YES
36 | #
37 | # Activate logging of uploads/downloads.
38 | xferlog_enable=YES
39 | #
40 | # Make sure PORT transfer connections originate from port 20 (ftp-data).
41 | connect_from_port_20=YES
42 | #
43 | # If you want, you can arrange for uploaded anonymous files to be owned by
44 | # a different user. Note! Using "root" for uploaded files is not
45 | # recommended!
46 | #chown_uploads=YES
47 | #chown_username=whoever
48 | #
49 | # You may override where the log file goes if you like. The default is shown
50 | # below.
51 | #xferlog_file=/var/log/vsftpd.log
52 | #
53 | # If you want, you can have your log file in standard ftpd xferlog format.
54 | # Note that the default log file location is /var/log/xferlog in this case.
55 | #xferlog_std_format=YES
56 | #
57 | # You may change the default value for timing out an idle session.
58 | #idle_session_timeout=600
59 | #
60 | # You may change the default value for timing out a data connection.
61 | #data_connection_timeout=120
62 | #
63 | # It is recommended that you define on your system a unique user which the
64 | # ftp server can use as a totally isolated and unprivileged user.
65 | #nopriv_user=ftpsecure
66 | #
67 | # Enable this and the server will recognise asynchronous ABOR requests. Not
68 | # recommended for security (the code is non-trivial). Not enabling it,
69 | # however, may confuse older FTP clients.
70 | #async_abor_enable=YES
71 | #
72 | # By default the server will pretend to allow ASCII mode but in fact ignore
73 | # the request. Turn on the below options to have the server actually do ASCII
74 | # mangling on files when in ASCII mode.
75 | # Beware that on some FTP servers, ASCII support allows a denial of service
76 | # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
77 | # predicted this attack and has always been safe, reporting the size of the
78 | # raw file.
79 | # ASCII mangling is a horrible feature of the protocol.
80 | #ascii_upload_enable=YES
81 | #ascii_download_enable=YES
82 | #
83 | # You may fully customise the login banner string:
84 | ftpd_banner=Welcome to FTP server of inception!
85 | #
86 | # You may specify a file of disallowed anonymous e-mail addresses. Apparently
87 | # useful for combatting certain DoS attacks.
88 | #deny_email_enable=YES
89 | # (default follows)
90 | #banned_email_file=/etc/vsftpd.banned_emails
91 | #
92 | # You may specify an explicit list of local users to chroot() to their home
93 | # directory. If chroot_local_user is YES, then this list becomes a list of
94 | # users to NOT chroot().
95 | # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
96 | # the user does not have write access to the top level directory within the
97 | # chroot)
98 | chroot_local_user=YES
99 | allow_writeable_chroot=YES
100 | user_sub_token=$USER
101 | local_root=/var/www/html/wordpress
102 |
103 | #chroot_list_enable=YES
104 | # (default follows)
105 | #chroot_list_file=/etc/vsftpd.chroot_list
106 | #
107 | # You may activate the "-R" option to the builtin ls. This is disabled by
108 | # default to avoid remote users being able to cause excessive I/O on large
109 | # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
110 | # the presence of the "-R" option, so there is a strong case for enabling it.
111 | #ls_recurse_enable=YES
112 | #
113 | # When "listen" directive is enabled, vsftpd runs in standalone mode and
114 | # listens on IPv4 sockets. This directive cannot be used in conjunction
115 | # with the listen_ipv6 directive.
116 | listen=YES
117 | listen_port=21
118 | listen_address=0.0.0.0
119 | seccomp_sandbox=NO
120 |
121 | #
122 | # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6
123 | # sockets, you must run two copies of vsftpd with two configuration files.
124 | # Make sure, that one of the listen options is commented !!
125 | #listen_ipv6=YES
126 |
127 | pasv_enable=YES
128 | pasv_min_port=21100
129 | pasv_max_port=21110
130 |
131 | userlist_enable=YES
132 | userlist_file=/etc/vsftpd.userlist
133 | userlist_deny=NO
--------------------------------------------------------------------------------
/srcs/requirements/bonus/ftp-server/tools/configure.sh:
--------------------------------------------------------------------------------
1 | if [ ! -f "/etc/vsftpd.conf.bak" ]; then
2 |
3 | mkdir -p /var/run/vsftpd/empty
4 |
5 | cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
6 | mv /var/www/vsftpd.conf /etc/vsftpd.conf
7 |
8 | # Добавьте FTP_USER, измените его пароль и объявите его владельцем папки wordpress и всех подпапок
9 | adduser $FTP_USR --disabled-password
10 | echo "$FTP_USR:$FTP_PWD" | /usr/sbin/chpasswd &> /dev/null
11 | chown -R $FTP_USR:$FTP_USR /var/www/html/wordpress
12 |
13 | # dev/null выглядит пустым при чтении из него, тогда как данные, записанные на это устройство, просто «исчезают».
14 | echo $FTP_USR | tee -a /etc/vsftpd.userlist &> /dev/null
15 |
16 | fi
17 |
18 | echo "FTP started on :21"
19 | /usr/sbin/vsftpd /etc/vsftpd.conf
--------------------------------------------------------------------------------
/srcs/requirements/bonus/redis/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM debian:buster
2 |
3 | RUN apt update
4 | RUN apt install -y redis
5 |
6 | COPY tools/configure.sh /var/www/configure.sh
7 |
8 | CMD bash /var/www/configure.sh
--------------------------------------------------------------------------------
/srcs/requirements/bonus/redis/tools/configure.sh:
--------------------------------------------------------------------------------
1 | if [ ! -f "/etc/redis/redis.conf.bak" ]; then
2 |
3 | cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
4 |
5 | # Чтобы изменить IP-адрес во всех файлах зоны, используйте следующую команду:
6 | # -i изменить файл на месте s означает замену
7 | sed -i "s|bind 127.0.0.1|#bind 127.0.0.1|g" /etc/redis/redis.conf
8 | # измените foobared на свой пароль
9 | # sed -i "s|# requirepass foobared|requirepass $REDIS_PWD|g" /etc/redis.conf
10 | # Когда память вашего экземпляра Redis заполнена и поступает новая запись,
11 | # Redis вытесняет ключи, чтобы освободить место для записи, в соответствии с политикой maxmemory вашего экземпляра
12 | sed -i "s|# maxmemory |maxmemory 2mb|g" /etc/redis/redis.conf
13 | # noevicrion
14 | # Эта политика вытеснения говорит Redis не удалять данные при достижении предела памяти.
15 | # Вместо этого Redis вернет ошибку и не сможет выполнить команду добавления данных.
16 | # Эта политика особенно применима, когда вам нужно удалить ключи вручную или
17 | # предотвратить случайную потерю данных.
18 | # Allkeys-LRU
19 | # Вторая политика — allkeys-lru. Этот тип политики вытесняет любой последний использованный ключ или LRU.
20 | # Эта политика предполагает, что вам не нужны недавно использованные ключи, и удаляет их.
21 | # Это предотвращает ошибку Redis в случае ограничения памяти.
22 | sed -i "s|# maxmemory-policy noevicrion|maxmemory-policy allkeys-lru|g" /etc/redis/redis.conf
23 |
24 | fi
25 |
26 | # Сервер Redis вернет ошибку любому клиенту, подключающемуся к внешним петлевым адресам в защищенном режиме
27 | redis-server --protected-mode no
--------------------------------------------------------------------------------
/srcs/requirements/mariadb/.dockerignore:
--------------------------------------------------------------------------------
1 | .git
2 | .DS_Store
--------------------------------------------------------------------------------
/srcs/requirements/mariadb/Dockerfile:
--------------------------------------------------------------------------------
1 | # задаёт базовый (родительский) образ
2 | FROM debian:buster
3 |
4 | # выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов
5 | RUN apt update
6 | RUN apt install -y mariadb-server
7 |
8 | # копирует в контейнер файлы и папки
9 | COPY ./conf/50-server.cnf /etc/mysql/mariadb.conf.d/
10 | COPY ./tools /var/www/
11 |
12 | # указывает на необходимость открыть порт
13 | EXPOSE 3306
14 |
15 | RUN service mysql start && mysql < /var/www/createdb.sql && rm -f /var/www/createdb.sql
16 |
17 | # описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен
18 | CMD /usr/bin/mysqld_safe
--------------------------------------------------------------------------------
/srcs/requirements/mariadb/conf/50-server.cnf:
--------------------------------------------------------------------------------
1 | #
2 | #These groups are read by MariaDB server.
3 | #Use it for options that only the server (but not clients) should see
4 | #
5 | #See the examples of server my.cnf files in /usr/share/mysql
6 |
7 | #this is read by the standalone daemon and embedded servers
8 | [server]
9 |
10 | #this is only for the mysqld standalone daemon
11 | [mysqld]
12 |
13 | #
14 | # * Basic Settings
15 | #
16 | user = mysql
17 | pid-file = /run/mysqld/mysqld.pid
18 | socket = /run/mysqld/mysqld.sock
19 | port = 3306
20 | basedir = /usr
21 | datadir = /var/lib/mysql
22 | tmpdir = /tmp
23 | lc-messages-dir = /usr/share/mysql
24 | #skip-external-locking
25 |
26 | #Instead of skip-networking the default is now to listen only on
27 | #localhost which is more compatible and is not less secure.
28 | #bind-address = 127.0.0.1
29 |
30 | #
31 | # * Fine Tuning
32 | #
33 | #key_buffer_size = 16M
34 | #max_allowed_packet = 16M
35 | #thread_stack = 192K
36 | #thread_cache_size = 8
37 | # This replaces the startup script and checks MyISAM tables if needed
38 | # the first time they are touched
39 | #myisam_recover_options = BACKUP
40 | #max_connections = 100
41 | #table_cache = 64
42 | #thread_concurrency = 10
43 |
44 | #
45 | # * Query Cache Configuration
46 | #
47 | #query_cache_limit = 1M
48 | query_cache_size = 16M
49 |
50 | #
51 | # * Logging and Replication
52 | #
53 | # Both location gets rotated by the cronjob.
54 | # Be aware that this log type is a performance killer.
55 | # As of 5.1 you can enable the log at runtime!
56 | #general_log_file = /var/log/mysql/mysql.log
57 | #general_log = 1
58 | #
59 | # Error log - should be very few entries.
60 | #
61 | log_error = /var/log/mysql/error.log
62 | #
63 | # Enable the slow query log to see queries with especially long duration
64 | #slow_query_log_file = /var/log/mysql/mariadb-slow.log
65 | #long_query_time = 10
66 | #log_slow_rate_limit = 1000
67 | #log_slow_verbosity = query_plan
68 | #log-queries-not-using-indexes
69 | #
70 | # The following can be used as easy to replay backup logs or for replication.
71 | # note: if you are setting up a replication slave, see README.Debian about
72 | # other settings you may need to change.
73 | #server-id = 1
74 | #log_bin = /var/log/mysql/mysql-bin.log
75 | expire_logs_days = 10
76 | #max_binlog_size = 100M
77 | #binlog_do_db = include_database_name
78 | #binlog_ignore_db = exclude_database_name
79 |
80 | #
81 | # * Security Features
82 | #
83 | # Read the manual, too, if you want chroot!
84 | #chroot = /var/lib/mysql/
85 | #
86 | # For generating SSL certificates you can use for example the GUI tool "tinyca".
87 | #
88 | #ssl-ca = /etc/mysql/cacert.pem
89 | #ssl-cert = /etc/mysql/server-cert.pem
90 | #ssl-key = /etc/mysql/server-key.pem
91 | #
92 | # Accept only connections using the latest and most secure TLS protocol version.
93 | # ..when MariaDB is compiled with OpenSSL:
94 | #ssl-cipher = TLSv1.2
95 | # ..when MariaDB is compiled with YaSSL (default in Debian):
96 | #ssl = on
97 |
98 | #
99 | # * Character sets
100 | #
101 | # MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
102 | # utf8 4-byte character set. See also client.cnf
103 | #
104 | character-set-server = utf8mb4
105 | collation-server = utf8mb4_general_ci
106 |
107 | #
108 | # * InnoDB
109 | #
110 | # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
111 | # Read the manual for more InnoDB related options. There are many!
112 |
113 | #
114 | # * Unix socket authentication plugin is built-in since 10.0.22-6
115 | #
116 | # Needed so the root database user can authenticate without a password but
117 | # only when running as the unix root user.
118 | #
119 | # Also available for other users if required.
120 | # See https://mariadb.com/kb/en/unix_socket-authentication-plugin/
121 |
122 | # this is only for embedded server
123 | [embedded]
124 |
125 | # This group is only read by MariaDB servers, not by MySQL.
126 | # If you use the same .cnf file for MySQL and MariaDB,
127 | # you can put MariaDB-only options here
128 | [mariadb]
129 |
130 | # This group is only read by MariaDB-10.3 servers.
131 | # If you use the same .cnf file for MariaDB of different versions,
132 | # use this group for options that older servers don't understand
133 | [mariadb-10.3]
--------------------------------------------------------------------------------
/srcs/requirements/mariadb/tools/createdb.sql:
--------------------------------------------------------------------------------
1 | CREATE DATABASE wordpress;
2 | CREATE USER 'rbiodies'@'%' IDENTIFIED BY '123123';
3 | -- Для GRANT ALL привилегий для rbiodies, предоставляющих этому пользователю полный контроль над database wordpress
4 | -- Эти привилегии предназначены для wordpress применяются ко всем таблицам этой базы данных,
5 | -- что обозначено .*следующим образом
6 | GRANT ALL PRIVILEGES ON wordpress.* TO 'rbiodies'@'%';
7 | -- Сохранение ваших изменений
8 | FLUSH PRIVILEGES;
9 |
10 | -- Чтобы изменить аутентификацию или характеристики ресурса базы данных пользователя базы данных
11 | -- Чтобы разрешить прокси-серверу подключаться в качестве клиента без аутентификации
12 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123123';
--------------------------------------------------------------------------------
/srcs/requirements/nginx/.dockerignore:
--------------------------------------------------------------------------------
1 | .git
2 | .DS_Store
--------------------------------------------------------------------------------
/srcs/requirements/nginx/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM debian:buster
2 |
3 | RUN apt update
4 | RUN apt install -y nginx openssl
5 |
6 | EXPOSE 443
7 |
8 | COPY ./conf/default /etc/nginx/sites-enabled/default
9 | COPY ./tools/start.sh /var/www
10 |
11 | CMD bash /var/www/start.sh
--------------------------------------------------------------------------------
/srcs/requirements/nginx/conf/default:
--------------------------------------------------------------------------------
1 | server {
2 | # данный элемент просит Nginx прослушивать порт 80
3 | listen 443 ssl;
4 | listen [::]:443 ssl;
5 |
6 | # этот элемент определяет имя вашего сервера и серверный блок,
7 | # которые должны использоваться для запросов к вашему серверу
8 | server_name rbiodies.42.fr;
9 |
10 | ssl_certificate_key /etc/ssl/private/nginx.key;
11 | ssl_certificate /etc/ssl/certs/nginx.crt;
12 | ssl_protocols TLSv1.3;
13 |
14 | # директива index определяет файлы,
15 | # которые будут использоваться в качестве индексов при обработке запросов к вашему серверу
16 | index index.php index.html index.htm;
17 | # наша директива root назначает имя корневой директории для запросов к нашему серверу.
18 | # Эта директория, /var/www/html/wordpress,
19 | # создается в качестве точки монтирования в момент сборки с помощью инструкций в Dockerfile WordPress.
20 | # Эти инструкции Dockerfile также гарантируют, что файлы релиза WordPress монтируются в этот том
21 | root /var/www/html/wordpress;
22 |
23 | # в этом блоке расположения мы будем использовать директиву try_files для проверки файлов,
24 | # соответствующих отдельным запросам URI. Вместо того, чтобы возвращать по умолчанию статус 404 не найдено,
25 | # мы будем передавать контроль файлу index.php Wordpress с аргументами запроса
26 | location / {
27 | try_files $uri $uri/ /index.php$is_args$args;
28 | }
29 | # этот блок расположения будет обрабатывать PHP-запросы и проксировать эти запросы в наш контейнер wordpress.
30 | # Поскольку наш образ WordPress Docker будет опираться на образ php:fpm,
31 | # мы также добавим параметры конфигурации, принадлежащие протоколу FastCGI, в этот блок.
32 | # Nginx требует наличия независимого процессора PHP для запросов PHP:
33 | # в нашем случае эти запросы будут обрабатываться процессором php-fpm, который будет включать образ php:fpm.
34 | # Кроме того, этот блок расположения содержит директивы FastCGI, переменные и опции,
35 | # которые будут проксировать запросы для приложения WordPress, запущенного в нашем контейнере wordpress,
36 | # задавать предпочитаемый индекс захваченного URI запроса, а также выполнять парсинг URI-запросов
37 | location ~ [^/]\.php(/|$) {
38 | try_files $uri =404;
39 | fastcgi_split_path_info ^(.+\.php)(/.+)$;
40 | fastcgi_pass wordpress:9000;
41 | fastcgi_index index.php;
42 | include fastcgi_params;
43 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
44 | fastcgi_param PATH_INFO $fastcgi_path_info;
45 | }
46 | }
--------------------------------------------------------------------------------
/srcs/requirements/nginx/tools/start.sh:
--------------------------------------------------------------------------------
1 | # -openssl
2 | # Утилита для создания сертификата
3 | # -Команда req
4 | # В первую очередь создает и обрабатывает запросы сертификатов
5 | # -x509
6 | # эта опция выводит самозаверяющий сертификат вместо запроса сертификата.
7 | # Обычно это используется для создания тестового сертификата или самозаверяющего корневого ЦС
8 | # -nodes
9 | # если эта опция указана, то если будет создан закрытый ключ, он не будет зашифрован
10 | # days n
11 | # когда используется опция -x509 , она указывает количество дней для сертификации сертификата
12 | # -newkey аргумент
13 | # эта опция создает новый запрос сертификата и новый закрытый ключ. Аргумент принимает одну из нескольких форм.
14 | # rsa:nbits , где nbits — количество битов, генерирует ключ RSA размером nbits
15 | # -keyout имя файла
16 | # это дает имя файла для записи вновь созданного закрытого ключа
17 | # -out имя файла
18 | # Это указывает имя выходного файла для записи или стандартный вывод по умолчанию
19 | # -subj аргумент
20 | # Заменяет поле темы входного запроса указанными данными и выводит измененный запрос
21 | if [ ! -f /etc/ssl/certs/nginx.crt ]; then
22 | echo "Nginx: setting up ssl ...";
23 | openssl req -x509 -nodes -days 365 -newkey rsa:4096 \
24 | -keyout /etc/ssl/private/nginx.key \
25 | -out /etc/ssl/certs/nginx.crt \
26 | -subj "/C=RU/ST=Tatarstan/L=Kazan/O=wordpress/CN=rbiodies.42.fr";
27 | echo "Nginx: ssl is set up!";
28 | fi
29 |
30 | # Run nginx
31 | # Nginx использует daemon off директиву для запуска на переднем плане
32 | nginx -g 'daemon off;';
--------------------------------------------------------------------------------
/srcs/requirements/wordpress/.dockerignore:
--------------------------------------------------------------------------------
1 | .git
2 | .DS_Store
--------------------------------------------------------------------------------
/srcs/requirements/wordpress/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM debian:buster
2 |
3 | RUN apt update
4 | RUN apt install -y php7.3 php-mysqli php-fpm curl sendmail
5 |
6 | EXPOSE 9000
7 |
8 | COPY ./conf/www.conf /etc/php/7.3/fpm/pool.d
9 | COPY ./tools /var/www/
10 |
11 | # static website
12 | COPY conf/index.html /var/www/index.html
13 |
14 | CMD bash /var/www/start.sh
--------------------------------------------------------------------------------
/srcs/requirements/wordpress/conf/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Inception
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | INCEPTION
23 |
24 |
25 | This project aims to broaden your knowledge of system administration by using Docker
26 |