Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added Checker_UML_scheme.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
78 changes: 78 additions & 0 deletions Docker-Balancer/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#### environment ################
TIMEZONE=Europe/Moscow

#### sites ######################
SITES_ENABLED_PATH=./nginx/hosts

#### IDE ########################
PHP_IDE_CONFIG=serverName=Docker

#### PATH #######################
LOGS=./_logs
STORAGE=./ZoneForSTORAGE
CERTIFICATES=${STORAGE}/certificates
ADDITIONAL_CODE_PATH_HOST=c:/MyWork/School/Otus/HomeWork
ADDITIONAL_SITE_NAME=homework.otus
WORKSPACE_SCRIPTS_PATH_HOST=./workspace/scripts
WORKSPACE_SCRIPTS_PATH_DOCKER=/srv/scripts

#### code #######################
PHP_VERSION=8.0
APP_CODE_PATH_HOST=./code
APP_CODE_PATH_DOCKER=/var/www/html
PHP_ERROR_LOG_PATH=${LOGS}/php_errors/

#### nginx ######################
NGINX_LOG_PATH=${LOGS}/nginx
NGINX_SSL_PATH_DOCKER=/etc/nginx/ssl

#### x-debug ####################
X_DEBUG=1
X_DEBUG_ERROR_LOG_PATH=${LOGS}/x-debug/

#### memprof ####################
### только MEMPROF_PROFILE_ENABLE=null отключает Memprof,
### для включения использовать любое значение.
### В документации рекомендуют 1
#################################
MEMPROF_PROFILE_ENABLE=1
MEMPROF_LOG_PATH_HOST=${LOGS}/memprof
MEMPROF_LOG_PATH_DOCKER=/var/log/memprof/

#### unix socket ################
UNIX_SOCKET_PATH_HOST=${STORAGE}/docker/sock
UNIX_SOCKET_PATH_DOCKER=/sock

#### mysql-Master ###############
MYSQL_MASTER_DB=laravel
MYSQL_MASTER_ROOT_PASSWORD=password
MYSQL_MASTER_STORAGE_PLACE=${STORAGE}/docker/mysql1
MYSQL_MASTER_LOG_PATH_HOST=${LOGS}/mysql/master
MYSQL_MASTER_LOG_PATH_DOCKER=/var/log/mysql/
MYSQL_MASTER_CONFIG_PATH_HOST=./mysql/conf

#### mysql-Slave ################
MYSQL_SLAVE_DB=laravel
MYSQL_SLAVE_ROOT_PASSWORD=password
MYSQL_SLAVE_STORAGE_PLACE=${STORAGE}/docker/mysql2
MYSQL_SLAVE_LOG_PATH_HOST=${LOGS}/mysql/slave
MYSQL_SLAVE_LOG_PATH_DOCKER=/var/log/mysql/
MYSQL_SLAVE_CONFIG_PATH_HOST=./mysql/conf

#### postgres ###################
PGSQL_DB_NAME=postgres
PGSQL_DB_USER=postgres
PGSQL_DB_PASSWORD=password
PGSQL_STORAGE_PLACE=${STORAGE}/docker/postgres/data

#### Redis ######################
REDIS_CONF=./redis/conf/redis/etc
REDIS_DATA=${STORAGE}/docker/redis/data/bases
REDIS_LOG=${LOGS}/redis/

#### Elasticsearch ##############
ELASTICSEARCH_DATA=${STORAGE}/docker/elasticsearch/data

#### MemCached ##################
MEMCACHED_CLUSTER=1
MEMCACHED_USE_SESSION=1
196 changes: 196 additions & 0 deletions Docker-Balancer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
# Docker
____

После загрузки из репозитория необходимо зайти в папку Docker-Balancer и запустить команду `>start_copy.bat` для windows или ` >./start_copy.sh ` для linux
В результате будут скопированы требуемые конфигурационные файлы
При необходимости их следует настроить:
- **.env** (~Пример `.env.example`)
- **.gitignore** (~Пример `.gitignore.example`)
- **docker-compose.yml** (~Пример `docker-compose.yml.bak`)
- **./code/application.loc/.env**

