vault backup: 2025-08-04 12:49:10

This commit is contained in:
Andrey Epifancev
2025-08-04 12:49:10 +04:00
parent 2073fb73ad
commit 9753a97c28
5 changed files with 660 additions and 4 deletions

View File

@@ -298,4 +298,4 @@ ssh-keyscan -p 2222 git.aepif.ru >> ~/.ssh/known_hosts
- Environment переменных контейнеров - Environment переменных контейнеров
- Примонтированных SSH ключах - Примонтированных SSH ключах
Следующий документ: [[Развертывание]] Следующий документ: [[Мой сервер/Second Mind Setup/Развертывание]]

View File

@@ -94,5 +94,5 @@ graph TB
Для развертывания системы изучите: Для развертывания системы изучите:
- [[Мой сервер/Second Mind Setup/Конфигурации]] - настройки всех сервисов - [[Мой сервер/Second Mind Setup/Конфигурации]] - настройки всех сервисов
- [[Развертывание]] - пошаговая инструкция установки - [[Мой сервер/Second Mind Setup/Развертывание]] - пошаговая инструкция установки
- [[Администрирование]] - обслуживание и мониторинг - [[Мой сервер/Second Mind Setup/Администрирование]] - обслуживание и мониторинг

View File

@@ -339,4 +339,4 @@ docker exec -it second_mind_nginx ls -la /usr/share/nginx/html/
- ✅ Полнотекстовый поиск и граф связей - ✅ Полнотекстовый поиск и граф связей
- ✅ SSL сертификаты для всех доменов - ✅ SSL сертификаты для всех доменов
Следующий документ: [[Администрирование]] Следующий документ: [[Мой сервер/Second Mind Setup/Администрирование]]

View File

