[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 [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 = [] [session] mode = "opt_in" cookie_name = "gitdata_session" cookie_domain = "" cookie_path = "/" cookie_http_only = true cookie_secure = false cookie_same_site = "lax" # Long enough to serve the 30-day "keep me signed in" window # (max_lifespan_secs); non-remember logins get a session cookie. cookie_max_age_secs = 2592000 cookie_prefix_host = false cookie_encode_ip_and_user_agent = false lifespan_secs = 604800 max_lifespan_secs = 2592000 memory_lifespan_secs = 1800 table_name = "session" key = "" database_key = "" always_save = false db_update_interval_secs = 60 purge_database_update_secs = 86400 enable_bloom_filter = true [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 = "" chat_jwt_sec = "" [[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_title_len = 255 max_body_len = 65535 max_comment_len = 65535 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 [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" [email_queue] enabled = false channel_prefix = "email" subscriber_group_id = "email-worker" max_retries = 3 retry_backoff_ms = 500 [apihost] enabled = true bind_addr = "0.0.0.0" port = 3000 admin_uids = [] [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.mails] port = 3003 [health.aihost] port = 3006 [admin] enabled = true bind_addr = "0.0.0.0" port = 3004 grpc_port = 3014 grpc_trusted_keys = [] cors_allow_origins = [] cors_allow_credentials = false [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 # 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