Далее можно установить сертификаты для работы по протоколу https://
Для этого запускается ` >run.bat ` для windows или ` >./run.sh ` для linux,
и настроить соответствующие конфиг. файлы в [nginx/hosts](nginx/hosts)

### Набор контейнеров для работы
| Обозначение | Путь к dockerfile | Описание |
|----|:----:|:----|
| `>app-1`| ./fpm-1 |исполнение скриптов |
| `>app-2`| ./fpm-2 |исполнение скриптов |
| `>workspace` | ./workspace | контейнер для выполнения служебных функций (composer, npm и т.д) |
| `>webserver`| ./nginx | webserver проекта |
| `>mysql-master`| Из репозитория | мастер база данных Mysql |
| `>mysql-slave`| Из репозитория | slave база данных Mysql |
| `>postgres`| Из репозитория | база данных Postgres |
| `>redis`| ./redis | база данных Redis |
| `>elasticsearch`| Из репозитория | база данных Elasticsearch |
| `>memcached`| ./memcached-1 | контейнер, где крутиться memcached |
| `>memcached`| ./memcached-2 | контейнер, где крутиться memcached |

### Назначение папок
- [code](./code) (Место расположения исполняемого кода)
- [application.loc](./code/application.loc) - код для сайта `application.loc`.
Это единственная папка, находящаяся в каталоге ./code, в которой изменения отслеживаются гитом (MyDock)
- [otus.loc](./code/otus.loc) - код для сайта `otus.loc`
(Для работы сайта otus.loc необходимо создать каталог `/otus.loc` в папке
на которую указывает параметр `CODE` из файла настроек `.env`. Начальная настройка на папку `./code`.
Папка `./code/otus.loc`не отслеживается гитом (MyDock), поэтому можно использовать код из другого репозитория)
- [valyakin.loc](./code/valyakin.loc) - код для сайта `valyakin.loc`
(Для работы сайта valyakin.loc необходимо создать каталог `/valyakin.loc` в папке
на которую указывает параметр `CODE` из файла настроек `.env`. Начальная настройка на папку `./code`.
Папка `./code/valyakin.loc`не отслеживается гитом (MyDock), поэтому можно использовать код из другого репозитория)
- [fpm-1](./fpm-1) - папка с данными для создания контейнера `app`
- [fpm-2](./fpm-2) - папка с данными для создания контейнера `app`
- [memcached-1](./memcached-1) - папка с данными для создания контейнера `memcached`
- [memcached-2](./memcached-2) - папка с данными для создания контейнера `memcached`
- [mysql](./mysql) - папка с данными для создания контейнеров `mysql-master` и `mysql-slave`
- [nginx](./nginx) - папка с данными для создания контейнера `webserver`
- [hosts](./nginx/hosts) - место, где находятся конфигурационные файлы для сайтов
- [redis](./redis) - папка с данными для создания контейнера `redis`
- [workspace](./workspace) - папка с данными для создания контейнера `workspace`
- [scripts](workspace/scripts) - папка со скриптами
- [certificate](workspace/scripts/certificate) - скрипты для создания сертификата сайта
- `./create_root_ca.sh` - создает корневой сертификат с приватным для него ключем
- `./create_certicicate_for_domain.sh mysite.loca` - создает сертификат для сайта с приватным ключем для всех сайтов (если еще не было)
- [_logs](./_logs) (Логи) Настраивается параматром `LOGS=./_logs` в файле .env
- [memprof](_logs/memprof) - путь сохранения в проекте для данных из memprof берется из `$_SERVER['MEMPROF_LOG_PATH']`
```
Используется в коде например так:
$memprofPath = $_SERVER['MEMPROF_LOG_PATH'];
memprof_dump_callgrind(fopen($memprofPath."memprof_logs.out", "w"));
```
- [mysql](_logs/mysql) - расположение логов Mysql (/master, /slave)
- [nginx](_logs/nginx) - расположение логов Nginx
- [php_errors](_logs/php_errors) - расположение логов ошибок PHP
- [redis](_logs/redis) - расположение логов redis
- [xdebug](_logs/x-debug) - расопложение логов x-debug
- [ZoneForSTORAGE](./ZoneForSTORAGE) (Хранение данных) Настраивается параматром STORAGE=./ZoneForSTORAGE в файле .env
- certificates - место хранения сертификатов для сайтов + корневой сертификат
- docker
- elasticsearch
- data
- nodes
- 0 - `нулевая нода у эластики`
- mysql1 - `Место хранения данных Mysql-master`
- mysql2 - `Место хранения данных Mysql-slave`
- postgres - `Место хранения данных Postgres`
- redis - `Место хранения данных redis`
- sock - `Место хранения unix-socket`

