Инструкция по запуску с Docker Compose
1. Установка и запуск
Подготовка
Убедитесь, что у вас установлен container runtime - docker и плагин docker-compose
docker -v
docker compose
Если runtime не установлен, установите для своей ОС, например
curl -L https://get.docker.com | sh
sudo usermod -aG docker $USER
sudo reboot
Данный скрипт также установит актуальный docker-compose
Шаг 1: Создание docker-compose.yml
Вам нужно создать файл docker-compose.yml, который определяет, как будет работать ваш контейнер,
включая проброс портов, использование конфигурационных файлов и переменных окружения. Пример файла:
version: "3.9"
services:
pve-proxyer:
image: harbor.service.it-pvk.ru/pvk-proxyer/pvk-proxyer:latest
# рекомендуется использовать тэг lattest так как он содержит
# релизную стабильную сборку,
# для использования пред-релизной сборки используйте другой тэг
container_name: pve-proxyer
ports:
- "7621:7621" # Проброс порта для основного приложения данный порт должен соответствовать порту в конфигурации
volumes:
- ./conf.yml:/app/conf.yml:ro # Монтируем конфигурационный файл
- ./pk.pem:/app/pk.pem:ro # Монтируем сертификат, если необходим
environment:
- PYTHONUNBUFFERED=1 # Устанавливаем переменную окружения
restart: always # Автоматический рестарт контейнера при сбое
Шаг 2: Запуск Docker Compose
После того как файл docker-compose.yml создан, запустите его с помощью команды:
docker compose up -d --build
Эта команда соберет и запустит контейнеры в фоновом режиме. Если образ был уже загружен, он будет использован без пересборки.
Шаг 3: Проверка работы контейнера
Чтобы убедиться, что контейнер работает корректно, выполните:
docker compose ps
Эта команда покажет статус контейнеров. Убедитесь, что ваш контейнер в статусе Up.
Если вам необходимо проверить логи контейнера - выполните
docker logs <container-id>
Шаг 4: Остановка контейнера
Если нужно остановить контейнеры, используйте команду:
docker compose down
или
docker compose down -v
последняя команда также удалит монтирование из контейнера
2. Необходимые файлы для работы
Docker compose
docker-compose.yml
version: "3.9"
services:
pve-proxy:
image: harbor.service.it-pvk.ru/pvk-proxyer/pvk-proxyer:latest
ports:
- "7621:7621" # Порт для вашего основного приложения
volumes:
- ./conf.yml:/app/conf.yml:ro # Монтируем конфиг
- ./pk.pem:/app/pk.pem:ro # Монтируем сертификат
environment:
- PYTHONUNBUFFERED=1
restart: always
Конфигурация
conf.yml
— конфигурационный файл, который содержит настройки для вашего приложения.
Пример:
site:
base_url: "https://api.prostodar.ru" # Сервис, куда необходимо проксировать запросы
service:
app_port: 7621 # Порт открываемый для проксирования - по этому порту необходимо сделать проброс портов из сервиса
fields:
partnerName: false #Список полей где true - шифрование необходимо
partnerPassword: true #Список полей где true - шифрование необходимо
requestId: true #Список полей где true - шифрование необходимо
operatorCode: true #Список полей где true - шифрование необходимо
# и другие поля...
encrypt:
cert_file: "*.pem" # Путь к файлу сертификата для публичного ключа
logging:
level: "DEBUG" # Уровень логирования сервиса
debug_mode: # Шифрование ответа (Отключите для продакшен-окружения)
raw: False
3. Как и какие запросы отправлять на сервис
Данный сервис, запущенный в Docker, выполняет роль прокси, который:
1. принимает HTTP-запросы на выделенный порт
2. модифицирует их по определенным правилам
3. шифрует поля, если это необходимо по conf.yml
4. перенаправляет запросы на целевой сервис (base_url)
5. получения ответа от целевого сервиса (base_url)
6. прокси парсит и отправляет его обратно клиенту
Пример запроса в прокси Получение данных от сервиса (например, баланс)
Нам необходимо отправить запрос на
https://api.prostodar.ru/partner/get_balance/
Для данного кейса файл конфигурации будет следующим
site:
base_url: "https://api.prostodar.ru"
service:
app_port: 7621
fields:
partnerName: false #Список полей где true
partnerPassword: true #Список полей где true
requestId: true #Список полей где true
operatorCode: true #Список полей где true
# и другие поля...
encrypt:
cert_file: "*.pem"
logging:
level: "DEBUG"
debug_mode:
raw: False
Следовательно, сервис, который должен обращаться к api.prostodar.ru, будет обращаться к
http://<proxy_ip>:7621
И запрос будет выглядеть следующим образом
Метод: POST
URL: http://localhost:7621/partner/get_balance/
Тело запроса (JSON):
{
"partnerName":"login",
"partnerPassword":"password",
"useAuthByCert":"Y"
}
ЛИБО в query
Метод: POST
URL: http://localhost:7621/partner/get_balance/?partnerName=login&partnerPassword=password&useAuthByCert=Y
В этом примере запрос содержит данные, которые отправляются прокси-сервису. Прокси проверяет, какие поля необходимо зашифровать (например, если user_id требует шифрования) и шифрует их. Затем прокси отправляет запрос на целевой сервис, подменяя домен в запросе.
Ответ от прокси-сервиса (JSON):
{
"status": "OK",
"balance": "15000"
}
Прокси получает ответ от целевого сервиса, парсит его и отправляет обратно клиенту в формате JSON.