69f12aa
[s3]
bucket = ""
region = "us-east-1"
endpoint = ""
public_endpoint = ""
access_key_id = ""
secret_access_key = ""
path_style = false
request_timeout_secs = 30
[redis]
url = "redis://localhost:6379"
mode = "standalone"
database = 0
pool_size = 8
connection_timeout_secs = 2
username = ""
password = ""
[search]
enabled = false
url = "http://127.0.0.1:7700"
api_key = ""
index_prefix = "gitdata"
max_file_bytes = 1048576
chunk_lines = 160
batch_size = 100
poll_interval_secs = 2
task_timeout_secs = 120
incremental = true
incremental_max_changed_files = 2000
git_timeout_secs = 120
cat_file_batch = true
parse_threads = 4
meili_inflight = 4
[import]
enabled = false
token_secret = ""
allowed_hosts = []
allow_insecure_tls = false
max_concurrent_jobs = 2
clone_timeout_secs = 3600
api_timeout_secs = 30
poll_interval_secs = 3
max_attempts = 5
max_repo_bytes = 0
stale_lock_secs = 1800
[database]
url = "postgres://postgres:postgres@localhost:5432/gitdata"
host = ""
port = 5432
username = "postgres"
password = ""
database = "gitdata"
schema_search_path = "public"
application_name = "gitdata"
ssl_mode = "prefer"
max_connections = 16
min_connections = 2
connect_timeout_secs = 10
idle_timeout_secs = 600
acquire_timeout_secs = 10
max_lifetime_secs = 1800
sqlx_logging = false
replicas = []
[pow]
difficulty = 16
max_difficulty = 24
expires_secs = 60
mac_key = ""
[auth.password_policy]
min_length = 8
require_upper = true
require_lower = true
require_digit = true
require_symbol = false
[auth]
verify_code_ttl_secs = 600
verify_code_len = 6
reset_token_ttl_secs = 1800
reset_token_bytes = 32
email_code_rate_limit_secs = 60
max_verify_attempts = 5
min_age = 13
totp_encryption_key = ""
[[auth.agreements]]
key = "terms"
version = "0.1.0"
title = "Terms of Service"
content_md = "Placeholder terms of service."
[[auth.agreements]]
key = "privacy"
version = "0.1.0"
title = "Privacy Policy"
content_md = "Placeholder privacy policy."
[web]
web_base_url = "http://localhost:3000"
cors_allow_origins = []
cors_allow_credentials = false
[user]
deletion_grace_days = 14
email_code_rate_limit_secs = 60
email_verify_code_ttl_secs = 900
email_verify_max_attempts = 5
email_verify_code_len = 6
[quota]
space_create_per_day = 10
room_create_per_day = 50
issue_create_per_day = 300
pull_create_per_day = 200
comment_create_per_day = 1000
dm_open_per_day = 100
webhook_create_per_day = 20
space_join_request_per_day = 20
[space]
max_pagination = 100
default_pagination = 20
max_space_name_len = 64
max_space_desc_len = 512
max_group_name_len = 64
max_alias_name_len = 64
max_invite_email_len = 254
allow_self_join_groups = false
join_request_cooldown_hours = 24
max_dir_nodes = 5000
[chat]
max_pagination = 200
default_pagination = 50
max_message_len = 4000
max_topic_len = 1024
max_thread_name_len = 255
max_reaction_emoji_len = 64
max_emoji_name_len = 64
max_bookmark_title_len = 255
max_webhook_name_len = 100
max_mentions_per_message = 20
typing_ttl_secs = 5
presence_ttl_secs = 300
[chat.ws]
ticket_ttl_secs = 60
heartbeat_secs = 30
max_subscriptions = 64
max_frame_bytes = 262144
history_limit = 200
[chat.upload]
max_size = 104857600
presign_ttl_secs = 3600
[issues]
max_pagination = 100
default_pagination = 20
max_board_name_len = 100
max_board_prefix_len = 10
max_title_len = 255
max_body_len = 65535
max_comment_len = 65535
[issues.attachment]
max_size = 26214400
presign_ttl_secs = 3600
max_pending_per_user = 50
max_label_name_len = 50
max_label_color_len = 7
max_milestone_title_len = 100
max_milestone_description_len = 1024
max_reaction_emoji_len = 32
max_mentions_per_message = 20
[agents]
max_pagination = 100
default_pagination = 20
max_collection_name_len = 100
max_agent_name_len = 100
max_instructions_len = 32768
# Lifetime of the per-run space token handed to the sandbox runtime when the
# agent chat "MCP" option is enabled (seconds).
mcp_token_ttl_secs = 86400
[sandbox_rpc]
enabled = false
endpoint = "http://127.0.0.1:8091"
fanout_endpoint = "http://127.0.0.1:8090"
trusted_key = ""
request_timeout_secs = 30
stream_token_ttl_secs = 600
[git]
repo_root = "/opt/gitdata/repos"
objects_root = "/opt/gitdata/objects"
max_blob_size = 104857600
git_command_timeout_secs = 300
git_rpc_timeout_secs = 3600
base_url = "http://localhost:3000"
http_clone_base_url = ""
ssh_clone_host = ""
ssh_clone_port = 0
ssh_clone_user = "git"
graphql_complexity_limit = 1000
graphql_introspection = true
[git.sync]
lock_ttl_secs = 120
max_commits_per_sync = 5000
concurrency = 4
queue_topic = "gitdata:tasks"
dlq_topic = "gitdata:dlq"
max_lock_retries = 5
max_languages = 20
language_timeout_secs = 30
brpop_timeout_secs = 5
git_command_timeout_secs = 120
[git.ssh]
bind_addr = "0.0.0.0"
port = 22
host_key_path = "/opt/gitdata/ssh_host_ed25519"
banner = ""
max_sessions = 64
auth_rejection_time = 2
inactivity_timeout = 300
keepalive_interval = 30
keepalive_max = 3
[email]
enabled = false
smtp_host = "smtp.example.com"
smtp_port = 587
smtp_username = ""
smtp_password = ""
from_address = "[email protected]"
from_name = "GitData"
connection_timeout_ms = 5000
response_timeout_ms = 30000
max_attachment_bytes = 26214400
default_locale = "en"
template_dir = "config/email_templates"
enabled = false
channel_prefix = "email"
subscriber_group_id = "email-worker"
max_retries = 3
retry_backoff_ms = 500
[email.rpc]
[apihost]
enabled = true
bind_addr = "0.0.0.0"
port = 3000
[internal]
# /api/v1/internal/* 的服务密钥,至少 32 字符;留空则拒绝所有 internal 请求。
service_key = ""
[oauth]
enabled = false
issuer = "http://127.0.0.1:18081"
client_id = "gitdata-web"
client_secret = ""
redirect_uri = "http://localhost:5173/api/v1/auth/callback"
token_endpoint = ""
jwks_url = ""
audience = "gitdata.ai"
grpc_endpoint = "http://127.0.0.1:18082"
rpc_key = ""
session_cookie = "gitdata_session"
refresh_cookie = "gitdata_refresh"
cookie_domain = ""
cookie_path = "/"
cookie_secure = false
cookie_same_site = "lax"
access_ttl_secs = 600
refresh_cookie_max_age_secs = 2592000
recheck_secs = 60
leeway_secs = 30
jwks_cache_secs = 3600
jwks_min_refresh_secs = 30
http_timeout_ms = 2000
chat_audience = "chat.gitdata.ai"
[githost]
enabled = true
http_bind_addr = "0.0.0.0"
http_port = 9418
[im]
enabled = true
bind_addr = "0.0.0.0"
port = 3001
[health]
enabled = true
bind_addr = "0.0.0.0"
[health.synchost]
port = 3002
[health.aihost]
port = 3006
[ci]
enabled = false
secret_encryption_key = ""
event_queue_topic = "gitdata:events"
event_dlq_topic = "gitdata:events:dlq"
lease_secs = 60
heartbeat_interval_secs = 15
long_poll_timeout_secs = 30
max_attempts = 2
job_timeout_default_secs = 3600
job_timeout_max_secs = 21600
log_chunk_max_bytes = 262144
log_retention_days = 30
artifact_retention_days = 30
run_retention_days = 180
artifact_max_bytes = 2147483648
outbound_max_attempts = 5
outbound_backoff_base_secs = 60
outbound_timeout_secs = 10
scheduler_interval_secs = 2
cancel_grace_secs = 120
[webhook]
enabled = true
bind_addr = "0.0.0.0"
port = 3005
public_base_url = ""
[ai]
enabled = false
base_url = ""
api_key = ""
model = ""
review_enabled = true
summary_enabled = true
release_notes_enabled = true
queue_topic = "gitdata:ai"
dlq_topic = "gitdata:ai:dlq"
max_attempts = 3
request_timeout_secs = 120
context_max_bytes = 524288
max_findings = 20
max_output_tokens = 4096
thinking_budget = 0
temperature = 0.2
summary_commit_limit = 50
bot_username = "ai-reviewer"
bot_display_name = "AI Reviewer"
output_language = "zh-CN"
[aihost]
enabled = true
bind_addr = "0.0.0.0"
port = 3006
concurrency = 2
poll_interval_secs = 5
retry_backoff_base_secs = 2
[runner]
server_url = "http://127.0.0.1:3005"
registration_token = ""
name = ""
labels = ["self-hosted"]
capacity = 1
workspace_root = "/var/lib/gitdata-runner"
credential_path = "/var/lib/gitdata-runner/credential"
docker_enabled = false
default_shell = "sh"
pat = ""
git_binary = "git"
docker_binary = "docker"
clone_timeout_secs = 1800
default_job_timeout_secs = 3600
poll_timeout_secs = 30
heartbeat_interval_secs = 15
log_flush_interval_ms = 1000
log_flush_bytes = 65536
keep_workspace = false
once = false
[push]
enabled = false
vapid_public_key = ""
vapid_private_key = ""
vapid_subject = "mailto:ops@example.com"
workers = 2
max_attempts = 3
retry_backoff_base_secs = 30
request_timeout_secs = 10
ttl_secs = 86400
[mcp]
enabled = true
bind_addr = "0.0.0.0"
port = 3007
# URL the sandbox-agent runtime uses to reach this MCP endpoint. Empty keeps
# the agent chat "MCP" option unavailable. Dev sets it in config/local.toml;
# production must point it at the runtime-reachable address.
runtime_url = ""
# MCP endpoint Host header allowlist. Empty keeps the rmcp default (loopback only).
# Production must set e.g. ["mcp.gitdata.ai"].
allowed_hosts = []
# Only requests whose resolved client IP falls inside these CIDRs can use internal keys.
internal_cidrs = ["127.0.0.1/32", "::1/128"]
# Proxies whose X-Forwarded-For header is trusted (e.g. the ingress pod/node CIDR).
trusted_proxies = []
# Internal system keys ([[mcp.internal_keys]]). Set exactly one of token or token_hash
# (token_hash = sha256_hex(token), recommended). These act as the platform AI bot with
# full permissions and are accepted only from internal_cidrs.
# [[mcp.internal_keys]]
# name = "gitdata-agent"
# token_hash = ""
# enabled = true
[livekit]
enabled = false
url = "ws://127.0.0.1:7880"
api_url = "http://127.0.0.1:7880"
api_key = ""
api_secret = ""
token_ttl_secs = 7200
empty_timeout_secs = 300
departure_timeout_secs = 20
default_max_participants = 50
presence_ttl_secs = 43200
hand_ttl_secs = 3600
recording_enabled = false