feat: enhance Ansible playbook and Nginx configuration with authentication and logrotate setup
- Added environment variables for project configuration in env.template. - Updated Ansible playbook to use environment variables for project settings and added tasks for monitoring authentication setup. - Enhanced Nginx configuration for Alertmanager and Prometheus with HTTP Basic Authentication. - Introduced logrotate configuration for managing log files and set up cron for daily execution. - Removed obsolete Uptime Kuma docker-compose file.
This commit is contained in:
127
MONITORING_AUTH.md
Normal file
127
MONITORING_AUTH.md
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
# 🔐 Авторизация для мониторинга
|
||||||
|
|
||||||
|
## Что было добавлено
|
||||||
|
|
||||||
|
Добавлена HTTP Basic Authentication для следующих сервисов мониторинга:
|
||||||
|
|
||||||
|
- **Prometheus** (`/prometheus/`) - метрики и мониторинг
|
||||||
|
- **Alertmanager** (`/alerts/` и `/api/v1/`) - управление алертами
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
### 1. Автоматическая настройка через Ansible
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Развертывание с паролями по умолчанию
|
||||||
|
ansible-playbook -i infra/ansible/inventory.ini infra/ansible/playbook.yml
|
||||||
|
|
||||||
|
# Развертывание с кастомными паролями
|
||||||
|
ansible-playbook -i infra/ansible/inventory.ini infra/ansible/playbook.yml \
|
||||||
|
-e monitoring_username=myuser \
|
||||||
|
-e monitoring_password=mypassword
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Ручная настройка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Настроить авторизацию
|
||||||
|
make auth-setup
|
||||||
|
|
||||||
|
# Добавить пользователя
|
||||||
|
make auth-add-user USER=admin
|
||||||
|
|
||||||
|
# Добавить еще одного пользователя
|
||||||
|
make auth-add-user USER=operator
|
||||||
|
```
|
||||||
|
|
||||||
|
## Управление пользователями
|
||||||
|
|
||||||
|
### Добавление пользователя
|
||||||
|
```bash
|
||||||
|
make auth-add-user USER=username
|
||||||
|
```
|
||||||
|
|
||||||
|
### Сброс пароля
|
||||||
|
```bash
|
||||||
|
make auth-reset USER=username
|
||||||
|
```
|
||||||
|
|
||||||
|
### Просмотр пользователей
|
||||||
|
```bash
|
||||||
|
make auth-list
|
||||||
|
```
|
||||||
|
|
||||||
|
## Доступ к сервисам
|
||||||
|
|
||||||
|
После настройки авторизации:
|
||||||
|
|
||||||
|
- **Prometheus**: `https://your-server/prometheus/`
|
||||||
|
- **Alertmanager**: `https://your-server/alerts/`
|
||||||
|
- **Alertmanager API**: `https://your-server/api/v1/`
|
||||||
|
|
||||||
|
При первом обращении браузер запросит логин и пароль.
|
||||||
|
|
||||||
|
## Health Check endpoints
|
||||||
|
|
||||||
|
Следующие endpoints остаются доступными без авторизации:
|
||||||
|
|
||||||
|
- `https://your-server/prometheus/-/healthy` - проверка состояния Prometheus
|
||||||
|
- `https://your-server/nginx-health` - проверка состояния nginx
|
||||||
|
|
||||||
|
## Файлы конфигурации
|
||||||
|
|
||||||
|
### Nginx конфигурации
|
||||||
|
- `infra/nginx/conf.d/prometheus.conf` - авторизация для Prometheus
|
||||||
|
- `infra/nginx/conf.d/alertmanager.conf` - авторизация для Alertmanager
|
||||||
|
|
||||||
|
### Ansible
|
||||||
|
- `infra/ansible/playbook.yml` - автоматическая настройка авторизации
|
||||||
|
- `infra/ansible/group_vars/all.yml` - переменные по умолчанию
|
||||||
|
|
||||||
|
### Скрипты
|
||||||
|
- `scripts/generate_auth_passwords.sh` - генерация паролей
|
||||||
|
- `infra/nginx/AUTH_SETUP.md` - подробная документация
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
- Пароли хранятся в зашифрованном виде в `/etc/nginx/passwords/monitoring.htpasswd`
|
||||||
|
- Файл доступен только для чтения пользователю root и группе www-data
|
||||||
|
- Используется HTTPS для всех соединений
|
||||||
|
- Настроена защита от брутфорса через fail2ban
|
||||||
|
|
||||||
|
## Устранение проблем
|
||||||
|
|
||||||
|
### Проверка конфигурации nginx
|
||||||
|
```bash
|
||||||
|
sudo nginx -t
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка файла паролей
|
||||||
|
```bash
|
||||||
|
make auth-list
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка логов
|
||||||
|
```bash
|
||||||
|
sudo tail -f /var/log/nginx/error.log
|
||||||
|
sudo tail -f /var/log/nginx/access.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Перезапуск nginx
|
||||||
|
```bash
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
## Переменные Ansible
|
||||||
|
|
||||||
|
В файле `infra/ansible/group_vars/all.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
monitoring_username: "admin" # Имя пользователя по умолчанию
|
||||||
|
monitoring_password: "admin123" # Пароль по умолчанию
|
||||||
|
```
|
||||||
|
|
||||||
|
Можно переопределить через:
|
||||||
|
- Переменные окружения
|
||||||
|
- `--extra-vars` в ansible-playbook
|
||||||
|
- Vault файлы для безопасного хранения паролей
|
||||||
38
Makefile
38
Makefile
@@ -1,4 +1,4 @@
|
|||||||
.PHONY: help build up down logs clean restart status deploy backup restore update clean-monitoring monitoring check-deps check-bot-deps check-anonBot-deps
|
.PHONY: help build up down logs clean restart status deploy backup restore update clean-monitoring monitoring check-deps check-bot-deps check-anonBot-deps auth-setup auth-add-user auth-reset
|
||||||
|
|
||||||
help: ## Показать справку
|
help: ## Показать справку
|
||||||
@echo "🏗️ Production Infrastructure - Доступные команды:"
|
@echo "🏗️ Production Infrastructure - Доступные команды:"
|
||||||
@@ -114,7 +114,7 @@ clean: ## Очистить все контейнеры и образы
|
|||||||
|
|
||||||
clean-monitoring: ## Очистить только данные мониторинга
|
clean-monitoring: ## Очистить только данные мониторинга
|
||||||
docker-compose down -v
|
docker-compose down -v
|
||||||
docker volume rm prod_prometheus_data prod_grafana_data 2>/dev/null || true
|
docker volume rm prod_prometheus_data prod_grafana_data prod_uptime_kuma_data prod_alertmanager_data 2>/dev/null || true
|
||||||
|
|
||||||
security-scan: ## Сканировать образы на уязвимости
|
security-scan: ## Сканировать образы на уязвимости
|
||||||
@echo "🔍 Scanning Docker images for vulnerabilities..."
|
@echo "🔍 Scanning Docker images for vulnerabilities..."
|
||||||
@@ -295,3 +295,37 @@ monitoring-all: ## Открыть все мониторинг сервисы
|
|||||||
@echo " - Uptime Kuma: http://localhost:3001"
|
@echo " - Uptime Kuma: http://localhost:3001"
|
||||||
@echo " - Alertmanager: http://localhost:9093"
|
@echo " - Alertmanager: http://localhost:9093"
|
||||||
@open http://localhost:3000 || xdg-open http://localhost:3000 || echo "Please open manually"
|
@open http://localhost:3000 || xdg-open http://localhost:3000 || echo "Please open manually"
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# 🔐 АВТОРИЗАЦИЯ МОНИТОРИНГА
|
||||||
|
# ========================================
|
||||||
|
|
||||||
|
auth-setup: ## Настроить авторизацию для мониторинга
|
||||||
|
@echo "🔐 Setting up monitoring authentication..."
|
||||||
|
@sudo mkdir -p /etc/nginx/passwords
|
||||||
|
@sudo cp scripts/generate_auth_passwords.sh /usr/local/bin/generate_auth_passwords.sh
|
||||||
|
@sudo chmod +x /usr/local/bin/generate_auth_passwords.sh
|
||||||
|
@echo "✅ Authentication setup complete!"
|
||||||
|
@echo "💡 Use 'make auth-add-user' to add users"
|
||||||
|
|
||||||
|
auth-add-user: ## Добавить пользователя для мониторинга (make auth-add-user USER=username)
|
||||||
|
@if [ -z "$(USER)" ]; then \
|
||||||
|
echo "❌ Please specify USER: make auth-add-user USER=username"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
@echo "🔐 Adding user $(USER) for monitoring..."
|
||||||
|
@sudo /usr/local/bin/generate_auth_passwords.sh $(USER)
|
||||||
|
@echo "✅ User $(USER) added successfully!"
|
||||||
|
|
||||||
|
auth-reset: ## Сбросить пароль для пользователя (make auth-reset USER=username)
|
||||||
|
@if [ -z "$(USER)" ]; then \
|
||||||
|
echo "❌ Please specify USER: make auth-reset USER=username"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
@echo "🔐 Resetting password for user $(USER)..."
|
||||||
|
@sudo htpasswd /etc/nginx/passwords/monitoring.htpasswd $(USER)
|
||||||
|
@echo "✅ Password reset for user $(USER)!"
|
||||||
|
|
||||||
|
auth-list: ## Показать список пользователей мониторинга
|
||||||
|
@echo "👥 Monitoring users:"
|
||||||
|
@sudo cat /etc/nginx/passwords/monitoring.htpasswd 2>/dev/null | cut -d: -f1 || echo "❌ No users found"
|
||||||
|
|||||||
22
env.template
22
env.template
@@ -27,3 +27,25 @@ SERVER_IP=your_server_ip_here
|
|||||||
|
|
||||||
# Status Page Configuration
|
# Status Page Configuration
|
||||||
STATUS_PAGE_PASSWORD=admin123
|
STATUS_PAGE_PASSWORD=admin123
|
||||||
|
|
||||||
|
# Ansible Configuration (for one-time server setup)
|
||||||
|
# Основные настройки проекта
|
||||||
|
PROJECT_ROOT=/home/prod
|
||||||
|
DEPLOY_USER=deploy
|
||||||
|
DEPLOY_UID=1001
|
||||||
|
DEPLOY_GID=1001
|
||||||
|
|
||||||
|
# Старый сервер для миграции
|
||||||
|
OLD_SERVER=root@77.223.98.129
|
||||||
|
|
||||||
|
# Настройки мониторинга для Ansible
|
||||||
|
MONITORING_USERNAME=admin
|
||||||
|
MONITORING_PASSWORD=admin123
|
||||||
|
|
||||||
|
# SSL настройки
|
||||||
|
USE_LETSENCRYPT=false
|
||||||
|
|
||||||
|
# Logrotate настройки
|
||||||
|
LOGROTATE_RETENTION_DAYS=30
|
||||||
|
LOGROTATE_COMPRESS=true
|
||||||
|
LOGROTATE_DELAYCOMPRESS=true
|
||||||
|
|||||||
@@ -5,18 +5,23 @@
|
|||||||
|
|
||||||
vars:
|
vars:
|
||||||
# Основная директория проекта
|
# Основная директория проекта
|
||||||
project_root: "/home/prod"
|
project_root: "{{ lookup('env', 'PROJECT_ROOT') | default('/home/prod') }}"
|
||||||
# Пользователь и группа
|
# Пользователь и группа
|
||||||
deploy_user: "deploy"
|
deploy_user: "{{ lookup('env', 'DEPLOY_USER') | default('deploy') }}"
|
||||||
uid: "1001"
|
uid: "{{ lookup('env', 'DEPLOY_UID') | default('1001') }}"
|
||||||
gid: "1001"
|
gid: "{{ lookup('env', 'DEPLOY_GID') | default('1001') }}"
|
||||||
# Старый сервер для копирования данных
|
# Старый сервер для копирования данных
|
||||||
old_server: "root@77.223.98.129"
|
old_server: "{{ lookup('env', 'OLD_SERVER') | default('root@77.223.98.129') }}"
|
||||||
# Опция: пересоздавать папку /home/prod (по умолчанию — нет)
|
# Опция: пересоздавать папку /home/prod (по умолчанию — нет)
|
||||||
recreate_project: false
|
recreate_project: false
|
||||||
# Grafana настройки
|
# Grafana настройки
|
||||||
grafana_admin_user: "{{ lookup('env', 'GRAFANA_ADMIN_USER') | default('admin') }}"
|
grafana_admin_user: "{{ lookup('env', 'GRAFANA_ADMIN_USER') | default('admin') }}"
|
||||||
grafana_admin_password: "{{ lookup('env', 'GRAFANA_ADMIN_PASSWORD') | default('admin') }}"
|
grafana_admin_password: "{{ lookup('env', 'GRAFANA_ADMIN_PASSWORD') | default('admin') }}"
|
||||||
|
# Мониторинг настройки
|
||||||
|
monitoring_username: "{{ lookup('env', 'MONITORING_USERNAME') | default('admin') }}"
|
||||||
|
monitoring_password: "{{ lookup('env', 'MONITORING_PASSWORD') | default('admin123') }}"
|
||||||
|
# SSL настройки
|
||||||
|
use_letsencrypt: "{{ lookup('env', 'USE_LETSENCRYPT') | default('false') | lower == 'true' }}"
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
# ========================================
|
# ========================================
|
||||||
@@ -63,6 +68,7 @@
|
|||||||
- apache2-utils
|
- apache2-utils
|
||||||
- certbot
|
- certbot
|
||||||
- python3-certbot-nginx
|
- python3-certbot-nginx
|
||||||
|
- logrotate
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: "[1/10] Установить Python библиотеки для Ansible"
|
- name: "[1/10] Установить Python библиотеки для Ansible"
|
||||||
@@ -286,10 +292,10 @@
|
|||||||
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
|
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: "[4/10] Настроить sudo для deploy (только Docker команды)"
|
- name: "[4/10] Настроить sudo для deploy (все команды без пароля)"
|
||||||
lineinfile:
|
lineinfile:
|
||||||
path: /etc/sudoers.d/deploy
|
path: /etc/sudoers.d/deploy
|
||||||
line: "{{ deploy_user }} ALL=(ALL) NOPASSWD: /usr/bin/docker, /usr/bin/docker-compose, /usr/bin/make"
|
line: "{{ deploy_user }} ALL=(ALL) NOPASSWD: ALL"
|
||||||
create: yes
|
create: yes
|
||||||
mode: '0440'
|
mode: '0440'
|
||||||
validate: 'visudo -cf %s'
|
validate: 'visudo -cf %s'
|
||||||
@@ -613,9 +619,30 @@
|
|||||||
- "{{ project_root }}/infra/nginx/ssl"
|
- "{{ project_root }}/infra/nginx/ssl"
|
||||||
- "{{ project_root }}/infra/nginx/conf.d"
|
- "{{ project_root }}/infra/nginx/conf.d"
|
||||||
- "{{ project_root }}/infra/uptime-kuma"
|
- "{{ project_root }}/infra/uptime-kuma"
|
||||||
|
- "{{ project_root }}/infra/uptime-kuma/backup"
|
||||||
- "{{ project_root }}/infra/alertmanager"
|
- "{{ project_root }}/infra/alertmanager"
|
||||||
- "{{ project_root }}/infra/grafana/dashboards"
|
- "{{ project_root }}/infra/grafana/dashboards"
|
||||||
- "{{ project_root }}/scripts"
|
- "{{ project_root }}/scripts"
|
||||||
|
- /etc/nginx/passwords
|
||||||
|
|
||||||
|
- name: "[8/10] Скопировать скрипт генерации паролей"
|
||||||
|
copy:
|
||||||
|
src: "{{ project_root }}/scripts/generate_auth_passwords.sh"
|
||||||
|
dest: /usr/local/bin/generate_auth_passwords.sh
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0755'
|
||||||
|
remote_src: yes
|
||||||
|
|
||||||
|
- name: "[8/10] Создать файл паролей для мониторинга"
|
||||||
|
htpasswd:
|
||||||
|
path: /etc/nginx/passwords/monitoring.htpasswd
|
||||||
|
name: "{{ monitoring_username | default('admin') }}"
|
||||||
|
password: "{{ monitoring_password | default('admin123') }}"
|
||||||
|
owner: root
|
||||||
|
group: www-data
|
||||||
|
mode: '0640'
|
||||||
|
create: yes
|
||||||
|
|
||||||
- name: "[8/10] Сгенерировать самоподписанный SSL сертификат (fallback)"
|
- name: "[8/10] Сгенерировать самоподписанный SSL сертификат (fallback)"
|
||||||
command: >
|
command: >
|
||||||
@@ -865,6 +892,68 @@
|
|||||||
debug:
|
debug:
|
||||||
var: fail2ban_status.stdout_lines
|
var: fail2ban_status.stdout_lines
|
||||||
|
|
||||||
|
# ========================================
|
||||||
|
# ЭТАП 9.5: НАСТРОЙКА LOGROTATE (ROOT)
|
||||||
|
# ========================================
|
||||||
|
|
||||||
|
- name: "[9.5/10] Создать директорию для logrotate конфигураций"
|
||||||
|
file:
|
||||||
|
path: /etc/logrotate.d
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: "[9.5/10] Настроить logrotate для ботов"
|
||||||
|
template:
|
||||||
|
src: "{{ project_root }}/infra/logrotate/logrotate_bots.conf.j2"
|
||||||
|
dest: /etc/logrotate.d/bots
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
backup: yes
|
||||||
|
|
||||||
|
- name: "[9.5/10] Настроить logrotate для системных сервисов"
|
||||||
|
template:
|
||||||
|
src: "{{ project_root }}/infra/logrotate/logrotate_system.conf.j2"
|
||||||
|
dest: /etc/logrotate.d/system
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
backup: yes
|
||||||
|
|
||||||
|
- name: "[9.5/10] Создать директории для логов ботов"
|
||||||
|
file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ deploy_user }}"
|
||||||
|
group: "{{ deploy_user }}"
|
||||||
|
mode: '0755'
|
||||||
|
loop:
|
||||||
|
- "{{ project_root }}/bots/AnonBot/logs"
|
||||||
|
- "{{ project_root }}/bots/telegram-helper-bot/logs"
|
||||||
|
|
||||||
|
- name: "[9.5/10] Проверить конфигурацию logrotate"
|
||||||
|
command: logrotate -d /etc/logrotate.conf
|
||||||
|
register: logrotate_test
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: "[9.5/10] Показать результат проверки logrotate"
|
||||||
|
debug:
|
||||||
|
var: logrotate_test.stdout_lines
|
||||||
|
|
||||||
|
- name: "[9.5/10] Включить и запустить logrotate"
|
||||||
|
systemd:
|
||||||
|
name: logrotate
|
||||||
|
enabled: yes
|
||||||
|
state: started
|
||||||
|
|
||||||
|
- name: "[9.5/10] Настроить cron для ежедневного запуска logrotate"
|
||||||
|
cron:
|
||||||
|
name: "Logrotate daily"
|
||||||
|
job: "0 2 * * * /usr/sbin/logrotate /etc/logrotate.conf"
|
||||||
|
user: root
|
||||||
|
|
||||||
# ========================================
|
# ========================================
|
||||||
# ЭТАП 10: ЗАПУСК ПРИЛОЖЕНИЙ И ПРОВЕРКИ (DEPLOY + ROOT)
|
# ЭТАП 10: ЗАПУСК ПРИЛОЖЕНИЙ И ПРОВЕРКИ (DEPLOY + ROOT)
|
||||||
# ========================================
|
# ========================================
|
||||||
@@ -997,7 +1086,7 @@
|
|||||||
retries: 5
|
retries: 5
|
||||||
delay: 10
|
delay: 10
|
||||||
|
|
||||||
- name: "[10/10] Проверить доступность Prometheus через Nginx"
|
- name: "[10/10] Проверить доступность Prometheus через Nginx (health check без авторизации)"
|
||||||
uri:
|
uri:
|
||||||
url: "https://{{ ansible_host }}/prometheus/-/healthy"
|
url: "https://{{ ansible_host }}/prometheus/-/healthy"
|
||||||
method: GET
|
method: GET
|
||||||
@@ -1017,6 +1106,13 @@
|
|||||||
retries: 5
|
retries: 5
|
||||||
delay: 10
|
delay: 10
|
||||||
|
|
||||||
|
- name: "[10/10] Настроить Uptime Kuma мониторы"
|
||||||
|
copy:
|
||||||
|
src: "{{ project_root }}/infra/uptime-kuma/monitors.json"
|
||||||
|
dest: "/tmp/uptime-kuma-monitors.json"
|
||||||
|
mode: '0644'
|
||||||
|
when: ansible_connection == 'local'
|
||||||
|
|
||||||
- name: "[10/10] Проверить доступность Uptime Kuma через Nginx"
|
- name: "[10/10] Проверить доступность Uptime Kuma через Nginx"
|
||||||
uri:
|
uri:
|
||||||
url: "https://{{ ansible_host }}/status"
|
url: "https://{{ ansible_host }}/status"
|
||||||
@@ -1027,12 +1123,14 @@
|
|||||||
retries: 5
|
retries: 5
|
||||||
delay: 10
|
delay: 10
|
||||||
|
|
||||||
- name: "[10/10] Проверить доступность Alertmanager через Nginx"
|
- name: "[10/10] Проверить доступность Alertmanager через Nginx (с авторизацией)"
|
||||||
uri:
|
uri:
|
||||||
url: "https://{{ ansible_host }}/alertmanager/"
|
url: "https://{{ ansible_host }}/alerts/"
|
||||||
method: GET
|
method: GET
|
||||||
status_code: 200
|
status_code: 200
|
||||||
validate_certs: no
|
validate_certs: no
|
||||||
|
user: "{{ monitoring_username | default('admin') }}"
|
||||||
|
password: "{{ monitoring_password | default('admin123') }}"
|
||||||
register: alertmanager_nginx_health
|
register: alertmanager_nginx_health
|
||||||
retries: 5
|
retries: 5
|
||||||
delay: 10
|
delay: 10
|
||||||
|
|||||||
77
infra/logrotate/README.md
Normal file
77
infra/logrotate/README.md
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# Logrotate Configuration
|
||||||
|
|
||||||
|
Эта директория содержит конфигурационные файлы для автоматической ротации логов.
|
||||||
|
|
||||||
|
## Файлы
|
||||||
|
|
||||||
|
### `logrotate_bots.conf.j2`
|
||||||
|
Шаблон конфигурации для логов ботов и Docker контейнеров:
|
||||||
|
- Логи ботов в `{{ project_root }}/bots/*/logs/*.log`
|
||||||
|
- Stderr логи ботов в `{{ project_root }}/bots/*/bot_stderr.log`
|
||||||
|
- Docker контейнер логи в `/var/lib/docker/containers/*/*.log`
|
||||||
|
|
||||||
|
### `logrotate_system.conf.j2`
|
||||||
|
Шаблон конфигурации для системных сервисов:
|
||||||
|
- Nginx логи в `/var/log/nginx/*.log`
|
||||||
|
- Системные логи (syslog, mail, auth, cron и др.)
|
||||||
|
- Fail2ban логи
|
||||||
|
- Docker daemon логи
|
||||||
|
- Prometheus node exporter логи
|
||||||
|
|
||||||
|
## Переменные окружения
|
||||||
|
|
||||||
|
Конфигурации используют следующие переменные из `.env` файла:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Logrotate настройки
|
||||||
|
LOGROTATE_RETENTION_DAYS=30 # Количество дней хранения логов
|
||||||
|
LOGROTATE_COMPRESS=true # Сжатие старых логов
|
||||||
|
LOGROTATE_DELAYCOMPRESS=true # Отложенное сжатие
|
||||||
|
```
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
Эти шаблоны автоматически применяются при запуске Ansible playbook. Они создают конфигурационные файлы в `/etc/logrotate.d/` на сервере.
|
||||||
|
|
||||||
|
### Ручное применение
|
||||||
|
|
||||||
|
Если нужно применить конфигурации вручную:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Скопировать конфигурации
|
||||||
|
sudo cp logrotate_bots.conf.j2 /etc/logrotate.d/bots
|
||||||
|
sudo cp logrotate_system.conf.j2 /etc/logrotate.d/system
|
||||||
|
|
||||||
|
# Проверить конфигурацию
|
||||||
|
sudo logrotate -d /etc/logrotate.conf
|
||||||
|
|
||||||
|
# Принудительная ротация
|
||||||
|
sudo logrotate -f /etc/logrotate.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
## Настройки по умолчанию
|
||||||
|
|
||||||
|
- **Ежедневная ротация**: все логи ротируются каждый день
|
||||||
|
- **Сжатие**: старые логи сжимаются gzip
|
||||||
|
- **Хранение**: 30 дней (настраивается через переменную)
|
||||||
|
- **Автоматический перезапуск сервисов**: после ротации логов
|
||||||
|
|
||||||
|
## Структура логов
|
||||||
|
|
||||||
|
После настройки логи будут организованы следующим образом:
|
||||||
|
|
||||||
|
```
|
||||||
|
/var/log/
|
||||||
|
├── nginx/
|
||||||
|
│ ├── access.log
|
||||||
|
│ ├── access.log.1.gz
|
||||||
|
│ ├── error.log
|
||||||
|
│ └── error.log.1.gz
|
||||||
|
└── ...
|
||||||
|
|
||||||
|
{{ project_root }}/bots/*/logs/
|
||||||
|
├── bot.log
|
||||||
|
├── bot.log.1.gz
|
||||||
|
├── bot.log.2.gz
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
49
infra/logrotate/logrotate_bots.conf.j2
Normal file
49
infra/logrotate/logrotate_bots.conf.j2
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# Logrotate configuration for bot applications
|
||||||
|
# This file manages log rotation for all bot services
|
||||||
|
|
||||||
|
{{ project_root }}/bots/*/logs/*.log {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate {{ lookup('env', 'LOGROTATE_RETENTION_DAYS') | default('30') }}
|
||||||
|
{% if lookup('env', 'LOGROTATE_COMPRESS') | default('true') | lower == 'true' %}compress{% endif %}
|
||||||
|
{% if lookup('env', 'LOGROTATE_DELAYCOMPRESS') | default('true') | lower == 'true' %}delaycompress{% endif %}
|
||||||
|
notifempty
|
||||||
|
create 0644 {{ deploy_user }} {{ deploy_user }}
|
||||||
|
postrotate
|
||||||
|
# Restart bot services if they are running
|
||||||
|
if [ -f /home/{{ deploy_user }}/.docker-compose-pid ]; then
|
||||||
|
cd {{ project_root }} && docker-compose restart
|
||||||
|
fi
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
|
||||||
|
{{ project_root }}/bots/*/bot_stderr.log {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate {{ lookup('env', 'LOGROTATE_RETENTION_DAYS') | default('30') }}
|
||||||
|
{% if lookup('env', 'LOGROTATE_COMPRESS') | default('true') | lower == 'true' %}compress{% endif %}
|
||||||
|
{% if lookup('env', 'LOGROTATE_DELAYCOMPRESS') | default('true') | lower == 'true' %}delaycompress{% endif %}
|
||||||
|
notifempty
|
||||||
|
create 0644 {{ deploy_user }} {{ deploy_user }}
|
||||||
|
postrotate
|
||||||
|
# Restart bot services if they are running
|
||||||
|
if [ -f /home/{{ deploy_user }}/.docker-compose-pid ]; then
|
||||||
|
cd {{ project_root }} && docker-compose restart
|
||||||
|
fi
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker container logs
|
||||||
|
/var/lib/docker/containers/*/*.log {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0644 root root
|
||||||
|
postrotate
|
||||||
|
# Reload Docker daemon
|
||||||
|
systemctl reload docker
|
||||||
|
endscript
|
||||||
|
}
|
||||||
100
infra/logrotate/logrotate_system.conf.j2
Normal file
100
infra/logrotate/logrotate_system.conf.j2
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# Logrotate configuration for system services
|
||||||
|
# This file manages log rotation for system services
|
||||||
|
|
||||||
|
# Nginx logs
|
||||||
|
/var/log/nginx/*.log {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate {{ lookup('env', 'LOGROTATE_RETENTION_DAYS') | default('30') }}
|
||||||
|
{% if lookup('env', 'LOGROTATE_COMPRESS') | default('true') | lower == 'true' %}compress{% endif %}
|
||||||
|
{% if lookup('env', 'LOGROTATE_DELAYCOMPRESS') | default('true') | lower == 'true' %}delaycompress{% endif %}
|
||||||
|
notifempty
|
||||||
|
create 0644 www-data adm
|
||||||
|
sharedscripts
|
||||||
|
postrotate
|
||||||
|
if [ -f /var/run/nginx.pid ]; then
|
||||||
|
kill -USR1 `cat /var/run/nginx.pid`
|
||||||
|
fi
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
|
||||||
|
# System logs
|
||||||
|
/var/log/syslog {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0644 syslog adm
|
||||||
|
postrotate
|
||||||
|
/usr/lib/rsyslog/rsyslog-rotate
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
|
||||||
|
/var/log/mail.info
|
||||||
|
/var/log/mail.warn
|
||||||
|
/var/log/mail.err
|
||||||
|
/var/log/mail.log
|
||||||
|
/var/log/daemon.log
|
||||||
|
/var/log/kern.log
|
||||||
|
/var/log/auth.log
|
||||||
|
/var/log/user.log
|
||||||
|
/var/log/lpr.log
|
||||||
|
/var/log/cron.log
|
||||||
|
/var/log/debug
|
||||||
|
/var/log/messages {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0644 syslog adm
|
||||||
|
sharedscripts
|
||||||
|
postrotate
|
||||||
|
/usr/lib/rsyslog/rsyslog-rotate
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fail2ban logs
|
||||||
|
/var/log/fail2ban.log {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0644 root root
|
||||||
|
postrotate
|
||||||
|
systemctl reload fail2ban
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker daemon logs
|
||||||
|
/var/log/docker.log {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0644 root root
|
||||||
|
postrotate
|
||||||
|
systemctl reload docker
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
|
||||||
|
# Prometheus node exporter logs
|
||||||
|
/var/log/prometheus-node-exporter.log {
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
rotate 7
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0644 prometheus prometheus
|
||||||
|
postrotate
|
||||||
|
systemctl reload prometheus-node-exporter
|
||||||
|
endscript
|
||||||
|
}
|
||||||
104
infra/nginx/AUTH_SETUP.md
Normal file
104
infra/nginx/AUTH_SETUP.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# Настройка авторизации для мониторинга
|
||||||
|
|
||||||
|
## Обзор
|
||||||
|
|
||||||
|
Добавлена HTTP Basic Authentication для следующих сервисов:
|
||||||
|
- **Prometheus** (`/prometheus/`) - метрики и мониторинг
|
||||||
|
- **Alertmanager** (`/alerts/` и `/api/v1/`) - управление алертами
|
||||||
|
|
||||||
|
## Управление паролями
|
||||||
|
|
||||||
|
### Автоматическая настройка через Ansible
|
||||||
|
|
||||||
|
При развертывании через Ansible пароли настраиваются автоматически:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Использовать пароли по умолчанию
|
||||||
|
ansible-playbook -i inventory.ini playbook.yml
|
||||||
|
|
||||||
|
# Задать свои пароли
|
||||||
|
ansible-playbook -i inventory.ini playbook.yml \
|
||||||
|
-e monitoring_username=myuser \
|
||||||
|
-e monitoring_password=mypassword
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ручная настройка
|
||||||
|
|
||||||
|
1. **Создать файл паролей:**
|
||||||
|
```bash
|
||||||
|
sudo mkdir -p /etc/nginx/passwords
|
||||||
|
sudo htpasswd -c /etc/nginx/passwords/monitoring.htpasswd admin
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Добавить дополнительных пользователей:**
|
||||||
|
```bash
|
||||||
|
sudo htpasswd /etc/nginx/passwords/monitoring.htpasswd username
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Установить правильные права:**
|
||||||
|
```bash
|
||||||
|
sudo chown root:www-data /etc/nginx/passwords/monitoring.htpasswd
|
||||||
|
sudo chmod 640 /etc/nginx/passwords/monitoring.htpasswd
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Перезапустить nginx:**
|
||||||
|
```bash
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование скрипта генерации
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сгенерировать пароль для пользователя admin
|
||||||
|
sudo /usr/local/bin/generate_auth_passwords.sh admin
|
||||||
|
|
||||||
|
# Сгенерировать пароль для другого пользователя
|
||||||
|
sudo /usr/local/bin/generate_auth_passwords.sh myuser
|
||||||
|
```
|
||||||
|
|
||||||
|
## Доступ к сервисам
|
||||||
|
|
||||||
|
После настройки авторизации доступ к сервисам:
|
||||||
|
|
||||||
|
- **Prometheus**: `https://your-server/prometheus/`
|
||||||
|
- **Alertmanager**: `https://your-server/alerts/`
|
||||||
|
- **Alertmanager API**: `https://your-server/api/v1/`
|
||||||
|
|
||||||
|
При первом обращении браузер запросит логин и пароль.
|
||||||
|
|
||||||
|
## Health Check endpoints
|
||||||
|
|
||||||
|
Следующие endpoints остаются доступными без авторизации для мониторинга:
|
||||||
|
|
||||||
|
- `https://your-server/prometheus/-/healthy` - проверка состояния Prometheus
|
||||||
|
- `https://your-server/nginx-health` - проверка состояния nginx
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
- Пароли хранятся в зашифрованном виде в файле `/etc/nginx/passwords/monitoring.htpasswd`
|
||||||
|
- Файл доступен только для чтения пользователю root и группе www-data
|
||||||
|
- Используется HTTPS для всех соединений
|
||||||
|
- Настроена защита от брутфорса через fail2ban
|
||||||
|
|
||||||
|
## Устранение проблем
|
||||||
|
|
||||||
|
### Проверка конфигурации nginx
|
||||||
|
```bash
|
||||||
|
sudo nginx -t
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка файла паролей
|
||||||
|
```bash
|
||||||
|
sudo cat /etc/nginx/passwords/monitoring.htpasswd
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка логов nginx
|
||||||
|
```bash
|
||||||
|
sudo tail -f /var/log/nginx/error.log
|
||||||
|
sudo tail -f /var/log/nginx/access.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Сброс пароля
|
||||||
|
```bash
|
||||||
|
sudo htpasswd /etc/nginx/passwords/monitoring.htpasswd admin
|
||||||
|
```
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
# Alertmanager Nginx Configuration
|
# Alertmanager Nginx Configuration
|
||||||
# Proxies requests to Alertmanager
|
# Proxies requests to Alertmanager
|
||||||
|
|
||||||
# Alertmanager location
|
# Alertmanager location with authentication
|
||||||
location /alerts/ {
|
location /alerts/ {
|
||||||
|
# HTTP Basic Authentication
|
||||||
|
auth_basic "Alertmanager Monitoring";
|
||||||
|
auth_basic_user_file /etc/nginx/passwords/monitoring.htpasswd;
|
||||||
|
|
||||||
# Rate limiting
|
# Rate limiting
|
||||||
limit_req zone=api burst=10 nodelay;
|
limit_req zone=api burst=10 nodelay;
|
||||||
|
|
||||||
@@ -31,8 +35,12 @@ location /alerts/ {
|
|||||||
add_header X-Content-Type-Options "nosniff" always;
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Alertmanager API
|
# Alertmanager API with authentication
|
||||||
location /api/v1/ {
|
location /api/v1/ {
|
||||||
|
# HTTP Basic Authentication
|
||||||
|
auth_basic "Alertmanager API";
|
||||||
|
auth_basic_user_file /etc/nginx/passwords/monitoring.htpasswd;
|
||||||
|
|
||||||
# Rate limiting
|
# Rate limiting
|
||||||
limit_req zone=api burst=20 nodelay;
|
limit_req zone=api burst=20 nodelay;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
# Prometheus proxy configuration
|
# Prometheus proxy configuration with authentication
|
||||||
location /prometheus/ {
|
location /prometheus/ {
|
||||||
proxy_pass http://prometheus_backend/;
|
# HTTP Basic Authentication
|
||||||
proxy_redirect / /prometheus/;
|
auth_basic "Prometheus Monitoring";
|
||||||
|
auth_basic_user_file /etc/nginx/passwords/monitoring.htpasswd;
|
||||||
|
|
||||||
|
# Rate limiting
|
||||||
|
limit_req zone=api burst=10 nodelay;
|
||||||
|
|
||||||
|
proxy_pass http://prometheus_backend/prometheus/;
|
||||||
|
proxy_redirect /prometheus/ /prometheus/;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
@@ -23,7 +30,7 @@ location /prometheus/ {
|
|||||||
|
|
||||||
# Health check endpoint
|
# Health check endpoint
|
||||||
location /prometheus/-/healthy {
|
location /prometheus/-/healthy {
|
||||||
proxy_pass http://prometheus_backend/-/healthy;
|
proxy_pass http://prometheus_backend/prometheus/-/healthy;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
access_log off;
|
access_log off;
|
||||||
}
|
}
|
||||||
77
infra/uptime-kuma/README.md
Normal file
77
infra/uptime-kuma/README.md
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# Uptime Kuma Configuration
|
||||||
|
|
||||||
|
Uptime Kuma - это статусная страница для мониторинга доступности сервисов.
|
||||||
|
|
||||||
|
## Доступ
|
||||||
|
|
||||||
|
- **Веб-интерфейс**: `https://your-domain/status/`
|
||||||
|
- **Прямой доступ**: `http://localhost:3001` (только локально)
|
||||||
|
|
||||||
|
## Настройка
|
||||||
|
|
||||||
|
### Первоначальная настройка
|
||||||
|
|
||||||
|
1. Запустите сервисы:
|
||||||
|
```bash
|
||||||
|
make up
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Откройте `https://your-domain/status/`
|
||||||
|
|
||||||
|
3. Создайте администратора:
|
||||||
|
- Username: `admin`
|
||||||
|
- Password: `admin` (смените после первого входа)
|
||||||
|
|
||||||
|
### Мониторинг сервисов
|
||||||
|
|
||||||
|
Uptime Kuma автоматически настроит мониторинг следующих сервисов:
|
||||||
|
|
||||||
|
- **Telegram Bot**: `http://telegram-bot:8080/health`
|
||||||
|
- **AnonBot**: `http://anon-bot:8081/health`
|
||||||
|
- **Prometheus**: `http://prometheus:9090/-/healthy`
|
||||||
|
- **Grafana**: `http://grafana:3000/api/health`
|
||||||
|
- **AlertManager**: `http://alertmanager:9093/-/healthy`
|
||||||
|
- **Nginx**: `http://nginx:80/nginx-health`
|
||||||
|
|
||||||
|
### Уведомления
|
||||||
|
|
||||||
|
Настройте уведомления в веб-интерфейсе:
|
||||||
|
- Telegram Bot
|
||||||
|
- Email
|
||||||
|
- Webhook
|
||||||
|
- Discord
|
||||||
|
- Slack
|
||||||
|
|
||||||
|
## Файлы конфигурации
|
||||||
|
|
||||||
|
- `monitors.json` - экспорт настроенных мониторов
|
||||||
|
- `settings.json` - настройки приложения
|
||||||
|
- `backup/` - резервные копии конфигурации
|
||||||
|
|
||||||
|
## Команды управления
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать логи
|
||||||
|
make logs-uptime-kuma
|
||||||
|
|
||||||
|
# Перезапустить
|
||||||
|
make restart-uptime-kuma
|
||||||
|
|
||||||
|
# Проверить статус
|
||||||
|
make status
|
||||||
|
```
|
||||||
|
|
||||||
|
## Резервное копирование
|
||||||
|
|
||||||
|
Конфигурация сохраняется в Docker volume `uptime_kuma_data`.
|
||||||
|
Для резервного копирования:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать backup
|
||||||
|
make backup
|
||||||
|
|
||||||
|
# Восстановить
|
||||||
|
make restore FILE=backup.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
36
infra/uptime-kuma/backup/README.md
Normal file
36
infra/uptime-kuma/backup/README.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# Uptime Kuma Backup
|
||||||
|
|
||||||
|
Эта директория содержит резервные копии конфигурации Uptime Kuma.
|
||||||
|
|
||||||
|
## Автоматическое резервное копирование
|
||||||
|
|
||||||
|
Создайте скрипт для автоматического бэкапа:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# backup-uptime-kuma.sh
|
||||||
|
|
||||||
|
DATE=$(date +%Y%m%d-%H%M%S)
|
||||||
|
BACKUP_DIR="/path/to/backups"
|
||||||
|
CONTAINER_NAME="bots_uptime_kuma"
|
||||||
|
|
||||||
|
# Создать backup
|
||||||
|
docker exec $CONTAINER_NAME tar -czf /tmp/uptime-kuma-backup-$DATE.tar.gz /app/data
|
||||||
|
|
||||||
|
# Скопировать backup на хост
|
||||||
|
docker cp $CONTAINER_NAME:/tmp/uptime-kuma-backup-$DATE.tar.gz $BACKUP_DIR/
|
||||||
|
|
||||||
|
# Очистить временные файлы
|
||||||
|
docker exec $CONTAINER_NAME rm /tmp/uptime-kuma-backup-$DATE.tar.gz
|
||||||
|
|
||||||
|
echo "Backup created: $BACKUP_DIR/uptime-kuma-backup-$DATE.tar.gz"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Восстановление
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Восстановить из backup
|
||||||
|
docker cp backup-file.tar.gz $CONTAINER_NAME:/tmp/
|
||||||
|
docker exec $CONTAINER_NAME tar -xzf /tmp/backup-file.tar.gz -C /
|
||||||
|
docker restart $CONTAINER_NAME
|
||||||
|
```
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# Uptime Kuma Configuration
|
|
||||||
# This is a separate docker-compose file for Uptime Kuma
|
|
||||||
# It will be included in the main docker-compose.yml
|
|
||||||
|
|
||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
|
||||||
uptime-kuma:
|
|
||||||
image: louislam/uptime-kuma:latest
|
|
||||||
container_name: bots_uptime_kuma
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- uptime_kuma_data:/app/data
|
|
||||||
ports:
|
|
||||||
- "3001:3001"
|
|
||||||
environment:
|
|
||||||
- UPTIME_KUMA_PORT=3001
|
|
||||||
networks:
|
|
||||||
- bots_network
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3001"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
start_period: 40s
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
uptime_kuma_data:
|
|
||||||
driver: local
|
|
||||||
|
|
||||||
networks:
|
|
||||||
bots_network:
|
|
||||||
external: true
|
|
||||||
147
infra/uptime-kuma/monitors.json
Normal file
147
infra/uptime-kuma/monitors.json
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
{
|
||||||
|
"monitors": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Telegram Bot Health",
|
||||||
|
"url": "http://telegram-bot:8080/health",
|
||||||
|
"type": "http",
|
||||||
|
"method": "GET",
|
||||||
|
"interval": 60,
|
||||||
|
"retries": 3,
|
||||||
|
"timeout": 10,
|
||||||
|
"keyword": null,
|
||||||
|
"maxredirects": 10,
|
||||||
|
"ignoreTls": false,
|
||||||
|
"upsideDown": false,
|
||||||
|
"tags": ["bot", "telegram", "health"],
|
||||||
|
"description": "Мониторинг состояния Telegram Helper Bot",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "AnonBot Health",
|
||||||
|
"url": "http://anon-bot:8081/health",
|
||||||
|
"type": "http",
|
||||||
|
"method": "GET",
|
||||||
|
"interval": 60,
|
||||||
|
"retries": 3,
|
||||||
|
"timeout": 10,
|
||||||
|
"keyword": null,
|
||||||
|
"maxredirects": 10,
|
||||||
|
"ignoreTls": false,
|
||||||
|
"upsideDown": false,
|
||||||
|
"tags": ["bot", "anon", "health"],
|
||||||
|
"description": "Мониторинг состояния AnonBot",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "Prometheus Health",
|
||||||
|
"url": "http://prometheus:9090/-/healthy",
|
||||||
|
"type": "http",
|
||||||
|
"method": "GET",
|
||||||
|
"interval": 60,
|
||||||
|
"retries": 3,
|
||||||
|
"timeout": 10,
|
||||||
|
"keyword": null,
|
||||||
|
"maxredirects": 10,
|
||||||
|
"ignoreTls": false,
|
||||||
|
"upsideDown": false,
|
||||||
|
"tags": ["monitoring", "prometheus", "health"],
|
||||||
|
"description": "Мониторинг состояния Prometheus",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "Grafana Health",
|
||||||
|
"url": "http://grafana:3000/api/health",
|
||||||
|
"type": "http",
|
||||||
|
"method": "GET",
|
||||||
|
"interval": 60,
|
||||||
|
"retries": 3,
|
||||||
|
"timeout": 10,
|
||||||
|
"keyword": null,
|
||||||
|
"maxredirects": 10,
|
||||||
|
"ignoreTls": false,
|
||||||
|
"upsideDown": false,
|
||||||
|
"tags": ["monitoring", "grafana", "health"],
|
||||||
|
"description": "Мониторинг состояния Grafana",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"name": "AlertManager Health",
|
||||||
|
"url": "http://alertmanager:9093/-/healthy",
|
||||||
|
"type": "http",
|
||||||
|
"method": "GET",
|
||||||
|
"interval": 60,
|
||||||
|
"retries": 3,
|
||||||
|
"timeout": 10,
|
||||||
|
"keyword": null,
|
||||||
|
"maxredirects": 10,
|
||||||
|
"ignoreTls": false,
|
||||||
|
"upsideDown": false,
|
||||||
|
"tags": ["monitoring", "alertmanager", "health"],
|
||||||
|
"description": "Мониторинг состояния AlertManager",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"name": "Nginx Health",
|
||||||
|
"url": "http://nginx:80/nginx-health",
|
||||||
|
"type": "http",
|
||||||
|
"method": "GET",
|
||||||
|
"interval": 60,
|
||||||
|
"retries": 3,
|
||||||
|
"timeout": 10,
|
||||||
|
"keyword": "healthy",
|
||||||
|
"maxredirects": 10,
|
||||||
|
"ignoreTls": false,
|
||||||
|
"upsideDown": false,
|
||||||
|
"tags": ["infrastructure", "nginx", "health"],
|
||||||
|
"description": "Мониторинг состояния Nginx",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"name": "External Bot Status",
|
||||||
|
"url": "https://your-domain/status/",
|
||||||
|
"type": "http",
|
||||||
|
"method": "GET",
|
||||||
|
"interval": 300,
|
||||||
|
"retries": 2,
|
||||||
|
"timeout": 15,
|
||||||
|
"keyword": null,
|
||||||
|
"maxredirects": 10,
|
||||||
|
"ignoreTls": false,
|
||||||
|
"upsideDown": false,
|
||||||
|
"tags": ["external", "status-page"],
|
||||||
|
"description": "Мониторинг внешней доступности статусной страницы",
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "bot",
|
||||||
|
"color": "#3498db"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "monitoring",
|
||||||
|
"color": "#e74c3c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "infrastructure",
|
||||||
|
"color": "#f39c12"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "health",
|
||||||
|
"color": "#27ae60"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "external",
|
||||||
|
"color": "#9b59b6"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
24
infra/uptime-kuma/settings.json
Normal file
24
infra/uptime-kuma/settings.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"language": "ru",
|
||||||
|
"theme": "light",
|
||||||
|
"timezone": "Europe/Moscow",
|
||||||
|
"dateLocale": "ru",
|
||||||
|
"dateFormat": "YYYY-MM-DD HH:mm:ss",
|
||||||
|
"timeFormat": "24",
|
||||||
|
"weekStart": 1,
|
||||||
|
"searchEngineIndex": true,
|
||||||
|
"primaryBaseURL": "https://your-domain/status/",
|
||||||
|
"public": true,
|
||||||
|
"publicGroupList": true,
|
||||||
|
"showTags": true,
|
||||||
|
"showPoweredBy": false,
|
||||||
|
"keepDataPeriodDays": 365,
|
||||||
|
"retentionCheckInterval": 3600,
|
||||||
|
"maxmindLicenseKey": "",
|
||||||
|
"dnsCache": true,
|
||||||
|
"dnsCacheTtl": 300,
|
||||||
|
"trustProxy": true,
|
||||||
|
"disableAuth": false,
|
||||||
|
"defaultTimezone": "Europe/Moscow",
|
||||||
|
"defaultLanguage": "ru"
|
||||||
|
}
|
||||||
31
scripts/generate_auth_passwords.sh
Executable file
31
scripts/generate_auth_passwords.sh
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script to generate HTTP Basic Auth passwords for monitoring services
|
||||||
|
# Usage: ./generate_auth_passwords.sh [username]
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Default username if not provided
|
||||||
|
USERNAME=${1:-"admin"}
|
||||||
|
|
||||||
|
# Create passwords directory if it doesn't exist
|
||||||
|
PASSWORDS_DIR="/etc/nginx/passwords"
|
||||||
|
mkdir -p "$PASSWORDS_DIR"
|
||||||
|
|
||||||
|
# Generate random password
|
||||||
|
PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-25)
|
||||||
|
|
||||||
|
# Create htpasswd file
|
||||||
|
echo "Creating password file for user: $USERNAME"
|
||||||
|
htpasswd -cb "$PASSWORDS_DIR/monitoring.htpasswd" "$USERNAME" "$PASSWORD"
|
||||||
|
|
||||||
|
# Set proper permissions
|
||||||
|
chown root:www-data "$PASSWORDS_DIR/monitoring.htpasswd"
|
||||||
|
chmod 640 "$PASSWORDS_DIR/monitoring.htpasswd"
|
||||||
|
|
||||||
|
echo "Password file created: $PASSWORDS_DIR/monitoring.htpasswd"
|
||||||
|
echo "Username: $USERNAME"
|
||||||
|
echo "Password: $PASSWORD"
|
||||||
|
echo ""
|
||||||
|
echo "Save this password securely!"
|
||||||
|
echo "You can add more users with: htpasswd $PASSWORDS_DIR/monitoring.htpasswd <username>"
|
||||||
Reference in New Issue
Block a user