mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
387 lines
8.3 KiB
TypeScript
387 lines
8.3 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import type {DerivedEndpoints} from './EndpointDerivation';
|
|
|
|
export type RuntimeEnv = 'development' | 'production' | 'test';
|
|
export type DatabaseBackend = 'postgres' | 'cassandra';
|
|
export type PublicScheme = 'http' | 'https';
|
|
|
|
export interface InstanceBrandingConfig {
|
|
product_name: string;
|
|
icon_url?: string;
|
|
symbol_url?: string;
|
|
logo_url?: string;
|
|
wordmark_url?: string;
|
|
favicon_url?: string;
|
|
theme_color?: string;
|
|
}
|
|
|
|
export interface MasterConfig {
|
|
env: RuntimeEnv;
|
|
domain: {
|
|
base_domain: string;
|
|
public_scheme: PublicScheme;
|
|
internal_scheme: PublicScheme;
|
|
public_port: number;
|
|
internal_port: number;
|
|
static_cdn_domain: string;
|
|
invite_domain: string;
|
|
gift_domain: string;
|
|
};
|
|
endpoint_overrides?: Partial<DerivedEndpoints>;
|
|
endpoints: DerivedEndpoints;
|
|
internal: {
|
|
kv: string;
|
|
kv_provider: 'redis';
|
|
kv_mode: 'standalone' | 'cluster';
|
|
kv_cluster_nodes: Array<{host: string; port: number}>;
|
|
kv_cluster_nat_map: Record<string, {host: string; port: number}>;
|
|
api: string;
|
|
gateway?: string;
|
|
media_proxy: string;
|
|
};
|
|
database: {
|
|
backend: DatabaseBackend;
|
|
cassandra: {
|
|
hosts: Array<string>;
|
|
port: number;
|
|
keyspace: string;
|
|
local_dc: string;
|
|
username: string;
|
|
password: string;
|
|
};
|
|
postgres: {
|
|
url: string;
|
|
host: string;
|
|
port: number;
|
|
database: string;
|
|
username: string;
|
|
password: string;
|
|
ssl: boolean;
|
|
ssl_ca: string;
|
|
max_connections: number;
|
|
kv_table: string;
|
|
};
|
|
};
|
|
s3?: {
|
|
endpoint: string;
|
|
presigned_url_base?: string;
|
|
force_path_style: boolean;
|
|
region: string;
|
|
access_key_id: string;
|
|
secret_access_key: string;
|
|
buckets: {
|
|
cdn: string;
|
|
uploads: string;
|
|
downloads: string;
|
|
reports: string;
|
|
harvests: string;
|
|
static: string;
|
|
};
|
|
};
|
|
s3_downloads?: {
|
|
endpoint: string;
|
|
presigned_url_base?: string;
|
|
force_path_style?: boolean;
|
|
region?: string;
|
|
access_key_id?: string;
|
|
secret_access_key?: string;
|
|
};
|
|
services: {
|
|
api: {
|
|
port: number;
|
|
max_inflight_requests: number;
|
|
ip_ban_exempt_ips: Array<string>;
|
|
desktop_github_redirect_countries: Array<string>;
|
|
presigned_attachment_uploads_enabled: boolean;
|
|
presigned_downloads_enabled: boolean;
|
|
presigned_harvest_downloads_enabled: boolean;
|
|
unfurl_ignored_hosts: Array<string>;
|
|
embeds: {
|
|
oembed_html_enabled: boolean;
|
|
oembed_html_allow_untrusted_on_self_hosted: boolean;
|
|
oembed_html_allowed_hosts: Array<string>;
|
|
cache_default_ttl_seconds: number;
|
|
cache_max_ttl_seconds: number;
|
|
cache_min_ttl_seconds: number;
|
|
cache_respect_remote_ttl: boolean;
|
|
};
|
|
content_moderation?: {
|
|
nsfw_threshold?: number;
|
|
};
|
|
worker?: {
|
|
mode?: 'all_lanes' | 'single_lane' | 'single_task';
|
|
lane?: 'realtime' | 'unfurl' | 'lifecycle' | 'batch';
|
|
task?: string;
|
|
enable_cron_scheduler?: boolean;
|
|
enable_voice_reconciliation?: boolean;
|
|
voice_reconciliation?: {
|
|
interval_ms?: number;
|
|
stagger_delay_ms?: number;
|
|
lock_ttl_seconds?: number;
|
|
cadence_ttl_seconds?: number;
|
|
gateway_only_grace_ms?: number;
|
|
livekit_only_grace_ms?: number;
|
|
};
|
|
lane_concurrency_overrides?: {
|
|
realtime?: number;
|
|
unfurl?: number;
|
|
lifecycle?: number;
|
|
batch?: number;
|
|
};
|
|
};
|
|
};
|
|
nats?: {
|
|
core_url?: string;
|
|
jetstream_url?: string;
|
|
auth_token?: string;
|
|
};
|
|
media_proxy: {
|
|
host: string;
|
|
port: number;
|
|
secret_key: string;
|
|
mode: string;
|
|
upload_relay: {
|
|
endpoint: string;
|
|
max_body_bytes: number;
|
|
token_ttl_secs: number;
|
|
keep_direct_countries: Array<string>;
|
|
};
|
|
};
|
|
gateway: {
|
|
port: number;
|
|
rpc_auth_token?: string;
|
|
media_proxy_endpoint?: string;
|
|
api_rpc_endpoint?: string;
|
|
push_enabled: boolean;
|
|
};
|
|
admin: {
|
|
port: number;
|
|
base_path: string;
|
|
secret_key_base: string;
|
|
oauth_client_secret: string;
|
|
};
|
|
marketing: {
|
|
port: number;
|
|
host: string;
|
|
base_path: string;
|
|
secret_key_base: string;
|
|
};
|
|
app_proxy: {
|
|
port: number;
|
|
assets_dir: string;
|
|
};
|
|
};
|
|
auth: {
|
|
sudo_mode_secret: string;
|
|
connection_initiation_secret: string;
|
|
sso_allow_private_addresses: boolean;
|
|
passkeys: {
|
|
rp_name: string;
|
|
rp_id: string;
|
|
additional_allowed_origins: Array<string>;
|
|
};
|
|
vapid: {
|
|
public_key: string;
|
|
private_key: string;
|
|
email: string;
|
|
};
|
|
bluesky: {
|
|
enabled: boolean;
|
|
client_name: string;
|
|
client_uri: string;
|
|
logo_uri: string;
|
|
tos_uri: string;
|
|
policy_uri: string;
|
|
keys: Array<{
|
|
kid: string;
|
|
private_key?: string;
|
|
private_key_path?: string;
|
|
}>;
|
|
};
|
|
};
|
|
cookie: {
|
|
domain: string;
|
|
secure: boolean;
|
|
};
|
|
integrations: {
|
|
email: {
|
|
enabled: boolean;
|
|
provider: 'smtp' | 'none';
|
|
from_email: string;
|
|
from_name: string;
|
|
app_base_url: string;
|
|
webhook_secret?: string;
|
|
smtp?: {
|
|
host: string;
|
|
port: number;
|
|
username: string;
|
|
password: string;
|
|
secure: boolean;
|
|
};
|
|
};
|
|
sms: {
|
|
enabled: boolean;
|
|
account_sid?: string;
|
|
auth_token?: string;
|
|
verify_service_sid?: string;
|
|
inbound_challenge_number?: string;
|
|
inbound_webhook_auth_token?: string;
|
|
inbound_webhook_public_url?: string;
|
|
};
|
|
captcha: {
|
|
enabled: boolean;
|
|
provider: 'hcaptcha' | 'turnstile' | 'none';
|
|
hcaptcha?: {
|
|
site_key: string;
|
|
secret_key: string;
|
|
};
|
|
turnstile?: {
|
|
site_key: string;
|
|
secret_key: string;
|
|
};
|
|
};
|
|
voice: {
|
|
enabled: boolean;
|
|
api_key: string;
|
|
api_secret: string;
|
|
url: string;
|
|
internal_url: string;
|
|
webhook_url: string;
|
|
default_region?: {
|
|
id: string;
|
|
name: string;
|
|
emoji: string;
|
|
latitude: number;
|
|
longitude: number;
|
|
};
|
|
};
|
|
search: {
|
|
engine: 'elasticsearch' | 'meilisearch';
|
|
url: string;
|
|
api_key: string;
|
|
username: string;
|
|
password: string;
|
|
tls_reject_unauthorized: boolean;
|
|
};
|
|
stripe: {
|
|
enabled: boolean;
|
|
secret_key: string;
|
|
webhook_secret: string;
|
|
prices?: Record<string, string | undefined>;
|
|
};
|
|
ncmec: {
|
|
enabled: boolean;
|
|
base_url: string;
|
|
username: string;
|
|
password: string;
|
|
reporter_email?: string;
|
|
};
|
|
clamav: {
|
|
enabled: boolean;
|
|
host: string;
|
|
port: number;
|
|
fail_open: boolean;
|
|
};
|
|
klipy: {
|
|
api_key: string;
|
|
};
|
|
youtube: {
|
|
api_key: string;
|
|
};
|
|
bunny: {
|
|
purge_enabled: boolean;
|
|
api_key: string;
|
|
pull_zone_id: number;
|
|
};
|
|
blocklist_feeds: {
|
|
enabled?: boolean;
|
|
};
|
|
risk_integration: {
|
|
enabled: boolean;
|
|
ipinfo_api_key: string;
|
|
account_policy_dsl?: unknown;
|
|
tor: {
|
|
block_all_relays: boolean;
|
|
reverse_dns_heuristic: boolean;
|
|
reverse_dns_timeout_ms: number;
|
|
};
|
|
};
|
|
push: {
|
|
apns: {
|
|
enabled: boolean;
|
|
team_id?: string;
|
|
key_id?: string;
|
|
private_key?: string;
|
|
private_key_path?: string;
|
|
default_environment?: 'production' | 'development';
|
|
apps?: Array<{
|
|
app_id?: string;
|
|
topic?: string;
|
|
environment?: 'production' | 'development';
|
|
project_id?: string;
|
|
}>;
|
|
};
|
|
fcm: {
|
|
enabled: boolean;
|
|
project_id?: string;
|
|
client_email?: string;
|
|
private_key?: string;
|
|
private_key_path?: string;
|
|
service_account_json_path?: string;
|
|
token_uri?: string;
|
|
apps?: Array<{
|
|
app_id?: string;
|
|
topic?: string;
|
|
environment?: 'production' | 'development';
|
|
project_id?: string;
|
|
}>;
|
|
};
|
|
};
|
|
};
|
|
instance: {
|
|
self_hosted: boolean;
|
|
auto_join_invite_code?: string;
|
|
visionaries_guild_id?: string;
|
|
visionaries_guild_visionary_role_id?: string;
|
|
branding: InstanceBrandingConfig;
|
|
setup: {
|
|
configured: boolean;
|
|
};
|
|
abuse_policy: {
|
|
inbound_phone_country_codes: Array<string>;
|
|
phone_verification: {
|
|
inbound_required_prefixes: Array<string>;
|
|
};
|
|
direct_contact_spam: {
|
|
enabled: boolean;
|
|
country_codes: Array<string>;
|
|
distinct_target_threshold: number;
|
|
target_window_ms: number;
|
|
action: 'flag_spammer' | 'suppress_delivery';
|
|
};
|
|
};
|
|
};
|
|
dev: {
|
|
relax_registration_rate_limits: boolean;
|
|
disable_rate_limits: boolean;
|
|
test_mode_enabled: boolean;
|
|
test_harness_token?: string;
|
|
validate_responses?: boolean;
|
|
};
|
|
geoip: {
|
|
maxmind_db_path: string;
|
|
};
|
|
proxy: {
|
|
trust_client_ip_header: boolean;
|
|
client_ip_header: string;
|
|
};
|
|
discovery: {
|
|
enabled: boolean;
|
|
min_member_count: number;
|
|
};
|
|
attachment_decay_enabled: boolean;
|
|
deletion_grace_period_hours: number;
|
|
inactivity_deletion_threshold_days: number;
|
|
}
|