85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
# DCRouter Storage Overview
|
|
|
|
DCRouter uses a **unified database layer** backed by `@push.rocks/smartdata` for all persistent data. All data is stored as typed document classes in a single database.
|
|
|
|
## Database Modes
|
|
|
|
### Embedded Mode (default)
|
|
When no external MongoDB URL is provided, DCRouter starts an embedded `LocalSmartDb` (Rust-based MongoDB-compatible engine) via `@push.rocks/smartdb`.
|
|
|
|
```
|
|
~/.serve.zone/dcrouter/tsmdb/
|
|
```
|
|
|
|
### External Mode
|
|
Connect to any MongoDB-compatible database by providing a connection URL.
|
|
|
|
```typescript
|
|
dbConfig: {
|
|
mongoDbUrl: 'mongodb://host:27017',
|
|
dbName: 'dcrouter',
|
|
}
|
|
```
|
|
|
|
## Configuration
|
|
|
|
```typescript
|
|
dbConfig: {
|
|
enabled: true, // default: true
|
|
mongoDbUrl: undefined, // default: embedded LocalSmartDb
|
|
storagePath: '~/.serve.zone/dcrouter/tsmdb', // default (embedded mode only)
|
|
dbName: 'dcrouter', // default
|
|
cleanupIntervalHours: 1, // TTL cleanup interval
|
|
}
|
|
```
|
|
|
|
## Document Classes
|
|
|
|
All data is stored as smartdata document classes in `ts/db/documents/`.
|
|
|
|
| Document Class | Collection | Unique Key | Purpose |
|
|
|---|---|---|---|
|
|
| `StoredRouteDoc` | storedRoutes | `id` | Programmatic routes (created via API) |
|
|
| `RouteOverrideDoc` | routeOverrides | `routeName` | Hardcoded route enable/disable overrides |
|
|
| `ApiTokenDoc` | apiTokens | `id` | API tokens (hashed secrets, scopes, expiry) |
|
|
| `VpnServerKeysDoc` | vpnServerKeys | `configId` (singleton) | VPN server Noise + WireGuard keypairs |
|
|
| `VpnClientDoc` | vpnClients | `clientId` | VPN client registrations |
|
|
| `AcmeCertDoc` | acmeCerts | `domainName` | ACME certificates and keys |
|
|
| `ProxyCertDoc` | proxyCerts | `domain` | SmartProxy TLS certificates |
|
|
| `CertBackoffDoc` | certBackoff | `domain` | Per-domain cert provision backoff state |
|
|
| `RemoteIngressEdgeDoc` | remoteIngressEdges | `id` | Edge node registrations |
|
|
| `VlanMappingsDoc` | vlanMappings | `configId` (singleton) | MAC-to-VLAN mapping table |
|
|
| `AccountingSessionDoc` | accountingSessions | `sessionId` | RADIUS accounting sessions |
|
|
| `CachedEmail` | cachedEmails | `id` | Email metadata (TTL: 30 days) |
|
|
| `CachedIPReputation` | cachedIPReputation | `ipAddress` | IP reputation results (TTL: 24 hours) |
|
|
|
|
## Architecture
|
|
|
|
```
|
|
DcRouterDb (singleton)
|
|
├── LocalSmartDb (embedded, Rust) ─── or ─── External MongoDB
|
|
└── SmartdataDb (ORM)
|
|
└── @Collection(() => getDb())
|
|
├── StoredRouteDoc
|
|
├── RouteOverrideDoc
|
|
├── ApiTokenDoc
|
|
├── VpnServerKeysDoc / VpnClientDoc
|
|
├── AcmeCertDoc / ProxyCertDoc / CertBackoffDoc
|
|
├── RemoteIngressEdgeDoc
|
|
├── VlanMappingsDoc / AccountingSessionDoc
|
|
├── CachedEmail (TTL)
|
|
└── CachedIPReputation (TTL)
|
|
```
|
|
|
|
### TTL Cleanup
|
|
|
|
`CacheCleaner` runs on a configurable interval (default: 1 hour) and removes expired documents where `expiresAt < now()`.
|
|
|
|
## Disabling
|
|
|
|
For tests or lightweight deployments without persistence:
|
|
|
|
```typescript
|
|
dbConfig: { enabled: false }
|
|
```
|