feat: add VitePress docs site, music file picker modal, Dockerfile optimization, i18n keys for 14 locales
- Add docs/ with VitePress site (19 pages): guide, config, architecture, FAQ - Add GitHub Actions workflow for auto-deploy to GitHub Pages - Replace music 'Add Tracks' upload picker with in-app audio file browser modal - Add music picker CSS styles with dark theme support - Add missing i18n keys (search_audio, no_audio_files, etc.) to all 14 locales - Optimize Dockerfile: shared base stage, COPY --chmod, consolidated RUN, HEALTHCHECK - Improve README: docs links, updated stats (222+ tests, 14 languages), feature status
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
# Internal Architecture
|
||||
|
||||
OxiCloud follows a **hexagonal (ports & adapters) architecture** with four layers:
|
||||
|
||||
```
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ Interfaces │ REST API, WebDAV, CalDAV, CardDAV, WOPI │
|
||||
├───────────────────────────────────────────────────────────────┤
|
||||
│ Application │ Use cases, DTOs, port definitions │
|
||||
├───────────────────────────────────────────────────────────────┤
|
||||
│ Domain │ Entities, business rules, repository traits │
|
||||
├───────────────────────────────────────────────────────────────┤
|
||||
│ Infrastructure│ PostgreSQL, filesystem, caching, auth │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
All cross-layer dependencies point **inward** via trait-based ports. The DI container (`AppServiceFactory`) wires concrete implementations at startup.
|
||||
|
||||
## Storage Model: 100% Blob Storage
|
||||
|
||||
- **File metadata** (name, folder, size, user, timestamps, trash status) → PostgreSQL (`storage.files`)
|
||||
- **File content** → content-addressed blobs via DedupService at `.blobs/{prefix}/{hash}.blob`
|
||||
- **Folder structure** → purely virtual, rows in `storage.folders` (no filesystem directories per user)
|
||||
- **Trash** → soft-delete flags on files/folders, exposed via `storage.trash_items` VIEW
|
||||
|
||||
## Dependency Injection
|
||||
|
||||
`AppServiceFactory` in `src/common/di.rs` builds all services in a defined order:
|
||||
|
||||
1. **Core services** — paths, content cache, thumbnails, chunked upload, transcode, dedup, compression
|
||||
2. **Repositories** — `FolderDbRepository`, `FileBlobReadRepository`, `FileBlobWriteRepository`, `TrashDbRepository`
|
||||
3. **Trash service** (if enabled)
|
||||
4. **Application services** — folder, file upload/retrieval/management, search, i18n
|
||||
5. **Share service** (if enabled)
|
||||
6. **DB services** — favorites, recent, storage usage, auth
|
||||
7. **CalDAV/CardDAV services**
|
||||
8. **ZIP service** (last, depends on file & folder services)
|
||||
9. **Assemble `AppState`**
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
src/
|
||||
├── common/ # Config, DI container, errors
|
||||
├── domain/ # Entities, repository traits
|
||||
├── application/ # Use cases, DTOs, port traits
|
||||
├── infrastructure/ # PostgreSQL repos, filesystem, caching
|
||||
└── interfaces/ # HTTP handlers, WebDAV, CalDAV, CardDAV
|
||||
```
|
||||
|
||||
## Key Metrics
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Rust source files | ~170 |
|
||||
| Lines of code | ~50 000 |
|
||||
| Automated tests | 222+ |
|
||||
| Docker image | ~40 MB |
|
||||
|
||||
## Further Reading
|
||||
|
||||
- [Caching Architecture →](/architecture/caching)
|
||||
- [Storage Quotas →](/architecture/storage-quotas)
|
||||
Reference in New Issue
Block a user