Для того чтобы базы данных подключились необходимо либо до Установки контейнеров, либо при выключенном контейнере добавить данные в нужную папку.
Этот способ не рекомендуется. Лучше воспользоваться средствами восстановления из бекапа!!!
Если не будет в наличии папок `elasticsearch`, `mysql1`, `mysql2`, `postgres`, `sock` - то при первом запуске контейнеров
они будут созданы. И в них появятся базы данных с настройками из файла .env

В контейнере Workplace /srv/scripts/certificate для создания ssl сертификата для сайта есть 2 скрипта
- create_root_ca.sh - создает корневой сертификат
- create_certifivate_for_domain.sh - создает сертификат для сайта, который используется в качестве параметра при запуске скрипта

`/srv/scripts/start.sh` - запускает их поочереди.

### Структура .env

>#### environment ################
|Параметр|Назначение|
|----|----|
|TIMEZONE=Europe/Moscow| Зона времени, устанавливаемая на все контейнеры |

>#### sites ######################
|Параметр|Назначение|
|----|----|
|SITES_ENABLED_PATH=./nginx/hosts| Место на хосте, где находятся конфигурационные файлы для папки sites-enabled Веб-сервера. |

Достаточно положить в эту папку новый, настроенный файл типа `newsite.loc.conf`,
в ./code создать новую директорию с кодом,
установить в файле `hosts` связь доменного имени с localhost,
перезагрузить веб-сервер и готово. Можно пользоваться новым доменным именем `http://newsite.loc`

>#### IDE ########################
|Параметр|Назначение|
|----|----|
|PHP_IDE_CONFIG=serverName=Docker| Имя сервера в IDE, для режима пошаговой отладки x-debug, должно совпадать со значением в serverName |

>#### PATH ########################
|Параметр|Назначение|
|----|----|
|LOGS=./_logs| Корневая папка для хранения логов. Ее изменение переместит отображение всех логов в другое место |
|STORAGE=./ZoneForSTORAGE| Корневая папка для хранения данных контейнеров. Таких как базы данных и юникс сокета |
|CERTIFICATES=${STORAGE}/certificates| Местоположение ключей и сертификатов для сайтов |
|ADDITIONAL_CODE_PATH_HOST=c:/MyWork/School/Otus/HomeWork| Отдельная папка с кодом для сайта, код которого не располагается в стандартной папке проектов /code |
|ADDITIONAL_SITE_NAME=homework.otus| Имя сайта, которое будет использовано для ADDITIONAL_CODE_PATH_HOST. Так же его нужно настроить в хостах nginx |
|WORKSPACE_SCRIPTS_PATH_HOST=./workspace/scripts| Папка со скриптами на хосте |
|WORKSPACE_SCRIPTS_PATH_DOCKER=/srv/scripts| Папка со скриптами в контейнере |

>#### code #######################
|Параметр|Назначение|
|----|----|
|PHP_VERSION=8.0| версия PHP |
|APP_CODE_PATH_HOST=./code| Местоположение корневой папки с кодом проектов на хосте |
|APP_CODE_PATH_DOCKER=/var/www/html| Местоположение корневой папки с кодом проектов в контейнерах |
|PHP_ERROR_LOG_PATH=${LOGS}/php_errors/| Место складывания логов ошибок PHP |

