fix(registry): restore protocol routing and test coverage for npm, oci, and api flows
This commit is contained in:
118
readme.md
118
readme.md
@@ -6,11 +6,7 @@ all behind a single binary with a modern web UI.
|
||||
|
||||
## Issue Reporting and Security
|
||||
|
||||
For reporting bugs, issues, or security vulnerabilities, please visit
|
||||
[community.foss.global/](https://community.foss.global/). This is the central community hub for all
|
||||
issue reporting. Developers who sign and comply with our contribution agreement and go through
|
||||
identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull
|
||||
Requests directly.
|
||||
For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly.
|
||||
|
||||
## ✨ Features
|
||||
|
||||
@@ -22,7 +18,7 @@ Requests directly.
|
||||
- 🛡️ **RBAC Permissions** — Reader → Developer → Maintainer → Admin per repository
|
||||
- 🔍 **Upstream Caching** — Transparently proxy and cache packages from public registries
|
||||
- 📊 **Audit Logging** — Full audit trail on every action for compliance
|
||||
- 🎨 **Modern Web UI** — Angular 19 dashboard with Tailwind CSS, embedded in the binary
|
||||
- 🎨 **Modern Web UI** — Web Components dashboard built with [`@design.estate/dees-catalog`](https://code.foss.global/design.estate/dees-catalog), bundled into the binary
|
||||
- ⚡ **Single Binary** — Cross-compiled with `deno compile` for Linux and macOS (x64 + ARM64)
|
||||
- 🗄️ **MongoDB + S3** — Metadata in MongoDB, artifacts in any S3-compatible store
|
||||
|
||||
@@ -40,7 +36,7 @@ Requests directly.
|
||||
curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash
|
||||
|
||||
# Install specific version
|
||||
curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --version v1.4.0
|
||||
curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --version v1.8.0
|
||||
|
||||
# Install + set up systemd service
|
||||
curl -sSL https://code.foss.global/stack.gallery/registry/raw/branch/main/install.sh | sudo bash -s -- --setup-service
|
||||
@@ -60,6 +56,9 @@ The installer:
|
||||
git clone https://code.foss.global/stack.gallery/registry.git
|
||||
cd registry
|
||||
|
||||
# Install Node dependencies (for tsbundle/tsdeno build tools)
|
||||
pnpm install
|
||||
|
||||
# Development mode (hot reload, reads .nogit/env.json)
|
||||
deno task dev
|
||||
|
||||
@@ -114,7 +113,7 @@ manager at the registry:
|
||||
|
||||
| Protocol | Paths | Client Config Example |
|
||||
| -------------- | --------------------------- | ------------------------------------------------------ |
|
||||
| **NPM** | `/-/*`, `/@scope/*` | `npm config set registry http://registry:3000` |
|
||||
| **NPM** | `/-/npm/{org}/*` | `npm config set registry http://registry:3000/-/npm/myorg/` |
|
||||
| **OCI/Docker** | `/v2/*` | `docker login registry:3000` |
|
||||
| **Maven** | `/maven2/*` | Add repository URL in `pom.xml` |
|
||||
| **Cargo** | `/api/v1/crates/*` | Configure in `.cargo/config.toml` |
|
||||
@@ -125,6 +124,34 @@ manager at the registry:
|
||||
Authentication works with **Bearer tokens** (API tokens prefixed `srg_`) and **Basic auth**
|
||||
(email:password or username:token).
|
||||
|
||||
### NPM Usage Example
|
||||
|
||||
```bash
|
||||
# Configure npm to use your org's registry
|
||||
npm config set @myorg:registry http://localhost:3000/-/npm/myorg/
|
||||
|
||||
# Authenticate
|
||||
echo "//localhost:3000/-/npm/myorg/:_authToken=srg_YOUR_TOKEN" >> ~/.npmrc
|
||||
|
||||
# Publish & install as usual
|
||||
npm publish
|
||||
npm install @myorg/my-package
|
||||
```
|
||||
|
||||
### Docker/OCI Usage Example
|
||||
|
||||
```bash
|
||||
# Login
|
||||
docker login localhost:3000
|
||||
|
||||
# Tag and push
|
||||
docker tag myimage:latest localhost:3000/myorg/myimage:1.0.0
|
||||
docker push localhost:3000/myorg/myimage:1.0.0
|
||||
|
||||
# Pull
|
||||
docker pull localhost:3000/myorg/myimage:1.0.0
|
||||
```
|
||||
|
||||
## 🔐 Authentication & Security
|
||||
|
||||
### Local Auth
|
||||
@@ -265,11 +292,10 @@ All management endpoints live under `/api/v1/`. Authenticated via
|
||||
registry/
|
||||
├── mod.ts # Deno entry point
|
||||
├── deno.json # Deno config, tasks, imports
|
||||
├── package.json # Node deps (tsbundle, tsdeno, tswatch)
|
||||
├── npmextra.json # tsdeno compile targets & gitzone config
|
||||
├── install.sh # Binary installer script
|
||||
├── .gitea/workflows/ # CI release pipeline
|
||||
├── scripts/
|
||||
│ └── bundle-ui.ts # Embeds Angular build as base64 TypeScript
|
||||
├── ts/
|
||||
│ ├── registry.ts # StackGalleryRegistry — main orchestrator
|
||||
│ ├── cli.ts # CLI commands (smartcli)
|
||||
@@ -277,6 +303,7 @@ registry/
|
||||
│ ├── api/
|
||||
│ │ ├── router.ts # REST API router with JWT/token auth
|
||||
│ │ └── handlers/ # auth, user, org, repo, package, token, audit, oauth, admin
|
||||
│ ├── opsserver/ # TypedRequest RPC handlers
|
||||
│ ├── models/ # MongoDB models via @push.rocks/smartdata
|
||||
│ │ ├── user.ts, organization.ts, team.ts
|
||||
│ │ ├── repository.ts, package.ts
|
||||
@@ -294,29 +321,25 @@ registry/
|
||||
│ │ ├── auth.provider.ts # IAuthProvider implementation
|
||||
│ │ └── storage.provider.ts # IStorageHooks for quota/audit
|
||||
│ └── interfaces/ # TypeScript interfaces & types
|
||||
├── ts_interfaces/ # Shared API contract (TypedRequest interfaces)
|
||||
│ ├── data/ # Data types (auth, org, repo, package, token, audit, admin)
|
||||
│ └── requests/ # Request/response interfaces for all API endpoints
|
||||
└── ui/ # Angular 19 + Tailwind CSS frontend
|
||||
└── src/app/
|
||||
├── features/ # Login, dashboard, orgs, repos, packages, tokens, admin
|
||||
├── core/ # Services, guards, interceptors
|
||||
└── shared/ # Layout, UI components
|
||||
└── ts_interfaces/ # Shared API contract (TypedRequest interfaces)
|
||||
├── data/ # Data types (auth, org, repo, package, token, audit, admin)
|
||||
└── requests/ # Request/response interfaces for all API endpoints
|
||||
```
|
||||
|
||||
## 🔧 Technology Stack
|
||||
|
||||
| Component | Technology |
|
||||
| ----------------- | ------------------------------------------------------------------------------------ |
|
||||
| **Runtime** | Deno 2.x |
|
||||
| **Language** | TypeScript (strict mode) |
|
||||
| **Database** | MongoDB via [`@push.rocks/smartdata`](https://code.foss.global/push.rocks/smartdata) |
|
||||
| **Storage** | S3 via [`@push.rocks/smartbucket`](https://code.foss.global/push.rocks/smartbucket) |
|
||||
| **Registry Core** | [`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry) |
|
||||
| **Frontend** | Angular 19 (Signals, Zoneless) + Tailwind CSS |
|
||||
| **Auth** | JWT (HS256) + OAuth/OIDC + LDAP |
|
||||
| **Build** | [`@git.zone/tsdeno`](https://code.foss.global/git.zone/tsdeno) cross-compilation |
|
||||
| **CI/CD** | Gitea Actions → binary releases |
|
||||
| Component | Technology |
|
||||
| ----------------- | ----------------------------------------------------------------------------------------- |
|
||||
| **Runtime** | Deno 2.x |
|
||||
| **Language** | TypeScript (strict mode) |
|
||||
| **Database** | MongoDB via [`@push.rocks/smartdata`](https://code.foss.global/push.rocks/smartdata) |
|
||||
| **Storage** | S3 via [`@push.rocks/smartbucket`](https://code.foss.global/push.rocks/smartbucket) |
|
||||
| **Registry Core** | [`@push.rocks/smartregistry`](https://code.foss.global/push.rocks/smartregistry) |
|
||||
| **Frontend** | Web Components via [`@design.estate/dees-element`](https://code.foss.global/design.estate/dees-element) + [`@design.estate/dees-catalog`](https://code.foss.global/design.estate/dees-catalog) |
|
||||
| **UI Build** | [`@git.zone/tsbundle`](https://code.foss.global/git.zone/tsbundle) |
|
||||
| **Auth** | JWT (HS256) + OAuth/OIDC + LDAP |
|
||||
| **Build** | [`@git.zone/tsdeno`](https://code.foss.global/git.zone/tsdeno) cross-compilation |
|
||||
| **CI/CD** | Gitea Actions → binary releases |
|
||||
|
||||
## 🛠️ Development
|
||||
|
||||
@@ -329,11 +352,8 @@ deno task dev
|
||||
# Watch mode: backend + UI + bundler concurrently
|
||||
pnpm run watch
|
||||
|
||||
# Build Angular UI
|
||||
deno task build
|
||||
|
||||
# Bundle UI into embedded TypeScript
|
||||
deno task bundle-ui
|
||||
# Build UI (web components via tsbundle)
|
||||
deno task build-ui
|
||||
|
||||
# Cross-compile binaries for all platforms
|
||||
deno task compile
|
||||
@@ -355,7 +375,7 @@ deno task test:e2e # E2E tests (requires running server + services)
|
||||
Releases are automated via Gitea Actions (`.gitea/workflows/release.yml`):
|
||||
|
||||
1. Push a `v*` tag
|
||||
2. CI builds the Angular UI and bundles it into TypeScript
|
||||
2. CI builds the Web Components UI via `tsbundle`
|
||||
3. `tsdeno compile` produces binaries for 4 platforms (linux-x64, linux-arm64, macos-x64,
|
||||
macos-arm64)
|
||||
4. Binaries + SHA256 checksums are uploaded as Gitea release assets
|
||||
@@ -367,38 +387,28 @@ Compile targets are configured in `npmextra.json` under `@git.zone/tsdeno`.
|
||||
Artifacts are stored in S3 at:
|
||||
|
||||
```
|
||||
{storagePath}/{protocol}/{orgName}/{packageName}/{version}/{filename}
|
||||
{storagePath}/{protocol}/packages/{packageName}/{version}/{filename}
|
||||
```
|
||||
|
||||
For example: `packages/npm/myorg/mypackage/1.0.0/mypackage-1.0.0.tgz`
|
||||
For example: `packages/npm/packages/@myorg/mypackage/mypackage-1.0.0.tgz`
|
||||
|
||||
## License and Legal Information
|
||||
|
||||
This repository contains open-source code licensed under the MIT License. A copy of the license can
|
||||
be found in the [LICENSE](./LICENSE) file.
|
||||
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file.
|
||||
|
||||
**Please note:** The MIT License does not grant permission to use the trade names, trademarks,
|
||||
service marks, or product names of the project, except as required for reasonable and customary use
|
||||
in describing the origin of the work and reproducing the content of the NOTICE file.
|
||||
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
|
||||
|
||||
### Trademarks
|
||||
|
||||
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated
|
||||
with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture
|
||||
Capital GmbH or third parties, and are not included within the scope of the MIT license granted
|
||||
herein.
|
||||
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.
|
||||
|
||||
Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the
|
||||
guidelines of the respective third-party owners, and any usage must be approved in writing.
|
||||
Third-party trademarks used herein are the property of their respective owners and used only in a
|
||||
descriptive manner, e.g. for an implementation of an API or similar.
|
||||
Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.
|
||||
|
||||
### Company Information
|
||||
|
||||
Task Venture Capital GmbH Registered at District Court Bremen HRB 35230 HB, Germany
|
||||
Task Venture Capital GmbH
|
||||
Registered at District Court Bremen HRB 35230 HB, Germany
|
||||
|
||||
For any legal inquiries or further information, please contact us via email at hello@task.vc.
|
||||
|
||||
By using this repository, you acknowledge that you have read this section, agree to comply with its
|
||||
terms, and understand that the licensing of the code does not imply endorsement by Task Venture
|
||||
Capital GmbH of any derivative works.
|
||||
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
||||
|
||||
Reference in New Issue
Block a user