From 3ba862914675ae5ef5a471d94c9794043bafa90a Mon Sep 17 00:00:00 2001 From: mirivlad Date: Tue, 14 Apr 2026 16:20:01 +0800 Subject: [PATCH] unify config: single .env.example, default password mirvmon2026, docker in README - .env.example moved to project root (used by both Docker and manual install) - Migration 007: admin password = mirvmon2026 (bcrypt hash) - docker-compose.yml reads ../.env from root - deploy.sh generates DB passwords, shows default admin password - README.md updated with Docker install section (Variant A) and manual (Variant B) - Consistent default credentials everywhere: admin/mirvmon2026 Co-authored-by: Qwen-Coder --- .env.example | 40 +++ README.md | 350 +++++++--------------- docker/.env.example | 13 +- docker/deploy.sh | 47 +-- docker/docker-compose.yml | 6 +- docker/migrations/007_seed_admin_user.sql | 6 +- 6 files changed, 194 insertions(+), 268 deletions(-) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2537f8d --- /dev/null +++ b/.env.example @@ -0,0 +1,40 @@ +# ========================================== +# MirvMon — Environment Configuration +# ========================================== +# Скопируйте: cp .env.example .env +# Этот файл используется и для Docker, и для ручной установки. + +# ------------------------------------------ +# Приложение +# ------------------------------------------ +APP_PORT=8080 +APP_TIMEZONE=Asia/Irkutsk + +# ------------------------------------------ +# База данных +# ------------------------------------------ +# Для Docker: всё поднимается автоматически +# Для ручной: убедитесь что БД и пользователь созданы +DB_HOST=localhost +DB_PORT=3306 +DB_NAME=monitoring_system +DB_USERNAME=mon_user +DB_PASSWORD=mon_password_123 +DB_ROOT_PASSWORD=root_password_change_me + +# ------------------------------------------ +# Уведомления — Email (опционально) +# ------------------------------------------ +# SMTP_HOST=smtp.gmail.com +# SMTP_PORT=587 +# SMTP_USERNAME=your@email.com +# SMTP_PASSWORD=your_app_password +# SMTP_ENCRYPTION=tls +# SMTP_FROM_EMAIL=your@email.com + +# ------------------------------------------ +# Уведомления — Telegram (опционально) +# ------------------------------------------ +# TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 +# TELEGRAM_CHAT_ID=-1001234567890 +# TELEGRAM_PROXY=http://127.0.0.1:1081 diff --git a/README.md b/README.md index 4e152f4..ee65fb2 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,15 @@ # 🖥️ mirvmon — Система мониторинга серверов -> Лёгкая и функциональная система мониторинга для домашних и небольших серверных инфраструктур. +> Лёгкая и функциональная система мониторинга для домашних и небольших серверных + инфраструктур. [![PHP](https://img.shields.io/badge/PHP-8.3+-777BB4.svg)](https://php.net) -[![Slim](https://img.shields.io/badge/Slim-4.x-3399FF.svg)](https://www.slimframework.com) -[![MariaDB](https://img.shields.io/badge/MariaDB-10.11-003545.svg)](https://mariadb.org) -[![Chart.js](https://img.shields.io/badge/Chart.js-4.x-FF6384.svg)](https://www.chartjs.org) +[![Slim](https://img.shields.io/badge/Slim-4.x-3399FF.svg)](https://www.slimfram +ework.com) +[![MariaDB](https://img.shields.io/badge/MariaDB-10.11-003545.svg)](https://mari +adb.org) +[![Chart.js](https://img.shields.io/badge/Chart.js-4.x-FF6384.svg)](https://www. +chartjs.org) --- @@ -21,6 +25,112 @@ --- +## 🚀 Установка + +### Вариант A: Docker (рекомендуется) + +Самый быстрый способ — всё поднимается автоматически: + +```bash +# 1. Клонируем +git clone https://git.mirv.top/mirivlad/mirvmon.git +cd mirvmon + +# 2. Запускаем скрипт (сам поставит Docker, сгенерит пароли, поднимет) +cd docker && bash deploy.sh + +# 3. Открываем браузер +# http://localhost:8080 +# Логин: admin +# Пароль: mirvmon2026 (смените сразу!) +``` + +**Ручной Docker (без скрипта):** + +```bash +git clone https://git.mirv.top/mirivlad/mirvmon.git +cd mirvmon + +cp .env.example .env # меняем пароли +docker compose -f docker/docker-compose.yml up -d --build +``` + +**При обновлении:** + +```bash +git pull +docker compose -f docker/docker-compose.yml up -d --build +``` + +> 📦 Код внутри Docker-образа (immutable). Данные БД в volume `db_data` — не теряются. + +--- + +### Вариант B: Ручная установка + +#### 1. Зависимости + +```bash +apt install php8.3 php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-curl nginx mariadb-server +composer install +``` + +#### 2. База данных + +```bash +mysql -u root -p <= 5.0` -- `requests >= 2.25` -- `systemd` (для сбора статусов сервисов) - ---- - -## 🔒 Безопасность - -- ✅ Все пароли хешируются через `password_hash()` (bcrypt) -- ✅ Токены агентов хранятся как SHA-256 хеши -- ✅ Подготовленные выражения (PDO) для всех SQL-запросов -- ✅ CSRF-токены для всех форм -- ✅ Сессионная аутентификация для веб-интерфейса -- ✅ Валидация и санитизация входных данных - ---- - -## 📝 Лицензия - -MIT - ---- - -## 👤 Автор - -Владимир (mirivlad) — [git.mirv.top](https://git.mirv.top/mirivlad/mirvmon) diff --git a/docker/.env.example b/docker/.env.example index 4691b2f..2537f8d 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,7 +1,8 @@ # ========================================== # MirvMon — Environment Configuration # ========================================== -# Скопируйте этот файл в .env и заполните значения +# Скопируйте: cp .env.example .env +# Этот файл используется и для Docker, и для ручной установки. # ------------------------------------------ # Приложение @@ -12,17 +13,15 @@ APP_TIMEZONE=Asia/Irkutsk # ------------------------------------------ # База данных # ------------------------------------------ +# Для Docker: всё поднимается автоматически +# Для ручной: убедитесь что БД и пользователь созданы +DB_HOST=localhost +DB_PORT=3306 DB_NAME=monitoring_system DB_USERNAME=mon_user DB_PASSWORD=mon_password_123 DB_ROOT_PASSWORD=root_password_change_me -# ------------------------------------------ -# Пользователь веб-интерфейса (первый запуск) -# ------------------------------------------ -ADMIN_USERNAME=admin -ADMIN_PASSWORD=admin_change_me - # ------------------------------------------ # Уведомления — Email (опционально) # ------------------------------------------ diff --git a/docker/deploy.sh b/docker/deploy.sh index b4bfe82..6832c41 100755 --- a/docker/deploy.sh +++ b/docker/deploy.sh @@ -1,6 +1,7 @@ #!/bin/bash # deploy.sh — Быстрый разворот MirvMon на чистом сервере -# Использование: bash deploy.sh +# Использование: cd docker/ && bash deploy.sh +# Все файлы .env лежат в корне проекта (../.env) set -e @@ -26,27 +27,32 @@ echo "✅ Compose: $($DOCKER_COMPOSE_CMD version 2>/dev/null || echo 'v1')" echo "" # ------------------------------------------ -# 2. Создаём .env если нет +# 2. Определяем пути # ------------------------------------------ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" +ENV_FILE="$PROJECT_DIR/.env" +ENV_EXAMPLE="$SCRIPT_DIR/.env.example" -if [ ! -f "$SCRIPT_DIR/.env" ]; then +# ------------------------------------------ +# 3. Создаём .env если нет +# ------------------------------------------ +if [ ! -f "$ENV_FILE" ]; then echo "📝 Creating .env from template..." - cp "$SCRIPT_DIR/.env.example" "$SCRIPT_DIR/.env" - + cp "$ENV_EXAMPLE" "$ENV_FILE" + # Генерируем случайные пароли ROOT_PASS=$(openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 20) DB_PASS=$(openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 20) ADMIN_PASS=$(openssl rand -base64 16 | tr -dc 'a-zA-Z0-9' | head -c 20) - - sed -i "s/DB_ROOT_PASSWORD=.*/DB_ROOT_PASSWORD=${ROOT_PASS}/" "$SCRIPT_DIR/.env" - sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${DB_PASS}/" "$SCRIPT_DIR/.env" - sed -i "s/ADMIN_PASSWORD=.*/ADMIN_PASSWORD=${ADMIN_PASS}/" "$SCRIPT_DIR/.env" - + + sed -i "s/DB_ROOT_PASSWORD=.*/DB_ROOT_PASSWORD=${ROOT_PASS}/" "$ENV_FILE" + sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${DB_PASS}/" "$ENV_FILE" + echo "🔐 Generated random passwords:" echo " DB root: $ROOT_PASS" echo " DB user: $DB_PASS" - echo " Admin web: $ADMIN_PASS" + echo " Admin web: mirvmon2026 (по умолчанию, смени в настройках)" echo "" echo "⚠️ Save these! Change .env if you want custom passwords." else @@ -55,25 +61,28 @@ fi echo "" # ------------------------------------------ -# 3. Запускаем +# 4. Запускаем из директории проекта # ------------------------------------------ echo "📦 Building and starting services..." -$DOCKER_COMPOSE_CMD up -d --build +cd "$PROJECT_DIR" +$DOCKER_COMPOSE_CMD -f docker/docker-compose.yml up -d --build echo "" echo "⏳ Waiting for migrations..." -sleep 10 +sleep 15 # Проверяем статус -$DOCKER_COMPOSE_CMD ps +$DOCKER_COMPOSE_CMD -f docker/docker-compose.yml ps + +APP_PORT=$(grep APP_PORT "$ENV_FILE" | head -1 | cut -d= -f2) echo "" echo "✅ MirvMon is running!" echo "" -echo "🌐 Web UI: http://localhost:$(grep APP_PORT .env | cut -d= -f2)" +echo "🌐 Web UI: http://localhost:${APP_PORT:-8080}" echo "👤 Login: admin" -echo "🔑 Password: $(grep ADMIN_PASSWORD .env | cut -d= -f2)" +echo "🔑 Password: mirvmon2026" echo "" -echo "📊 To check logs: $DOCKER_COMPOSE_CMD logs -f app" -echo "🔧 To stop: $DOCKER_COMPOSE_CMD down" +echo "📊 To check logs: $DOCKER_COMPOSE_CMD -f docker/docker-compose.yml logs -f app" +echo "🔧 To stop: $DOCKER_COMPOSE_CMD -f docker/docker-compose.yml down" echo "" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7f21c27..5b633a3 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -5,7 +5,9 @@ services: dockerfile: docker/Dockerfile restart: unless-stopped env_file: - - .env + - ../.env + environment: + DB_HOST: db depends_on: db: condition: service_healthy @@ -18,7 +20,7 @@ services: image: nginx:alpine restart: unless-stopped ports: - - "${APP_PORT:-80}:80" + - "${APP_PORT:-8080}:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro depends_on: diff --git a/docker/migrations/007_seed_admin_user.sql b/docker/migrations/007_seed_admin_user.sql index 90b6cb2..ad050c2 100644 --- a/docker/migrations/007_seed_admin_user.sql +++ b/docker/migrations/007_seed_admin_user.sql @@ -1,10 +1,8 @@ -- 007: Создаём админа по умолчанию (если нет ни одного пользователя) +-- Пароль: mirvmon2026 (обязательно смените при первом входе!) --- Пароль: admin (нужно сменить при первом входе!) --- Хеш генерируется через password_hash('admin', PASSWORD_DEFAULT) --- Это хеш от 'admin' — смените сразу после входа! INSERT INTO users (username, password_hash, email, role) -SELECT 'admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin@localhost', 'admin' +SELECT 'admin', '$2b$12$13ox46bUsmmrG2o0eEktEuUG90HI8hgC9cqnbOecx9J.NXXn5rTRW', 'admin@localhost', 'admin' WHERE NOT EXISTS (SELECT 1 FROM users LIMIT 1); -- Создаём настройки уведомлений для админа