feat(server): split file storage into a separate file service with tickets, receipts and WebDAV backup

- new projects WebDrop.FileApi (file service), WebDrop.FileProtocol (shared tickets and receipts) and WebDrop.Sync (WebDAV)
- file content of any size goes to the file service; chat, avatars and space structure stay on the main backend
- tickets issued by the main backend, receipts by the file service, deletion queue and daily reconciliation
- daily database snapshot and file sync to external storage (OpenList/WebDAV) with a 30 day retention
- reorganize Core, Storage and Api into feature folders (namespaces unchanged)
- web client uploads file frames to the file service and reads them with tickets
This commit is contained in:
justme committed 2026-10-17 15:25:16 +08:00
1 parent d66c93fe98
commit 72a5e5b839
84 files changed
+2156 -39

No files matched your search

+80 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"x-backend-contract-sha256": "96cd0ffa3588a288af7bc720b2413cb56499dd862ac98d83c73ccc11a1147d25",
"x-backend-contract-sha256": "1b3b8d56bf4262d61d7c2814fcd788b09225ccc94120084673ea46de46c09593",
"$defs": {
"AccountChannelBody": {
"type": "object",
@@ -844,6 +844,60 @@
"error"
]
},
"FileGrantBody": {
"type": "object",
"properties": {
"expires_at": {
"type": "integer"
},
"mode": {
"type": "string"
},
"ticket": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"expires_at",
"mode"
]
},
"FileGrantRequest": {
"type": "object",
"properties": {
"from": {
"type": "integer"
},
"item": {
"type": "string"
},
"op": {
"type": "string"
}
},
"required": [
"from",
"item",
"op"
]
},
"FinishShareRequest": {
"type": "object",
"properties": {
@@ -1350,6 +1404,9 @@
"defaults": {
"$ref": "#/$defs/DefaultsBody"
},
"files": {
"$ref": "#/$defs/FilesInfoBody"
},
"limits": {
"$ref": "#/$defs/LimitsBody"
},
@@ -1365,6 +1422,7 @@
"choices",
"contract_version",
"defaults",
"files",
"limits",
"protocol",
"transports"
@@ -1414,6 +1472,27 @@
"share"
]
},
"FilesInfoBody": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"enabled"
]
},
"LimitsBody": {
"type": "object",
"properties": {