Это сервер для разработки и публикации web-приложений, построенный на базе Docker контейнеров.
Этот сервер может использоваться как для локальный разработки, так и для продакшн.
Внимание! Данная инструкция была написана для старой версии. С тех пор произошло обновление путей и добавление новых компонентов, но общие принципы работы, по сути, не изменились. Если вы видите это сообщение, то эта инструкция не совсем актуальная для текущей версии. Вы можете использовать ее, но учтите, что некоторые команды и пути могут не совпадать. Мы постепенно обновляем инструкцию.
- Быстрый старт
- О проекте
- Docker
- Git
- Начало работы
- Компоненты
- Разработка нескольких проектов
Быстрый запуск в 5 простых шагов.
1. Перед началом, установите и настройте Docker и Git
2. Выполните клонирование данного репозитория в ваш проект на локальном компьютере.
git clone https://github.com/isengine/server
или в текущий каталог вашего проекта
git clone https://github.com/isengine/server .
3. Удалите все файлы .gitkeep во всех вложенных каталогах среды разработки.
Windows power shell:
remove-item server/* -include .gitkeep -recurse
Если вы находитесь внутри папки с клонированным репозиторием, выполните комманду:
remove-item ./* -include .gitkeep -recurse
Linux / Mac
find server/ -name ".gitkeep" | xargs rm
Если вы находитесь внутри папки с клонированным репозиторием, выполните комманду:
find ./ -name ".gitkeep" | xargs rm
4. Настройте переменные окружения
Нужно переименовать файл .env.example в .env.
Возможно, для корректной работы придется задайте свои параметры, например связь с базой данных.
5. Соберите проект из каталога вашего проекта
docker-compose up --build
С флагом -d консоль не заблокируется, но и вывод информации будет ограничен:
docker-compose up --build -d
Если консоль не заблокирована, в ней будет отображаться вся информация по операциям в среде разработке, включая запросы к сервисам, текущее состояние контейнеров и т.д.
Дальнейшие команды для работы:
# обновление
docker-compose up
# запуск
docker-compose start
# остановка
docker-compose stop
# перезапуск контейнера
docker-compose restart CONTAINER_NAME
# подключение к контейнерам
docker-compose exec CONTAINER_NAME bash
Результат.
Вывод проекта через node.js на 8080 порт: http://localhost:8080
Вывод статики из каталога "./public/" через сервер nginx + php-fpm на 80 порт: http://localhost
phpMyAdmin работает на 8810 порту: http://localhost:8810
Adminer работает на 8800 порту: http://localhost:8800
В случае необходимости изменить конфигурацию сервера, возникновения ошибок и прочих вопросов, смотрите полное руководство.
Среда разработки включает в себя следующие контейнеры и компоненты:
- nodejs
- yarn
- nginx
- php
- git
- composer
- базы данных
- adminer
- dbeaver
- phpmyadmin
- mysql
- postgres
- pgadmin
- redis
- redis-commander
- mongo
- почтовый сервер
- iredmail
- poste
- mailcow
- прочие песочницы и компиляторы
- c++
- python
- тренажер
...
├── projects
│ └── ...
├── services
│ ├── .ssh
│ ├── adminer
│ ├── cpp
│ ├── dbeaver
│ ├── git
│ ├── iredmail
│ ├── mailcow
│ ├── mongo
│ ├── mysql
│ ├── nginx
│ ├── nodejs
│ ├── pgadmin
│ ├── php
│ ├── phpmyadmin
│ ├── poste
│ ├── postgres
│ ├── python
│ ├── redis
│ ├── redis-commander
│ └── trainer
├── .env
└── docker-compose.yml
В каталогах некоторых сервисов есть вложенные каталоги data, которые содержат данные этого сервиса. Например, это могут быть настройки php, дамп базы данных и т.п.
.gitkeep - это пустые файлы, которые нужны только для того, чтобы добавить каталог под наблюдение Git.
.env - файл с основными настройками среды разработки.
docker-compose.yml - документ в формате YML, в котором определены правила создания и запуска многоконтейнерных приложений Docker.
Dockerfile - конфигурационный файл, в котором описаны инструкции, которые будут применены при сборке Docker-образа и запуске контейнера.
README.md - документация.
.ssh - каталог для хранения ssh-ключей.
Перед началом работы рекомендуется удалить все файлы .gitkeep из всех вложенных каталогов. Иначе могут быть проблемы, например, с хранилищами баз данных.
Контейнер mysql не будет корректно работать под именем localhost, т.к. по-умолчанию это имя привязано к ip 127.0.0.1, а реальный ip адрес контейнера отличается. При попытке назначить данный ip адрес и открыть его наружу, контейнер падает в ошибку, т.к. возникает конфликт с системой.
На текущий момент рабочее решение - для локальной разработки использовать в вашем проекте другое имя сервера (хоста) MySQL, по-умолчанию задано "mysql".
В контейнер nodejs по-умолчанию включены команды, запускающие билд quasar. Возможно, для вашего проекта нужно будет их убрать.
Для правильной работы нужен компонент WSL2.
Скачиваем и устанавливаем обновление
Проверим его наличие и версию
wsl -l -v
Должна быть 2. Если нет, то устанавливаем
wsl --set-default-version 2
Затем ставим дистрибутив Linux Ubuntu
wsl --install -d Ubuntu
И назначаем его по-умолчанию
wsl --set-default Ubuntu
После этого устанавливаем Docker desktop с параметром "использовать WSL 2" или включаем его в настройках ("Use the WSL 2 based engine").
Запускаем.
Docker desktop под Windows по-умолчанию включает компоненты docker, docker-compose и операции для работы через командную строку.
Инструкция по установке и настройке docker:
https://docs.docker.com/desktop/install/linux-install/
Docker под Linux по-умолчанию НЕ включает в себя docker-compose. Поэтому ставить его нужно отдельно.
Под Linux комманды docker нужно вводить из-под суперпользователя, например:
sudo docker-compose up --build
Полное руководство: https://docs.docker.com/reference/
Сборка:
docker-compose up --build
# с флагом -d консоль не заблокируется, но и вывод информации будет ограничен
docker-compose up --build -d
Полное отключение:
docker-compose down
Перезапуск:
docker-compose restart
Обычный запуск:
docker-compose run
# или
docker-compose start
Остановка:
docker-compose stop
Посмотреть статистику:
docker-compose ps
Для того, чтобы управлять одним сервисом или контейнером, нужно после комманды ввести его имя.
Например:
docker-compose up --build CONTAINER_NAME
Подключение к контейнеру:
docker-compose exec CONTAINER_NAME sh (или bash, если установлен)
# или
docker exec -it CONTAINER_NAME sh (или bash, если установлен)
Выполнить команду в контейнере:
docker exec -it CONTAINER_NAME COMMAND
# например, посмотреть версию php из контейнера php
docker exec -it php php -v
Список контейнеров:
# запущенные контейнеры
docker ps
# все контейнеры
docker ps -a
Информация о контейнере:
docker inspect CONTAINER_NAME
Перезагрузить контейнер:
docker restart CONTAINER_NAME
Удалить контейнеры:
# удаление всех контейнеров
docker rm -v $(docker ps -aq)
# удаление активных контейнеров
docker rm -v $(docker ps -q)
# удаление неактивных контейнеров
docker rm -v $(docker ps -aq -f status=exited)
Список образов:
docker images
Удалить образы:
docker rmi $(docker images -q)
Чистим докер:
docker system prune --volumes --all
Для правильной работы под Windows нужно установить приложение по ссылке
https://git-scm.com/download/win
Под Linux нужно установить пакет git соответствующей командой.
Ubuntu:
apt-get install git
Alpine:
apk add git
Полное руководство: https://git-scm.com/book/en/v2
Обычное копирование:
git clone https://REPOSITORY_URL.git
В текущий каталог:
git clone https://REPOSITORY_URL.git .
С указанием ветки:
git clone --branch BRANCH_NAME https://REPOSITORY_URL.git .
Выбрать ветку репозитория для дальнейшей работы:
git branch BRANCH_NAME
Узнать статус:
git status
Статус покажет, какие файлы изменены, но не добавлены, какие ожидают коммита и т.п.
Получить лог последних действий:
git log
Посмотреть информацию и проверить подключение к репозиторию:
git remote show origin
Получить и сразу принять последние изменения:
git pull
Получить изменения из ветки, не применяя их в проект:
git fetch
Применить изменения из ветки в проект:
git merge
Добавить свои изменения в файлах или каталогах:
git add PATH/TO/FOLER/OR/FILE.EXT
Зафиксировать изменения:
git commit -m "DESCRIPTION"
Залить свои изменения в репозиторий:
git push
Если вы хотите указать ветку репозитория для работы, это можно сделать, добавив указатель в конце каждой комманды, например:
git pull origin BRANCH_NAME
Если вы выбрали ветку в самом начале, достаточно использовать обычные комманды.
Отменить изменения в файле или каталоге:
git checkout PATH/TO/FOLER/OR/FILE.EXT
Убрать каталог или файл из коммита:
git restore --staged PATH/TO/FOLER/OR/FILE.EXT
Вернуть файл из репозитория:
git restore PATH/TO/FILE.EXT
Отменить коммит:
git revert COMMIT_ID
Выполните пункты 1-4 (до сборки) из раздела Быстрый старт.
Настройте файлы локального сервера по вашему желанию:
1. Удалите ненужные контейнеры в файле docker-compose.yml и настройте зависимости.
2. Задайте переменные окружения в файле .env.
3. Настройте команды после запуска nodejs в файле Dockerfile.
4. Настройте команды после запуска php в файле Dockerfile в каталоге ./php/.
5. Отредактируйте настройки виртуальных хостов Nginx в файле nginx.conf в каталоге ./nginx/conf.d/.
Если ваш проект использует git (наверняка так оно и есть), рекомендуем настроить файл .gitignore.
Если его нет, желательно его создать.
В этот файл нужно прописать файлы и папки, которые не должны попасть в ваш репозиторий.
Вы можете настроить зависимости в файле docker-compose.yml. Например:
nginx:
...
depends_on:
- php
- mysql
- adminer
Таким образом, при запуске сервиса nginx будут автоматически запускаться сервисы php, mysql и adminer.
Обратите внимание, что сервисы баз данных уже настроены на запуск администрирования. Например, при запуске mysql автоматически запускается сервис phpmyadmin. По аналогии происходит с postgres и redis. Исключением является сервис adminer, т.к. он управляет разными типами баз данных.
Настройте хосты (доменные имена) web-проектов на локальной машине.
Необходимо добавить названия хостов web-проектов в файл hosts на вашем компьютере.
В файле hosts следует описать связь доменных имён ваших web-проектов в среде разработки на локальном компьютере и IP docker-контейнера nginx.
На Mac и Linux этот файл расположен в /etc/hosts. На Windows он находится в C:\Windows\System32\drivers\etc\hosts.
Строки, которые вы добавляете в этот файл, будут выглядеть примерно так:
127.0.0.1 localhost
В данном случае, мы исходим из того, что Nginx, запущенный в docker-контейнере, доступен по адресу 127.0.0.1 и web-сервер слушает порт 80.
По своему желанию вы можете также настроить маршрутизацию внутри контейнеров.
Web-проекты должны иметь возможность отправлять http-запросы друг другу и использовать для этого название хостов.
Из одного запущенного docker-контейнера php web-приложение №1 должно иметь возможность отправить запрос к web-приложению №2, которое работает внутри другого docker-контейнера nodejs. При этом адресом запроса может быть название хоста, которое указано в файле /etc/hosts локального компьютера.
Чтобы это стало возможным нужно внутри контейнеров так же внести соответствующие записи в файл /etc/hosts.
Самый простой способ решить данную задачу — добавить секцию extra_hosts в описание сервисов php и nodejs в docker-compose.yml.
Пример:
...
php:
...
extra_hosts:
- 'PROJECT_1_HOST_NAME_FROM_HOSTS:IP_HOST_MACHINE'
- 'PROJECT_2_HOST_NAME_FROM_HOSTS:IP_HOST_MACHINE'
...
PROJECT_х_HOST_NAME_FROM_HOSTS — имя хоста, заданное в пункте выше.
IP_HOST_MACHINE — IP адрес, по которому из docker-контейнера доступен ваш локальный компьютер.
Если вы разворачиваете среду разработки на Mac, то внутри docker-контейнера вам доступен хост docker.for.mac.localhost.
Узнать IP адрес вашего Mac можно при помощи команды, который нужно выполнить на локальной машине:
docker run -it alpine ping docker.for.mac.localhost
В результате вы получите, что-то подобное:
PING docker.for.mac.localhost (192.168.65.2): 56 data bytes
64 bytes from 192.168.65.2: seq=0 ttl=37 time=0.286 ms
64 bytes from 192.168.65.2: seq=1 ttl=37 time=0.504 ms
64 bytes from 192.168.65.2: seq=2 ttl=37 time=0.801 ms
После того, как вам станет известен IP-адрес, укажите его в секции extra_hosts в описание сервисов php и nodejs в docker-compose.yml.
php:
...
extra_hosts:
- 'php:192.168.65.2'
- 'nodejs:192.168.65.2'
...
Для работы web-проектов могут потребоваться SSH-ключи, например для того, чтобы из контейнера при помощи Composer можно было установить пакет из приватного репозитория.
Вам потребуется утилита ssh-keygen, которая идет в комплекте с git: Установка Git
Создать SSH-ключи можно при помощи следующей команды:
ssh-keygen -f /.ssh/id_rsa -t rsa -b 2048 -C "your-name@example.com"
Вместо your-name@example.com укажите свой email.
В каталог .ssh/ будут сохранены 2 файла — публичный и приватный ключ.
Если вы скопировали в каталог .ssh свой ранее созданный ssh-ключ, то убедитесь, что файл id_rsa имеет права 700 (-rwx------@).
Установить права можно командой:
chmod 700 id_rsa.
Вывод проекта через node.js на 8080 порт.
Вывод статики из каталога "./public/" через сервер nginx + php-fpm на 80 порт.
phpMyAdmin работает на 8810 порту.
Adminer работает на 8800 порту.
В первый раз запускаем проект с установкой необходимых образов и компонентов
docker-compose up --build
С флагом -d консоль не заблокируется, но и вывод информации будет ограничен
docker-compose up --build -d
Предлагаю использовать разные вкладки
Если консоль заблокирована процессом, то процесс можно остановить, нажав
Ctrl + C
Чтобы остановить процесс выполнения контейнеров с удалением контейнеров
docker-compose down
Мы не рекомендуем запускать nodejs в контейнере, когда вы ведете разработку. Лучше установите nodejs глобально для вашей операционной системы. Запускать в контейнере ваши nodejs приложения имеет смысл только для production режима.
Для комфортной работы мы рекомендуем установить менеджер пакетов yarn. Для этого выполните
npm install yarn --global
Если вы работаете под Windows, то сначала вам скорее всего понадобится разрешить выполнение скриптов. Для этого запустите power shell от имени администратора и выполните
Set-ExecutionPolicy unrestricted
Подключимся к контейнеру
docker exec -it nodejs bash
Вы можете установить зависимости, которые могут быть нужны. Например:
yarn global add @quasar/cli
Мы рекомендуем использовать yarn вместо npm.
Сборка делается автоматически при создании контейнера. Но если нужно ее повторить, можете выполнить команду
yarn
# или
yarn install
Дальше остается сделать билд.
Например:
yarn build
# или команду билда вашего проекта
# например, для фреймворка quasar на vue:
yarn quasar build
Вы можете объединить эти команды и прописать их в файл docker-compose.yml в секцию nodejs:
command: bash -c "yarn quasar build"
Тогда они будут выполняться сами при каждой сборке среды.
Перезапустить контейнер можно из командной строки. При этом все команды будут выполняться автоматически.
docker restart nodejs
# или
docker-compose restart nodejs
Если контейнер nodejs не будет занят каким-либо процессом, он автоматически завершится.
Quasar - это фреймворк для разработки приложений под Node.js для vue.js.
Его удобство заключается в том, что большая часть задач решается посредством имеющихся решений. Вам не придется искать сторонние модули и компоненты.
Quasar, как и весь vue.js, поддерживает режим hot-reload - обновление билда в реальном времени при изменении кода.
Для того, чтобы в Quasar работал hot-reload, нужно в файл quasar.conf.js, в секцию build, добавить следующий код:
extendWebpack(cfg) {
cfg.watchOptions = {
aggregateTimeout: 200,
poll: 1000,
};
},
Этот каталог предназначен для хранения файлов конфигурации Nginx и логов.
├── conf.d
├── logs
└── nginx.conf
nginx.conf — файл конфигурации.
Конфигурация настроена таким образом, что из папки conf.d автоматически подключаются все конфигурации виртуальных хостов web-проектов, имеющие расширение .http.conf.
Вы также можете хранить там конфигурацию потоков с расширением .stream.conf.
Для параметров используйте расширение .params.conf.
Давайте посмотрим внутрь конфигурации виртуального хоста. Например nginx.http.conf.
Здесь указаны порты ipv4 и ipv6, и название сервера:
listen 80;
listen [::]:80;
server_name example.com www.example.com;
Здесь указан индексный файл, точка входа:
index index.php;
Здесь заданы каталоги и файлы отчетов о работе сервера:
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
Здесь задан корневой каталог проекта:
root /var/www/example.com/public;
Дальше следуют другие настройки. Но нам следует обратить внимание на то, как производится перенаправление запросов к нужному docker-контейнеру.
fastcgi_pass php:9000;
php — название docker-контейнера, а 9000 — порт внутренней сети. Контейнеры между собой связаны через внутреннюю сеть network, которая определена в файле docker-compose.yml.
Если вам нужно создать несколько параллельных проектов, вы можете их настроить, создав для каждого свой файл.
Мы предлагаем уже настроенные проекты для сервисов, входящих в комплект. Если вы не используете какие-то из них, nginx может не запуститься. Для отключения переименуйте расширение, например nodejs.http.conf.off
Каталог данных PHP.
├── supervisor.d
└── php.ini
...
└── Dockerfile
supervisor.d — место для хранения файлов конфигурации Supervisor.
Dockerfile — это текстовый документ, содержащий все команды, которые следует выполнить для сборки образов PHP.
php.ini — это файл конфигурации PHP.
В каталоге projects/example.com/php лежит файл index.php. Это файл с примером web страницы на языке php.
В каталоге services/nginx/data/conf.d лежит файл php.http.conf.example. Он содержит базовые настройки для запуска прокси-сервера для сервиса nginx.
Переименуйте его в файл вашего сервера, оканчивающийся на .http.conf и сделайте необходимые настройки. Например, укажите имя сервера и рабочий каталог. Возможно, вы захотите указать другой порт.
По-умолчанию php запускается на 9000 порту!
В Nginx в первом volume (/var/www) подключаем статику сайта с компьютера в контейнер для публикации. Этот же volume используется для php.
Во втором volume (/etc/nginx/conf.d) - настройки самого Nginx для работы с php.
fastcgi_pass php:9000;
этой строкой Nginx понимает, где расположен сервер с php. Контейнер с php по умолчанию расположен на 9000 порту, php - это имя сервиса, которое мы задали в файле docker-compose.yml.
Также через настройки контейнера мы передаем в контейнер php настройки MySQL из переменных среды для подключения к базе. В php потом их можно взять из глобального массива $_ENV.
В php мы можем не просто взять image, но и произвести настройку контейнера. Установить службы для работы с MySQL, установить composer и др.
Подключиться к контейнеру
docker exec -it php bash
Установить библиотеки:
docker-php-ext-install LIBRARY_NAME
# или несколько библиотек сразу
docker-php-ext-install pdo mysqli pdo_mysql
Инициализировать библиотеки можно в файле php.ini в каталоге ./php/php-ini/.
extension=pdo
extension=mysqli
extension=pdo_mysql
Или из коммандной строки:
docker-php-ext-enable LIBRARY_NAME
# или несколько библиотек сразу
docker-php-ext-enable pdo mysqli pdo_mysql
После этого нужно будет выйти из контейнера
exit
Или нажав
Ctrl + C
И перезагрузить контейнеры
docker restart php nginx
Посмотреть версию php:
php -v
Посмотреть расширения php:
php -m
Если в проекте на PHP используется Composer и вам нужно установить зависимости, вы должны заходить в проект из контейнера PHP, но не Nginx!
Далее в консоли вам нужно перейти в папку проекта и выполнить
composer install --ignore-platform-reqs
или
composer update
Мы предоставляем рабочее окружение языка С++ последней доступной версии.
Вы можете использовать его как песочницу stand-alone проектов, запуская проекты из папки data данного сервиса.
По-умолчанию С++ запускается на 7000 порту!
В каталоге projects/example.com/python лежит файл main.py. Он содержит базовые настройки для сервера flask.
Каталог projects/example.com/gunicorn содержит базовые настройки для сервера gunicorn.
В каталоге services/nginx/data/conf.d лежит файл python.http.conf.example. Он содержит базовые настройки для запуска прокси-сервера для сервиса nginx.
Переименуйте его в файл вашего сервера, оканчивающийся на .http.conf и сделайте необходимые настройки. Например, укажите имя сервера и рабочий каталог. Возможно, вы захотите указать другой порт.
По-умолчанию python запускается на 8000 порту!
Теперь подключимся к контейнеру
docker-container exec -it python bash
и перейдем в папку вашего проекта
cd DOMAIN_NAME
Вам наверняка нужно будет установить зависимости.
pip install --upgrade pip
pip install --no-cache-dir -r requirements.txt
Если вам нужно запустить сервер flask или любой другой скрипт, используйте такую команду
python main.py
Для запуска сервера gunicorn можно использовать команды
gunicorn -c gunicorn.py DOMAIN_NAME.wsgi
gunicorn -w 4 script:app
Вы можете автоматизировать запуск web-приложения, если пропишете эти команды в docker-compose.yml.
Этот сервис представляет собой компилятор кода на разных языках.
Его особенность в том, что он может компилировать код, полученный из запроса по http-протоколу с методом GET.
На данный момент он реализует доступ через всего один эндпоинт /run/.
В качестве входящих данных вы можете передать json-строку.
Пример кода на языке Go:
{
"command": "go run main.go",
"files": [
{
"name": "main.go",
"content": "package main\nimport \"fmt\"\nfunc main() {fmt.Println(\"Hello world!\")}"
}
]
}
Пример кода на языке Python:
{
"command": "python main.py",
"files": [
{
"name": "main.py",
"content": "n=5\nstring=\"Hello World \"\nprint(string * n)"
}
]
}
Пример кода на языке Python с входными данными:
{
"command": "python main.py",
"stdin": ["name", "city"],
"files": [
{
"name": "main.py",
"content": "name_user = input()\ncity_user = input()\nprint(f'Вас зовут {name_user}. Ваш город {city_user}')\n"
}
]
}
Пример кода на языке С++:
{
"command": "g++ -pipe -O2 -static -o main main.cpp && ./main",
"files": [
{
"name": "main.cpp",
"content": "#include <iostream>\n\nint main()\n{\n std::cout << \"Hello world!\";\n return 0;\n}\n"
}
]
}
Пример кода на языке С++ с входными данными:
{
"command": "g++ -pipe -O2 -static -o main main.cpp && ./main",
"stdin": [2, 21],
"files": [
{
"name": "main.cpp",
"content": "#include <iostream>\n\nint main() {\n int a, b;\n std::cin >> a >> b;\n std::cout << a + b << std::endl;\n}\n"
}
]
}
Пример ответа:
{
"exit_code": 0,
"stdin": 2,
"stdout": "...",
"stderr": "",
"oom_killed": false,
"timeout": false,
"duration": 0
}
По-умолчанию тренажер запускается на 3999 порту!
Конфигурация php задается в файле php.ini в каталоге ./adminer/.
Например, там можно задать максимальный размер бэкапа, который можно загрузить через Adminer.
Adminer запускается в отдельном контейнере на 8080 порту, но у нас этот порт уже занят контейнером с веб-сервером Node.js.
Поэтому мы перебрасываем 8080 порт на 8800.
Вы можете создать пользователя командой sql:
CREATE USER user_name WITH PASSWORD 'password';
Есть альтернативный вариант - создать роль, пользователя и связать их:
CREATE ROLE user_name WITH LOGIN PASSWORD 'password';
Возможно, вам потребуется назначить пользователю все права для работы с базой данных:
GRANT ALL PRIVILEGES ON DATABASE database_name TO user_name;
DBeaver - это инструмент для управления базами данных. Позволяет работать с огромным количеством БД, как SQL, так и NoSQL.
Работает через драйвер JDBC и ODBS. Таким образом поддерживаются популярные базы MySQL, PostgreSQL, SQLite, а также ClickHouse, Elasticsearch, Firebase, Kafka. Enterprise версия поддерживает MongoDB и Redis.
Возможности DBeaver включают в себя:
- выполнение SQL-запросов, SQL-скриптов, генерацию DDL,
- браузер/редактор данных,
- просмотр и редактирование структуры (метаданных),
- диаграммы отношений (ERD),
- SSH-туннелирование,
- экспорт/миграцию данных,
- импорт, экспорт и резервное копирование данных,
- генерацию mock данных для тестирования.
В этой сборке используется контейнеризированная облачная версия. Enterprise версия использует другой контейнер - dbeaver/cloudbeaver-ee.
DBeaver запускается в отдельном контейнере на 8978 порту, но мы перебрасываем этот порт на любой, заданный в переменной окружения (по-умолчанию 8890).
DBeaver по-умолчанию отключен. Чтобы его включить, достаточно просто раскомментировать сервис dbeaver в файле docker-compose.yml в корневом каталоге.
Переменная среды
PMA_ARBITRARY=1
обозначает, что можно подключаться к любому серверу сети, а не только localhost.
Остальная конфигурация php задается в файле php.ini в каталоге ./phpmyadmin/.
Например, там можно задать максимальный размер бэкапа, который можно загрузить через phpMyAdmin.
phpMyAdmin запускается в отдельном контейнере с Apache2 на 80 порту, но у нас 80 порт уже занят контейнером с веб-сервером Nginx, который на 80 порту публикует статику PHP.
Поэтому мы перебрасываем 80 порт на 8810.
Каталог базы данных MySQL.
├── conf.d
│ └── config-file.cnf
├── dump
├── lib
└── logs
config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 8 будут применены.
dump — каталог для хранения дампов.
lib — этот каталог предназначен для хранения пользовательских данных MySQL 8.
logs — каталог для хранения логов.
Мы подключаем дамп базы в контейнер, чтобы наша база не удалялась каждый раз когда мы делаем build или чистим проект.
Настройку базы можно производить в phpMyAdmin или через консоль.
Имя сервера mysql указано в файле .env
MYSQL_HOST=mysql
Пользователь с правами администратора всегда:
root
Там же, в файле .env, задан пароль для root
MYSQL_ROOT_PASSWORD=1234
Также в этом файле прописаны настройки рабочей базы:
MYSQL_DB=test
MYSQL_USER=user
MYSQL_PASSWORD=1234
Поменяйте их на те, которые будут использоваться в вашем проекте. И затем вам нужно создать базу и пользователя.
Для работы в консоли вам подойдет следующая инструкция.
Обратите внимание, что вместо переменных окружения вам нужно будет поставить их значения. Например, вместо
CREATE DATABASE `_MYSQL_DB_`;
# нужно написать
CREATE DATABASE `test`;
# или имя вашей базы
И не забывайте ставить знак ";" в конце операции!
Подключимся к контейнеру
docker exec -it mysql sh
Для подключения к самой MySQL внутри контейнера наберем команду
mysql -uroot -p
Система попросит ввести пароль, вводим пароль из MYSQL_ROOT_PASSWORD.
Создадим базу данных
CREATE DATABASE `_MYSQL_DB_`;
Посмотрим на все базы данных и убедимся, что она создана
SHOW DATABASES;
Создадим пользователя
CREATE USER '_MYSQL_USER_'@'%' IDENTIFIED BY '_MYSQL_PASSWORD_';
% обозначает что пользователь может подключаться из под любого хоста. Это важно т.к. разные контейнеры расположены на разных хостах и у них разные ip.
Добавим пользователю все права на базу созданную ранее
GRANT ALL PRIVILEGES ON `_MYSQL_DB_` . * TO '_MYSQL_USER_'@'%';
Для того чтобы удалить пользователя, нужно будет сначала убрать права, а потом удалить.
REVOKE ALL PRIVILEGES, GRANT OPTION FROM '_MYSQL_USER_'@'%';
DROP USER '_MYSQL_USER_'@'%';
Вариант 1
Если требуется создать дополнительных пользователей, то следует это сделать перед началом процедуры загрузки дампа.
В файле mysql/conf.d/config-file.cnf отключите лог медленных запросов slow_query_log=0 или установите большое значение long_query_time, например 1000.
Если дамп сжат утилитой gzip, сначала следует распаковать архив:
gunzip databases-dump.sql.gz
Затем можно развернуть дамп, выполнив на локальном компьютере команду:
docker exec -i mysql mysql --user=root --password=secret --force < databases-dump.sql
Указывать пароль в командной строке — плохая практика, не делайте так в производственной среде.
MySQL выдаст справедливое предупреждение:
>mysql: [Warning] Using a password on the command line interface can be insecure.
Ключ --force говорит MySQL, что ошибки следует проигнорировать и продолжить развёртывание дампа. Этот ключ иногда может пригодится, но лучше его без необходимости не применять.
Вариант 2
Из командной строки:
mysqldump -u MYSQL_USER -pMYSQL_PASSWORD MYSQL_DB -P MYSQL_PORT > dumpfile.sql
По ssh:
ssh LOGIN@SERVER_ADDRESS -p PORT 'mysqldump -u MYSQL_USER -pMYSQL_PASSWORD MYSQL_DB -P MYSQL_PORT > dumpfile.sql'
scp -P PORT LOGIN@SERVER_ADDRESS:dumpfile.sql dumpfile.sql
ssh LOGIN@SERVER_ADDRESS -p PORT 'rm dumpfile.sql'
LOGIN SERVER_ADDRESS PORT MYSQL_USER MYSQL_PASSWORD MYSQL_DB MYSQL_PORT
Каталог для системы управления базами данных PostgreSQL.
├── dump
└── lib
dump — каталог для хранения дампов.
lib — этот каталог предназначен для хранения пользовательских данных PostgreSQL.
База данных postgre задается следующими переменными окружения:
POSTGRES_HOST=postgres
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=secret
POSTGRES_PORT=5432
Управлять базой можно через два интерфейса:
- Adminer
- PgAdmin
и через командную строку, подключившись:
docker-compose exec -it postgres sh
PgAdmin доступен по порту, заданному в переменной окружения
PGADMIN_PORT=8820
Чтобы подключиться через PgAdmin, вам понадобится ввести email root-пользователя. Этот email задан по-умолчанию из переменной окружения с добавлением хоста и .sql на конце.
POSTGRES_USER@POSTGRES_HOST.sql
Дальше вам понадобится добавить сервер, где указать данные из переменных окружения.
Сделать дамп
Выполните следующую команду на локальной машине:
pg_dump -h PG_HOST -p PG_PORT -U PG_USER PG_DATABASE > /path/to/dump/dumpfile.sql
PG_USER — имя пользователя. Значение POSTGRES_USER.
PG_DATABASE — название базы данных. Значение POSTGRES_DB.
Например:
pg_dump -h localhost -p 5432 -U postgres mydb > dumpfile.sql
Восстановить базу из дампа
psql -U PG_USER PG_DATABASE < /path/to/dump/dumpfile.sql
Например:
psql -U postgres mydb < dumpfile.sql
Выполнение команд
Эти команды вы можете выполнить разными способами:
- зайти в контейнер postgres и ввести команду,
- выполнить из командной строки с вызовом контейнера,
- по ssh.
Выполнить из командной строки с вызовом контейнера:
docker exec -i postgres КОМАНДА
По ssh:
ssh LOGIN@SERVER_ADDRESS -p PORT 'КОМАНДА'
scp -P PORT LOGIN@SERVER_ADDRESS:/path/to/dump/dumpfile.sql dumpfile.sql
ssh LOGIN@SERVER_ADDRESS -p PORT 'rm /path/to/dump/dumpfile.sql'
LOGIN — логин для подключения по ssh.
SERVER_ADDRESS — имя сервера или его ip.
PORT — порт сервера (если нужен).
При подключении по ssh сервер может потребовать ввести пароль!
Здесь мы приводим три команды подряд. Первая создает дамп или восстанавливает базу из дампа. Вторая копирует файл дампа на локальную машину с удаленного сервера. А третья удаляет файл дампа с сервера, чтобы не засорять его лишним мусором.
Каталог key-value хранилища Redis.
├── conf
└── lib
conf — каталог для хранения специфических параметров конфигурации.
lib — если настройки конфигурации предполагают сохранения данных на диске, то Redis будет использовать именно этот каталог.
Redis Commander являеся интерфейсом для управления базой данных Redis.
Redis Commander доступен по порту, заданному в переменной окружения
REDIS_COMMANDER_PORT=8830
Он использует те же переменные окружения, что и база данных:
REDIS_HOST=redis
REDIS_PORT=6379
Каталог базы данных MongoDB.
├── configdb
│ └── mongo.conf
├── db
└── dump
mongo.conf — Файл конфигурации MongoDB. В этот файл можно добавлять параметры, которые при перезапуске MongoDB будут применены.
db — этот каталог предназначен для хранения пользовательских данных MongoDB.
dump — каталог для хранения дампов.
-
Скопируйте фалы дампа в каталог mongo/dump.
-
Войдите в контейнер mongo:
docker exec -it mongo sh
Выполните следующую команду, чтобы развернуть дамп базы database_name:
mongorestore -d database_name /dump/databases/database_name
Как вариант, мы предлагаем установить почтовый сервер iredmail.
Он использует базу данных mariadb и разворачивается в docker контейнере.
Как вариант, мы предлагаем установить почтовый сервер poste.io в бесплатной версии.
Он легко и быстро разворачивается в docker контейнере и почти не требует настроек.
В его состав входят:
- SQLite - User database, easy backup, no running daemon,
- Dovecot - IMAP and POP3 email server,
- NGiNX - Fast web server for administration and webmail client,
- Haraka - A modern, high performance, flexible SMTP server,
- RSPAMD - Spam detection,
- ClamAV - Antivirus engine,
- Roundcube - Webmail client,
- Z-Push - OS implementation of Active Sync and Push.
Установка и настройка происходит из папки poste.
Все необходимые настройки содержатся в файле .env. Управление контейнером производится через docker-compose.
Mailcow — это почтовый сервер который разворачивается в docker контейнере и требует минимум настройки. Maicow состоит из Dovecot, ClamAV, Solr, Oletools, Memcached, Redis, MariaDB, Unbound, PHP, Postfix, ACME, Nginx, Rspamd, SOGo, Netfilter.
В этом репозитории нет файлов для Mailcow, потому что вся установка и настройка происходит из официального репозитория.
Подробнее см. соответствующий раздел.
Устанавливать mailcow необходимо от пользователя root. Подключаемся к серверу под root пользователем, либо выполняем следующую команду
sudo su
Для установки нам дополнительно потребуется пакет docker-compose-plugin
apt install docker-compose-plugin
Переходим в папку opt и клонируем репозиторий mailcow и переходим в папку mailcow-dockerized
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
Запускаем генерацию файла конфигурации
./generate_config.sh
Во время генерации конфигурационного файла у нас будет запрошено доменное имя на котором будет находится система mailcow, советуем вам создать на вашем домене поддомен для почты и указать его. Mailcow просит указать имя домена в формате FQDN, а это значит, что точка на конце обязательна. Например
mail.example.com.
Также потребуется указать часовую зону в формате
Europe/Moscow
Если на вашем сервере памяти меньше чем 2.5GB скрипт предложит вам отключить ClamAV
Сгенерированный файл конфигурации находится в файле mailcow.conf. При необходимости вы можете его отредактировать.
Для установки выполняем следующие команды
docker compose pull
docker compose up -d
После установки переходим в админ панель которая находится по адресу https://mail.example.com, либо если вы меняли порт в файле конфигурации то добавляем его в конце доменного имени.
Стандартный логин admin, пароль moohoo. После первого входа в обязательном порядке меняем пароль у пользователя admin.
Для добавления нового почтового домена, переходим в в раздел Configuration — Mail Setup и нажимаем на зеленую кнопку + Add Domain
Указываем доменное имя, по желанию добавляем описание и тэг для почты. При добавлении нового доменного имени обязательно нужно перегружать контейнер SOGo, для этого предусмотрена отдельная кнопка Add domain and restart SOGo, нажимаем ее.
Для создания почтовых ящиков, переходим во вкладку Mailboxes и создаем почтовый ящик нажав на кнопку Add mailbox.
После добавления почтового адреса перейдем в webmail и отправим наше первое письмо. Для входа в Webmail вверху нажимаем на App и выбираем Webmail.
Вводим логин, пароль и попадаем в почтовый веб-интерфейс.
Mailcow устанавливается с поддержкой ipv6 и для того чтобы ее отключить, необходимо отредактировать файл docker-compose.yml. В данном файле находим строку enable_ipv6 и меняем значение на false:
networks:
mailcow-network:
...
enable_ipv6: false
Для работы Mailcow вам необходимо добавить следующие DNS записи для вашего домена
# Name Type Value
mail IN A 1.2.3.4
autodiscover IN CNAME mail.example.com. (your ${MAILCOW_HOSTNAME})
autoconfig IN CNAME mail.example.com. (your ${MAILCOW_HOSTNAME})
@ IN MX 10 mail.example.com. (your ${MAILCOW_HOSTNAME})
Так же необходимо добавить SPF запись указав в ней IP вашего сервера
@ IN TXT "v=spf1 mx a SERVER_IP -all"
И указать DKIM запись которая доступна в панели управления Mailcow в разделе Configuration — Configuration & Details — ARC/DKIM keys
dkim._domainkey IN TXT "v=DKIM1; k=rsa; t=s; s=email; p=..."
Установим необходимые пакеты
sudo apt update
sudo apt install \
ca-certificates \
curl \
gnupg \
lsb-release
Добавим GPG ключ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Добавим стабильный репозиторий Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Обновим пакеты и установим Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
Для того, чтобы разрабатывать параллельно несколько проектов, можно пойти двумя путями:
- создать несколько копий server, каждая для своего проекта,
- создать общую среду разработки для проектов.
В первом случае вам придется назначать разные порты для сервисов, чтобы они не конфликтовали между собой.
Во втором случае вам понадобится лишь изменить структуру каталогов и внести правки в файл конфигурации nginx и в файл hosts.
Мы рекомендуем использовать второй вариант. Также именно под этот вариант составлен весь раздел.
Если вы хотите использовать первый вариант, здесь нет никаких проблем - просто пропустите данный раздел. Используйте установку сервера каждый раз заново для каждого нового прокта.
Все проекты будут лежать в каталоге projects.
Если server уже был развернут в каталоге каждого проекта, вы можете перенести его вверх из одного проекта, а во всех остальных - удалить.
Например, раньше было:
├── project1
│ └── server
│ └── projects
├── project2
│ └── server
│ └── projects
...
Теперь должно стать:
└── server
└── projects
├── project1
├── project2
...
Для каждого проекта вам нужно будет создать свой файл конфигурации сервера:
data/conf.d/nginx.http.conf
Как настроить файл hosts, подробно описано здесь: Хосты.
Адрес будет тот же самый: 127.0.0.1, а вот имя хоста должно соответствовать именам каталогов ваших проектов.
Согласно примеру выше, файл должен содержать такие строки:
127.0.0.1 my-project-first.test
127.0.0.1 my-project-second.test
Вывод проектов через node.js на порты с 8080.
http://localhost:8080 http://localhost:8081
Вывод статики из каталога "./public/" через сервер nginx + php-fpm на 80 порт, согласно имени проекта.
http://my-project-first.test http://my-project-second.test
Базы данных и прочие сервисы общие для каждого проекта и работают на указанных портах.
Например, phpMyAdmin работает на 8810 порту.
Adminer работает на 8800 порту.
Все сервисы управляются через общий докер. Конфликтов между сервисами нет.