UpdaterService.Client 1.0.10

dotnet add package UpdaterService.Client --version 1.0.10
                    
NuGet\Install-Package UpdaterService.Client -Version 1.0.10
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="UpdaterService.Client" Version="1.0.10" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="UpdaterService.Client" Version="1.0.10" />
                    
Directory.Packages.props
<PackageReference Include="UpdaterService.Client" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add UpdaterService.Client --version 1.0.10
                    
#r "nuget: UpdaterService.Client, 1.0.10"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package UpdaterService.Client@1.0.10
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=UpdaterService.Client&version=1.0.10
                    
Install as a Cake Addin
#tool nuget:?package=UpdaterService.Client&version=1.0.10
                    
Install as a Cake Tool

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

Безопасность и авторизация

Аутентификация

Система поддерживает два метода аутентификации:

  1. JWT токены — для веб-интерфейса администратора
  2. API ключи — для клиентских приложений

Первоначальная настройка

При первом запуске API автоматически создаётся администратор:

  • Логин: admin (настраивается в appsettings.jsonSecurity: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)

  1. Скопируйте файлы на сервер:

    scp -r api/ docker-compose.yml .env.example user@server:/path/to/updater
    
  2. Создайте .env файл:

    cp .env.example .env
    nano .env  # Заполните свои значения
    
  3. Запустите контейнер:

    docker compose up -d
    
  4. Проверьте статус:

    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)

  1. Залейте web/ в отдельный репозиторий или используйте monorepo

  2. В настройках проекта Vercel:

    • Root Directory: web (если monorepo)
    • Framework Preset: Next.js
    • Environment Variables:
      NEXT_PUBLIC_API_URL=https://api.mydomain.com
      
  3. Деплой произойдёт автоматически при push в main

Переменные Vercel
Переменная Описание
NEXT_PUBLIC_API_URL URL вашего API сервера
Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.10 96 2/16/2026
1.0.9 94 2/15/2026
1.0.8 86 2/15/2026
1.0.7 92 2/15/2026
1.0.6 95 2/11/2026
1.0.5 94 2/11/2026
1.0.4 114 2/11/2026
1.0.3 104 1/31/2026
1.0.2 97 1/31/2026
1.0.0.5 88 2/11/2026