# Argus

`Argus` is an ASP.NET Core 10 web application. It serves a public catalog of published applications and downloadable release files.

## Scope

- public web catalog
- public read-only API
- package file serving from disk
- SQLite metadata storage
- Docker-ready deployment for Raspberry Pi 5 (`linux/arm64`)

There is no HTTP admin API, browser publishing form, or external publishing endpoint. Releases must be published on the server side, for example over SSH, by updating the SQLite database and placing package files under `Data/Packages`.

Use [ARGUS_PUBLICATION.md](ARGUS_PUBLICATION.md) as the canonical instruction for publishing applications and integrating update checks through Argus.

## What It Stores

- app metadata: slug, name, summary, description, repository URL, homepage URL
- release metadata: version, channel, platform, package kind, notes, publish timestamp
- package files on disk under `Data/Packages`
- SHA-256 checksum and file size for each package

`latest` release selection is based on semantic version precedence first, then on publish time as a tie-breaker.

Successful startup keeps only the most recently published release per app. Older release records and their stored package files are pruned automatically.

SQLite data is stored in `Data/argus.db`.

## Public API

- `GET /health`
- `GET /api/apps`
- `GET /api/apps/{slug}`
- `GET /api/apps/{slug}/manifest?platform=web&channel=stable`
- `GET /api/apps/{slug}/download/latest?platform=web&channel=stable`
- `GET /api/apps/{slug}/releases/{releaseId}/download`
- `GET /api/releases/recent`

## Local Run

```powershell
dotnet run --project .\Argus.csproj
```

Default local URL:

```text
http://localhost:5105
```

## Publishing

Publishing is intentionally not exposed through HTTP. Connect to the server over SSH, copy package files into `Data/Packages`, and update `Data/argus.db` locally.

See [ARGUS_PUBLICATION.md](ARGUS_PUBLICATION.md) for the complete publication command template and the client update protocol.

Required release fields in SQLite:

- `CatalogAppId`
- `Version`
- `Channel`
- `Platform`
- `PackageKind`
- `OriginalFileName`
- `StoredRelativePath`
- `ContentType`
- `PackageSizeBytes`
- `Sha256`
- `PublishedAt`

## Docker On Raspberry Pi 5

Files included:

- `Dockerfile`
- `docker-compose.rpi5.yml`
- `.env.example`

Quick start:

```bash
cp .env.example .env
docker compose -f docker-compose.rpi5.yml up -d --build
```

The service binds only to `127.0.0.1:5105`. Put Nginx or another reverse proxy in front of it for external access.

## Reverse Proxy For argus.kusoft.xyz

Prepared Nginx site config:

- `deploy/nginx/argus.kusoft.xyz.conf`

It is configured to:

- redirect `http://argus.kusoft.xyz` to HTTPS
- proxy HTTPS traffic to `http://127.0.0.1:5105`
- pass `X-Forwarded-*` headers expected by the app
- use standard Let's Encrypt certificate paths for `argus.kusoft.xyz`

Persistent data mount:

- host: `${ARGUS_DATA_PATH}`
- container: `/app/Data`