@@ -0,0 +1,508 @@
# Инфраструктура - Администрирование
## Мониторинг системы
### Проверка статуса всех сервисов
```bash
# Статус инфраструктурных сервисов
cd /DOCKER/reverse-proxy && docker-compose ps
cd /DOCKER/auth && docker-compose ps
# Общий статус системы
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# Использование ресурсов
docker stats --no-stream traefik authelia auth_redis
```
### Мониторинг Traefik
#### Dashboard и метрики
```bash
# Проверка Traefik dashboard
curl -I https://traefik.aepif.ru/dashboard/
# Просмотр конфигурации маршрутов
curl https://traefik.aepif.ru/api/http/routers | jq
# Проверка SSL сертификатов
curl https://traefik.aepif.ru/api/http/routers | jq '.[] | select(.tls) | {name, rule, tls}'
# Статистика сервисов
curl https://traefik.aepif.ru/api/http/services | jq
```
#### Логи Traefik
```bash
# Просмотр логов в реальном времени
cd /DOCKER/reverse-proxy
docker-compose logs -f traefik
# Поиск ошибок SSL
docker-compose logs traefik | grep -i "acme\|ssl\|tls"
# Анализ трафика
docker-compose logs traefik | grep -E "GET|POST" | tail -20
```
### Мониторинг Authelia
#### Проверка аутентификации
```bash
# Health check Authelia
curl https://auth.aepif.ru/api/health
# Проверка конфигурации
cd /DOCKER/auth
docker exec authelia authelia validate-config /config/configuration.yml
# Статистика пользователей
docker exec authelia sqlite3 /config/db.sqlite3 "SELECT * FROM user_preferences;"
```
#### Анализ логов аутентификации
```bash
# Логи Authelia
cd /DOCKER/auth
docker-compose logs -f authelia
# Поиск неуспешных попыток входа
docker-compose logs authelia | grep -i "authentication\|failed\|banned"
# Статистика входов по пользователям
docker-compose logs authelia | grep "Successful" | cut -d' ' -f8 | sort | uniq -c
```
### Мониторинг Redis
```bash
# Статус Redis
cd /DOCKER/auth
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" info
# Количество активных сессий
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" info keyspace
# Список ключей сессий
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" keys "authelia*"
# Время жизни сессий
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" keys "*" | head -5 | xargs -I {} docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" ttl {}
```
## Обслуживание SSL сертификатов
### Проверка статуса сертификатов
```bash
# Просмотр всех сертификатов
cd /DOCKER/reverse-proxy
docker exec traefik cat /data/acme.json | jq '.letsencrypt.Certificates[] | {domains: .domain.main, expires: .certificate}' 2>/dev/null || echo "Нет сертификатов"
# Проверка срока действия сертификата
echo | openssl s_client -connect aepif.ru:443 2>/dev/null | openssl x509 -noout -dates
# Проверка для всех доменов
for domain in traefik.aepif.ru auth.aepif.ru notes.aepif.ru git.aepif.ru webhook.aepif.ru; do
echo "=== $domain ==="
echo | openssl s_client -connect $domain:443 -servername $domain 2>/dev/null | openssl x509 -noout -subject -dates
echo
done
```
### Принудительное обновление сертификатов
```bash
# Удаление старых сертификатов (ОСТОРОЖНО!)
cd /DOCKER/reverse-proxy
docker-compose stop traefik
docker volume rm reverse-proxy_traefik_data
docker volume create traefik_data
docker-compose up -d traefik
# Проверка получения новых сертификатов
docker-compose logs -f traefik | grep -i acme
```
## Управление пользователями
### Добавление нового пользователя
```bash
# Генерация хеша пароля
NEW_PASSWORD="secure-password-123"
PASSWORD_HASH=$(docker run --rm authelia/authelia:latest authelia hash-password "$NEW_PASSWORD")
# Редактирование базы пользователей
cd /DOCKER/auth
cp authelia/users_database.yml authelia/users_database.yml.backup
cat >> authelia/users_database.yml << EOF
newuser:
displayname: "New User"
password: "$PASSWORD_HASH"
email: newuser@aepif.ru
groups:
- users
EOF
# Применение изменений
docker-compose restart authelia
# Проверка
docker-compose logs authelia | grep -i "user\|config"
```
### Смена пароля пользователя
```bash
# Генерация нового хеша
NEW_PASSWORD="new-secure-password"
PASSWORD_HASH=$(docker run --rm authelia/authelia:latest authelia hash-password "$NEW_PASSWORD")
# Редактирование файла пользователей
cd /DOCKER/auth
nano authelia/users_database.yml
# Замените строку password для нужного пользователя
# Перезапуск Authelia
docker-compose restart authelia
```
### Удаление пользователя
```bash
# Создание резервной копии
cd /DOCKER/auth
cp authelia/users_database.yml authelia/users_database.yml.backup
# Редактирование (удалить секцию пользователя)
nano authelia/users_database.yml
# Очистка сессий пользователя из Redis
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" keys "*username*" | xargs docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" del
# Перезапуск
docker-compose restart authelia
```
## Управление политиками доступа
### Добавление нового защищенного сервиса
```bash
# Редактирование конфигурации Authelia
cd /DOCKER/auth
nano authelia/configuration.yml
# Добавить новое правило в секцию access_control.rules:
# - domain: newservice.aepif.ru
# policy: one_factor
# Применение изменений
docker-compose restart authelia
```
### Изменение политик безопасности
```bash
# Для более строгой безопасности (требует 2FA)
cd /DOCKER/auth
nano authelia/configuration.yml
# Изменить policy с one_factor на two_factor для нужных доменов
# - domain: notes.aepif.ru
# policy: two_factor
# Перезапуск
docker-compose restart authelia
```
## Обновления
### Обновление Traefik
```bash
cd /DOCKER/reverse-proxy
# Проверка текущей версии
docker exec traefik traefik version
# Получение новой версии
docker-compose pull traefik
# Обновление с сохранением конфигурации
docker-compose up -d traefik
# Проверка логов
docker-compose logs -f traefik
```
### Обновление Authelia
```bash
cd /DOCKER/auth
# Создание резервной копии конфигурации
tar czf authelia_backup_$(date +%Y%m%d).tar.gz authelia/
# Проверка текущей версии
docker exec authelia authelia --version
# Получение новой версии
docker-compose pull authelia
# Обновление
docker-compose up -d authelia
# Проверка совместимости конфигурации
docker exec authelia authelia validate-config /config/configuration.yml
```
### Обновление Redis
```bash
cd /DOCKER/auth
# Создание дампа данных
docker exec auth_redis redis-cli -a "$REDIS_PASSWORD" save
# Обновление образа
docker-compose pull redis
docker-compose up -d redis
# Проверка работоспособности
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" ping
```
## Резервное копирование
### Автоматический backup скрипт
```bash
#!/bin/bash
# /opt/scripts/infrastructure_backup.sh
BACKUP_DIR="/opt/backups/infrastructure"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
echo "Starting infrastructure backup - $DATE"
# Backup Traefik data (SSL сертификаты)
echo "Backing up Traefik data..."
docker run --rm -v reverse-proxy_traefik_data:/data -v $BACKUP_DIR:/backup alpine \
tar czf /backup/traefik_data_$DATE.tar.gz -C /data .
# Backup Authelia configuration
echo "Backing up Authelia config..."
tar czf $BACKUP_DIR/authelia_config_$DATE.tar.gz -C /DOCKER/auth authelia/
# Backup Redis data
echo "Backing up Redis data..."
docker exec auth_redis redis-cli -a "$REDIS_PASSWORD" save
docker run --rm -v auth_redis_data:/data -v $BACKUP_DIR:/backup alpine \
tar czf /backup/redis_data_$DATE.tar.gz -C /data .
# Backup environment files
echo "Backing up environment files..."
tar czf $BACKUP_DIR/env_files_$DATE.tar.gz \
/DOCKER/reverse-proxy/.env \
/DOCKER/auth/.env \
/DOCKER/reverse-proxy/docker-compose.yml \
/DOCKER/auth/docker-compose.yml
# Cleanup old backups (keep 7 days)
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "Infrastructure backup completed - $DATE"
```
### Настройка автоматического backup
```bash
# Создание скрипта
sudo mkdir -p /opt/scripts
sudo nano /opt/scripts/infrastructure_backup.sh
sudo chmod +x /opt/scripts/infrastructure_backup.sh
# Создание директории для бэкапов
sudo mkdir -p /opt/backups/infrastructure
# Добавление в crontab (ежедневно в 2:00)
echo "0 2 * * * /opt/scripts/infrastructure_backup.sh >> /var/log/infrastructure_backup.log 2>&1" | sudo crontab -
```
### Восстановление из backup
```bash
#!/bin/bash
# Восстановление инфраструктуры из backup
BACKUP_DATE="20250804_020000" # Измените на нужную дату
BACKUP_DIR="/opt/backups/infrastructure"
# Остановка сервисов
cd /DOCKER/reverse-proxy && docker-compose down
cd /DOCKER/auth && docker-compose down
# Восстановление Traefik data
docker volume rm reverse-proxy_traefik_data
docker volume create reverse-proxy_traefik_data
docker run --rm -v reverse-proxy_traefik_data:/data -v $BACKUP_DIR:/backup alpine \
tar xzf /backup/traefik_data_$BACKUP_DATE.tar.gz -C /data
# Восстановление Authelia config
rm -rf /DOCKER/auth/authelia
tar xzf $BACKUP_DIR/authelia_config_$BACKUP_DATE.tar.gz -C /DOCKER/auth/
# Восстановление Redis data
docker volume rm auth_redis_data
docker volume create auth_redis_data
docker run --rm -v auth_redis_data:/data -v $BACKUP_DIR:/backup alpine \
tar xzf /backup/redis_data_$BACKUP_DATE.tar.gz -C /data
# Восстановление env файлов
tar xzf $BACKUP_DIR/env_files_$BACKUP_DATE.tar.gz -C /
# Запуск сервисов
cd /DOCKER/reverse-proxy && docker-compose up -d
cd /DOCKER/auth && docker-compose up -d
echo "Восстановление завершено"
```
## Диагностика проблем
### Проблемы с маршрутизацией
```bash
# Проверка правил маршрутизации в Traefik
curl https://traefik.aepif.ru/api/http/routers | jq '.[] | {name, rule, service}'
# Проверка состояния сервисов
curl https://traefik.aepif.ru/api/http/services | jq '.[] | {name, status}'
# Тест конкретного маршрута
curl -H "Host: notes.aepif.ru" http://localhost/
```
### Проблемы с аутентификацией
```bash
# Проверка Forward Auth middleware
curl -v https://notes.aepif.ru/
# Проверка сессий в Redis
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" keys "*"
# Тест API Authelia
curl -v https://auth.aepif.ru/api/verify
# Сброс заблокированного пользователя
docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" keys "*banned*" | xargs docker exec -it auth_redis redis-cli -a "$REDIS_PASSWORD" del
```
### Проблемы с SSL
```bash
# Проверка ACME логов
docker logs traefik 2>&1 | grep -i acme
# Тест получения сертификата вручную
docker exec traefik sh -c "curl -I http://test.aepif.ru/.well-known/acme-challenge/test"
# Проверка файла acme.json
docker exec traefik ls -la /data/
docker exec traefik cat /data/acme.json | jq '.letsencrypt.Certificates | length'
```
## Мониторинг производительности
### Настройка метрик
```bash
# Добавление Prometheus метрик в Traefik
cd /DOCKER/reverse-proxy
nano docker-compose.yml
# Добавить в command секцию:
# - --metrics.prometheus=true
# - --metrics.prometheus.addEntryPointsLabels=true
# - --metrics.prometheus.addServicesLabels=true
docker-compose up -d traefik
```
### Анализ производительности
```bash
# Статистика запросов к Traefik
curl https://traefik.aepif.ru/metrics
# Анализ времени ответа
curl -w "@curl-format.txt" -o /dev/null -s https://notes.aepif.ru/
# Создание файла curl-format.txt:
cat > curl-format.txt << 'EOF'
time_namelookup: %{time_namelookup}s\n
time_connect: %{time_connect}s\n
time_appconnect: %{time_appconnect}s\n
time_pretransfer: %{time_pretransfer}s\n
time_redirect: %{time_redirect}s\n
time_starttransfer: %{time_starttransfer}s\n
----------\n
time_total: %{time_total}s\n
EOF
```
## Автоматизация обслуживания
### Скрипт проверки системы
```bash
#!/bin/bash
# /opt/scripts/infrastructure_health_check.sh
echo "=== Infrastructure Health Check $(date) ==="
# Проверка статуса контейнеров
echo "Container Status:"
docker ps --filter "name=traefik" --filter "name=authelia" --filter "name=auth_redis" --format "table {{.Names}}\t{{.Status}}"
# Проверка доступности сервисов
echo -e "\nService Availability:"
for service in traefik.aepif.ru auth.aepif.ru; do
if curl -s -o /dev/null -w "%{http_code}" https://$service | grep -q "200\|302"; then
echo "$service: OK"
else
echo "$service: FAILED"
fi
done
# Проверка SSL сертификатов (срок действия)
echo -e "\nSSL Certificates:"
for domain in traefik.aepif.ru auth.aepif.ru; do
expiry=$(echo | openssl s_client -connect $domain:443 -servername $domain 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
echo "$domain expires: $expiry"
done
# Проверка использования диска
echo -e "\nDisk Usage:"
df -h /var/lib/docker | tail -1
echo -e "\n=== End Health Check ==="
```
Система администрирования настроена! Теперь у вас есть полный контроль над инфраструктурой.
Связанные документы:
- [[Инфраструктура - Обзор системы]]
- [[Second Mind - Администрирование]]

