- /api/v1/media and /api/v2/media (and GET/PUT /api/v1/media/:id):
images go through libvips (NetVips, its native build bundled):
autorotated, every kind of metadata dropped (EXIF, GPS, XMP, IPTC,
comments), capped at 4096 px, with a 640 px preview and a blurhash
(own encoder, the reference algorithm); animated GIFs are re-encoded;
video and audio are remuxed by ffmpeg with -map_metadata -1, never
re-encoded, and a video gets a still preview. Files get random names
under /var/lib/privapub/media, outside the web root deploys replace, and
are served at /media/files with nosniff and a sandbox CSP.
- media_ids on create and edit (four at most, the persona's own, each used
once); notes carry them as Document attachments with alt text, blurhash,
focalPoint and size; inbound attachments were already kept.
- avatar and header uploads in update_credentials, cropped to 400x400 and
1500x500, federated with Update{Person}.
- Remote media reaches clients only through /media/proxy/{hmac}/{url},
fetched by the guarded client (no SVG, 40 MB cap) and cached outside the
served root, trimmed to 5 GB; foreign avatars and headers use it too, so
a client never contacts another server.
- MediaJanitor deletes uploads left unattached for a day.
- nginx accepts 100 MB bodies on the upload endpoints only (applied on Max).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
70 lines
1.9 KiB
JSON
70 lines
1.9 KiB
JSON
{
|
|
"Media": {
|
|
"Root": "/var/lib/privapub/media"
|
|
},
|
|
"MongoSettings": {
|
|
"Database": "PrivaPub",
|
|
"LogsDatabase": "logs",
|
|
"ConnectionString": "mongodb://127.0.0.1:27022"
|
|
},
|
|
"AppConfiguration": {
|
|
"Version": "0.0.0",
|
|
"BackendBaseAddress": "https://privapub.thepra.dev",
|
|
"FrontendBaseAddress": "https://decepub.thepra.dev",
|
|
"MaxAllowedUploadFiles": 3,
|
|
"MaxAllowedFileSize": 2097152,
|
|
"ValidDiscussionFilesTypes": ".odt,.docx,.pdf,.xlsx,.ods,.odp,.pptx,.png,.jpg,.jpeg",
|
|
"SupportedLanguages": [
|
|
"en", "it", "de", "fr", "es", "ja", "ru", "zh", "bg", "cs", "da", "nl", "et", "fi", "el", "hu", "lv", "lt", "pl", "pt", "ro", "sk", "sl", "sv"
|
|
],
|
|
"EmailConfiguration": {
|
|
"SmtpServer": "mail.privateemail.com",
|
|
"SmtpPort": 465,
|
|
"UseSSL": true,
|
|
"SmtpUsername": "support@collanon.app",
|
|
"SmtpPassword": "c4kXUJFQeKC2dVQbZqxZ"
|
|
},
|
|
"HashingOptions": {
|
|
"Iterations": 10101
|
|
},
|
|
"Jwt": {
|
|
"Key": "FVkEHw8t84HVXE/+3fyY6gH1AJIlLVNE9UqOzFNBdRKsdFuKrCFBvys0IQfZu+d2Qgg6KtslgntiedPMO98iKg==",
|
|
"Issuer": "https://privapub.thepra.dev",
|
|
"Audience": "https://privapub.thepra.dev",
|
|
"HoursTimeout": 365
|
|
}
|
|
},
|
|
"Logging": {
|
|
"LogLevel": {
|
|
"Default": "Information",
|
|
"Microsoft.AspNetCore": "Warning"
|
|
}
|
|
},
|
|
"Serilog": {
|
|
"MinimumLevel": {
|
|
"Default": "Information",
|
|
"Override": {
|
|
"Microsoft.AspNetCore": "Warning"
|
|
}
|
|
},
|
|
"WriteTo": [
|
|
{
|
|
"Name": "MongoDBCapped",
|
|
"Args": {
|
|
"databaseUrl": "mongodb://127.0.0.1:27022/logs",
|
|
"collectionName": "PrivaPub",
|
|
"cappedMaxSizeMb": "1024",
|
|
"cappedMaxDocuments": "10000"
|
|
}
|
|
},
|
|
{
|
|
"Name": "Console",
|
|
"Args": {
|
|
"theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
|
|
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"AllowedHosts": "privapub.thepra.dev;localhost;127.0.0.1"
|
|
} |