Commit Graph

34 Commits

Author SHA1 Message Date
783464acac fix: clippy let_and_return warning 2026-01-30 16:15:21 +00:00
8ac1e2c0c3 style: fix formatting 2026-01-30 16:06:40 +00:00
8c525bb5c2 feat: add Docker image metadata support
- Store metadata (.meta.json) alongside manifests with:
  - push_timestamp, last_pulled, downloads counter
  - size_bytes, os, arch, variant
  - layers list with digest and size
- Update metadata on manifest pull (increment downloads, update last_pulled)
- Extract OS/arch from config blob on push
- Extend UI API TagInfo with metadata fields
- Add public_url config option for pull commands
- Add Docker upstream proxy with auth support
- Add raw repository support
- Bump version to 0.2.12
2026-01-30 15:52:29 +00:00
5c53611cfd feat: add secrets provider architecture
Trait-based secrets management for secure credential handling:
- SecretsProvider trait for pluggable backends
- EnvProvider as default (12-Factor App pattern)
- ProtectedString with zeroize (memory zeroed on drop)
- Redacted Debug impl prevents secret leakage in logs
- S3Credentials struct for future AWS S3 integration
- Config: [secrets] section with provider and clear_env options

Foundation for AWS Secrets Manager, Vault, K8s (v0.4.0+)
2026-01-30 10:02:58 +00:00
73d28ea80b feat: add configurable rate limiting
Rate limits now configurable via config.toml and ENV variables:
- New [rate_limit] config section with auth/upload/general settings
- ENV: NORA_RATE_LIMIT_{AUTH|UPLOAD|GENERAL}_{RPS|BURST}
- Rate limit configuration logged at startup
- Functions accept &RateLimitConfig instead of hardcoded values
2026-01-30 08:20:50 +00:00
278275978c Fix clippy warnings 2026-01-26 19:43:51 +00:00
c1019238cb Fix code formatting 2026-01-26 19:42:20 +00:00
73e7e525a3 Add i18n support, PyPI proxy, and UI improvements
- Add Russian/English language switcher with cookie persistence
- Add PyPI proxy support with caching (like npm)
- Add height limits to Activity Log and Mount Points tables
- Change Cargo icon to delivery truck
- Replace graphical logo with styled text "NORA"
- Bump version to 0.2.11
2026-01-26 19:31:28 +00:00
0a5f267374 Bump version to 0.2.10 2026-01-26 18:43:21 +00:00
5353faef88 Apply dark theme to all UI pages
- Convert registry list, docker detail, package detail, maven detail pages to dark theme
- Use layout_dark instead of layout for all pages
- Update colors: bg-[#1e293b] cards, slate-700 borders, slate-200/400 text
- Mark unused light theme functions with #[allow(dead_code)]
2026-01-26 18:43:11 +00:00
a1c51e1b6b Bump version to 0.2.9 2026-01-26 18:02:43 +00:00
9cea0673da Bump version to 0.2.8 2026-01-26 17:46:34 +00:00
24f198e172 Add dashboard endpoint to OpenAPI documentation
- Add /api/ui/dashboard endpoint with dashboard tag
- Add schemas: DashboardResponse, GlobalStats, RegistryCardStats, MountPoint, ActivityEntry
- Update API version to 0.2.7 in OpenAPI spec
2026-01-26 17:45:54 +00:00
5eca1817af Display version dynamically in UI sidebar
- Add VERSION constant using CARGO_PKG_VERSION
- Show version in both light and dark theme sidebars
- Update workspace version to 0.2.7
2026-01-26 17:31:39 +00:00
80a96527fa Fix clippy warnings 2026-01-26 16:44:01 +00:00
1abe0df25a Fix formatting 2026-01-26 16:39:48 +00:00
38c727491b Add dashboard metrics, activity log, and dark theme
- Add DashboardMetrics for tracking downloads/uploads/cache hits per registry
- Add ActivityLog for recent activity with bounded size (50 entries)
- Instrument Docker, npm, Maven, and Cargo handlers with metrics
- Add /api/ui/dashboard endpoint with global stats and activity
- Implement dark theme dashboard with real-time polling (5s interval)
- Add mount points table showing registry paths and proxy upstreams
2026-01-26 16:21:25 +00:00
d0a9459acd Fix Docker push/pull: add PATCH endpoint for chunked uploads
- Add PATCH handler for /v2/{name}/blobs/uploads/{uuid} to support
  chunked blob uploads (Docker sends data chunks via PATCH)
- Include Range header in PATCH response to indicate bytes received
- Add Docker-Content-Digest header to GET manifest responses
- Store manifests by both tag and digest for proper pull support
- Add parking_lot dependency for upload session state management
2026-01-26 12:01:05 +00:00
482a68637e Fix rate limiting: exempt health/metrics, increase upload limits
- Health, metrics, UI, and API docs are now exempt from rate limiting
- Increased upload rate limits to 200 req/s with burst of 500 for Docker compatibility
2026-01-26 11:04:14 +00:00
340c49bf12 Fix formatting 2026-01-26 10:14:11 +00:00
c84d13c26e Increase upload rate limits for Docker parallel requests
Docker client sends many parallel requests when pushing layers.
Increased upload rate limiter from 10 req/s to 50 req/s and burst from 20 to 100.
2026-01-26 10:10:45 +00:00
7e8978533a fix: resolve clippy warnings and format code 2026-01-26 08:31:00 +00:00
4c6348dac7 feat(ui): add custom NORA logo to sidebar 2026-01-26 08:09:24 +00:00
9a8728454b feat(ui): add responsive mobile design
- Hide sidebar on mobile, show hamburger menu
- Add slide-out drawer with overlay
- Touch-friendly tap targets
- Responsive padding and font sizes
- Replace anchor emoji with NORA logo (O as hole)
2026-01-26 07:38:20 +00:00
6c18230072 fix: add ConnectInfo for rate limiter IP extraction
PeerIpKeyExtractor requires SocketAddr from ConnectInfo to
extract client IP. Without this, rate limiting fails with
"Unable To Extract Key!" error in Docker containers.
2026-01-26 07:25:58 +00:00
36a4efdb6c feat: replace emoji icons with SVG brand icons
- Add icons module with Docker, Maven, npm, Cargo, PyPI SVGs
- Update sidebar navigation with proper fill/stroke rendering
- Update stat cards, quick links, and detail pages
- Consistent icon styling across all UI components
2026-01-26 00:02:45 +00:00
fcd5e2fa39 feat: implement storage migration command
- nora migrate --from local --to s3
- Dry-run mode with --dry-run flag
- Progress bar with indicatif
- Skip existing files in destination
- Summary statistics (migrated, skipped, failed, bytes)
2026-01-26 00:02:39 +00:00
1887ec61c4 feat: add rate limiting for brute-force protection
- Auth endpoints: 1 req/sec, burst 5 (strict)
- Upload endpoints: 10 req/sec, burst 20
- General endpoints: 100 req/sec, burst 200
- Uses tower_governor with PeerIpKeyExtractor
2026-01-26 00:02:33 +00:00
ffc584351c feat: add X-Request-ID middleware for request tracking
- Generate UUID v4 per request or accept upstream ID
- Store in request extensions for handler access
- Add to response headers for client correlation
- Include in tracing spans for log correlation
2026-01-26 00:02:27 +00:00
697d59811a feat: add typed error handling with thiserror
- AppError enum with IntoResponse for Axum
- Automatic conversion from StorageError and ValidationError
- JSON error responses with request_id support
2026-01-26 00:02:21 +00:00
a220567270 feat: add input validation with path traversal protection
- validate_storage_key: reject ../, null bytes, absolute paths
- validate_docker_name: OCI distribution spec compliance
- validate_digest: sha256/sha512 format validation
- validate_docker_reference: tag and digest reference validation
- Integrate validation in storage wrapper and Docker handlers
2026-01-26 00:02:15 +00:00
7ed3444d86 test: add comprehensive unit tests for storage and auth
- LocalStorage tests: put/get, list, stat, health_check, nested dirs
- S3Storage tests with wiremock HTTP mocking
- Auth/htpasswd tests: loading, validation, public paths
- Token lifecycle tests: create, verify, expire, revoke

Total: 75 tests passing
2026-01-26 00:02:09 +00:00
26237bff2d fix: remove all unwrap() calls for safer error handling 2026-01-25 18:15:19 +00:00
586420a476 feat: initialize NORA artifact registry
Cloud-native multi-protocol artifact registry in Rust.

- Docker Registry v2
- Maven (+ proxy)
- npm (+ proxy)
- Cargo, PyPI
- Web UI, Swagger, Prometheus
- Local & S3 storage
- 32MB Docker image

Created by DevITWay
https://getnora.io
2026-01-25 17:33:15 +00:00