Add Essence 520 minimal DB, configs, and login/game Docker profile.

This commit is contained in:
test
2026-05-18 12:54:47 +03:00
parent a4a3a2aa09
commit 6fdbc9b103
21 changed files with 438 additions and 172 deletions
+49 -87
View File
@@ -1,6 +1,5 @@
#!/usr/bin/env bash
# Интерактивное управление: остановка, запуск, перезапуск Docker-сервисов проекта.
# Запуск: chmod +x manage.sh && ./manage.sh
# Управление: PostgreSQL + Login/Game (Essence 520, profile l2).
set -euo pipefail
@@ -13,10 +12,10 @@ YELLOW='\033[1;33m'
NC='\033[0m'
ENV_FILE="$SCRIPT_DIR/.env"
PROFILE_PLACEHOLDER=(--profile placeholder)
# Имена из docker-compose.yml (для надёжной проверки состояния)
PROFILE_L2=(--profile l2)
PG_CONTAINER="l2_postgres"
L2_CONTAINER="l2_server_placeholder"
LOGIN_CONTAINER="l2_login"
GAME_CONTAINER="l2_game"
read_env_val() {
local key="$1"
@@ -50,144 +49,107 @@ step_header() {
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
}
require_cmd() {
command -v "$1" >/dev/null 2>&1
}
ensure_docker() {
if ! require_cmd docker || ! docker compose version >/dev/null 2>&1; then
err "Нужны Docker и плагин «docker compose». Установите через ./install.sh"
if ! command -v docker >/dev/null 2>&1 || ! docker compose version >/dev/null 2>&1; then
err "Нужны Docker и docker compose. Запустите ./install.sh"
exit 1
fi
if ! docker info >/dev/null 2>&1; then
err "Docker недоступен (sudo или перелогин после группы docker)."
err "Docker недоступен."
exit 1
fi
}
ensure_env() {
if [[ ! -f "$ENV_FILE" ]]; then
err "Нет файла .env. Сначала выполните ./install.sh"
err "Нет .env. Сначала ./install.sh"
exit 1
fi
}
postgres_running() {
[[ "$(docker inspect -f '{{.State.Running}}' "$PG_CONTAINER" 2>/dev/null || echo false)" == "true" ]]
container_running() {
[[ "$(docker inspect -f '{{.State.Running}}' "$1" 2>/dev/null || echo false)" == "true" ]]
}
l2_running() {
[[ "$(docker inspect -f '{{.State.Running}}' "$L2_CONTAINER" 2>/dev/null || echo false)" == "true" ]]
}
postgres_running() { container_running "$PG_CONTAINER"; }
login_running() { container_running "$LOGIN_CONTAINER"; }
game_running() { container_running "$GAME_CONTAINER"; }
# --- Шаг 0 ---
step_header "Шаг 0 — Управление сервером (Docker Compose)"
echo "Проект: PostgreSQL 17 + опционально l2-server (profile placeholder)."
step_header "Шаг 0 — Essence 520 (PostgreSQL + Login/Game)"
if ! ask_yes_no "Продолжить?" "y"; then
info "Выход."
exit 0
fi
ensure_docker
ensure_env
# --- Шаг 1: статус ---
step_header "Шаг 1 — Текущий статус"
step_header "Шаг 1Статус"
if ask_yes_no "Показать docker compose ps?" "y"; then
docker compose "${PROFILE_PLACEHOLDER[@]}" ps -a || true
docker compose ps -a || true
docker compose "${PROFILE_L2[@]}" ps -a 2>/dev/null || true
fi
# --- Шаг 2: остановка ---
step_header "Шаг 2 — Остановка"
if ask_yes_no "Остановить контейнер l2-server (если был запущен с profile placeholder)?" "n"; then
docker compose "${PROFILE_PLACEHOLDER[@]}" stop l2-server 2>/dev/null || warn "l2-server не остановлен (возможно не запускался)."
if ask_yes_no "Остановить game и login (profile l2)?" "n"; then
docker compose "${PROFILE_L2[@]}" stop game login 2>/dev/null || true
fi
if ask_yes_no "Остановить только PostgreSQL (docker compose stop postgres)?" "n"; then
docker compose stop postgres 2>/dev/null || warn "PostgreSQL уже остановлен или не создавался."
if ask_yes_no "Остановить PostgreSQL?" "n"; then
docker compose stop postgres 2>/dev/null || true
fi
if ask_yes_no "Полная остановка проекта: docker compose down (все сервисы, сеть; тома БД не удаляются)?" "n"; then
docker compose "${PROFILE_PLACEHOLDER[@]}" down
info "Контейнеры остановлены. Данные БД в томе postgres_data сохранены."
if ask_yes_no "docker compose down (все сервисы, том БД сохраняется)?" "n"; then
docker compose "${PROFILE_L2[@]}" down
docker compose down
fi
if ask_yes_no "Удалить том с данными PostgreSQL (docker compose down -v)? ОПАСНО: потеря БД." "n"; then
warn "Будет выполнено: docker compose --profile placeholder down -v"
if ask_yes_no "Точно удалить тома?" "n"; then
docker compose "${PROFILE_PLACEHOLDER[@]}" down -v
info "Тома удалены."
else
info "Отмена удаления томов."
if ask_yes_no "Удалить том БД (down -v)? ОПАСНО." "n"; then
if ask_yes_no "Точно удалить?" "n"; then
docker compose "${PROFILE_L2[@]}" down -v
docker compose down -v
fi
fi
# --- Шаг 3: запуск ---
step_header "Шаг 3 — Запуск"
if ask_yes_no "Запустить / обновить PostgreSQL (up -d postgres)?" "n"; then
if ask_yes_no "Запустить PostgreSQL?" "n"; then
docker compose up -d postgres
info "Ожидание pg_isready..."
EV_USER="$(read_env_val POSTGRES_USER)"
EV_DB="$(read_env_val POSTGRES_DB)"
for _ in $(seq 1 60); do
if docker compose exec -T postgres pg_isready -U "$EV_USER" -d "$EV_DB" >/dev/null 2>&1; then
break
fi
docker compose exec -T postgres pg_isready -U "$EV_USER" -d "$EV_DB" >/dev/null 2>&1 && break
sleep 1
done
fi
if ask_yes_no "Запустить l2-server (placeholder, нужен здоровый PostgreSQL)?" "n"; then
if ! postgres_running; then
warn "PostgreSQL не запущен. Сначала поднимите postgres."
if ask_yes_no "Запустить login + game (profile l2)?" "n"; then
if postgres_running; then
docker compose "${PROFILE_L2[@]}" up -d login game
else
docker compose "${PROFILE_PLACEHOLDER[@]}" up -d l2-server
warn "Сначала поднимите postgres."
fi
fi
# --- Шаг 4: перезапуск ---
step_header "Шаг 4 — Перезапуск"
if ask_yes_no "Перезапустить PostgreSQL (restart postgres)?" "n"; then
if ask_yes_no "Перезапустить PostgreSQL?" "n"; then
if postgres_running; then
docker compose restart postgres
info "PostgreSQL перезапущен."
else
warn "PostgreSQL не в состоянии running. Выполняю up -d postgres."
docker compose up -d postgres
fi
fi
if ask_yes_no "Перезапустить l2-server (restart l2-server)?" "n"; then
if l2_running; then
docker compose "${PROFILE_PLACEHOLDER[@]}" restart l2-server
info "l2-server перезапущен."
else
warn "l2-server не запущен. Пропуск."
fi
if ask_yes_no "Перезапустить login?" "n"; then
login_running && docker compose "${PROFILE_L2[@]}" restart login || warn "login не запущен."
fi
if ask_yes_no "Перезапустить весь стек: сначала down, затем up postgres (+ опционально l2)?" "n"; then
docker compose "${PROFILE_PLACEHOLDER[@]}" down
if ask_yes_no "Перезапустить game?" "n"; then
game_running && docker compose "${PROFILE_L2[@]}" restart game || warn "game не запущен."
fi
if ask_yes_no "Полный перезапуск: down → postgres → login → game?" "n"; then
docker compose "${PROFILE_L2[@]}" down
docker compose down
docker compose up -d postgres
EV_USER="$(read_env_val POSTGRES_USER)"
EV_DB="$(read_env_val POSTGRES_DB)"
for _ in $(seq 1 60); do
if docker compose exec -T postgres pg_isready -U "$EV_USER" -d "$EV_DB" >/dev/null 2>&1; then
break
fi
sleep 1
done
if ask_yes_no "Сразу поднять l2-server (placeholder)?" "n"; then
docker compose "${PROFILE_PLACEHOLDER[@]}" up -d l2-server
fi
info "Стек перезапущен."
sleep 3
docker compose "${PROFILE_L2[@]}" up -d login game
fi
# --- Итог ---
step_header "Готово"
if ask_yes_no "Показать итоговый статус?" "y"; then
docker compose "${PROFILE_PLACEHOLDER[@]}" ps -a || true
if ask_yes_no "Показать статус?" "y"; then
docker compose ps -a
docker compose "${PROFILE_L2[@]}" ps -a 2>/dev/null || true
fi
info "Логи: docker compose logs -f postgres"
info "Выход из проекта без удаления томов: docker compose --profile placeholder down"
info "Логи: docker compose logs -f login game postgres"