450 lines
12 KiB
Markdown
450 lines
12 KiB
Markdown
## Мониторинг системы
|
||
|
||
### Проверка статуса сервисов
|
||
|
||
```bash
|
||
# Статус всех контейнеров
|
||
docker-compose ps
|
||
|
||
# Подробная информация о ресурсах
|
||
docker stats second_mind_gitea second_mind_webhook second_mind_nginx second_mind_db
|
||
|
||
# Проверка дискового пространства
|
||
df -h
|
||
du -sh /DOCKER/second-mind/
|
||
```
|
||
|
||
### Мониторинг логов
|
||
|
||
```bash
|
||
# Все логи системы
|
||
docker-compose logs -f
|
||
|
||
# Логи конкретного сервиса
|
||
docker-compose logs -f quartz-webhook
|
||
docker-compose logs -f gitea
|
||
docker-compose logs -f nginx
|
||
|
||
# Последние 100 строк с отметками времени
|
||
docker-compose logs --tail=100 -t quartz-webhook
|
||
```
|
||
|
||
### Health checks
|
||
|
||
```bash
|
||
# Проверка webhook сервиса
|
||
curl https://webhook.aepif.ru/health
|
||
|
||
# Проверка Gitea
|
||
curl -I https://git.aepif.ru
|
||
|
||
# Проверка статического сайта
|
||
curl -I https://notes.aepif.ru
|
||
|
||
# Проверка SSH доступа к Git
|
||
ssh -p 2222 git@git.aepif.ru
|
||
```
|
||
|
||
## Обслуживание
|
||
|
||
### Регулярные задачи
|
||
|
||
#### Очистка логов Docker
|
||
|
||
```bash
|
||
# Очистка логов всех контейнеров
|
||
docker system prune -f
|
||
|
||
# Очистка конкретного контейнера
|
||
docker logs second_mind_webhook 2>/dev/null | tail -1000 > temp.log
|
||
docker cp temp.log second_mind_webhook:/tmp/
|
||
docker exec second_mind_webhook truncate -s 0 /proc/1/fd/1
|
||
rm temp.log
|
||
```
|
||
|
||
#### Очистка старых образов
|
||
|
||
```bash
|
||
# Удаление неиспользуемых образов
|
||
docker image prune -f
|
||
|
||
# Удаление всех неиспользуемых ресурсов
|
||
docker system prune -a -f
|
||
```
|
||
|
||
### Перезапуск сервисов
|
||
|
||
```bash
|
||
# Перезапуск всей системы (с сохранением данных)
|
||
docker-compose restart
|
||
|
||
# Перезапуск конкретного сервиса
|
||
docker-compose restart quartz-webhook
|
||
|
||
# Полная пересборка webhook сервиса
|
||
docker-compose build quartz-webhook
|
||
docker-compose up -d quartz-webhook
|
||
|
||
# Graceful restart с ожиданием
|
||
docker-compose stop
|
||
docker-compose up -d
|
||
```
|
||
|
||
## Обновления
|
||
|
||
### Обновление Quartz
|
||
|
||
```bash
|
||
# Вход в контейнер webhook
|
||
docker exec -it second_mind_webhook bash
|
||
|
||
# Обновление Quartz репозитория
|
||
cd /quartz
|
||
git pull origin main
|
||
npm install
|
||
|
||
# Выход из контейнера
|
||
exit
|
||
|
||
# Перезапуск для применения изменений
|
||
docker-compose restart quartz-webhook
|
||
```
|
||
|
||
### Обновление образов Docker
|
||
|
||
```bash
|
||
# Скачивание новых версий
|
||
docker-compose pull
|
||
|
||
# Пересоздание контейнеров с новыми образами
|
||
docker-compose up -d
|
||
|
||
# Принудительное пересоздание всех сервисов
|
||
docker-compose up -d --force-recreate
|
||
```
|
||
|
||
### Обновление системы
|
||
|
||
```bash
|
||
# Обновление пакетов хост-системы
|
||
apt update && apt upgrade -y
|
||
|
||
# Обновление Docker и Docker Compose до последних версий
|
||
curl -fsSL https://get.docker.com | sh
|
||
pip3 install --upgrade docker-compose
|
||
```
|
||
|
||
## Диагностика проблем
|
||
|
||
### Проблемы с webhook'ами
|
||
|
||
#### Проверка получения webhook'ов
|
||
|
||
```bash
|
||
# Просмотр логов webhook сервиса в реальном времени
|
||
docker-compose logs -f quartz-webhook
|
||
|
||
# Проверка последних webhook'ов в Gitea
|
||
# Repository → Settings → Webhooks → Recent Deliveries
|
||
```
|
||
|
||
#### Ручной запуск сборки
|
||
|
||
```bash
|
||
# Вход в контейнер webhook
|
||
docker exec -it second_mind_webhook bash
|
||
|
||
# Ручной запуск процесса сборки
|
||
cd /webhook
|
||
node -e "
|
||
const { execSync } = require('child_process');
|
||
const fs = require('fs');
|
||
|
||
function buildSite() {
|
||
try {
|
||
console.log('Manual build started...');
|
||
execSync('cd /obsidian && git pull origin main || git pull origin master', { stdio: 'inherit' });
|
||
execSync('cd /quartz && npm run quartz build -- -d /obsidian', { stdio: 'inherit' });
|
||
execSync('rm -rf /public/*', { stdio: 'inherit' });
|
||
execSync('cp -r /quartz/public/* /public/', { stdio: 'inherit' });
|
||
console.log('Manual build completed!');
|
||
} catch (error) {
|
||
console.error('Build error:', error.message);
|
||
}
|
||
}
|
||
|
||
buildSite();
|
||
"
|
||
```
|
||
|
||
### Проблемы с Git
|
||
|
||
#### Проверка SSH подключения
|
||
|
||
```bash
|
||
# Тест SSH соединения
|
||
ssh -p 2222 -v git@git.aepif.ru
|
||
|
||
# Проверка SSH ключей в контейнере
|
||
docker exec -it second_mind_webhook ls -la /root/.ssh/
|
||
docker exec -it second_mind_webhook cat /root/.ssh/config
|
||
```
|
||
|
||
#### Сброс SSH ключей
|
||
|
||
```bash
|
||
# Пересоздание SSH ключей
|
||
rm ~/.ssh/id_ed25519*
|
||
ssh-keygen -t ed25519 -C "webhook-new" -f ~/.ssh/id_ed25519
|
||
|
||
# Добавление нового ключа в Gitea
|
||
cat ~/.ssh/id_ed25519.pub
|
||
# Копировать в Gitea → Settings → SSH Keys
|
||
|
||
# Перезапуск webhook контейнера
|
||
docker-compose restart quartz-webhook
|
||
```
|
||
|
||
### Проблемы с базой данных
|
||
|
||
#### Проверка подключения к PostgreSQL
|
||
|
||
```bash
|
||
# Вход в контейнер базы данных
|
||
docker exec -it second_mind_db psql -U gitea -d gitea
|
||
|
||
# Проверка размера базы
|
||
\l+
|
||
|
||
# Проверка активных подключений
|
||
SELECT * FROM pg_stat_activity;
|
||
|
||
# Выход
|
||
\q
|
||
```
|
||
|
||
#### Очистка базы данных (ОСТОРОЖНО!)
|
||
|
||
```bash
|
||
# Полная очистка и пересоздание базы
|
||
docker-compose stop gitea
|
||
docker exec -it second_mind_db psql -U gitea -c "DROP DATABASE gitea;"
|
||
docker exec -it second_mind_db psql -U gitea -c "CREATE DATABASE gitea;"
|
||
docker-compose start gitea
|
||
```
|
||
|
||
### Проблемы с Nginx
|
||
|
||
#### Проверка конфигурации
|
||
|
||
```bash
|
||
# Тест конфигурации Nginx
|
||
docker exec -it second_mind_nginx nginx -t
|
||
|
||
# Перезагрузка конфигурации без перезапуска
|
||
docker exec -it second_mind_nginx nginx -s reload
|
||
|
||
# Проверка файлов статического сайта
|
||
docker exec -it second_mind_nginx ls -la /usr/share/nginx/html/
|
||
```
|
||
|
||
## Безопасность
|
||
|
||
### Регулярная смена паролей
|
||
|
||
```bash
|
||
# Изменение паролей в .env файле
|
||
nano .env
|
||
|
||
# Применение новых переменных
|
||
docker-compose up -d --force-recreate
|
||
```
|
||
|
||
### Мониторинг доступа
|
||
|
||
```bash
|
||
# Просмотр логов Nginx для анализа трафика
|
||
docker-compose logs nginx | grep -E "GET|POST"
|
||
|
||
# Анализ логов Gitea для подозрительной активности
|
||
docker-compose logs gitea | grep -i "login\|failed"
|
||
|
||
# Проверка активных SSH сессий
|
||
docker exec -it second_mind_gitea who
|
||
```
|
||
|
||
### Обновления безопасности
|
||
|
||
```bash
|
||
# Регулярное обновление образов для получения security patches
|
||
docker-compose pull
|
||
docker-compose up -d
|
||
|
||
# Проверка уязвимостей в образах
|
||
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
|
||
-v $PWD/cache:/tmp/cache --name trivy aquasec/trivy \
|
||
image second-mind_quartz-webhook
|
||
```
|
||
|
||
## Backup и восстановление
|
||
|
||
### Создание резервных копий
|
||
|
||
```bash
|
||
# Backup базы данных
|
||
docker exec second_mind_db pg_dump -U gitea gitea > backup_db_$(date +%Y%m%d).sql
|
||
|
||
# Backup Git репозиториев (Gitea data)
|
||
docker run --rm -v second-mind_gitea_data:/data -v $(pwd):/backup alpine \
|
||
tar czf /backup/gitea_data_$(date +%Y%m%d).tar.gz -C /data .
|
||
|
||
# Backup конфигурационных файлов
|
||
tar czf config_backup_$(date +%Y%m%d).tar.gz \
|
||
docker-compose.yml Dockerfile nginx.conf .env webhook-server/
|
||
|
||
# Backup SSH ключей
|
||
cp -r ~/.ssh ssh_backup_$(date +%Y%m%d)
|
||
```
|
||
|
||
### Восстановление из резервных копий
|
||
|
||
```bash
|
||
# Остановка сервисов
|
||
docker-compose down
|
||
|
||
# Восстановление базы данных
|
||
docker-compose up -d db
|
||
sleep 10
|
||
docker exec -i second_mind_db psql -U gitea gitea < backup_db_YYYYMMDD.sql
|
||
|
||
# Восстановление Gitea data
|
||
docker run --rm -v second-mind_gitea_data:/data -v $(pwd):/backup alpine \
|
||
tar xzf /backup/gitea_data_YYYYMMDD.tar.gz -C /data
|
||
|
||
# Запуск всех сервисов
|
||
docker-compose up -d
|
||
```
|
||
|
||
## Автоматизация
|
||
|
||
### Cron задачи для автоматического обслуживания
|
||
|
||
```bash
|
||
# Добавление в crontab
|
||
crontab -e
|
||
|
||
# Ежедневный backup в 2:00
|
||
0 2 * * * cd /DOCKER/second-mind && docker exec second_mind_db pg_dump -U gitea gitea > backup_db_$(date +\%Y\%m\%d).sql
|
||
|
||
# Еженедельная очистка старых логов в воскресенье в 3:00
|
||
0 3 * * 0 docker system prune -f
|
||
|
||
# Ежемесячное обновление образов в первое воскресенье месяца в 4:00
|
||
0 4 1-7 * 0 cd /DOCKER/second-mind && docker-compose pull && docker-compose up -d
|
||
```
|
||
|
||
### Скрипт мониторинга
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# monitoring.sh - проверка состояния Second Mind
|
||
|
||
echo "=== Second Mind System Status ==="
|
||
echo "Date: $(date)"
|
||
echo
|
||
|
||
# Проверка контейнеров
|
||
echo "Container Status:"
|
||
docker-compose ps
|
||
|
||
echo
|
||
echo "Resource Usage:"
|
||
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" \
|
||
second_mind_gitea second_mind_webhook second_mind_nginx second_mind_db
|
||
|
||
echo
|
||
echo "Disk Usage:"
|
||
df -h /DOCKER/second-mind
|
||
|
||
echo
|
||
echo "Webhook Health:"
|
||
curl -s https://webhook.aepif.ru/health || echo "Webhook unreachable"
|
||
|
||
echo
|
||
echo "Recent Errors:"
|
||
docker-compose logs --tail=20 | grep -i error || echo "No recent errors"
|
||
```
|
||
|
||
### Настройка алертов
|
||
|
||
```bash
|
||
# Простой скрипт алертов через email (требует настройки sendmail/postfix)
|
||
#!/bin/bash
|
||
# alerts.sh
|
||
|
||
WEBHOOK_STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://webhook.aepif.ru/health)
|
||
NOTES_STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://notes.aepif.ru)
|
||
|
||
if [ "$WEBHOOK_STATUS" != "200" ]; then
|
||
echo "ALERT: Webhook service is down!" | mail -s "Second Mind Alert" admin@aepif.ru
|
||
fi
|
||
|
||
if [ "$NOTES_STATUS" != "200" ]; then
|
||
echo "ALERT: Notes website is down!" | mail -s "Second Mind Alert" admin@aepif.ru
|
||
fi
|
||
```
|
||
|
||
## Performance оптимизация
|
||
|
||
### Настройка ресурсов контейнеров
|
||
|
||
```yaml
|
||
# В docker-compose.yml добавить лимиты ресурсов
|
||
services:
|
||
gitea:
|
||
# ... другие настройки
|
||
deploy:
|
||
resources:
|
||
limits:
|
||
memory: 512M
|
||
cpus: '0.5'
|
||
reservations:
|
||
memory: 256M
|
||
cpus: '0.25'
|
||
|
||
quartz-webhook:
|
||
# ... другие настройки
|
||
deploy:
|
||
resources:
|
||
limits:
|
||
memory: 1G
|
||
cpus: '1.0'
|
||
reservations:
|
||
memory: 512M
|
||
cpus: '0.5'
|
||
```
|
||
|
||
### Оптимизация Nginx
|
||
|
||
```nginx
|
||
# Добавление в nginx.conf для улучшения производительности
|
||
http {
|
||
# ... существующие настройки
|
||
|
||
# Увеличение буферов
|
||
client_body_buffer_size 128k;
|
||
client_max_body_size 10m;
|
||
client_header_buffer_size 1k;
|
||
large_client_header_buffers 4 4k;
|
||
output_buffers 1 32k;
|
||
postpone_output 1460;
|
||
|
||
# Кэширование файлов
|
||
open_file_cache max=1000 inactive=20s;
|
||
open_file_cache_valid 30s;
|
||
open_file_cache_min_uses 2;
|
||
open_file_cache_errors on;
|
||
}
|
||
```
|
||
|
||
Система администрирования настроена! Для дальнейшего изучения см. [[Обзор системы]] |