>#### nginx ######################
|Параметр|Назначение|
|----|----|
|NGINX_LOG_PATH=${LOGS}/nginx| Место складывания логов webserver-а |
|NGINX_SSL_PATH_DOCKER=/etc/nginx/ssl| Папка с ключами и сертификатами в контейнере |

>#### x-debug
|Параметр|Назначение|
|----|----|
|X_DEBUG=1|при true или 1 включается x-debug|
|X_DEBUG_ERROR_LOG_PATH=${LOGS}/x-debug/| Место складывания логов x-Debug |

>#### memprof
|Параметр|Назначение|
|----|----|
|MEMPROF_PROFILE_ENABLE=1| только значение null отключает Memprof |
|MEMPROF_LOG_PATH_HOST=${LOGS}/memprof| путь для лога memprof на хосте |
|MEMPROF_LOG_PATH_DOCKER=/var/log/memprof/| путь для лога memprof в контейнере |

>#### unix socket
|Параметр|Назначение|
|----|----|
|UNIX_SOCKET_PATH_HOST=${STORAGE}/docker/sock| путь для файла сокета на хосте |
|UNIX_SOCKET_PATH_DOCKER=/sock| путь для файла сокета в контейнере |

>#### mysql-Master
|Параметр|Назначение|
|----|----|
|MYSQL_MASTER_DB=laravel| имя базы данных mysql-master |
|MYSQL_MASTER_ROOT_PASSWORD=password| пароль |
|MYSQL_MASTER_STORAGE_PLACE=${STORAGE}/docker/mysql1| путь к каталогу хранения данных |
|MYSQL_MASTER_LOG_PATH_HOST=${LOGS}/mysql/master| Место где можно смотреть логи на хосте |
|MYSQL_MASTER_LOG_PATH_DOCKER=/var/log/mysql/| Место хранения MySql логов в контейнере |
|MYSQL_SLAVE_CONFIG_PATH_HOST=./mysql/conf| Место хранения файла настроек MySql |

>#### mysql-Slave
|Параметр|Назначение|
|----|----|
|MYSQL_SLAVE_DB=laravel| имя базы данных mysql-slave |
|MYSQL_SLAVE_ROOT_PASSWORD=password| пароль |
|MYSQL_SLAVE_STORAGE_PLACE=${STORAGE}/docker/mysql2| путь к каталогу хранения данных |
|MYSQL_SLAVE_LOG_PATH_HOST=${LOGS}/mysql/master| Место где можно смотреть логи на хосте |
|MYSQL_SLAVE_LOG_PATH_DOCKER=/var/log/mysql/| Место хранения MySql логов в контейнере |
|MYSQL_SLAVE_CONFIG_PATH_HOST=./mysql/conf| Место хранения файла настроек MySql |

>#### postgres
|Параметр|Назначение|
|----|----|
|PGSQL_DB_NAME=postgres| имя базы данных Postgres - задается при создании контейнера, если базы нет |
|PGSQL_DB_USER=postgres| имя пользователя - задается при создании контейнера, если базы нет |
|PGSQL_DB_PASSWORD=password| пароль - задается при создании контейнера, если базы нет |
|PGSQL_STORAGE_PLACE=${STORAGE}/docker/postgres/data| путь к каталогу хранения данных |

>#### Redis
|Параметр|Назначение|
|----|----|
|REDIS_CONF=./redis/conf/redis/etc|местоположение конфигурационного файла redis|
|REDIS_DATA=${STORAGE}/docker/redis/data| путь к каталогу хранения данных |
|REDIS_LOG=${LOGS}/docker/redis/| путь к каталогу логов |

