Установка
Docker Compose
Пошаговая инструкция по установке и настройке сервиса через Docker Compose
Подготовка сервера
Создайте директорию проекта
mkdir -p /var/www/html/konkurs/
cd /var/www/html/konkurs/
Обновите список пакетов и установите Docker
apt update && apt install -y docker.io
apt-get update && apt-get install -y docker.io
Установите Docker Compose
Определите последнюю версию автоматически или укажите конкретную:
COMVER=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
COMVER=v2.29.7
Загрузите и установите бинарный файл:
curl -L "https://github.com/docker/compose/releases/download/$COMVER/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose version
Убедитесь, что версия Docker Compose 2.20 или выше. Более ранние версии могут не поддерживать используемые возможности конфигурации.
Настройка Docker daemon
Создайте конфигурационный файл Docker daemon:
mkdir -p /etc/docker
nano /etc/docker/daemon.json
Содержимое файла daemon.json:
{
"mtu": 1450,
"bip": "10.10.0.1/16",
"default-address-pools": [{
"base": "10.0.0.0/8",
"size": 16
}],
"data-root": "/opt/docker",
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Параметр
mtu: 1450 рекомендуется для облачных сред (OpenStack, Yandex Cloud и др.), где MTU канала может быть меньше стандартного. Если Платформа разворачивается на bare-metal — можно использовать значение 1500.Перезапустите Docker для применения настроек:
systemctl restart docker
Конфигурация Docker Compose
Файл docker-compose.yml
Создайте файл docker-compose.yml в директории проекта:
nano docker-compose.yml
name: 'konkurs'
services:
konkurs-client:
image: qubeek.gitlab.yandexcloud.net:5050/competitions.qubeek.io/application/client:latest
env_file:
- .env.konkurs.client
tmpfs:
- /tmp
networks:
- net
healthcheck:
test: ["CMD-SHELL", "nc -z localhost 3000"]
interval: 10s
timeout: 5s
retries: 5
konkurs-api:
image: qubeek.gitlab.yandexcloud.net:5050/competitions.qubeek.io/application/api:latest
env_file:
- .env
volumes:
- konkurs-api-storage:/var/www/html/public
- konkurs-storage:/var/www/html/storage/app/public/
- konkurs-dumps:/var/www/html/storage/app/private/competitions/
- konkurs-logs:/var/www/html/storage/logs/
networks:
- net
healthcheck:
test: ["CMD-SHELL", "nc -z localhost 80"]
start_period: 5s
interval: 5s
timeout: 5s
retries: 5
konkurs-nginx:
container_name: konkurs-nginx
restart: unless-stopped
image: nginx:alpine
volumes:
- konkurs-api-storage:/var/www/html/api-storage
- konkurs-storage:/var/www/html/storage
- /var/www/html/konkurs/nginx.conf:/etc/nginx/nginx.conf:ro
- /var/www/html/konkurs/nginx:/etc/nginx/conf.d
ports:
- "81:80"
networks:
- net
konkurs-pgsql:
image: postgres:17-alpine
container_name: konkurs-pgsql
env_file:
- .env
environment:
POSTGRES_DB: '${DB_DATABASE}'
POSTGRES_USER: '${DB_USERNAME}'
POSTGRES_PASSWORD: '${DB_PASSWORD}'
POSTGRES_MAX_CONNECTIONS: 200
volumes:
- konkurs_postgres_data:/var/lib/postgresql/data
ports:
- "127.0.0.1:7432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U '${DB_USERNAME}' -d '${DB_DATABASE}'"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
restart: unless-stopped
networks:
- net
konkurs-valkey:
image: 'valkey/valkey:7-alpine'
container_name: konkurs-valkey
volumes:
- konkurs-valkey-data:/data
networks:
- net
healthcheck:
test:
- CMD
- valkey-cli
- ping
retries: 3
timeout: 5s
konkurs-meilisearch:
image: getmeili/meilisearch:latest
container_name: konkurs-meilisearch
environment:
MEILI_NO_ANALYTICS: '${MEILISEARCH_NO_ANALYTICS:-false}'
volumes:
- konkurs_meilisearch_data:/meili_data
networks:
- net
healthcheck:
test:
- CMD
- wget
- '--no-verbose'
- '--spider'
- 'http://127.0.0.1:7700/health'
retries: 3
timeout: 5s
networks:
net:
external: true
volumes:
konkurs_postgres_data:
konkurs-valkey-data:
konkurs_meilisearch_data:
konkurs-api-storage:
driver: local
driver_opts:
o: bind
type: none
device: /var/www/html/konkurs/konkurs-api-storage
konkurs-storage:
driver: local
driver_opts:
o: bind
type: none
device: /var/www/html/konkurs/konkurs-storage
konkurs-dumps:
driver: local
driver_opts:
o: bind
type: none
device: /var/www/html/konkurs/konkurs-dumps
konkurs-logs:
driver: local
driver_opts:
o: bind
type: none
device: /var/www/html/konkurs/konkurs-logs
Описание сервисов
| Сервис | Образ | Назначение |
|---|---|---|
konkurs-client | application/client | Фронтенд-приложение (Nuxt) |
konkurs-api | application/api | Бэкенд API (Laravel) |
konkurs-nginx | nginx:alpine | Обратный прокси, раздача статики |
konkurs-pgsql | postgres:17-alpine | База данных PostgreSQL |
konkurs-valkey | valkey/valkey:7-alpine | Кэширование и очереди (Redis-совместимый) |
konkurs-meilisearch | getmeili/meilisearch | Полнотекстовый поиск |
Создание env-файлов и директорий
Создайте файлы окружения
nano .env
nano .env.konkurs.client
Описание параметров .env см. в разделе Конфигурация.
Создайте директории для томов
mkdir -p /var/www/html/konkurs/konkurs-api-storage/
mkdir -p /var/www/html/konkurs/konkurs-storage/
mkdir -p /var/www/html/konkurs/konkurs-dumps/
mkdir -p /var/www/html/konkurs/konkurs-logs/
mkdir -p /var/log/nginx/
Настройка Nginx
Создайте директорию и файл конфигурации:
mkdir -p nginx
nano nginx/defaults.conf
После изменения конфигурации Nginx обязательно проверьте синтаксис перед перезагрузкой, чтобы не уронить работающий сервис.
Проверка и перезагрузка:
docker-compose exec -T konkurs-nginx nginx -t
docker-compose exec -T konkurs-nginx nginx -s reload
Авторизация в Docker-реестре
Если образы размещены в приватном реестре, выполните авторизацию:
docker login <адрес-реестра> -u <пользователь> -p <токен>
После авторизации загрузите все образы:
docker-compose pull
Токен доступа к реестру предоставляется администратором. Не передавайте его третьим лицам и не сохраняйте в открытом виде в файлах конфигурации.