Owner decisions (2026-10-04, recorded in docs/ROADMAP.md): production runs everything that is built, and nothing waits
on a person running a command.
- Geolocation updates itself. GeoUpdater, a hosted service, checks daily whether each DB-IP Lite database was built this
month. If not, it fetches this month's, or last month's early in the month. It installs a file only once it opens as
the right kind of database, then swaps it in atomically, and the locator reloads at once. Lookups now run under the
lock, so a reload can no longer dispose a reader mid-lookup. The systemd timer, its script and their setup.sh lines
are gone: the root step they needed never happened, and none is needed now. /stargazing names the database in use.
- The admin CLI runs after the app is built, with every service and nothing started.
- `create-root <login> [--admin]` takes the password on stdin; it is how the first login is made while sign-up is
closed.
- `smoke <persona>` keeps the root `deploy-smoke` and an undiscoverable persona, and gives the root a new password
on every run.
- The deploy signs in as @thepra. It runs the CLI, gets a token through the real OAuth flow (tools/smoke/oauth.sh,
moved out of the pasture's privapub_token, which now uses it), checks the signed-in API and that @thepra is
undiscoverable, then revokes the token. PRIVAPUB_SMOKE_TOKEN is gone.
- The deploy also fails when:
- NodeInfo and the instance API disagree about registrations;
- /stargazing does not say the crawler is on;
- the geolocation databases are missing or more than 40 days old.
- The crawler is on in production, seeded with ten large servers of different kinds. FEDERATION.md now describes it
and how to opt out.
- One registrations switch (Registrations:Mode, default Invitations; Open in tests and the pasture). It is read by
open sign-up (403 when closed), NodeInfo `openRegistrations`, and v1 and v2 of the instance API, so they can no longer
disagree. Before, NodeInfo said open and the instance API said closed. Group invitations always work, so
invites_enabled is true.
- A persona edit through /clientapi no longer resets what the Mastodon API set (discoverable, locked, quote policy…):
the theme is merged into the settings instead of replacing them.
650 tests pass. The deploy's smoke step was rehearsed against the pasture's PrivaPub.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ELjqpznMFMNrJoJUj6K5p2
90 lines
2.2 KiB
JSON
90 lines
2.2 KiB
JSON
{
|
|
"Media": {
|
|
"Root": "/var/lib/privapub/media"
|
|
},
|
|
"Registrations": {
|
|
"Mode": "Invitations"
|
|
},
|
|
"Statistics": {
|
|
"Crawler": {
|
|
"Enabled": true,
|
|
"Seeds": [
|
|
"mastodon.social",
|
|
"fosstodon.org",
|
|
"mas.to",
|
|
"lemmy.world",
|
|
"lemmy.ml",
|
|
"misskey.io",
|
|
"pixelfed.social",
|
|
"framatube.org",
|
|
"piefed.social",
|
|
"bookwyrm.social"
|
|
]
|
|
}
|
|
},
|
|
"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"
|
|
} |