Docker configure
This commit is contained in:
10
.dockerignore
Normal file
10
.dockerignore
Normal file
@@ -0,0 +1,10 @@
|
||||
_build/
|
||||
build/
|
||||
deps/
|
||||
logs/
|
||||
Mnesia.*
|
||||
.git/
|
||||
.gitignore
|
||||
*.log
|
||||
*.dump
|
||||
.DS_Store
|
||||
58
Makefile
58
Makefile
@@ -192,20 +192,64 @@ release: ## Собрать релиз
|
||||
@$(REBAR3) as prod release
|
||||
@echo "✓ Релиз собран в _build/prod/rel/eventhub/"
|
||||
|
||||
# ============================================================================
|
||||
# DOCKER
|
||||
# ============================================================================
|
||||
docker-build: ## Собрать Docker образ
|
||||
@echo "Сборка Docker образа..."
|
||||
@docker build -t eventhub:latest .
|
||||
@echo "✓ Docker образ собран"
|
||||
@docker build -f docker/Dockerfile -t eventhub:latest .
|
||||
@echo "✅ Docker образ собран"
|
||||
|
||||
docker-run: ## Запустить Docker контейнер
|
||||
docker-build-debug: ## Собрать Docker образ
|
||||
@echo "Сборка Docker образа..."
|
||||
@docker build -f docker/Debug.Dockerfile -t eventhub-debug:latest .
|
||||
@echo "✅ Docker образ собран"
|
||||
|
||||
|
||||
docker-run: ## Запустить Docker контейнер (одиночный)
|
||||
@echo "Запуск Docker контейнера..."
|
||||
@docker run -p 8080:8080 -p 8445:8445 --name eventhub eventhub:latest
|
||||
@docker run -d \
|
||||
--name eventhub \
|
||||
-p 8080:8080 \
|
||||
-p 8081:8081 \
|
||||
-p 8445:8445 \
|
||||
-p 8446:8446 \
|
||||
-v eventhub-data:/app/data \
|
||||
eventhub:latest
|
||||
@echo "✅ Контейнер запущен на http://localhost:8080"
|
||||
|
||||
docker-stop: ## Остановить Docker контейнер
|
||||
@echo "Остановка Docker контейнера..."
|
||||
@docker stop eventhub || true
|
||||
@docker rm eventhub || true
|
||||
@echo "✓ Контейнер остановлен"
|
||||
@docker stop eventhub 2>/dev/null || true
|
||||
@docker rm eventhub 2>/dev/null || true
|
||||
@echo "✅ Контейнер остановлен"
|
||||
|
||||
docker-logs: ## Показать логи Docker контейнера
|
||||
@docker logs -f eventhub
|
||||
|
||||
docker-shell: ## Зайти в Docker контейнер
|
||||
@docker exec -it eventhub sh
|
||||
|
||||
docker-compose-up: ## Запустить кластер (3 ноды)
|
||||
@echo "Запуск кластера EventHub (3 ноды)..."
|
||||
@docker-compose -f docker/docker-compose.yml up -d
|
||||
@echo "✅ Кластер запущен"
|
||||
@echo "Node 1: http://localhost:8080"
|
||||
@echo "Node 2: http://localhost:8082"
|
||||
@echo "Node 3: http://localhost:8084"
|
||||
|
||||
docker-compose-down: ## Остановить кластер
|
||||
@echo "Остановка кластера..."
|
||||
@docker-compose -f docker/docker-compose.yml down
|
||||
@echo "✅ Кластер остановлен"
|
||||
|
||||
docker-compose-logs: ## Показать логи кластера
|
||||
@docker-compose -f docker/docker-compose.yml logs -f
|
||||
|
||||
docker-clean: docker-stop ## Очистить Docker образы и volumes
|
||||
@docker rmi eventhub:latest 2>/dev/null || true
|
||||
@docker volume rm eventhub-data 2>/dev/null || true
|
||||
@echo "✅ Docker очищен"
|
||||
|
||||
# ============================================================================
|
||||
# UTILITIES
|
||||
|
||||
38
docker/Debug.Dockerfile
Normal file
38
docker/Debug.Dockerfile
Normal file
@@ -0,0 +1,38 @@
|
||||
# ============================================================
|
||||
# Одноэтапный Dockerfile (сборка и рантайм в одном образе)
|
||||
# ============================================================
|
||||
FROM erlang:28-alpine
|
||||
|
||||
# Устанавливаем инструменты для сборки и runtime-зависимости
|
||||
RUN apk add --no-cache \
|
||||
# для сборки
|
||||
git curl make gcc musl-dev \
|
||||
rust cargo openssl-dev libsodium-dev \
|
||||
# для рантайма
|
||||
openssl libstdc++ libgcc ncurses-libs
|
||||
|
||||
# Рабочая директория
|
||||
WORKDIR /app
|
||||
|
||||
# Копируем конфигурацию и исходники
|
||||
COPY rebar.config ./
|
||||
COPY include/ include/
|
||||
COPY src/ src/
|
||||
COPY src/config/sys.config ./config/sys.config
|
||||
|
||||
# Собираем зависимости и релиз
|
||||
RUN rebar3 get-deps && \
|
||||
rebar3 as prod release
|
||||
|
||||
# Создаём директорию для данных
|
||||
RUN mkdir -p /app/data && chmod 777 /app/data
|
||||
|
||||
# Настраиваем порты
|
||||
EXPOSE 8080 8081 8445 8446
|
||||
|
||||
# Переменные окружения
|
||||
ENV RELX_REPLACE_OS_VARS=true
|
||||
ENV MNESIA_DIR=/app/data
|
||||
|
||||
# Запускаем приложение из собранного релиза
|
||||
CMD ["/app/_build/prod/rel/eventhub/bin/eventhub", "foreground"]
|
||||
44
docker/Dockerfile
Normal file
44
docker/Dockerfile
Normal file
@@ -0,0 +1,44 @@
|
||||
# ============================================================
|
||||
# Этап 1: Сборка
|
||||
# ============================================================
|
||||
FROM erlang:28-alpine AS builder
|
||||
|
||||
RUN apk add --no-cache \
|
||||
git curl make gcc musl-dev \
|
||||
rust cargo openssl-dev libsodium-dev
|
||||
|
||||
WORKDIR /app
|
||||
COPY rebar.config ./
|
||||
RUN rebar3 lock || true
|
||||
RUN rebar3 get-deps
|
||||
|
||||
COPY include/ include/
|
||||
COPY src/ src/
|
||||
|
||||
# Копируем sys.config из src/config/ в config/
|
||||
COPY src/config/sys.config ./config/sys.config
|
||||
|
||||
RUN rebar3 as prod release
|
||||
RUN rebar3 as prod tar
|
||||
RUN mkdir -p /app/release && \
|
||||
tar -xzf _build/prod/rel/eventhub/eventhub-*.tar.gz -C /app/release
|
||||
|
||||
# ============================================================
|
||||
# Этап 2: Финальный образ
|
||||
# ============================================================
|
||||
FROM alpine:3.20
|
||||
|
||||
RUN apk add --no-cache openssl libstdc++ libgcc ncurses-libs libsodium
|
||||
COPY --from=builder /app/release /app
|
||||
COPY --from=builder /usr/lib/libcrypto.* /usr/lib/
|
||||
COPY --from=builder /usr/lib/libssl.* /usr/lib/
|
||||
|
||||
RUN mkdir -p /app/data && chmod 777 /app/data
|
||||
|
||||
WORKDIR /app
|
||||
EXPOSE 8080 8081 8445 8446
|
||||
|
||||
ENV RELX_REPLACE_OS_VARS=true
|
||||
ENV MNESIA_DIR=/app/data
|
||||
|
||||
CMD ["/app/bin/eventhub", "foreground"]
|
||||
86
docker/docker-compose.yml
Normal file
86
docker/docker-compose.yml
Normal file
@@ -0,0 +1,86 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
eventhub-node1:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile
|
||||
container_name: eventhub-node1
|
||||
ports:
|
||||
- "8080:8080"
|
||||
- "8081:8081"
|
||||
- "8445:8445"
|
||||
- "8446:8446"
|
||||
environment:
|
||||
- NODE_NAME=eventhub-node1@eventhub-node1
|
||||
- HTTP_PORT=8080
|
||||
- WS_PORT=8081
|
||||
- ADMIN_HTTP_PORT=8445
|
||||
- ADMIN_WS_PORT=8446
|
||||
- MNESIA_DIR=/app/data
|
||||
volumes:
|
||||
- eventhub-node1-data:/app/data
|
||||
networks:
|
||||
- eventhub-net
|
||||
restart: unless-stopped
|
||||
|
||||
eventhub-node2:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile
|
||||
container_name: eventhub-node2
|
||||
ports:
|
||||
- "8082:8080"
|
||||
- "8083:8081"
|
||||
- "8447:8445"
|
||||
- "8448:8446"
|
||||
environment:
|
||||
- NODE_NAME=eventhub-node2@eventhub-node2
|
||||
- HTTP_PORT=8080
|
||||
- WS_PORT=8081
|
||||
- ADMIN_HTTP_PORT=8445
|
||||
- ADMIN_WS_PORT=8446
|
||||
- MNESIA_DIR=/app/data
|
||||
- JOIN_NODES=eventhub-node1@eventhub-node1
|
||||
volumes:
|
||||
- eventhub-node2-data:/app/data
|
||||
networks:
|
||||
- eventhub-net
|
||||
depends_on:
|
||||
- eventhub-node1
|
||||
restart: unless-stopped
|
||||
|
||||
eventhub-node3:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile
|
||||
container_name: eventhub-node3
|
||||
ports:
|
||||
- "8084:8080"
|
||||
- "8085:8081"
|
||||
- "8449:8445"
|
||||
- "8450:8446"
|
||||
environment:
|
||||
- NODE_NAME=eventhub-node3@eventhub-node3
|
||||
- HTTP_PORT=8080
|
||||
- WS_PORT=8081
|
||||
- ADMIN_HTTP_PORT=8445
|
||||
- ADMIN_WS_PORT=8446
|
||||
- MNESIA_DIR=/app/data
|
||||
- JOIN_NODES=eventhub-node1@eventhub-node1
|
||||
volumes:
|
||||
- eventhub-node3-data:/app/data
|
||||
networks:
|
||||
- eventhub-net
|
||||
depends_on:
|
||||
- eventhub-node1
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
eventhub-node1-data:
|
||||
eventhub-node2-data:
|
||||
eventhub-node3-data:
|
||||
|
||||
networks:
|
||||
eventhub-net:
|
||||
driver: bridge
|
||||
8
docker/docker-entrypoint.sh
Normal file
8
docker/docker-entrypoint.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
# Создаём директорию Mnesia, если не существует
|
||||
mkdir -p ${MNESIA_DIR}
|
||||
|
||||
# Запускаем приложение
|
||||
exec /app/bin/eventhub foreground
|
||||
10
rebar.config
10
rebar.config
@@ -18,11 +18,19 @@
|
||||
{relx, [
|
||||
{release, {eventhub, "0.0.1"}, [eventhub, sasl]},
|
||||
{dev_mode, true},
|
||||
{include_erts, false},
|
||||
{include_erts, true},
|
||||
{extended_start_script, true}
|
||||
]}.
|
||||
|
||||
{profiles, [
|
||||
{prod, [
|
||||
{relx, [
|
||||
{release, {eventhub, "0.0.1"}, [eventhub, sasl]},
|
||||
{include_erts, true},
|
||||
{extended_start_script, true},
|
||||
{sys_config, "./src/config/sys.config"}
|
||||
]}
|
||||
]},
|
||||
{test, [
|
||||
{erl_opts, [debug_info, {i, "include"}, {d, 'TEST'}]},
|
||||
{src_dirs, ["src", "test/unit"]},
|
||||
|
||||
@@ -4,11 +4,10 @@
|
||||
{ws_port, 8081},
|
||||
{admin_http_port, 8445},
|
||||
{admin_ws_port, 8446},
|
||||
{jwt_secret, <<"my-super-secret-key-for-jwt-32-bytes!">>},
|
||||
{argon2_params, #{t_cost => 2, m_cost => 19, parallelism => 1}}
|
||||
{jwt_secret, <<"${JWT_SECRET:-change_me_in_production}">>}
|
||||
]},
|
||||
{mnesia, [
|
||||
{dir, "Mnesia.${NODE}"}
|
||||
{dir, "${MNESIA_DIR:-Mnesia.${NODE}}"}
|
||||
]},
|
||||
{kernel, [
|
||||
{logger_level, info},
|
||||
|
||||
Reference in New Issue
Block a user