docs: инфраструктура VM Сервисы + архитектура pulse-api и pulse-web
This commit is contained in:
337
Инфраструктура/pulse-api.md
Normal file
337
Инфраструктура/pulse-api.md
Normal file
@@ -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 <token>`, проверяет `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 <id>` или `/done_<id>` | Отметить задачу выполненной |
|
||||||
|
| `/check <id>` или `/check_<id>` | Отметить привычку |
|
||||||
|
| `/help` | Справка |
|
||||||
|
|
||||||
|
**Callback-кнопки:**
|
||||||
|
- `donetask_<id>` — выполнить задачу
|
||||||
|
- `deltask_<id>` — удалить задачу
|
||||||
|
- `checkhabit_<id>` — отметить привычку сегодня
|
||||||
|
- `checkhabit_<id>_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/<domain>.go` + роут в `cmd/api/main.go` |
|
||||||
|
| Изменить модель/таблицу | `model/<domain>.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` |
|
||||||
263
Инфраструктура/pulse-web.md
Normal file
263
Инфраструктура/pulse-web.md
Normal file
@@ -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. Доступ только если добавить `<Route path="/finance">`.
|
||||||
|
|
||||||
|
## Основные компоненты
|
||||||
|
|
||||||
|
| Компонент | Файл | Назначение |
|
||||||
|
|-----------|------|------------|
|
||||||
|
| `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 <access_token>
|
||||||
|
|
||||||
|
// 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/<domain>.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)
|
||||||
112
Инфраструктура/Сервисы/README.md
Normal file
112
Инфраструктура/Сервисы/README.md
Normal file
@@ -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/<name>
|
||||||
|
cd /opt/digital-home/<name>
|
||||||
|
|
||||||
|
# docker-compose.yml с сетью:
|
||||||
|
networks:
|
||||||
|
services_proxy:
|
||||||
|
external: true
|
||||||
|
|
||||||
|
docker compose up -d
|
||||||
|
# Добавить proxy host в NPM UI (порт 81)
|
||||||
|
```
|
||||||
38
Инфраструктура/Сервисы/adventurelog.md
Normal file
38
Инфраструктура/Сервисы/adventurelog.md
Normal file
@@ -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 с геопространственными расширениями)
|
||||||
42
Инфраструктура/Сервисы/bots-menu.md
Normal file
42
Инфраструктура/Сервисы/bots-menu.md
Normal file
@@ -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
|
||||||
|
```
|
||||||
36
Инфраструктура/Сервисы/cosmo-studio.md
Normal file
36
Инфраструктура/Сервисы/cosmo-studio.md
Normal file
@@ -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)
|
||||||
40
Инфраструктура/Сервисы/gitea-runner.md
Normal file
40
Инфраструктура/Сервисы/gitea-runner.md
Normal file
@@ -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`
|
||||||
47
Инфраструктура/Сервисы/gitea.md
Normal file
47
Инфраструктура/Сервисы/gitea.md
Normal file
@@ -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
|
||||||
37
Инфраструктура/Сервисы/health-webhook.md
Normal file
37
Инфраструктура/Сервисы/health-webhook.md
Normal file
@@ -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)
|
||||||
40
Инфраструктура/Сервисы/homepage.md
Normal file
40
Инфраструктура/Сервисы/homepage.md
Normal file
@@ -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)
|
||||||
31
Инфраструктура/Сервисы/it-tools.md
Normal file
31
Инфраструктура/Сервисы/it-tools.md
Normal file
@@ -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)
|
||||||
31
Инфраструктура/Сервисы/japan-app.md
Normal file
31
Инфраструктура/Сервисы/japan-app.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Japan App
|
||||||
|
|
||||||
|
## Назначение
|
||||||
|
PWA-гид по Японии. Содержит список мест (92+), расписание поездки, карты.
|
||||||
|
|
||||||
|
## Контейнеры
|
||||||
|
|
||||||
|
| Имя | Образ |
|
||||||
|
|-----|-------|
|
||||||
|
| japan-app | local build |
|
||||||
|
|
||||||
|
## Порты
|
||||||
|
Нет (через NPM).
|
||||||
|
|
||||||
|
## Volumes
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## Домен
|
||||||
|
Через NPM (не указан явно).
|
||||||
|
|
||||||
|
## Сети
|
||||||
|
- `services_proxy` (external)
|
||||||
|
|
||||||
|
## Env переменные
|
||||||
|
Нет.
|
||||||
|
|
||||||
|
## Статус
|
||||||
|
❌ **Не запущен** (не найден в `docker ps`)
|
||||||
|
|
||||||
|
## Заметки
|
||||||
|
- `watchtower.enable=false` — не обновляется автоматически
|
||||||
39
Инфраструктура/Сервисы/langlearn.md
Normal file
39
Инфраструктура/Сервисы/langlearn.md
Normal file
@@ -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`)
|
||||||
34
Инфраструктура/Сервисы/lingua-learn.md
Normal file
34
Инфраструктура/Сервисы/lingua-learn.md
Normal file
@@ -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`)
|
||||||
50
Инфраструктура/Сервисы/media.md
Normal file
50
Инфраструктура/Сервисы/media.md
Normal file
@@ -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
|
||||||
41
Инфраструктура/Сервисы/my-game-svoya-igra.md
Normal file
41
Инфраструктура/Сервисы/my-game-svoya-igra.md
Normal file
@@ -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`)
|
||||||
49
Инфраструктура/Сервисы/nextcloud.md
Normal file
49
Инфраструктура/Сервисы/nextcloud.md
Normal file
@@ -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 МБ
|
||||||
50
Инфраструктура/Сервисы/photo-immich.md
Normal file
50
Инфраструктура/Сервисы/photo-immich.md
Normal file
@@ -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 работает только во внутренней сети
|
||||||
38
Инфраструктура/Сервисы/portainer.md
Normal file
38
Инфраструктура/Сервисы/portainer.md
Normal file
@@ -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)
|
||||||
49
Инфраструктура/Сервисы/pulse-api-homelab-api.md
Normal file
49
Инфраструктура/Сервисы/pulse-api-homelab-api.md
Normal file
@@ -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]]
|
||||||
36
Инфраструктура/Сервисы/pulse-web.md
Normal file
36
Инфраструктура/Сервисы/pulse-web.md
Normal file
@@ -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]]
|
||||||
46
Инфраструктура/Сервисы/review-bot.md
Normal file
46
Инфраструктура/Сервисы/review-bot.md
Normal file
@@ -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`
|
||||||
52
Инфраструктура/Сервисы/savings.md
Normal file
52
Инфраструктура/Сервисы/savings.md
Normal file
@@ -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`
|
||||||
|
- Встроенный расчёт процентов по расписанию
|
||||||
41
Инфраструктура/Сервисы/services-nginx-proxy-manager.md
Normal file
41
Инфраструктура/Сервисы/services-nginx-proxy-manager.md
Normal file
@@ -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 (только из локальной сети)
|
||||||
31
Инфраструктура/Сервисы/storybook.md
Normal file
31
Инфраструктура/Сервисы/storybook.md
Normal file
@@ -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)
|
||||||
35
Инфраструктура/Сервисы/uptime-kuma.md
Normal file
35
Инфраструктура/Сервисы/uptime-kuma.md
Normal file
@@ -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)
|
||||||
38
Инфраструктура/Сервисы/vault-vaultwarden.md
Normal file
38
Инфраструктура/Сервисы/vault-vaultwarden.md
Normal file
@@ -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)
|
||||||
48
Инфраструктура/Сервисы/vikunja.md
Normal file
48
Инфраструктура/Сервисы/vikunja.md
Normal file
@@ -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)
|
||||||
37
Инфраструктура/Сервисы/vpn-invite.md
Normal file
37
Инфраструктура/Сервисы/vpn-invite.md
Normal file
@@ -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)
|
||||||
35
Инфраструктура/Сервисы/vpn-router.md
Normal file
35
Инфраструктура/Сервисы/vpn-router.md
Normal file
@@ -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`
|
||||||
40
Инфраструктура/Сервисы/webhook-deploy.md
Normal file
40
Инфраструктура/Сервисы/webhook-deploy.md
Normal file
@@ -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 и всем проектам — может деплоить любой сервис
|
||||||
Reference in New Issue
Block a user