UpdaterService.Client
1.0.2
See the version list below for details.
dotnet add package UpdaterService.Client --version 1.0.2
NuGet\Install-Package UpdaterService.Client -Version 1.0.2
<PackageReference Include="UpdaterService.Client" Version="1.0.2" />
<PackageVersion Include="UpdaterService.Client" Version="1.0.2" />
<PackageReference Include="UpdaterService.Client" />
paket add UpdaterService.Client --version 1.0.2
#r "nuget: UpdaterService.Client, 1.0.2"
#:package UpdaterService.Client@1.0.2
#addin nuget:?package=UpdaterService.Client&version=1.0.2
#tool nuget:?package=UpdaterService.Client&version=1.0.2
Updater Service
Сервис управления пакетами и обновлениями: REST API (ASP.NET Core), NuGet‑клиент, веб‑морда (Next.js).
Архитектура
Основные сущности
- Product — продукт/приложение (например, "Stax")
- Package — пакет для продукта с типом:
Software(0) — основное ПО / обновленияPlugin(1) — плагины / модулиConfig(2) — конфигурационные файлы
Структура проекта
- web/ — Next.js веб‑морда (админ-панель)
- api/ — ASP.NET Core API
- client/ — NuGet‑клиент для приложений
Запуск
API:
cd api
dotnet run
Веб‑морда:
cd web
npm install
npm run dev
В web/.env.local задайте NEXT_PUBLIC_API_URL=http://localhost:5008 (порт из api/Properties/launchSettings.json).
Сборка решения (API + Client):
dotnet build UpdaterService.slnx
Безопасность и авторизация
Аутентификация
Система поддерживает два метода аутентификации:
- JWT токены — для веб-интерфейса администратора
- API ключи — для клиентских приложений
Первоначальная настройка
При первом запуске API автоматически создаётся администратор:
- Логин:
admin(настраивается вappsettings.json→Security:InitialAdminUsername) - Пароль:
CHANGE_THIS_PASSWORD!(настраивается вSecurity:InitialAdminPassword)
ВАЖНО: Измените пароль администратора и JWT секрет перед деплоем!
Конфигурация безопасности (api/appsettings.json)
{
"Jwt": {
"Secret": "CHANGE_THIS_TO_A_SECURE_SECRET_KEY_AT_LEAST_32_CHARACTERS_LONG!",
"Issuer": "UpdaterService",
"Audience": "UpdaterServiceClients",
"AccessTokenExpirationMinutes": 15,
"RefreshTokenExpirationDays": 7
},
"Security": {
"AllowedOrigins": ["http://localhost:3000", "https://your-domain.com"],
"InitialAdminUsername": "admin",
"InitialAdminPassword": "CHANGE_THIS_PASSWORD!"
}
}
API ключи
Создаются через веб-интерфейс (/api-keys) или API. Поддерживают разрешения:
- Read (1) — чтение списка пакетов
- Download (2) — скачивание пакетов
- Upload (4) — загрузка пакетов
- Delete (8) — удаление пакетов
Использование в клиентской библиотеке
// С API ключом
var client = new UpdaterClient("https://your-api.com", "upd_your_api_key_here");
// Получить все пакеты продукта
var packages = await client.GetPackagesByProductAsync("stax");
// Получить только плагины
var plugins = await client.GetPackagesByProductAsync("stax", PackageType.Plugin);
// Получить последнюю версию софта
var latest = await client.GetLatestPackageAsync("stax", PackageType.Software);
// Скачать пакет
await client.DownloadPackageToFileAsync(packageId, "update.exe");
Rate Limiting
Настроен по умолчанию:
- 60 запросов в минуту для большинства эндпоинтов
- 5 попыток входа в минуту
- 120 запросов в минуту для загрузки чанков
API Endpoints
Авторизация
POST /api/auth/login— вход (без авторизации)POST /api/auth/refresh— обновление токена (без авторизации)POST /api/auth/logout— выход (требует JWT)GET /api/auth/me— информация о пользователе (требует JWT)POST /api/auth/change-password— смена пароля (требует JWT)GET /api/auth/api-keys— список API ключей (требует JWT)POST /api/auth/api-keys— создание API ключа (требует JWT)DELETE /api/auth/api-keys/{id}— отзыв API ключа (требует JWT)
Управление пользователями (только SuperAdmin)
GET /api/auth/users— список пользователейPOST /api/auth/users— создание пользователяDELETE /api/auth/users/{id}— деактивация пользователя
Продукты (требует JWT или API Key)
GET /api/products— список продуктов (Read)GET /api/products/{code}— продукт по коду (Read)POST /api/products— создать продукт (Upload)PUT /api/products/{code}— обновить продукт (Upload)DELETE /api/products/{code}— удалить продукт (Delete)
Пакеты (требует JWT или API Key)
GET /api/packages— все пакеты с фильтрами (Read)?productCode=stax— по продукту?type=1— по типу (0=Software, 1=Plugin, 2=Config)?status=2— по статусу (0=Normal, 1=Important, 2=Critical)
GET /api/packages/by-product/{productCode}— пакеты продукта (Read)GET /api/packages/latest/{productCode}/{type}— последний пакет (Read)GET /api/packages/{id}— получить пакет (Read)GET /api/packages/{id}/download— скачать файл (Download)GET /api/packages/{id}/file-size— размер файла (Read)POST /api/packages— создать пакет (Upload)DELETE /api/packages/{id}— удалить пакет (Delete)
Chunked Upload (требует Upload разрешение)
POST /api/packages/upload-chunk— загрузка чанкаGET /api/packages/upload-progress/{uploadId}— прогресс загрузкиPOST /api/packages/finish-upload/{uploadId}— завершение загрузки
Обратная совместимость (deprecated)
Старые эндпоинты /api/updates/* работают для обратной совместимости, но рекомендуется использовать /api/packages/*.
Типы пакетов
| Тип | Значение | Описание |
|---|---|---|
| Software | 0 | Основное ПО, обновления программы |
| Plugin | 1 | Плагины, дополнительные модули |
| Config | 2 | Конфигурационные файлы (JSON, XML и др.) |
Статусы пакетов
| Статус | Значение | Описание |
|---|---|---|
| Normal | 0 | Обычный пакет |
| Important | 1 | Важный, рекомендуется к установке |
| Critical | 2 | Критический, требует немедленной установки |
БД
SQLite updater.db в папке api/; создаётся при первом запуске. Строка подключения в api/appsettings.json.
При изменении структуры БД удалите старую базу updater.db для пересоздания.
Деплой
API (Docker)
Скопируйте файлы на сервер:
scp -r api/ docker-compose.yml .env.example user@server:/path/to/updaterСоздайте
.envфайл:cp .env.example .env nano .env # Заполните свои значенияЗапустите контейнер:
docker compose up -dПроверьте статус:
docker compose ps docker compose logs -f api
Переменные окружения (.env)
| Переменная | Описание | Пример |
|---|---|---|
JWT_SECRET |
Секрет для JWT (мин. 32 символа) | your-super-secret-key-here-32ch |
ADMIN_PASSWORD |
Пароль админа при первом запуске | SecurePass123! |
ALLOWED_ORIGIN |
URL фронтенда (Vercel) | https://myapp.vercel.app |
API_BASE_URL |
Публичный URL API | https://api.mydomain.com |
Nginx Reverse Proxy (рекомендуется)
server {
listen 443 ssl http2;
server_name api.mydomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
client_max_body_size 500M;
location / {
proxy_pass http://localhost:5008;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
Полезные команды Docker
# Перезапуск
docker compose restart
# Обновление (пересборка)
docker compose up -d --build
# Просмотр логов
docker compose logs -f api
# Бэкап БД
docker cp updater-api:/app/data/updater.db ./backup-$(date +%Y%m%d).db
# Вход в контейнер
docker exec -it updater-api sh
Web UI (Vercel)
Залейте web/ в отдельный репозиторий или используйте monorepo
В настройках проекта Vercel:
- Root Directory:
web(если monorepo) - Framework Preset: Next.js
- Environment Variables:
NEXT_PUBLIC_API_URL=https://api.mydomain.com
- Root Directory:
Деплой произойдёт автоматически при push в main
Переменные Vercel
| Переменная | Описание |
|---|---|
NEXT_PUBLIC_API_URL |
URL вашего API сервера |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- System.Net.Http.Json (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.