From 20e1f3fa6c530c7c1b91e99f4b7aaa549f099927 Mon Sep 17 00:00:00 2001 From: Cosmo Date: Thu, 2 Apr 2026 10:43:44 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B8=D0=BD=D1=84=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0=20VM=20=D0=A1?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D1=8B=20+=20=D0=B0=D1=80=D1=85?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BA=D1=82=D1=83=D1=80=D0=B0=20pulse-api=20?= =?UTF-8?q?=D0=B8=20pulse-web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Инфраструктура/pulse-api.md | 337 ++++++++++++++++++ Инфраструктура/pulse-web.md | 263 ++++++++++++++ Инфраструктура/Сервисы/README.md | 112 ++++++ Инфраструктура/Сервисы/adventurelog.md | 38 ++ Инфраструктура/Сервисы/bots-menu.md | 42 +++ Инфраструктура/Сервисы/cosmo-studio.md | 36 ++ Инфраструктура/Сервисы/gitea-runner.md | 40 +++ Инфраструктура/Сервисы/gitea.md | 47 +++ Инфраструктура/Сервисы/health-webhook.md | 37 ++ Инфраструктура/Сервисы/homepage.md | 40 +++ Инфраструктура/Сервисы/it-tools.md | 31 ++ Инфраструктура/Сервисы/japan-app.md | 31 ++ Инфраструктура/Сервисы/langlearn.md | 39 ++ Инфраструктура/Сервисы/lingua-learn.md | 34 ++ Инфраструктура/Сервисы/media.md | 50 +++ Инфраструктура/Сервисы/my-game-svoya-igra.md | 41 +++ Инфраструктура/Сервисы/nextcloud.md | 49 +++ Инфраструктура/Сервисы/photo-immich.md | 50 +++ Инфраструктура/Сервисы/portainer.md | 38 ++ .../Сервисы/pulse-api-homelab-api.md | 49 +++ Инфраструктура/Сервисы/pulse-web.md | 36 ++ Инфраструктура/Сервисы/review-bot.md | 46 +++ Инфраструктура/Сервисы/savings.md | 52 +++ .../Сервисы/services-nginx-proxy-manager.md | 41 +++ Инфраструктура/Сервисы/storybook.md | 31 ++ Инфраструктура/Сервисы/uptime-kuma.md | 35 ++ Инфраструктура/Сервисы/vault-vaultwarden.md | 38 ++ Инфраструктура/Сервисы/vikunja.md | 48 +++ Инфраструктура/Сервисы/vpn-invite.md | 37 ++ Инфраструктура/Сервисы/vpn-router.md | 35 ++ Инфраструктура/Сервисы/webhook-deploy.md | 40 +++ 31 files changed, 1843 insertions(+) create mode 100644 Инфраструктура/pulse-api.md create mode 100644 Инфраструктура/pulse-web.md create mode 100644 Инфраструктура/Сервисы/README.md create mode 100644 Инфраструктура/Сервисы/adventurelog.md create mode 100644 Инфраструктура/Сервисы/bots-menu.md create mode 100644 Инфраструктура/Сервисы/cosmo-studio.md create mode 100644 Инфраструктура/Сервисы/gitea-runner.md create mode 100644 Инфраструктура/Сервисы/gitea.md create mode 100644 Инфраструктура/Сервисы/health-webhook.md create mode 100644 Инфраструктура/Сервисы/homepage.md create mode 100644 Инфраструктура/Сервисы/it-tools.md create mode 100644 Инфраструктура/Сервисы/japan-app.md create mode 100644 Инфраструктура/Сервисы/langlearn.md create mode 100644 Инфраструктура/Сервисы/lingua-learn.md create mode 100644 Инфраструктура/Сервисы/media.md create mode 100644 Инфраструктура/Сервисы/my-game-svoya-igra.md create mode 100644 Инфраструктура/Сервисы/nextcloud.md create mode 100644 Инфраструктура/Сервисы/photo-immich.md create mode 100644 Инфраструктура/Сервисы/portainer.md create mode 100644 Инфраструктура/Сервисы/pulse-api-homelab-api.md create mode 100644 Инфраструктура/Сервисы/pulse-web.md create mode 100644 Инфраструктура/Сервисы/review-bot.md create mode 100644 Инфраструктура/Сервисы/savings.md create mode 100644 Инфраструктура/Сервисы/services-nginx-proxy-manager.md create mode 100644 Инфраструктура/Сервисы/storybook.md create mode 100644 Инфраструктура/Сервисы/uptime-kuma.md create mode 100644 Инфраструктура/Сервисы/vault-vaultwarden.md create mode 100644 Инфраструктура/Сервисы/vikunja.md create mode 100644 Инфраструктура/Сервисы/vpn-invite.md create mode 100644 Инфраструктура/Сервисы/vpn-router.md create mode 100644 Инфраструктура/Сервисы/webhook-deploy.md diff --git a/Инфраструктура/pulse-api.md b/Инфраструктура/pulse-api.md new file mode 100644 index 0000000..5eb8b92 --- /dev/null +++ b/Инфраструктура/pulse-api.md @@ -0,0 +1,337 @@ +# pulse-api — Архитектура + +**Репозиторий:** `https://git.digital-home.site/daniil/pulse-api` +**Go module:** `github.com/daniil/homelab-api` +**URL:** `https://api.digital-home.site` +**Dev:** `http://192.168.31.60:8081` + +## Общая архитектура + +Классический Go REST API с разделением на слои: + +``` +cmd/api/main.go ← точка входа, роутер, инициализация +internal/ + config/ ← загрузка env-переменных + repository/ ← работа с БД (SQL-запросы) + service/ ← бизнес-логика + handler/ ← HTTP-хендлеры (request/response) + model/ ← структуры данных (Go structs + JSON) + middleware/ ← JWT-аутентификация + bot/ ← Telegram бот + scheduler/ ← cron-задачи (напоминания) +``` + +**Стек:** +- Router: `go-chi/chi v5` +- ORM: `jmoiron/sqlx` (raw SQL + named queries) +- БД: PostgreSQL 16 +- JWT: `golang-jwt/jwt v5` +- Telegram: `go-telegram-bot-api v5` +- Cron: `robfig/cron v3` +- Email: Resend API (`service/email.go`) +- Крипто: `golang.org/x/crypto` (bcrypt для паролей) + +## Структура папок + +``` +pulse-api/ +├── cmd/api/main.go # Точка входа: роутер, DI, запуск +├── internal/ +│ ├── bot/ +│ │ ├── bot.go # Инициализация, Start(), SendMessage() +│ │ └── handlers.go # Команды и callback кнопки +│ ├── config/ +│ │ └── config.go # Config struct + Load() из env +│ ├── handler/ +│ │ ├── auth.go # Register, Login, Refresh, Me, VerifyEmail... +│ │ ├── tasks.go # CRUD задач + complete/uncomplete +│ │ ├── habits.go # CRUD привычек + логи + статистика +│ │ ├── habit_freeze.go # Заморозка привычек +│ │ ├── finance.go # Категории и транзакции финансов +│ │ ├── savings.go # Накопления (категории, участники, планы) +│ │ ├── interest.go # Начисление процентов +│ │ ├── profile.go # Профиль пользователя +│ │ └── health.go # GET /health +│ ├── middleware/ +│ │ └── auth.go # JWT Bearer middleware +│ ├── model/ +│ │ ├── user.go # User, RegisterRequest, LoginRequest... +│ │ ├── task.go # Task, CreateTaskRequest... +│ │ ├── habit.go # Habit, HabitLog, HabitStats... +│ │ ├── habit_freeze.go # HabitFreeze +│ │ ├── finance.go # FinanceCategory, FinanceTransaction... +│ │ ├── savings.go # SavingsCategory, SavingsTransaction... +│ │ └── email.go # Email templates +│ ├── repository/ +│ │ ├── db.go # NewDB() + RunMigrations() +│ │ ├── user.go # UserRepository +│ │ ├── task.go # TaskRepository +│ │ ├── habit.go # HabitRepository +│ │ ├── habit_freeze.go # HabitFreezeRepository +│ │ ├── finance.go # FinanceRepository +│ │ ├── savings.go # SavingsRepository +│ │ └── email_token.go # EmailTokenRepository +│ ├── service/ +│ │ ├── auth.go # AuthService: register/login/JWT +│ │ ├── habit.go # HabitService +│ │ ├── task.go # TaskService +│ │ ├── finance.go # FinanceService +│ │ ├── interest.go # Начисление процентов +│ │ └── email.go # EmailService (Resend) +│ └── scheduler/ +│ └── scheduler.go # Cron-напоминания через Telegram +├── docs/ +│ └── SAVINGS.md +├── go.mod +├── Dockerfile +└── docker-compose.yml +``` + +## API Эндпоинты + +### Публичные (без авторизации) + +| Метод | Путь | Описание | +|-------|------|----------| +| GET | `/health` | Health check | +| POST | `/auth/register` | Регистрация: `{email, username, password}` | +| POST | `/auth/login` | Логин: `{email, password}` → `{access_token, refresh_token, user}` | +| POST | `/auth/refresh` | Обновление токена: `{refresh_token}` | +| POST | `/auth/verify-email` | Подтверждение email: `{token}` | +| POST | `/auth/resend-verification` | Повторная отправка: `{email}` | +| POST | `/auth/forgot-password` | Сброс пароля: `{email}` | +| POST | `/auth/reset-password` | Новый пароль: `{token, new_password}` | + +### Авторизованные (Bearer JWT) + +#### Аутентификация/Профиль + +| Метод | Путь | Описание | +|-------|------|----------| +| GET | `/auth/me` | Текущий пользователь | +| PUT | `/auth/me` | Обновить профиль | +| PUT | `/auth/password` | Сменить пароль: `{old_password, new_password}` | +| GET | `/profile` | Профиль | +| PUT | `/profile` | Обновить профиль | + +#### Задачи + +| Метод | Путь | Описание | +|-------|------|----------| +| GET | `/tasks` | Список задач. Query: `?completed=true/false` | +| GET | `/tasks/today` | Задачи на сегодня | +| POST | `/tasks` | Создать: `{title, description?, icon?, color?, due_date?, priority?, reminder_time?, is_recurring?, recurrence_type?, recurrence_interval?, recurrence_end_date?}` | +| GET | `/tasks/{id}` | Получить задачу | +| PUT | `/tasks/{id}` | Обновить задачу | +| DELETE | `/tasks/{id}` | Удалить задачу | +| POST | `/tasks/{id}/complete` | Отметить выполненной | +| POST | `/tasks/{id}/uncomplete` | Снять отметку | + +#### Привычки + +| Метод | Путь | Описание | +|-------|------|----------| +| GET | `/habits` | Список привычек | +| POST | `/habits` | Создать: `{name, description?, color?, icon?, frequency, target_days?, target_count?, reminder_time?, start_date?}` | +| GET | `/habits/{id}` | Получить привычку | +| PUT | `/habits/{id}` | Обновить | +| DELETE | `/habits/{id}` | Удалить | +| POST | `/habits/{id}/log` | Отметить: `{date?, count?, note?}` | +| GET | `/habits/{id}/logs` | История отметок | +| DELETE | `/habits/{id}/logs/{logId}` | Удалить отметку | +| GET | `/habits/stats` | Общая статистика | +| GET | `/habits/{id}/stats` | Статистика привычки | +| GET | `/habits/{id}/freezes` | Заморозки привычки | +| POST | `/habits/{id}/freezes` | Создать заморозку | +| DELETE | `/habits/{id}/freezes/{freezeId}` | Удалить заморозку | + +#### Финансы + +| Метод | Путь | Описание | +|-------|------|----------| +| GET | `/finance/categories` | Категории расходов/доходов | +| POST | `/finance/categories` | Создать: `{name, emoji?, type, budget?, color?, sort_order?}` | +| PUT | `/finance/categories/{id}` | Обновить | +| DELETE | `/finance/categories/{id}` | Удалить | +| GET | `/finance/transactions` | Транзакции. Query: `?month=&year=` | +| POST | `/finance/transactions` | Создать: `{category_id, type, amount, description?, date}` | +| PUT | `/finance/transactions/{id}` | Обновить | +| DELETE | `/finance/transactions/{id}` | Удалить | +| GET | `/finance/summary` | Сводка: баланс, доходы, расходы, по категориям | +| GET | `/finance/analytics` | Аналитика: тренды по месяцам | + +#### Накопления + +| Метод | Путь | Описание | +|-------|------|----------| +| GET | `/savings/categories` | Категории накоплений | +| POST | `/savings/categories` | Создать категорию | +| GET | `/savings/categories/{id}` | Получить | +| PUT | `/savings/categories/{id}` | Обновить | +| DELETE | `/savings/categories/{id}` | Удалить | +| GET | `/savings/categories/{id}/members` | Участники | +| POST | `/savings/categories/{id}/members` | Добавить участника | +| DELETE | `/savings/categories/{id}/members/{userId}` | Удалить участника | +| GET | `/savings/categories/{id}/recurring-plans` | Регулярные планы | +| POST | `/savings/categories/{id}/recurring-plans` | Создать план | +| PUT | `/savings/recurring-plans/{planId}` | Обновить план | +| DELETE | `/savings/recurring-plans/{planId}` | Удалить план | +| GET | `/savings/transactions` | Транзакции накоплений | +| POST | `/savings/transactions` | Создать транзакцию | +| GET | `/savings/transactions/{id}` | Получить | +| PUT | `/savings/transactions/{id}` | Обновить | +| DELETE | `/savings/transactions/{id}` | Удалить | +| GET | `/savings/stats` | Статистика | + +## Модели данных + +### User +```go +type User struct { + ID int64 + Email string + Username string + PasswordHash string // bcrypt, в JSON скрыто + EmailVerified bool + TelegramChatID *int64 // nullable + NotificationsEnabled bool + Timezone string + MorningReminderTime string // "09:00" + EveningReminderTime string // "21:00" + CreatedAt, UpdatedAt time.Time +} +``` + +### Task +```go +type Task struct { + ID, UserID int64 + Title, Description string + Icon, Color string + DueDate *string // "2026-01-01" + Priority int // 1=низкий, 2=средний, 3=высокий + ReminderTime *string // "19:00" + Completed bool // производное от CompletedAt + // Повторяющиеся задачи: + IsRecurring bool + RecurrenceType *string // "daily", "weekly", "monthly" + RecurrenceInterval int + RecurrenceEndDate *string + ParentTaskID *int64 + CreatedAt, UpdatedAt time.Time +} +``` + +### Habit +```go +type Habit struct { + ID, UserID int64 + Name, Description string + Color, Icon string + Frequency string // "daily", "weekly", "custom" + TargetDays []int // дни недели (0=вс...6=сб) + TargetCount int + ReminderTime *string // "19:00" + StartDate *string + IsArchived bool + CreatedAt, UpdatedAt time.Time +} + +type HabitLog struct { + ID, HabitID, UserID int64 + Date time.Time + Count int + Note string + CreatedAt time.Time +} +``` + +### FinanceCategory / FinanceTransaction +```go +type FinanceCategory struct { + ID, UserID int64 + Name, Emoji string + Type string // "income" | "expense" + Budget *float64 + Color string + SortOrder int + CreatedAt time.Time +} + +type FinanceTransaction struct { + ID, UserID, CategoryID int64 + Type string // "income" | "expense" + Amount float64 + Description string + Date time.Time + CreatedAt time.Time + CategoryName, CategoryEmoji string // из JOIN +} +``` + +## Аутентификация + +- **JWT HS256** с двумя типами токенов: `access` (короткий) и `refresh` (длинный) +- Middleware `Authenticate` парсит `Authorization: Bearer `, проверяет `type == "access"` +- UserID извлекается из claims и помещается в context: `GetUserID(ctx)` +- Пароли хешируются bcrypt +- Email-верификация при регистрации через Resend API +- Password reset — одноразовые токены в таблице `email_tokens` + +## Telegram Бот + +**Команды:** +| Команда | Действие | +|---------|---------| +| `/start` | Показать Chat ID (для привязки к аккаунту Pulse) | +| `/tasks` | Список задач на сегодня с inline-кнопками | +| `/habits` | Привычки на сегодня с inline-кнопками | +| `/done ` или `/done_` | Отметить задачу выполненной | +| `/check ` или `/check_` | Отметить привычку | +| `/help` | Справка | + +**Callback-кнопки:** +- `donetask_` — выполнить задачу +- `deltask_` — удалить задачу +- `checkhabit_` — отметить привычку сегодня +- `checkhabit__yesterday` — отметить привычку за вчера + +**Привязка:** пользователь вводит `/start`, получает Chat ID, вставляет его в настройки Pulse → `PUT /profile {telegram_chat_id: ...}` + +## Scheduler (cron-напоминания) + +`internal/scheduler/scheduler.go` — использует `robfig/cron`: +- Утренние напоминания (время из настроек пользователя) +- Вечерние напоминания +- Напоминания о задачах по `reminder_time` +- Напоминания о привычках по `reminder_time` + +## Конфигурация (env переменные) + +| Переменная | Описание | Default | +|-----------|----------|---------| +| `DATABASE_URL` | PostgreSQL DSN | `postgres://homelab:homelab@db:5432/homelab` | +| `JWT_SECRET` | Секрет для JWT | `change-me-in-production` | +| `PORT` | Порт сервера | `8080` | +| `RESEND_API_KEY` | API ключ Resend (email) | — | +| `FROM_EMAIL` | Email отправителя | `noreply@digital-home.site` | +| `FROM_NAME` | Имя отправителя | `Homelab` | +| `APP_URL` | Публичный URL приложения | `https://api.digital-home.site` | +| `TELEGRAM_BOT_TOKEN` | Токен Telegram бота | — | + +## Где искать что + +| Задача | Файл | +|--------|------| +| Добавить новый эндпоинт | `handler/.go` + роут в `cmd/api/main.go` | +| Изменить модель/таблицу | `model/.go` + `repository/db.go` (migrations) | +| Логика уведомлений | `internal/scheduler/scheduler.go` | +| Telegram команды | `internal/bot/handlers.go` | +| Финансы (категории/транзакции) | `handler/finance.go`, `service/finance.go`, `repository/finance.go` | +| Привычки | `handler/habits.go`, `service/habit.go`, `repository/habit.go` | +| Задачи | `handler/tasks.go`, `service/task.go`, `repository/task.go` | +| Накопления | `handler/savings.go`, `repository/savings.go` | +| Email отправка | `service/email.go` | +| JWT/Auth | `service/auth.go`, `middleware/auth.go` | +| Конфиг | `config/config.go` | diff --git a/Инфраструктура/pulse-web.md b/Инфраструктура/pulse-web.md new file mode 100644 index 0000000..47e2c5c --- /dev/null +++ b/Инфраструктура/pulse-web.md @@ -0,0 +1,263 @@ +# pulse-web — Архитектура + +**Репозиторий:** `https://git.digital-home.site/daniil/pulse-web` +**URL:** `https://pulse.digital-home.site` +**Dev:** `http://192.168.31.60:5174` +**Storybook:** `http://192.168.31.60:6006` + +## Общая архитектура + +React SPA (Single Page Application): + +``` +src/ + api/ ← API-функции (axios, по доменам) + store/ ← State management (Zustand) + contexts/ ← React Context (тема) + pages/ ← Страницы (маршруты) + components/ ← Переиспользуемые компоненты + main.jsx ← Точка входа (BrowserRouter + ThemeContext) + App.jsx ← Роутер (Routes/Route) + index.css ← Глобальные стили (Tailwind) +``` + +**Стек:** +- Framework: React 18 +- Bundler: Vite 5 +- Роутинг: React Router DOM 6 +- State: Zustand 4 +- HTTP: Axios (с interceptors для JWT refresh) +- UI: Tailwind CSS 3 +- Анимации: Framer Motion 11 +- Иконки: Lucide React +- Графики: Recharts 2 +- Утилиты дат: date-fns 3 +- Компонент-либа: Storybook 8 +- Тесты: Vitest + Testing Library + +## Структура папок + +``` +pulse-web/ +├── src/ +│ ├── api/ +│ │ ├── client.js # Axios instance + JWT interceptor +│ │ ├── auth.js # (в store/auth.js) +│ │ ├── tasks.js # tasksApi: list, today, create, complete... +│ │ ├── habits.js # habitsApi: list, create, log, stats... +│ │ ├── finance.js # financeApi: categories, transactions, summary +│ │ ├── savings.js # savingsApi: categories, transactions, stats +│ │ └── profile.js # profileApi: get, update +│ ├── store/ +│ │ └── auth.js # useAuthStore (Zustand): user, login, logout +│ ├── contexts/ +│ │ └── ThemeContext.jsx # ThemeProvider: light/dark, localStorage +│ ├── pages/ +│ │ ├── Home.jsx # Главная страница (дашборд) +│ │ ├── Tracker.jsx # Трекер (таб: привычки/задачи/статистика) +│ │ ├── Habits.jsx # Страница привычек (встраивается в Tracker) +│ │ ├── Tasks.jsx # Страница задач (встраивается в Tracker) +│ │ ├── Stats.jsx # Статистика (встраивается в Tracker) +│ │ ├── Finance.jsx # Финансы (таб: обзор/транзакции/аналитика/категории) +│ │ ├── Savings.jsx # Накопления +│ │ ├── Settings.jsx # Настройки пользователя +│ │ ├── Login.jsx # Вход +│ │ ├── Register.jsx # Регистрация +│ │ ├── ForgotPassword.jsx # Сброс пароля +│ │ ├── ResetPassword.jsx # Новый пароль (по токену из email) +│ │ └── VerifyEmail.jsx # Подтверждение email +│ ├── components/ +│ │ ├── Navigation.jsx # Нижняя навигация (fixed bottom) +│ │ ├── CreateTaskModal.jsx +│ │ ├── EditTaskModal.jsx +│ │ ├── CreateHabitModal.jsx +│ │ ├── EditHabitModal.jsx +│ │ ├── LogHabitModal.jsx +│ │ └── finance/ +│ │ ├── FinanceDashboard.jsx # Обзор месяца +│ │ ├── TransactionList.jsx # Список транзакций +│ │ ├── FinanceAnalytics.jsx # Графики трендов +│ │ ├── CategoriesManager.jsx # Управление категориями +│ │ └── AddTransactionModal.jsx +│ ├── App.jsx # Routes + ProtectedRoute/PublicRoute +│ ├── main.jsx # ReactDOM.render + Providers +│ └── index.css # Tailwind + кастомные стили +├── public/ +├── package.json +├── vite.config.js +├── tailwind.config.js +├── nginx.conf +└── Dockerfile +``` + +## Страницы / Роуты + +| Путь | Компонент | Защита | Описание | +|------|-----------|--------|----------| +| `/login` | `Login` | Public only | Форма входа | +| `/register` | `Register` | Public only | Форма регистрации | +| `/forgot-password` | `ForgotPassword` | Public only | Запрос сброса пароля | +| `/verify-email` | `VerifyEmail` | Нет | Подтверждение email по токену | +| `/reset-password` | `ResetPassword` | Нет | Установка нового пароля | +| `/` | `Home` | Protected | Главная: дашборд | +| `/tracker` | `Tracker` | Protected | Трекер привычек/задач/статистики | +| `/habits` | → `/tracker` | Protected | Редирект на трекер | +| `/tasks` | → `/tracker` | Protected | Редирект на трекер | +| `/stats` | → `/tracker` | Protected | Редирект на трекер | +| `/savings` | `Savings` | Protected | Накопления | +| `/settings` | `Settings` | Protected | Настройки аккаунта | +| `*` | → `/` | — | Любой неизвестный → главная | + +### Tracker (вкладки) +`/tracker` содержит 3 вкладки: +1. **Привычки** — `Habits` компонент +2. **Задачи** — `Tasks` компонент +3. **Статистика** — `Stats` компонент + +### Finance (вкладки) +`/finance` (доступна через роутер если добавить) содержит 4 вкладки: +1. **Обзор** — `FinanceDashboard` +2. **Транзакции** — `TransactionList` +3. **Аналитика** — `FinanceAnalytics` +4. **Категории** — `CategoriesManager` + +> ⚠️ Страница Finance рендерится, но **нет роута** в App.jsx. Доступ только если добавить ``. + +## Основные компоненты + +| Компонент | Файл | Назначение | +|-----------|------|------------| +| `Navigation` | components/Navigation.jsx | Нижняя навбар (Главная, Трекер, Накопления, Настройки). Показывает Finance только для `user.id === 1` (owner) | +| `ProtectedRoute` | App.jsx | Редиректит на `/login` если не авторизован | +| `PublicRoute` | App.jsx | Редиректит на `/` если уже авторизован | +| `FinanceDashboard` | finance/ | Обзор месяца: баланс, доходы/расходы, по категориям, дневной график | +| `TransactionList` | finance/ | Список транзакций с фильтрацией | +| `FinanceAnalytics` | finance/ | Recharts: тренды по месяцам | +| `CategoriesManager` | finance/ | CRUD категорий | +| `AddTransactionModal` | finance/ | Модал добавления транзакции | +| `CreateTaskModal` | components/ | Создание задачи | +| `EditTaskModal` | components/ | Редактирование задачи | +| `CreateHabitModal` | components/ | Создание привычки | +| `LogHabitModal` | components/ | Отметка привычки | + +## API вызовы + +### Axios Client (`src/api/client.js`) + +```js +const api = axios.create({ baseURL: VITE_API_URL }) + +// Request interceptor: добавляет Bearer токен из localStorage +api.interceptors.request → Authorization: Bearer + +// Response interceptor: при 401 делает refresh и повторяет запрос +api.interceptors.response → POST /auth/refresh → обновляет tokens в localStorage +``` + +### API модули + +```js +// tasks.js +tasksApi.list(completed?) → GET /tasks +tasksApi.today() → GET /tasks/today +tasksApi.create(data) → POST /tasks +tasksApi.complete(id) → POST /tasks/{id}/complete +tasksApi.uncomplete(id) → POST /tasks/{id}/uncomplete +tasksApi.update(id, data) → PUT /tasks/{id} +tasksApi.delete(id) → DELETE /tasks/{id} + +// habits.js +habitsApi.list() → GET /habits +habitsApi.create(data) → POST /habits +habitsApi.log(id, data) → POST /habits/{id}/log +habitsApi.stats() → GET /habits/stats +habitsApi.habitStats(id) → GET /habits/{id}/stats + +// finance.js +financeApi.getCategories() → GET /finance/categories +financeApi.createCategory(data) → POST /finance/categories +financeApi.getTransactions(m, y) → GET /finance/transactions?month=&year= +financeApi.createTransaction(data) → POST /finance/transactions +financeApi.getSummary(m, y) → GET /finance/summary +financeApi.getAnalytics() → GET /finance/analytics + +// savings.js +savingsApi.getCategories() → GET /savings/categories +savingsApi.createCategory(data) → POST /savings/categories +savingsApi.getTransactions() → GET /savings/transactions +savingsApi.getStats() → GET /savings/stats + +// profile.js +profileApi.get() → GET /profile +profileApi.update(data) → PUT /profile +``` + +## State Management + +**Zustand** — единственный store: `src/store/auth.js` + +```js +useAuthStore = { + user: null | User, + isLoading: boolean, + isAuthenticated: boolean, + + initialize() // Вызывается в App.jsx useEffect: GET /auth/me + login(email, password) // POST /auth/login, сохраняет tokens + register(email, username, password) + logout() // Чистит localStorage + state +} +``` + +**React Context:** +- `ThemeContext` (`contexts/ThemeContext.jsx`) — dark/light mode, сохраняется в localStorage + +**Нет Redux / React Query** — данные загружаются локально в компонентах через `useState + useEffect`. + +## Основные зависимости + +| Пакет | Версия | Назначение | +|-------|--------|------------| +| react | 18.2 | UI framework | +| react-router-dom | 6.22 | Роутинг | +| zustand | 4.5 | State management | +| axios | 1.6 | HTTP клиент | +| tailwindcss | 3.4 | CSS utility framework | +| framer-motion | 11 | Анимации | +| lucide-react | 0.312 | Иконки | +| recharts | 2.12 | Графики | +| date-fns | 3.3 | Утилиты дат | +| clsx | 2.1 | Условные классы | +| storybook | 8.5 | UI компонент-браузер (dev) | +| vitest | 4 | Тесты | + +## Конфигурация + +| Env переменная | Описание | Default | +|---------------|----------|---------| +| `VITE_API_URL` | URL backend API | `https://api.digital-home.site` | + +## Где искать что + +| Задача | Файл | +|--------|------| +| **Новая страница** | `src/pages/NewPage.jsx` + роут в `App.jsx` + ссылка в `Navigation.jsx` | +| **Новый компонент** | `src/components/NewComponent.jsx` | +| **Новый API вызов** | `src/api/.js` (добавить метод) | +| **Финансы: UI** | `src/pages/Finance.jsx`, `src/components/finance/` | +| **Финансы: API** | `src/api/finance.js` | +| **Привычки: UI** | `src/pages/Habits.jsx`, `CreateHabitModal`, `LogHabitModal` | +| **Привычки: API** | `src/api/habits.js` | +| **Задачи: UI** | `src/pages/Tasks.jsx`, `CreateTaskModal`, `EditTaskModal` | +| **Задачи: API** | `src/api/tasks.js` | +| **Авторизация** | `src/store/auth.js`, `src/pages/Login.jsx` | +| **Глобальные стили** | `src/index.css` + `tailwind.config.js` | +| **Темная тема** | `src/contexts/ThemeContext.jsx` | +| **Нижняя навигация** | `src/components/Navigation.jsx` | + +## Заметки + +- `Finance` страница не добавлена в роутер и навигацию для обычных пользователей — только для owner (id=1) +- Legacy роуты `/habits`, `/tasks`, `/stats` → редиректят на `/tracker` +- Токены хранятся в `localStorage`: `access_token`, `refresh_token` +- Auto-refresh токена при 401 ответе (в axios interceptor) diff --git a/Инфраструктура/Сервисы/README.md b/Инфраструктура/Сервисы/README.md new file mode 100644 index 0000000..c4266da --- /dev/null +++ b/Инфраструктура/Сервисы/README.md @@ -0,0 +1,112 @@ +# Сервисы VM 192.168.31.60 + +Все Docker-сервисы развёрнуты в `/opt/digital-home/` на VM Сервисы. +Общая сеть: `services_proxy` (создана в `services/docker-compose.yml`). +Внешний трафик: Nginx Proxy Manager → домены `*.digital-home.site`. + +## Сводная таблица + +| Сервис | Папка | Домен | Порты (внешние) | Статус | +|--------|-------|-------|-----------------|--------| +| Nginx Proxy Manager | services/ | — (точка входа) | 80, 81, 443 | ✅ Up | +| Gitea | gitea/ | git.digital-home.site | — (NPM) | ✅ Up | +| Gitea Runner | gitea-runner/ | — | — | ✅ Up | +| Homepage | homepage/ | home.digital-home.site | — (NPM) | ✅ Up | +| Jellyfin | media/ | — | — (NPM) | ✅ Up | +| qBittorrent | media/ | — | 6881 | ❌ Stopped | +| Nextcloud | nextcloud/ | cloud.digital-home.site | 5433 (db) | ✅ Up | +| Immich | photo/ | — | — (NPM) | ✅ Up | +| Portainer | portainer/ | portainer.digital-home.site | — (NPM) | ✅ Up | +| Uptime Kuma | uptime-kuma/ | — | — (NPM) | ✅ Up | +| Vaultwarden | vault/ | vault.digital-home.site | — (NPM) | ✅ Up | +| Vikunja | vikunja/ | tasks.digital-home.site | — (NPM) | ✅ Up | +| Menu Bot | bots/menu/ | — | — | ❓ Unknown | +| Review Bot | review-bot/ | — | 3300 | ✅ Up | +| Cosmo Studio | cosmo-studio/ | — | — (NPM) | ✅ Up | +| Pulse API | homelab-api/ | api.digital-home.site | 8081 (dev) | ✅ Up | +| Pulse Web | pulse-web/ | pulse.digital-home.site | 5174 (dev) | ✅ Up | +| Storybook | storybook/ | — | 6006 | ✅ Up | +| Health Webhook | health-webhook/ | health.digital-home.site | 3200 | ✅ Up | +| IT Tools | it-tools/ | — | — (NPM) | ✅ Up | +| Savings | savings/ | — | — (NPM) | ❌ Stopped | +| AdventureLog | adventurelog/ | — | — | ❌ Stopped | +| LangLearn | langlearn/ | — | — | ❌ Stopped | +| Lingua Learn | lingua-learn/ | — | — | ❌ Stopped | +| My Game (Своя Игра) | my-game/ | — | — | ❌ Stopped | +| Japan App | japan-app/ | — | — | ❌ Stopped | +| VPN Invite | vpn-invite/ | — | 3500 | ✅ Up | +| VPN Router | vpn-router/ | — | host network | ❌ Stopped | +| Webhook Deploy | webhook-deploy/ | — | 9000 | ❓ Unknown | + +## Запущенные сервисы (docker ps) + +Статус на момент документирования (02.04.2026): + +``` +homelab-api Up 19 hours +vpn-invite Up 21 hours +cosmo-studio (x2) Up 3 days +uptime-kuma Up 5 days (healthy) +jellyfin Up 6 days (healthy) +gitea-runner Up 6 days +review-bot Up 6 days +health-webhook Up 7 days +pulse-web Up 12 days +pulse-web-dev Up 4 weeks +pulse-api-dev Up 4 weeks +storybook Up 4 weeks +nginx_proxy_manager Up 26 hours +homelab-db Up 4 weeks (healthy) +it-tools Up 4 weeks +homepage Up 4 weeks (healthy) +immich_server Up 4 weeks (healthy) +immich_redis Up 4 weeks +immich_postgres Up 4 weeks +immich_ml Up 4 weeks (healthy) +vikunja Up 4 weeks +vikunja_db Up 4 weeks +vaultwarden Up 4 weeks (healthy) +portainer Up 4 weeks +nextcloud_app Up 4 weeks +nextcloud_db Up 4 weeks +nextcloud_redis Up 4 weeks +gitea Up 4 weeks +``` + +## Архитектура сети + +``` +Интернет + ↓ +Nginx Proxy Manager (80/443) + ↓ (services_proxy network) +┌───────────────────────────────┐ +│ Все сервисы в одной сети │ +│ services_proxy │ +│ │ +│ git.* → gitea:3000 │ +│ home.* → homepage:3000 │ +│ cloud.* → nextcloud_app:80 │ +│ vault.* → vaultwarden:80 │ +│ tasks.* → vikunja:3456 │ +│ portainer.* → portainer:9000 │ +│ api.* → homelab-api:8080 │ +│ pulse.* → pulse-web:80 │ +│ health.* → health-webhook:3200│ +└───────────────────────────────┘ +``` + +## Паттерн добавления сервиса + +```bash +mkdir /opt/digital-home/ +cd /opt/digital-home/ + +# docker-compose.yml с сетью: +networks: + services_proxy: + external: true + +docker compose up -d +# Добавить proxy host в NPM UI (порт 81) +``` diff --git a/Инфраструктура/Сервисы/adventurelog.md b/Инфраструктура/Сервисы/adventurelog.md new file mode 100644 index 0000000..c1badb2 --- /dev/null +++ b/Инфраструктура/Сервисы/adventurelog.md @@ -0,0 +1,38 @@ +# AdventureLog + +## Назначение +Приложение для логирования путешествий и приключений. Ведение дневника поездок с геолокацией. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| adventurelog-frontend | ghcr.io/seanmorley15/adventurelog-frontend:latest | +| adventurelog-backend | ghcr.io/seanmorley15/adventurelog-backend:latest | +| adventurelog-db | postgis/postgis:16-3.5 | + +## Порты +Нет внешних портов (через NPM). + +## Volumes + +| Volume | Контейнер | Путь контейнера | Содержимое | +|--------|-----------|----------------|------------| +| postgres_data | adventurelog-db | /var/lib/postgresql/data | БД PostGIS | +| adventurelog_media | adventurelog-backend | /code/media/ | Медиа-файлы | + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) +- `default` (internal между frontend и backend) + +## Env переменные +Из `env_file: .env` (ключи неизвестны). + +## Статус +❌ **Не запущен** (не найден в `docker ps`) + +## Заметки +- Использует PostGIS (PostgreSQL с геопространственными расширениями) diff --git a/Инфраструктура/Сервисы/bots-menu.md b/Инфраструктура/Сервисы/bots-menu.md new file mode 100644 index 0000000..5dd2240 --- /dev/null +++ b/Инфраструктура/Сервисы/bots-menu.md @@ -0,0 +1,42 @@ +# Menu Bot (bots/menu) + +## Назначение +Telegram-бот для отображения меню / навигации. Написан на Go. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| menu-bot | local build (Go) | + +## Порты +Нет внешних портов. + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./data | /root/data | Данные бота | + +## Домен +Нет. + +## Сети +Нет явной сети (использует `env_file: .env`). + +## Env переменные +Из `.env` файла (ключи неизвестны — файл не читался). + +## Статус +❓ **Статус неизвестен** (не найден в `docker ps`) + +## Структура проекта +``` +bots/menu/ +├── cmd/ # Точка входа +├── internal/ # Логика бота +├── data/ # Данные +├── Dockerfile +├── docker-compose.yml +└── go.mod +``` diff --git a/Инфраструктура/Сервисы/cosmo-studio.md b/Инфраструктура/Сервисы/cosmo-studio.md new file mode 100644 index 0000000..7e3194f --- /dev/null +++ b/Инфраструктура/Сервисы/cosmo-studio.md @@ -0,0 +1,36 @@ +# Cosmo Studio + +## Назначение +Web-интерфейс для OpenClaw AI-ассистента (Cosmo). Bridge-сервис соединяется с OpenClaw instance, frontend предоставляет UI для взаимодействия. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| cosmo-studio-bridge-1 | local build (Dockerfile) | +| cosmo-studio-frontend-1 | local build (Dockerfile.frontend) | + +## Порты + +| Контейнер | Внутренний | Назначение | +|-----------|-----------|------------| +| bridge | 3401-3402 | WebSocket bridge | +| frontend | 80 | Web UI | + +## Volumes +Нет persistent volumes (конфиг через env). + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) +- `internal` (bridge между bridge и frontend) + +## Env переменные +- `OPENCLAW_URL` (ws://192.168.31.103:18789) +- `OPENCLAW_TOKEN` +- `SSH_KEY_PATH` + +## Статус +✅ **Запущен** (Up 3 days) diff --git a/Инфраструктура/Сервисы/gitea-runner.md b/Инфраструктура/Сервисы/gitea-runner.md new file mode 100644 index 0000000..f87fbc5 --- /dev/null +++ b/Инфраструктура/Сервисы/gitea-runner.md @@ -0,0 +1,40 @@ +# Gitea Actions Runner + +## Назначение +CI/CD runner для выполнения Gitea Actions workflows. Запускает задачи сборки, тестирования и деплоя при push/PR в Gitea. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| gitea-runner | gitea-runner-runner (local build) | + +## Порты +Нет внешних портов. + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| /var/run/docker.sock | /var/run/docker.sock | Docker socket (для запуска контейнеров) | +| runner_data | /data | Данные runner'а | +| ./config.yaml | /config/config.yaml | Конфиг runner'а | + +## Домен +Нет. + +## Сети +- `services_proxy` (external) + +## Env переменные +- `GITEA_INSTANCE_URL` +- `GITEA_RUNNER_REGISTRATION_TOKEN` +- `GITEA_RUNNER_NAME` +- `CONFIG_FILE` + +## Статус +✅ **Запущен** (Up 6 days) + +## Заметки +- `privileged: true` — нужно для запуска вложенных Docker-контейнеров в workflows +- Подключается к Gitea по `http://gitea:3000` diff --git a/Инфраструктура/Сервисы/gitea.md b/Инфраструктура/Сервисы/gitea.md new file mode 100644 index 0000000..9509377 --- /dev/null +++ b/Инфраструктура/Сервисы/gitea.md @@ -0,0 +1,47 @@ +# Gitea + +## Назначение +Self-hosted Git-хостинг. Хранит репозитории проектов (pulse-api, pulse-web, obsidian и другие). Поддерживает Gitea Actions для CI/CD. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| gitea | gitea/gitea:latest | + +## Порты + +| Внутренний | Протокол | Назначение | +|-----------|---------|------------| +| 3000 | HTTP | Web UI + API | +| 22 | TCP | SSH для git | + +(Порты открыты только в сети, внешний доступ через NPM) + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./data | /data | Репозитории, конфиги, БД (SQLite) | +| /etc/timezone | /etc/timezone | Временная зона (ro) | +| /etc/localtime | /etc/localtime | Локальное время (ro) | + +## Домен +`https://git.digital-home.site` + +## Сети +- `gitea_backend` (internal) +- `services_proxy` (external, для NPM) + +## Env переменные +- `USER_UID` +- `USER_GID` +- `GITEA__server__DOMAIN` +- `GITEA__server__ROOT_URL` + +## Статус +✅ **Запущен** (Up 4 weeks) + +## Связанные сервисы +- `gitea-runner` — CI/CD runner для Gitea Actions +- `review-bot` — AI ревью PR через webhook diff --git a/Инфраструктура/Сервисы/health-webhook.md b/Инфраструктура/Сервисы/health-webhook.md new file mode 100644 index 0000000..efe22d7 --- /dev/null +++ b/Инфраструктура/Сервисы/health-webhook.md @@ -0,0 +1,37 @@ +# Health Webhook + +## Назначение +Webhook-сервис для проверки здоровья / health check инфраструктуры. Node.js сервис с JWT-авторизацией, возможно интеграция с email-уведомлениями через Resend. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| health-webhook | local build (Node.js) | + +## Порты + +| Внешний | Внутренний | Назначение | +|---------|-----------|------------| +| 3200 | 3200 | HTTP API | + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./data | /app/data | Данные сервиса | + +## Домен +`https://health.digital-home.site` + +## Сети +- `services_proxy` (external) + +## Env переменные +- `JWT_SECRET` +- `NODE_ENV` +- `RESEND_API_KEY` +- `APP_URL` + +## Статус +✅ **Запущен** (Up 7 days) diff --git a/Инфраструктура/Сервисы/homepage.md b/Инфраструктура/Сервисы/homepage.md new file mode 100644 index 0000000..2fd59bd --- /dev/null +++ b/Инфраструктура/Сервисы/homepage.md @@ -0,0 +1,40 @@ +# Homepage + +## Назначение +Стартовая страница / дашборд домашней лаборатории. Показывает все сервисы, их статусы, виджеты (погода, календарь и т.д.). + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| homepage | ghcr.io/gethomepage/homepage:latest | + +## Порты + +| Внутренний | Назначение | +|-----------|------------| +| 3000 | Web UI | + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./config | /app/config | YAML-конфиги (services, widgets, bookmarks) | +| ./icons | /app/public/icons | Пользовательские иконки | +| /var/run/docker.sock | /var/run/docker.sock | Docker socket (для статусов контейнеров, ro) | + +## Домен +`https://home.digital-home.site` + +## Сети +- `homepage_backend` (internal) +- `services_proxy` (external, для NPM) + +## Env переменные +- `PUID` +- `PGID` +- `TZ` +- `HOMEPAGE_ALLOWED_HOSTS` + +## Статус +✅ **Запущен** (Up 4 weeks, healthy) diff --git a/Инфраструктура/Сервисы/it-tools.md b/Инфраструктура/Сервисы/it-tools.md new file mode 100644 index 0000000..415d63e --- /dev/null +++ b/Инфраструктура/Сервисы/it-tools.md @@ -0,0 +1,31 @@ +# IT Tools + +## Назначение +Коллекция онлайн-инструментов для разработчиков: конверторы форматов, генераторы, кодировщики, хэши и т.д. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| it-tools | corentinth/it-tools:latest | + +## Порты + +| Внутренний | Назначение | +|-----------|------------| +| 80 | Web UI (через NPM) | + +## Volumes +Нет. + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) + +## Env переменные +Нет. + +## Статус +✅ **Запущен** (Up 4 weeks) diff --git a/Инфраструктура/Сервисы/japan-app.md b/Инфраструктура/Сервисы/japan-app.md new file mode 100644 index 0000000..223888a --- /dev/null +++ b/Инфраструктура/Сервисы/japan-app.md @@ -0,0 +1,31 @@ +# Japan App + +## Назначение +PWA-гид по Японии. Содержит список мест (92+), расписание поездки, карты. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| japan-app | local build | + +## Порты +Нет (через NPM). + +## Volumes +Нет. + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) + +## Env переменные +Нет. + +## Статус +❌ **Не запущен** (не найден в `docker ps`) + +## Заметки +- `watchtower.enable=false` — не обновляется автоматически diff --git a/Инфраструктура/Сервисы/langlearn.md b/Инфраструктура/Сервисы/langlearn.md new file mode 100644 index 0000000..4f7d8a1 --- /dev/null +++ b/Инфраструктура/Сервисы/langlearn.md @@ -0,0 +1,39 @@ +# LangLearn + +## Назначение +Приложение для изучения языков. Go backend + React frontend с PostgreSQL. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| langlearn-backend | local build (Go) | +| langlearn-frontend | local build (React) | +| langlearn-db | postgres:16-alpine | + +## Порты + +| Контейнер | Внутренний | Назначение | +|-----------|-----------|------------| +| backend | 8080 | REST API (через NPM) | +| frontend | — | Web UI (через NPM) | + +## Volumes + +| Volume | Контейнер | Путь контейнера | Содержимое | +|--------|-----------|----------------|------------| +| pgdata | db | /var/lib/postgresql/data | БД | + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) +- `internal` (между backend и db) + +## Env переменные +- `DATABASE_URL` +- `PORT` + +## Статус +❌ **Не запущен** (не найден в `docker ps`) diff --git a/Инфраструктура/Сервисы/lingua-learn.md b/Инфраструктура/Сервисы/lingua-learn.md new file mode 100644 index 0000000..0d498f2 --- /dev/null +++ b/Инфраструктура/Сервисы/lingua-learn.md @@ -0,0 +1,34 @@ +# Lingua Learn + +## Назначение +Приложение для изучения языков (альтернативная версия). Node.js backend + React frontend. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| lingua-learn-client | local build (React) | +| lingua-learn-server | local build (Node.js) | +| lingua-learn-db | postgres:16-alpine | + +## Порты +Нет внешних портов (через NPM). + +## Volumes + +| Volume | Контейнер | Путь контейнера | Содержимое | +|--------|-----------|----------------|------------| +| postgres_data | db | /var/lib/postgresql/data | БД | + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) + +## Env переменные +- `DATABASE_URL` +- `NODE_ENV` + +## Статус +❌ **Не запущен** (не найден в `docker ps`) diff --git a/Инфраструктура/Сервисы/media.md b/Инфраструктура/Сервисы/media.md new file mode 100644 index 0000000..67830b4 --- /dev/null +++ b/Инфраструктура/Сервисы/media.md @@ -0,0 +1,50 @@ +# Media (Jellyfin + qBittorrent) + +## Назначение +Медиа-стек: скачивание торрентов (qBittorrent) и стриминг медиа-контента (Jellyfin). + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| jellyfin | jellyfin/jellyfin:latest | +| qbittorrent | lscr.io/linuxserver/qbittorrent:latest | + +## Порты + +| Контейнер | Внешний | Внутренний | Назначение | +|-----------|---------|-----------|------------| +| qbittorrent | 6881 | 6881 | BitTorrent TCP | +| qbittorrent | 6881/udp | 6881/udp | BitTorrent UDP | +| jellyfin | — | 8096 | Web UI (через NPM) | +| qbittorrent | — | 8080 | Web UI (через NPM) | + +## Volumes + +| Путь хоста | Контейнер | Путь контейнера | Содержимое | +|-----------|-----------|----------------|------------| +| ./qbittorrent/config | qbittorrent | /config | Конфиг qBittorrent | +| ./downloads | qbittorrent | /downloads | Загруженные файлы | +| ./jellyfin/config | jellyfin | /config | Конфиг Jellyfin | +| ./jellyfin/cache | jellyfin | /cache | Кэш Jellyfin | +| ./downloads | jellyfin | /data/downloads | Медиа-файлы (ro) | +| ../nextcloud/nextcloud_data/data | jellyfin | /data/nextcloud | Файлы Nextcloud (ro) | + +## Домен +Через NPM (не указан явно в конфиге). + +## Сети +- `media_backend` (internal) +- `services_proxy` (external) + +## Env переменные +- `PUID`, `PGID`, `TZ` (оба контейнера) +- `WEBUI_PORT` (qbittorrent) + +## Статус +- ✅ jellyfin: **Запущен** (Up 6 days, healthy) +- ❌ qbittorrent: **Не запущен** + +## Заметки +- Jellyfin имеет доступ к файлам Nextcloud через bind mount +- Закомментированная секция GPU-транскодинга для Intel diff --git a/Инфраструктура/Сервисы/my-game-svoya-igra.md b/Инфраструктура/Сервисы/my-game-svoya-igra.md new file mode 100644 index 0000000..a09197f --- /dev/null +++ b/Инфраструктура/Сервисы/my-game-svoya-igra.md @@ -0,0 +1,41 @@ +# My Game (Своя игра) + +## Назначение +Веб-версия игры "Своя Игра" (аналог Jeopardy). Node.js/Express backend + React frontend + MongoDB. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| svoya-igra-client | local build (React) | +| svoya-igra-server | local build (Node.js) | +| svoya-igra-mongodb | mongo:7 | + +## Порты + +| Контейнер | Внутренний | Назначение | +|-----------|-----------|------------| +| server | 3001 | REST API (через NPM) | + +## Volumes + +| Volume | Контейнер | Путь контейнера | Содержимое | +|--------|-----------|----------------|------------| +| mongodb_data | mongodb | /data/db | MongoDB данные | +| ./server/public | server | /app/public | Статичные файлы | + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) +- `internal` (между server и mongodb) + +## Env переменные +- `PORT` +- `MONGODB_URI` +- `NODE_ENV` +- `CLIENT_URL` + +## Статус +❌ **Не запущен** (не найден в `docker ps`) diff --git a/Инфраструктура/Сервисы/nextcloud.md b/Инфраструктура/Сервисы/nextcloud.md new file mode 100644 index 0000000..f1b268f --- /dev/null +++ b/Инфраструктура/Сервисы/nextcloud.md @@ -0,0 +1,49 @@ +# Nextcloud + +## Назначение +Облачное хранилище файлов (self-hosted аналог Google Drive). Синхронизация файлов, фото, документов. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| nextcloud_app | nextcloud:latest | +| nextcloud_db | postgres:15-alpine | +| nextcloud_redis | redis:7-alpine | + +## Порты + +| Контейнер | Внешний | Внутренний | Назначение | +|-----------|---------|-----------|------------| +| nextcloud_db | 5433 | 5432 | PostgreSQL (для прямого доступа) | +| nextcloud_app | — | 80 | Web UI (через NPM) | + +## Volumes + +| Путь хоста | Контейнер | Путь контейнера | Содержимое | +|-----------|-----------|----------------|------------| +| ./db_data | nextcloud_db | /var/lib/postgresql/data | БД PostgreSQL | +| ./redis_data | nextcloud_redis | /data | Redis данные | +| ./nextcloud_data | nextcloud_app | /var/www/html | Файлы Nextcloud, данные пользователей | + +## Домен +`https://cloud.digital-home.site` + +## Сети +- `nextcloud_backend` (internal) +- `services_proxy` (external) + +## Env переменные +- `POSTGRES_HOST`, `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD` +- `NEXTCLOUD_ADMIN_USER`, `NEXTCLOUD_ADMIN_PASSWORD` +- `OVERWRITEPROTOCOL`, `OVERWRITEHOST` +- `NEXTCLOUD_TRUSTED_PROXIES`, `TRUSTED_DOMAINS` +- `REDIS_HOST` +- `PHP_UPLOAD_LIMIT`, `PHP_MEMORY_LIMIT` + +## Статус +✅ **Все контейнеры запущены** (Up 4 weeks) + +## Заметки +- Файлы Nextcloud монтируются в Jellyfin и Immich для просмотра медиа +- Лимит загрузки файлов: 2048 МБ diff --git a/Инфраструктура/Сервисы/photo-immich.md b/Инфраструктура/Сервисы/photo-immich.md new file mode 100644 index 0000000..fab350c --- /dev/null +++ b/Инфраструктура/Сервисы/photo-immich.md @@ -0,0 +1,50 @@ +# Immich (photo) + +## Назначение +Self-hosted Google Photos альтернатива. Автозагрузка фото с телефона, ML-распознавание лиц и объектов, умный поиск. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| immich_server | ghcr.io/immich-app/immich-server:release | +| immich_machine_learning | ghcr.io/immich-app/immich-machine-learning:release | +| immich_redis | redis:7-alpine | +| immich_postgres | tensorchord/pgvecto-rs:pg14-v0.2.0 | + +## Порты + +| Контейнер | Внутренний | Назначение | +|-----------|-----------|------------| +| immich_server | 2283 | Web UI (через NPM) | +| immich_redis | 6379 | Redis | +| immich_postgres | 5432 | PostgreSQL + pgvecto-rs | + +## Volumes + +| Путь хоста | Контейнер | Путь контейнера | Содержимое | +|-----------|-----------|----------------|------------| +| ./upload | immich_server | /usr/src/app/upload | Загруженные фото | +| ./model-cache | immich_ml | /cache | ML-модели | +| ./pgdata | immich_postgres | /var/lib/postgresql/data | БД | +| ../nextcloud/nextcloud_data/data | immich_server | /mnt/nextcloud | Файлы Nextcloud (ro) | +| /etc/localtime | immich_server | /etc/localtime | Время (ro) | + +## Домен +Через NPM (не указан явно). + +## Сети +- `photo_backend` (internal) +- `services_proxy` (external, только immich_server) + +## Env переменные +- `DB_HOSTNAME`, `DB_USERNAME`, `DB_PASSWORD`, `DB_DATABASE_NAME` +- `REDIS_HOSTNAME` +- `POSTGRES_PASSWORD`, `POSTGRES_USER`, `POSTGRES_DB` + +## Статус +✅ **Все контейнеры запущены** (Up 4 weeks, immich_server healthy) + +## Заметки +- Использует `pgvecto-rs` — PostgreSQL с расширением для векторного поиска (нужно для ML) +- immich_machine_learning работает только во внутренней сети diff --git a/Инфраструктура/Сервисы/portainer.md b/Инфраструктура/Сервисы/portainer.md new file mode 100644 index 0000000..fb0d271 --- /dev/null +++ b/Инфраструктура/Сервисы/portainer.md @@ -0,0 +1,38 @@ +# Portainer + +## Назначение +Web UI для управления Docker. Просмотр контейнеров, образов, volumes, сетей. Визуальный мониторинг всей Docker-инфраструктуры. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| portainer | portainer/portainer-ce:latest | + +## Порты + +| Внутренний | Назначение | +|-----------|------------| +| 8000 | Edge agent | +| 9000 | HTTP Web UI | +| 9443 | HTTPS Web UI | + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| /var/run/docker.sock | /var/run/docker.sock | Docker socket | +| ./data | /data | Данные Portainer (пользователи, настройки) | + +## Домен +`https://portainer.digital-home.site` + +## Сети +- `portainer_backend` (internal) +- `services_proxy` (external) + +## Env переменные +Нет (кроме `security_opt: no-new-privileges:true`). + +## Статус +✅ **Запущен** (Up 4 weeks) diff --git a/Инфраструктура/Сервисы/pulse-api-homelab-api.md b/Инфраструктура/Сервисы/pulse-api-homelab-api.md new file mode 100644 index 0000000..de50265 --- /dev/null +++ b/Инфраструктура/Сервисы/pulse-api-homelab-api.md @@ -0,0 +1,49 @@ +# Pulse API (homelab-api) + +## Назначение +Backend API для приложения Pulse — трекер привычек, задач, финансов, накоплений. Go REST API + Telegram бот. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| homelab-api | local build (Go) | +| homelab-db | postgres:16-alpine | +| pulse-api-dev | local build (dev instance, порт 8081) | + +## Порты + +| Контейнер | Внешний | Внутренний | Назначение | +|-----------|---------|-----------|------------| +| homelab-api | — | 8080 | REST API (через NPM → api.digital-home.site) | +| pulse-api-dev | 8081 | 8080 | Dev-инстанс API | +| homelab-db | — | 5432 | PostgreSQL | + +## Volumes + +| Volume | Путь контейнера | Содержимое | +|--------|----------------|------------| +| postgres_data | /var/lib/postgresql/data | БД | + +## Домен +`https://api.digital-home.site` + +## Сети +- `services_proxy` (external) +- `internal` (между api и db) + +## Env переменные +- `DATABASE_URL` +- `JWT_SECRET` +- `PORT` +- `RESEND_API_KEY` +- `FROM_EMAIL` +- `FROM_NAME` +- `APP_URL` +- `TELEGRAM_BOT_TOKEN` + +## Статус +✅ **Запущен** (homelab-api: Up 19 hours, homelab-db: Up 4 weeks, pulse-api-dev: Up 4 weeks) + +## Подробная документация +→ [[pulse-api]] diff --git a/Инфраструктура/Сервисы/pulse-web.md b/Инфраструктура/Сервисы/pulse-web.md new file mode 100644 index 0000000..eef1cd0 --- /dev/null +++ b/Инфраструктура/Сервисы/pulse-web.md @@ -0,0 +1,36 @@ +# Pulse Web + +## Назначение +Frontend React-приложение для Pulse. Трекер привычек, задач, финансов, накоплений. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| pulse-web | local build (React/Vite) | +| pulse-web-dev | local build (dev instance, порт 5174) | + +## Порты + +| Контейнер | Внешний | Внутренний | Назначение | +|-----------|---------|-----------|------------| +| pulse-web | — | 80 | Prod (через NPM → pulse.digital-home.site) | +| pulse-web-dev | 5174 | 80 | Dev-инстанс | + +## Volumes +Нет persistent volumes. + +## Домен +`https://pulse.digital-home.site` + +## Сети +- `services_proxy` (external) + +## Env переменные +- `VITE_API_URL` + +## Статус +✅ **Запущен** (pulse-web: Up 12 days, pulse-web-dev: Up 4 weeks) + +## Подробная документация +→ [[pulse-web]] diff --git a/Инфраструктура/Сервисы/review-bot.md b/Инфраструктура/Сервисы/review-bot.md new file mode 100644 index 0000000..3b05b0b --- /dev/null +++ b/Инфраструктура/Сервисы/review-bot.md @@ -0,0 +1,46 @@ +# Review Bot + +## Назначение +AI-бот для автоматического code review Pull Request'ов в Gitea. Получает вебхуки от Gitea, клонирует репозиторий, анализирует изменения через Anthropic Claude и оставляет комментарии. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| review-bot | local build (Node.js) | + +## Порты + +| Внешний | Внутренний | Назначение | +|---------|-----------|------------| +| 3300 | 3300 | HTTP webhook endpoint | + +## Volumes + +| Volume | Путь контейнера | Содержимое | +|--------|----------------|------------| +| review-bot-logs | /var/log/review-bot | Логи ревью | + +## Домен +Нет (доступен только изнутри сети). + +## Сети +- `services_proxy` (external) + +## Env переменные +- `GITEA_URL` +- `GITEA_TOKEN` +- `WEBHOOK_SECRET` +- `ANTHROPIC_URL` (прокси через AI-proxy на 192.168.31.103:3301) +- `PROXY_KEY` +- `LOG_FILE` +- `CLONE_BASE_DIR` +- `PORT` + +## Статус +✅ **Запущен** (Up 6 days) + +## Заметки +- Использует AI-proxy (`192.168.31.103:3301`) т.к. Anthropic API key работает только с основной машины OpenClaw +- Вебхук настроен для репозиториев pulse-api и pulse-web +- Директория для клонирования: `/tmp/review-bot-clones` diff --git a/Инфраструктура/Сервисы/savings.md b/Инфраструктура/Сервисы/savings.md new file mode 100644 index 0000000..ad3e8de --- /dev/null +++ b/Инфраструктура/Сервисы/savings.md @@ -0,0 +1,52 @@ +# Savings (семейные накопления) + +## Назначение +Приложение для совместного управления накоплениями. Go backend + React frontend. Поддержка категорий накоплений, участников, регулярных планов, начисления процентов. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| savings-backend | local build (Go) | +| savings-frontend | local build (React) | + +## Порты + +| Контейнер | Внутренний | Назначение | +|-----------|-----------|------------| +| savings-backend | 9090 | REST API (через NPM) | +| savings-frontend | — | Web UI (через NPM) | + +## Volumes + +| Путь хоста | Контейнер | Путь контейнера | Содержимое | +|-----------|-----------|----------------|------------| +| ./savings.db | backend | /root/savings.db | SQLite БД | + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) + +## Env переменные +**Backend:** +- `DB_NAME`, `DB_TYPE` +- `JWT_SECRET`, `JWT_EXPIRES_IN` +- `PORT`, `GIN_MODE` +- `FRONTEND_URL` +- `INTEREST_CALCULATION_ENABLED`, `INTEREST_CALCULATION_INTERVAL` +- `SMTP_HOST`, `SMTP_PORT`, `SMTP_USERNAME`, `SMTP_PASSWORD` +- `FROM_EMAIL`, `FROM_NAME`, `EMAIL_ENABLED` + +**Frontend (build args):** +- `REACT_APP_API_URL` +- `REACT_APP_APP_NAME` +- `REACT_APP_VERSION` + +## Статус +❌ **Не запущен** (не найден в `docker ps`) + +## Заметки +- Использует SQLite (не PostgreSQL) — данные в одном файле `savings.db` +- Встроенный расчёт процентов по расписанию diff --git a/Инфраструктура/Сервисы/services-nginx-proxy-manager.md b/Инфраструктура/Сервисы/services-nginx-proxy-manager.md new file mode 100644 index 0000000..b267a7b --- /dev/null +++ b/Инфраструктура/Сервисы/services-nginx-proxy-manager.md @@ -0,0 +1,41 @@ +# Nginx Proxy Manager (services) + +## Назначение +Обратный прокси-сервер. Управляет входящим трафиком (HTTP/HTTPS), SSL-сертификатами (Let's Encrypt), маршрутизирует запросы к контейнерам по доменам `*.digital-home.site`. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| nginx_proxy_manager | jc21/nginx-proxy-manager:latest | + +## Порты + +| Внешний | Внутренний | Назначение | +|---------|-----------|------------| +| 80 | 80 | HTTP | +| 81 | 81 | Web UI (управление NPM) | +| 443 | 443 | HTTPS | + +## Volumes + +| Volume | Путь | Содержимое | +|--------|------|------------| +| ./data | /data | Конфиги прокси-хостов, БД | +| ./letsencrypt | /etc/letsencrypt | SSL-сертификаты Let's Encrypt | + +## Домен +Нет (сам является точкой входа). UI доступен напрямую через порт 81. + +## Сети +- `services_proxy` (создаётся здесь как `proxy`, используется всеми другими сервисами) + +## Env переменные +Нет конфигурационных env-переменных. + +## Статус +✅ **Запущен** (Up 26 hours) + +## Заметки +- Это корневой сервис инфраструктуры — все остальные подключаются к сети `services_proxy` +- Управление через UI на порту 81 (только из локальной сети) diff --git a/Инфраструктура/Сервисы/storybook.md b/Инфраструктура/Сервисы/storybook.md new file mode 100644 index 0000000..a0e9b05 --- /dev/null +++ b/Инфраструктура/Сервисы/storybook.md @@ -0,0 +1,31 @@ +# Storybook + +## Назначение +Storybook для разработки UI-компонентов pulse-web. Изолированная среда для разработки и документирования React-компонентов. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| storybook | local build | + +## Порты + +| Внешний | Внутренний | Назначение | +|---------|-----------|------------| +| 6006 | 80 | Storybook UI | + +## Volumes +Нет. + +## Домен +Нет (доступен напрямую по порту 6006). + +## Сети +- `services_proxy` (external) + +## Env переменные +Нет. + +## Статус +✅ **Запущен** (Up 4 weeks) diff --git a/Инфраструктура/Сервисы/uptime-kuma.md b/Инфраструктура/Сервисы/uptime-kuma.md new file mode 100644 index 0000000..4f28cee --- /dev/null +++ b/Инфраструктура/Сервисы/uptime-kuma.md @@ -0,0 +1,35 @@ +# Uptime Kuma + +## Назначение +Мониторинг доступности сервисов. Следит за uptime всех хостов и URL, отправляет уведомления при падении. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| uptime-kuma | louislam/uptime-kuma:1 | + +## Порты + +| Внутренний | Назначение | +|-----------|------------| +| 3001 | Web UI (через NPM) | + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./data | /app/data | БД мониторинга (SQLite), конфиги | + +## Домен +Через NPM (не указан явно). + +## Сети +- `uptime_backend` (internal) +- `services_proxy` (external) + +## Env переменные +Нет. + +## Статус +✅ **Запущен** (Up 5 days, healthy) diff --git a/Инфраструктура/Сервисы/vault-vaultwarden.md b/Инфраструктура/Сервисы/vault-vaultwarden.md new file mode 100644 index 0000000..11c9f7e --- /dev/null +++ b/Инфраструктура/Сервисы/vault-vaultwarden.md @@ -0,0 +1,38 @@ +# Vaultwarden (vault) + +## Назначение +Self-hosted менеджер паролей, совместимый с клиентами Bitwarden. Хранит пароли, заметки, карты в зашифрованном виде. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| vaultwarden | vaultwarden/server:latest | + +## Порты + +| Внутренний | Назначение | +|-----------|------------| +| 80 | Web UI (через NPM) | + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./data | /data | Зашифрованная БД паролей | + +## Домен +`https://vault.digital-home.site` + +## Сети +- `vault_backend` (internal) +- `services_proxy` (external) + +## Env переменные +- `DOMAIN` +- `LOG_LEVEL` +- `EXTENDED_LOGGING` +- (закомментированы: `SIGNUPS_ALLOWED`, `ADMIN_TOKEN`, SMTP-настройки) + +## Статус +✅ **Запущен** (Up 4 weeks, healthy) diff --git a/Инфраструктура/Сервисы/vikunja.md b/Инфраструктура/Сервисы/vikunja.md new file mode 100644 index 0000000..1577cad --- /dev/null +++ b/Инфраструктура/Сервисы/vikunja.md @@ -0,0 +1,48 @@ +# Vikunja + +## Назначение +Self-hosted менеджер задач (аналог Todoist/Trello). Используется для личных задач, проектов, канбан-досок. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| vikunja | vikunja/vikunja:latest | +| vikunja_db | postgres:15-alpine | + +## Порты + +| Контейнер | Внутренний | Назначение | +|-----------|-----------|------------| +| vikunja | 3456 | Web UI (через NPM) | +| vikunja_db | 5432 | PostgreSQL | + +## Volumes + +| Путь хоста | Контейнер | Путь контейнера | Содержимое | +|-----------|-----------|----------------|------------| +| ./db | vikunja_db | /var/lib/postgresql/data | БД задач | +| ./files | vikunja | /app/vikunja/files | Вложения к задачам | + +## Домен +`https://tasks.digital-home.site` + +## Сети +- `vikunja_backend` (internal) +- `services_proxy` (external) + +## Env переменные +- `VIKUNJA_DATABASE_TYPE`, `VIKUNJA_DATABASE_HOST`, `VIKUNJA_DATABASE_DATABASE` +- `VIKUNJA_DATABASE_USER`, `VIKUNJA_DATABASE_PASSWORD` +- `VIKUNJA_SERVICE_PUBLICURL` +- `VIKUNJA_SERVICE_JWTSECRET` +- `VIKUNJA_SERVICE_ENABLEREGISTRATION` +- `VIKUNJA_SERVICE_ENABLETASKATTACHMENTS` +- `VIKUNJA_SERVICE_TIMEZONE` + +## Статус +✅ **Запущен** (Up 4 weeks) + +## Заметки +- API токен для автоматизации: `tk_03787e3778789fd5bfaff0542a8dd9390aae0f82` +- Проекты: Inbox(1), Личное(3), Dev(4), Япония(5), Финансы(6) diff --git a/Инфраструктура/Сервисы/vpn-invite.md b/Инфраструктура/Сервисы/vpn-invite.md new file mode 100644 index 0000000..b324356 --- /dev/null +++ b/Инфраструктура/Сервисы/vpn-invite.md @@ -0,0 +1,37 @@ +# VPN Invite + +## Назначение +Сервис для управления приглашениями в VPN. Node.js приложение с SQLite. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| vpn-invite-vpn-invite-1 | node:20-alpine | + +## Порты + +| Внутренний | Назначение | +|-----------|------------| +| 3500 | HTTP API (через NPM) | + +## Volumes + +| Volume | Путь контейнера | Содержимое | +|--------|----------------|------------| +| vpn-invite-data | /data | SQLite БД инвайтов | +| ./ | /app | Код приложения | + +## Домен +Через NPM (не указан явно). + +## Сети +- `services_proxy` (external) + +## Env переменные +- `ADMIN_KEY` +- `PORT` +- `DB_PATH` + +## Статус +✅ **Запущен** (Up 21 hours) diff --git a/Инфраструктура/Сервисы/vpn-router.md b/Инфраструктура/Сервисы/vpn-router.md new file mode 100644 index 0000000..918591d --- /dev/null +++ b/Инфраструктура/Сервисы/vpn-router.md @@ -0,0 +1,35 @@ +# VPN Router (sing-box) + +## Назначение +VPN-маршрутизатор на базе sing-box. Управляет VPN-трафиком, поддерживает разные протоколы. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| vpn-router | ghcr.io/sagernet/sing-box:v1.10.7 | + +## Порты +`network_mode: host` — использует все порты хоста напрямую. + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./config | /etc/sing-box | Конфиг sing-box (config.json) | + +## Домен +Нет (работает на уровне сети). + +## Сети +`network_mode: host` (нет Docker-сетей). + +## Env переменные +Нет. + +## Статус +❌ **Не запущен** (не найден в `docker ps`) + +## Заметки +- `cap_add: NET_ADMIN` — нужно для управления сетевыми интерфейсами +- Конфиг в `./config/config.json` diff --git a/Инфраструктура/Сервисы/webhook-deploy.md b/Инфраструктура/Сервисы/webhook-deploy.md new file mode 100644 index 0000000..08c4bdf --- /dev/null +++ b/Инфраструктура/Сервисы/webhook-deploy.md @@ -0,0 +1,40 @@ +# Webhook Deploy + +## Назначение +Python-сервер для автоматического деплоя через вебхуки. Получает HTTP-запрос → запускает Docker Compose команды для обновления сервисов. + +## Контейнеры + +| Имя | Образ | +|-----|-------| +| deploy-webhook | python:3.12-alpine | + +## Порты + +| Внешний | Внутренний | Назначение | +|---------|-----------|------------| +| 9000 | 9000 | HTTP webhook endpoint | + +## Volumes + +| Путь хоста | Путь контейнера | Содержимое | +|-----------|----------------|------------| +| ./server.py | /app/server.py | Python код сервера | +| /var/run/docker.sock | /var/run/docker.sock | Docker socket | +| /opt/digital-home | /opt/digital-home | Все проекты (для деплоя) | +| /usr/bin/docker | /usr/bin/docker | Docker CLI бинарник | + +## Домен +Нет (внутренний доступ). + +## Сети +- `services_proxy` (external) + +## Env переменные +Нет (конфиг в `server.py`). + +## Статус +❓ **Статус неизвестен** (не найден в `docker ps`) + +## Заметки +- Имеет доступ к Docker socket и всем проектам — может деплоить любой сервис