diff --git a/Second Mind Setup/Second Mind - Администрирование.md b/Second Mind Setup/Second Mind - Администрирование.md new file mode 100644 index 0000000..dc59cf9 --- /dev/null +++ b/Second Mind Setup/Second Mind - Администрирование.md @@ -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 - Обзор системы]] \ No newline at end of file diff --git a/Second Mind Setup/Second Mind - Конфигурации.md b/Second Mind Setup/Second Mind - Конфигурации.md new file mode 100644 index 0000000..49cb7be --- /dev/null +++ b/Second Mind Setup/Second Mind - Конфигурации.md @@ -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 - Развертывание]] \ No newline at end of file diff --git a/Second Mind Setup/second_mind_deployment.md b/Second Mind Setup/second_mind_deployment.md new file mode 100644 index 0000000..9b2a8be --- /dev/null +++ b/Second Mind Setup/second_mind_deployment.md @@ -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 - Администрирование]] - обслуживание и мониторинг \ No newline at end of file diff --git a/Second Mind Setup/second_mind_overview.md b/Second Mind Setup/second_mind_overview.md new file mode 100644 index 0000000..9b2a8be --- /dev/null +++ b/Second Mind Setup/second_mind_overview.md @@ -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 - Администрирование]] - обслуживание и мониторинг \ No newline at end of file