View File

@@ -0,0 +1,148 @@
## Предварительные требования
### Системные требования
- Ubuntu/Debian сервер с минимум 2GB RAM
- Docker и Docker Compose установлены
- Открыты порты: 80, 443, 2222, 8080
- Настроены DNS записи для поддоменов
### Подготовка DNS
Создайте A-записи для всех поддоменов:
```dns
traefik.aepif.ru IN A YOUR_SERVER_IP
auth.aepif.ru IN A YOUR_SERVER_IP
notes.aepif.ru IN A YOUR_SERVER_IP
git.aepif.ru IN A YOUR_SERVER_IP
webhook.aepif.ru IN A YOUR_SERVER_IP
```
## Порядок развертывания
⚠️ **Важно**: Инфраструктурные сервисы должны быть развернуты **первыми**, так как все остальные приложения зависят от них.
### Последовательность установки:
1. **Traefik Reverse Proxy** (сначала)
2. **Authelia Authentication** (после Traefik)
3. **Second Mind** (после обеих частей инфраструктуры)
## 1. Развертывание Traefik
### Подготовка директорий
```bash
# Создание директории проекта
mkdir -p /DOCKER/reverse-proxy
cd /DOCKER/reverse-proxy
# Создание volume для данных Traefik
docker volume create traefik_data
```
### Создание .env файла
```bash
cat > .env << 'EOF'
DOMAIN=aepif.ru
ADMIN_EMAIL=epifantsev1aa@gmail.com
EOF
```
### Создание docker-compose.yml
```bash
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
traefik:
image: traefik:v3.0
container_name: traefik
command:
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=proxy
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --entrypoints.ssh.address=:2222
- --certificatesresolvers.letsencrypt.acme.email=epifantsev1aa@gmail.com
- --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
- --providers.docker.exposedByDefault=false
- --api.insecure=true
ports:
- "80:80"
- "443:443"
- "8080:8080"
- "2222:2222"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_data:/data
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`)
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
- traefik.http.routers.traefik.service=api@internal
- traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)
- traefik.http.routers.http-catchall.entrypoints=web
- traefik.http.routers.http-catchall.middlewares=redirect-to-https
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
restart: unless-stopped
volumes:
traefik_data:
networks:
proxy:
name: proxy
driver: bridge
EOF
```
### Создание сети и запуск
```bash
# Создание внешней сети proxy
docker network create proxy
# Запуск Traefik
docker-compose up -d
# Проверка статуса
docker-compose ps
docker-compose logs -f
```
### Проверка работы Traefik
```bash
# Проверка HTTP → HTTPS редиректа
curl -I http://traefik.aepif.ru
# Проверка HTTPS
curl -I https://traefik.aepif.ru
# Проверка dashboard (должен быть доступен)
curl -I https://traefik.aepif.ru/dashboard/
```
## 2. Развертывание Authelia
### Подготовка директорий
```bash
# Создание директории проекта
mkdir -p /DOCKER/auth/authelia
cd /DOCKER/auth
```
### Генерация секретов
```bash
# Генерация всех необходимых секретов
JWT_SECRET=$(openssl rand -base64 48)
SESSION_SECRET=$(openssl rand -base64 48)
STORAGE_KEY=$(openssl rand -base64 24)
REDIS_PASSWORD=$(