vault backup: 2025-08-04 12:33:00
This commit is contained in:
450
Second Mind Setup/Second Mind - Администрирование.md
Normal file
450
Second Mind Setup/Second Mind - Администрирование.md
Normal file
@@ -0,0 +1,450 @@
|
|||||||
|
## Мониторинг системы
|
||||||
|
|
||||||
|
### Проверка статуса сервисов
|
||||||
|
|
||||||
|
```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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Система администрирования настроена! Для дальнейшего изучения см. [[Second Mind - Обзор системы]]
|
||||||
303
Second Mind Setup/Second Mind - Конфигурации.md
Normal file
303
Second Mind Setup/Second Mind - Конфигурации.md
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
|
||||||
|
|
||||||
|
## Docker Compose
|
||||||
|
|
||||||
|
### Основной файл docker-compose.yml
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
gitea:
|
||||||
|
image: gitea/gitea:latest
|
||||||
|
container_name: second_mind_gitea
|
||||||
|
environment:
|
||||||
|
- USER_UID=1000
|
||||||
|
- USER_GID=1000
|
||||||
|
- GITEA__database__DB_TYPE=postgres
|
||||||
|
- GITEA__database__HOST=db:5432
|
||||||
|
- GITEA__database__NAME=gitea
|
||||||
|
- GITEA__database__USER=gitea
|
||||||
|
- GITEA__database__PASSWORD=sG7hZXBQDAtRab9A
|
||||||
|
- GITEA__server__SSH_DOMAIN=git.aepif.ru
|
||||||
|
- GITEA__server__SSH_PORT=2222
|
||||||
|
volumes:
|
||||||
|
- gitea_data:/data
|
||||||
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
networks:
|
||||||
|
- default
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
# HTTP routing
|
||||||
|
- traefik.http.routers.gitea.rule=Host(`git.aepif.ru`)
|
||||||
|
- traefik.http.routers.gitea.tls.certresolver=letsencrypt
|
||||||
|
- traefik.http.services.gitea.loadbalancer.server.port=3000
|
||||||
|
# TCP routing for SSH
|
||||||
|
- traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)
|
||||||
|
- traefik.tcp.routers.gitea-ssh.entrypoints=ssh
|
||||||
|
- traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: postgres:14
|
||||||
|
container_name: second_mind_db
|
||||||
|
environment:
|
||||||
|
- POSTGRES_USER=gitea
|
||||||
|
- POSTGRES_PASSWORD=sG7hZXBQDAtRab9A
|
||||||
|
- POSTGRES_DB=gitea
|
||||||
|
volumes:
|
||||||
|
- postgres_data:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- default
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
nginx:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: second_mind_nginx
|
||||||
|
volumes:
|
||||||
|
- ./quartz_build:/usr/share/nginx/html:ro
|
||||||
|
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
networks:
|
||||||
|
- default
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.http.routers.obsidian.rule=Host(`notes.aepif.ru`)
|
||||||
|
- traefik.http.routers.obsidian.tls.certresolver=letsencrypt
|
||||||
|
- traefik.http.routers.obsidian.middlewares=authelia@docker
|
||||||
|
- traefik.http.services.obsidian.loadbalancer.server.port=80
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
quartz-webhook:
|
||||||
|
build: .
|
||||||
|
container_name: second_mind_webhook
|
||||||
|
volumes:
|
||||||
|
- /root/.ssh:/root/.ssh
|
||||||
|
- ./obsidian_repo:/obsidian
|
||||||
|
- ./quartz_build:/public
|
||||||
|
environment:
|
||||||
|
- WEBHOOK_SECRET=MHtue5Zclp/dr69OFdwquGzCVHUGiEHP
|
||||||
|
- GITEA_REPO_URL=http://gitea:3000/admin/second-mind-aep.git
|
||||||
|
networks:
|
||||||
|
- default
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.http.routers.webhook.rule=Host(`webhook.aepif.ru`)
|
||||||
|
- traefik.http.routers.webhook.tls.certresolver=letsencrypt
|
||||||
|
- traefik.http.services.webhook.loadbalancer.server.port=3000
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
gitea_data:
|
||||||
|
postgres_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
proxy:
|
||||||
|
external: true
|
||||||
|
default:
|
||||||
|
driver: bridge
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dockerfile для webhook сервиса
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
FROM node:22
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Установка Git и SSH клиента
|
||||||
|
RUN apt-get update && apt-get install -y git openssh-client && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Создание .ssh директории и настройка SSH
|
||||||
|
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
|
||||||
|
|
||||||
|
# Добавление SSH ключа для доступа к git.aepif.ru (будет примонтирован как volume)
|
||||||
|
# Настройка SSH для автоматического принятия ключей хоста
|
||||||
|
RUN echo "Host git.aepif.ru\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile=/dev/null" > /root/.ssh/config
|
||||||
|
|
||||||
|
# Клонирование кастомного Quartz репозитория
|
||||||
|
RUN git clone ssh://git@git.aepif.ru:2222/aep/quartz.git /quartz
|
||||||
|
WORKDIR /quartz
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
# Копирование и настройка webhook сервиса
|
||||||
|
COPY webhook-server/ /webhook/
|
||||||
|
WORKDIR /webhook
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
WORKDIR /webhook
|
||||||
|
CMD ["node", "server.js"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация Nginx
|
||||||
|
|
||||||
|
### nginx.conf
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
sendfile on;
|
||||||
|
keepalive_timeout 65;
|
||||||
|
gzip on;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
# Основная обработка запросов
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ $uri.html =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Кэширование статических файлов
|
||||||
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Переменные окружения
|
||||||
|
|
||||||
|
### .env файл
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Основной домен
|
||||||
|
DOMAIN=aepif.ru
|
||||||
|
|
||||||
|
# Настройки Gitea
|
||||||
|
GITEA_ADMIN_USER=admin
|
||||||
|
GITEA_ADMIN_PASSWORD=Creonila1
|
||||||
|
GITEA_DB_PASSWORD=sG7hZXBQDAtRab9A
|
||||||
|
GITEA_SECRET=okPnnPYzdKkkpO6oS8LqI5PHm7fH/OCl
|
||||||
|
|
||||||
|
# Webhook настройки
|
||||||
|
WEBHOOK_SECRET=MHtue5Zclp/dr69OFdwquGzCVHUGiEHP
|
||||||
|
|
||||||
|
# Репозиторий заметок
|
||||||
|
REPO_NAME=second-mind-aep
|
||||||
|
```
|
||||||
|
|
||||||
|
## Webhook сервис
|
||||||
|
|
||||||
|
### package.json
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "quartz-webhook",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "server.js",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### server.js (основные моменты)
|
||||||
|
|
||||||
|
Webhook сервис включает:
|
||||||
|
- Обработчик POST `/webhook` для получения уведомлений от Gitea
|
||||||
|
- Health check endpoint GET `/health`
|
||||||
|
- Функцию автоматической сборки с этапами:
|
||||||
|
1. Проверка наличия Git репозитория
|
||||||
|
2. `git pull` для обновления локальной копии
|
||||||
|
3. Создание `index.md` если отсутствует
|
||||||
|
4. Запуск `npm run quartz build` с указанием исходной директории
|
||||||
|
5. Очистка целевой папки `/public`
|
||||||
|
6. Копирование собранного сайта из `/quartz/public`
|
||||||
|
|
||||||
|
## Настройки Quartz
|
||||||
|
|
||||||
|
### quartz.config.ts (основные параметры)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const config: QuartzConfig = {
|
||||||
|
configuration: {
|
||||||
|
pageTitle: "AEP Second Mind",
|
||||||
|
pageTitleSuffix: "",
|
||||||
|
enableSPA: true,
|
||||||
|
enablePopovers: true,
|
||||||
|
locale: "ru-RU",
|
||||||
|
baseUrl: "notes.aepif.ru",
|
||||||
|
ignorePatterns: ["private", "templates", ".obsidian"],
|
||||||
|
defaultDateType: "modified",
|
||||||
|
theme: {
|
||||||
|
typography: {
|
||||||
|
header: "Schibsted Grotesk",
|
||||||
|
body: "Source Sans Pro",
|
||||||
|
code: "IBM Plex Mono",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// ... плагины и эмиттеры
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## SSH конфигурация
|
||||||
|
|
||||||
|
### Настройка доступа к репозиториям
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# В ~/.ssh/config
|
||||||
|
Host git.aepif.ru
|
||||||
|
Port 2222
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
```
|
||||||
|
|
||||||
|
### Known hosts для автоматического принятия ключей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавление отпечатков сервера
|
||||||
|
ssh-keyscan -p 2222 git.aepif.ru >> ~/.ssh/known_hosts
|
||||||
|
```
|
||||||
|
|
||||||
|
## Traefik Labels
|
||||||
|
|
||||||
|
### Основные метки для маршрутизации
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# HTTP с SSL
|
||||||
|
- traefik.http.routers.service-name.rule=Host(`domain.aepif.ru`)
|
||||||
|
- traefik.http.routers.service-name.tls.certresolver=letsencrypt
|
||||||
|
- traefik.http.services.service-name.loadbalancer.server.port=PORT
|
||||||
|
|
||||||
|
# TCP для SSH (только для Gitea)
|
||||||
|
- traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)
|
||||||
|
- traefik.tcp.routers.gitea-ssh.entrypoints=ssh
|
||||||
|
- traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22
|
||||||
|
|
||||||
|
# Middleware для защиты (Authelia)
|
||||||
|
- traefik.http.routers.obsidian.middlewares=authelia@docker
|
||||||
|
```
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
### Уровни защиты
|
||||||
|
|
||||||
|
1. **Gitea**: Собственная авторизация пользователей
|
||||||
|
2. **Notes**: Защита через Authelia middleware
|
||||||
|
3. **Webhook**: Проверка секретного токена в запросах
|
||||||
|
4. **SSH**: Доступ только по ключам
|
||||||
|
5. **SSL**: Автоматические сертификаты через Let's Encrypt
|
||||||
|
|
||||||
|
### Секреты и пароли
|
||||||
|
|
||||||
|
Все чувствительные данные хранятся в:
|
||||||
|
- `.env` файле для Docker Compose
|
||||||
|
- Environment переменных контейнеров
|
||||||
|
- Примонтированных SSH ключах
|
||||||
|
|
||||||
|
Следующий документ: [[Second Mind - Развертывание]]
|
||||||
100
Second Mind Setup/second_mind_deployment.md
Normal file
100
Second Mind Setup/second_mind_deployment.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# Second Mind - Обзор системы
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Second Mind - система автоматической публикации заметок Obsidian через Quartz с использованием Git-based workflow. Позволяет превращать локальные заметки в красивый статический сайт автоматически при каждом commit'е.
|
||||||
|
|
||||||
|
## Архитектура системы
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
A[Gitea Repository] --> B[Webhook Service]
|
||||||
|
B --> C[Quartz Builder]
|
||||||
|
C --> D[Static Files]
|
||||||
|
D --> E[Nginx Server]
|
||||||
|
F[PostgreSQL] --> A
|
||||||
|
G[Traefik Proxy] --> A
|
||||||
|
G --> E
|
||||||
|
G --> B
|
||||||
|
```
|
||||||
|
|
||||||
|
## Основные компоненты
|
||||||
|
|
||||||
|
### Git-сервер (Gitea)
|
||||||
|
- **Назначение**: Хранение и версионирование заметок
|
||||||
|
- **Домен**: `git.aepif.ru`
|
||||||
|
- **База данных**: PostgreSQL
|
||||||
|
- **Особенности**: SSH доступ на порту 2222, webhook'и при push
|
||||||
|
|
||||||
|
### Webhook Service
|
||||||
|
- **Назначение**: Автоматическая пересборка при изменениях
|
||||||
|
- **Домен**: `webhook.aepif.ru`
|
||||||
|
- **Технология**: Node.js + Express
|
||||||
|
- **Функции**:
|
||||||
|
- Получение webhook'ов от Gitea
|
||||||
|
- Обновление локальной копии репозитория
|
||||||
|
- Запуск сборки Quartz
|
||||||
|
- Копирование результата для Nginx
|
||||||
|
|
||||||
|
### Quartz Builder
|
||||||
|
- **Назначение**: Генерация статического сайта из Markdown
|
||||||
|
- **Репозиторий**: Кастомный форк `ssh://git@git.aepif.ru:2222/aep/quartz.git`
|
||||||
|
- **Особенности**: Поддержка Obsidian-flavored Markdown, граф связей, поиск
|
||||||
|
|
||||||
|
### Веб-сервер (Nginx)
|
||||||
|
- **Назначение**: Раздача статического контента
|
||||||
|
- **Домен**: `notes.aepif.ru`
|
||||||
|
- **Особенности**: Кэширование, сжатие, защита через Authelia
|
||||||
|
|
||||||
|
### Reverse Proxy (Traefik)
|
||||||
|
- **Назначение**: Маршрутизация трафика и SSL
|
||||||
|
- **Функции**: Автоматические SSL сертификаты, балансировка, middleware
|
||||||
|
|
||||||
|
## Workflow использования
|
||||||
|
|
||||||
|
1. **Создание заметок** в Obsidian локально
|
||||||
|
2. **Commit и push** изменений в Gitea репозиторий
|
||||||
|
3. **Автоматический webhook** от Gitea запускает пересборку
|
||||||
|
4. **Webhook сервис** обновляет локальную копию и запускает Quartz
|
||||||
|
5. **Quartz генерирует** обновленный статический сайт
|
||||||
|
6. **Nginx раздает** новый контент посетителям
|
||||||
|
|
||||||
|
## Домены и доступ
|
||||||
|
|
||||||
|
| Сервис | Домен | Описание | Защита |
|
||||||
|
|--------|-------|----------|---------|
|
||||||
|
| Git-сервер | `git.aepif.ru` | Интерфейс Gitea | Авторизация |
|
||||||
|
| Статический сайт | `notes.aepif.ru` | Опубликованные заметки | Authelia |
|
||||||
|
| Webhook | `webhook.aepif.ru` | API для автоматизации | Секретный токен |
|
||||||
|
|
||||||
|
## Структура файлов
|
||||||
|
|
||||||
|
```
|
||||||
|
/DOCKER/second-mind/
|
||||||
|
├── docker-compose.yml # Основная конфигурация
|
||||||
|
├── Dockerfile # Образ для webhook сервиса
|
||||||
|
├── .env # Переменные окружения
|
||||||
|
├── nginx.conf # Конфигурация Nginx
|
||||||
|
├── webhook-server/ # Код webhook сервиса
|
||||||
|
│ ├── server.js
|
||||||
|
│ └── package.json
|
||||||
|
├── obsidian_repo/ # Локальная копия репозитория
|
||||||
|
└── quartz_build/ # Собранный статический сайт
|
||||||
|
```
|
||||||
|
|
||||||
|
## Преимущества решения
|
||||||
|
|
||||||
|
- **Автоматизация**: Публикация происходит автоматически при push
|
||||||
|
- **Версионирование**: Полная история изменений через Git
|
||||||
|
- **Безопасность**: Многоуровневая защита доступа
|
||||||
|
- **Производительность**: Статический сайт быстро загружается
|
||||||
|
- **Кастомизация**: Возможность настройки внешнего вида через Quartz
|
||||||
|
- **Поиск**: Полнотекстовый поиск по заметкам
|
||||||
|
- **Связи**: Визуализация связей между заметками
|
||||||
|
|
||||||
|
## Следующие шаги
|
||||||
|
|
||||||
|
Для развертывания системы изучите:
|
||||||
|
- [[Second Mind - Конфигурации]] - настройки всех сервисов
|
||||||
|
- [[Second Mind - Развертывание]] - пошаговая инструкция установки
|
||||||
|
- [[Second Mind - Администрирование]] - обслуживание и мониторинг
|
||||||
100
Second Mind Setup/second_mind_overview.md
Normal file
100
Second Mind Setup/second_mind_overview.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# Second Mind - Обзор системы
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Second Mind - система автоматической публикации заметок Obsidian через Quartz с использованием Git-based workflow. Позволяет превращать локальные заметки в красивый статический сайт автоматически при каждом commit'е.
|
||||||
|
|
||||||
|
## Архитектура системы
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
A[Gitea Repository] --> B[Webhook Service]
|
||||||
|
B --> C[Quartz Builder]
|
||||||
|
C --> D[Static Files]
|
||||||
|
D --> E[Nginx Server]
|
||||||
|
F[PostgreSQL] --> A
|
||||||
|
G[Traefik Proxy] --> A
|
||||||
|
G --> E
|
||||||
|
G --> B
|
||||||
|
```
|
||||||
|
|
||||||
|
## Основные компоненты
|
||||||
|
|
||||||
|
### Git-сервер (Gitea)
|
||||||
|
- **Назначение**: Хранение и версионирование заметок
|
||||||
|
- **Домен**: `git.aepif.ru`
|
||||||
|
- **База данных**: PostgreSQL
|
||||||
|
- **Особенности**: SSH доступ на порту 2222, webhook'и при push
|
||||||
|
|
||||||
|
### Webhook Service
|
||||||
|
- **Назначение**: Автоматическая пересборка при изменениях
|
||||||
|
- **Домен**: `webhook.aepif.ru`
|
||||||
|
- **Технология**: Node.js + Express
|
||||||
|
- **Функции**:
|
||||||
|
- Получение webhook'ов от Gitea
|
||||||
|
- Обновление локальной копии репозитория
|
||||||
|
- Запуск сборки Quartz
|
||||||
|
- Копирование результата для Nginx
|
||||||
|
|
||||||
|
### Quartz Builder
|
||||||
|
- **Назначение**: Генерация статического сайта из Markdown
|
||||||
|
- **Репозиторий**: Кастомный форк `ssh://git@git.aepif.ru:2222/aep/quartz.git`
|
||||||
|
- **Особенности**: Поддержка Obsidian-flavored Markdown, граф связей, поиск
|
||||||
|
|
||||||
|
### Веб-сервер (Nginx)
|
||||||
|
- **Назначение**: Раздача статического контента
|
||||||
|
- **Домен**: `notes.aepif.ru`
|
||||||
|
- **Особенности**: Кэширование, сжатие, защита через Authelia
|
||||||
|
|
||||||
|
### Reverse Proxy (Traefik)
|
||||||
|
- **Назначение**: Маршрутизация трафика и SSL
|
||||||
|
- **Функции**: Автоматические SSL сертификаты, балансировка, middleware
|
||||||
|
|
||||||
|
## Workflow использования
|
||||||
|
|
||||||
|
1. **Создание заметок** в Obsidian локально
|
||||||
|
2. **Commit и push** изменений в Gitea репозиторий
|
||||||
|
3. **Автоматический webhook** от Gitea запускает пересборку
|
||||||
|
4. **Webhook сервис** обновляет локальную копию и запускает Quartz
|
||||||
|
5. **Quartz генерирует** обновленный статический сайт
|
||||||
|
6. **Nginx раздает** новый контент посетителям
|
||||||
|
|
||||||
|
## Домены и доступ
|
||||||
|
|
||||||
|
| Сервис | Домен | Описание | Защита |
|
||||||
|
|--------|-------|----------|---------|
|
||||||
|
| Git-сервер | `git.aepif.ru` | Интерфейс Gitea | Авторизация |
|
||||||
|
| Статический сайт | `notes.aepif.ru` | Опубликованные заметки | Authelia |
|
||||||
|
| Webhook | `webhook.aepif.ru` | API для автоматизации | Секретный токен |
|
||||||
|
|
||||||
|
## Структура файлов
|
||||||
|
|
||||||
|
```
|
||||||
|
/DOCKER/second-mind/
|
||||||
|
├── docker-compose.yml # Основная конфигурация
|
||||||
|
├── Dockerfile # Образ для webhook сервиса
|
||||||
|
├── .env # Переменные окружения
|
||||||
|
├── nginx.conf # Конфигурация Nginx
|
||||||
|
├── webhook-server/ # Код webhook сервиса
|
||||||
|
│ ├── server.js
|
||||||
|
│ └── package.json
|
||||||
|
├── obsidian_repo/ # Локальная копия репозитория
|
||||||
|
└── quartz_build/ # Собранный статический сайт
|
||||||
|
```
|
||||||
|
|
||||||
|
## Преимущества решения
|
||||||
|
|
||||||
|
- **Автоматизация**: Публикация происходит автоматически при push
|
||||||
|
- **Версионирование**: Полная история изменений через Git
|
||||||
|
- **Безопасность**: Многоуровневая защита доступа
|
||||||
|
- **Производительность**: Статический сайт быстро загружается
|
||||||
|
- **Кастомизация**: Возможность настройки внешнего вида через Quartz
|
||||||
|
- **Поиск**: Полнотекстовый поиск по заметкам
|
||||||
|
- **Связи**: Визуализация связей между заметками
|
||||||
|
|
||||||
|
## Следующие шаги
|
||||||
|
|
||||||
|
Для развертывания системы изучите:
|
||||||
|
- [[Second Mind - Конфигурации]] - настройки всех сервисов
|
||||||
|
- [[Second Mind - Развертывание]] - пошаговая инструкция установки
|
||||||
|
- [[Second Mind - Администрирование]] - обслуживание и мониторинг
|
||||||
Reference in New Issue
Block a user