>#### Elasticsearch
|Параметр|Назначение|
|----|----|
|ELASTICSEARCH_DATA=${STORAGE}/docker/elasticsearch/data| путь к каталогу хранения данных |
61 changes: 61 additions & 0 deletions Docker-Balancer/code/application.loc/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#### path #######################
CONTROLLERS_BASE_PATH=App/Http/Controllers
VIEW_BASE_PATH=resources/Views
APP_LOG_PATH=log/application.log

#### framework ##################
DEFAULT_CONTROLLER_NAME=Default
DEFAULT_CONTROLLER_METHOD=run
DEFAULT_SCRIPT_NAME=index.php
DEFAULT_VIEW_NAME=index

#### mysql ######################
MYSQL_DRIVER=mysql
MYSQLITE_DRIVER=mysqlite

#### mysql-Master ###############
MYSQL_MASTER_HOST=db1
MYSQL_MASTER_PORT=3306
MYSQL_MASTER_DB=laravel
MYSQL_MASTER_USER=root
MYSQL_MASTER_PASSWORD=password

#### mysql-Slave ################
MYSQL_SLAVE_HOST=db2
MYSQL_SLAVE_PORT=3306
MYSQL_SLAVE_DB=laravel
MYSQL_SLAVE_USER=root
MYSQL_SLAVE_PASSWORD=password

#### postgres ###################
PGSQL_DB_HOST=postgres
PGSQL_DB_PORT=5432
PGSQL_DB_NAME=postgres
PGSQL_DB_USER=postgres
PGSQL_DB_PASSWORD=password
PGSQL_DRIVER=pgsql
PGSQL_PG_DRIVER=pg_connect

#### redis #######################
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_TIMEOUT=0
REDIS_RESERVED=as
REDIS_RETRY_INTERVAL=0
REDIS_READ_TIMEOUT=0.0

#### memcached ###################
MEMCACHED_HOST=memcached-1
MEMCACHED_PORT=11211

MEMCACHED_CLUSTER=true
MEMCACHED_1_HOST=memcached-1
MEMCACHED_1_PORT=11211
MEMCACHED_2_HOST=memcached-2
MEMCACHED_2_PORT=11211
MEMCACHED_DRIVER=Memcache

#### elasticsearch ###############
ELASTICSEARCH_HOST=elasticsearch
ELASTICSEARCH_PORT=9200
ELASTICSEARCH_DRIVER=elasticsearch
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace App\Console\Routes;


use Routes\Router;


class ConsoleRouter
{
static public function run(array $arguments): void
{
self::setUrlFromCliRequest($arguments);
Router::run();
}

static private function setUrlFromCliRequest(array $arguments): void
{
print_r($arguments);
$argument = mb_strtolower(($arguments[1] ?? '') . '/' . ($arguments[2] ?? ''));
echo $argument.PHP_EOL;
$_SERVER['REQUEST_URI'] = self::getRouteByArgument($argument);
}

static private function getRouteByArgument(string $argument): string
{
return match ($argument) {
'elasticsearch/' => '/Elasticsearch/xhrCheckConnection',
'redis/' => '/Redis/xhrCheckConnection',
'memcached/' => '/Memcached/AloneMemcached/xhrCheckConnection',
'mysql/mysqli' => '/Mysql/xhrCheckMysqliConnection',
'mysql/pdo' => '/Mysql/xhrCheckPdoConnection',
'postgres/pdo' => '/Postgres/xhrCheckPdoConnection',
'postgres/pg_connect' => '/Postgres/xhrCheckPgConnection',
'sysinfo/' => '/Sysinfo/xhrGetInfo',
default => '',
};
}
}
12 changes: 12 additions & 0 deletions Docker-Balancer/code/application.loc/App/Console/checker.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php
use App\Console\Routes\ConsoleRouter;
use App\Http\Response\ResponseCli;

require_once __DIR__ . '/../../bootstrap/init.php';

try {
ConsoleRouter::run($argv);
}
catch(Exception $ex){
(new ResponseCli())->send($ex->getCode(), $ex->getMessage());
}
Loading