Repository navigation
Expand file tree
/
Copy pathconfig.example.toml
More file actions
131 lines (121 loc) · 6.35 KB
/
Copy pathconfig.example.toml
File metadata and controls
131 lines (121 loc) · 6.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# ---------------------------------------------------------------------------
# Secret env-var overrides (RELENG-918)
# Each secret below can be supplied by EITHER this TOML file OR a dedicated
# environment variable — the two are interchangeable sources. The env var wins
# ONLY when it is set AND non-empty; otherwise the TOML value here is used. This
# lets prod inject per-secret values via env without changing local dev, and lets
# these keys be omitted entirely from TOML when supplied purely by env.
# Required secrets (django_secret_key, salt_key, postgres.password, slack
# bot/app tokens, and — when their section is present — pagerduty.api_token,
# statuspage.api_key, notion.integration_token) must resolve to a non-empty
# value from one of the two sources or config loading fails fast at boot.
# Overridable keys and their env vars:
# django_secret_key -> DJANGO_SECRET_KEY
# [postgres] password -> DJANGO_PG_PASS
# salt_key -> SALT_KEY
# (NOTE: SALT_KEY only overrides the singular salt_key. To rotate salt keys,
# use the salt_keys list in this config file, which takes precedence.)
# [slack] bot_token -> SLACK_BOT_TOKEN
# [slack] app_token -> SLACK_APP_TOKEN
# [linear] client_secret -> LINEAR_CLIENT_SECRET
# [pagerduty] api_token -> PAGERDUTY_API_TOKEN
# [pagerduty.escalation_policies.<NAME>] integration_key
# -> PAGERDUTY_ESCALATION_KEY_<NAME>
# [statuspage] api_key -> STATUSPAGE_API_KEY
# [notion] integration_token -> NOTION_INTEGRATION_TOKEN
# [genai] api_key -> OPENROUTER_API_KEY
# ---------------------------------------------------------------------------
project_key = "INC"
log_level = "INFO"
django_secret_key = "django-insecure-gmj)qc*_dk&^i1=z7oy(ew7%5*fz^yowp8=4=0882_d=i3hl69" # Overridable via DJANGO_SECRET_KEY env var (env wins if set & non-empty)
# Salt for django-fernet-encrypted-fields. In prod, use a unique value: python -c "import secrets; print(secrets.token_urlsafe(32))"
salt_key = "" # Overridable via SALT_KEY
# Optional: for key rotation, set salt_keys (plural) to a list of salts. When present it
# takes precedence over salt_key (and over any SALT_KEY env override), so rotate salt keys
# here in the config file rather than via the env var. Values are encrypted with the
# FIRST key and can be decrypted with any,
# so during rotation list the new key first and keep the old one until every row is
# re-encrypted (run the reencrypt_encrypted_fields migration), then drop the old key.
# salt_keys = ["<new-salt>", "<old-salt>"]
sentry_dsn = "https://your-sentry-dsn@o1.ingest.us.sentry.io/project-id"
firetower_base_url = "http://localhost:5173"
# Optional: link rendered in /inc mitigated and /inc resolved modals to help users pick service_tier/affected_service.
service_registry_url = "https://your-service-registry.example.com"
region_grouping = [["region-a", "region-b"], ["region-c", "region-d"]]
[postgres]
db = "firetower"
host = "localhost"
user = "postgres"
password = "dummy_dev_password" # Overridable via DJANGO_PG_PASS
# Optional: during a password rotation, list the other valid password(s) here.
# If `password` is rejected with an auth error, each of these is tried in order.
# Once the rotation is complete, move the new value into `password` and clear this.
# fallback_passwords = ["<other-password>"]
[slack]
bot_token = "" # Overridable via SLACK_BOT_TOKEN
team_id = "<slack-team-id>"
participant_sync_throttle_seconds = 300
app_token = "" # Overridable via SLACK_APP_TOKEN
incident_feed_channel_id = ""
always_invited_ids = []
incident_guide_message = "This is the message posted whenever a new incident slack channel is created."
slash_command = "/inc"
[auth]
iap_enabled = false
iap_audience = ""
[pagerduty]
api_token = "" # Overridable via PAGERDUTY_API_TOKEN
[pagerduty.escalation_policies.IMOC]
id = ""
integration_key = "" # Overridable via PAGERDUTY_ESCALATION_KEY_IMOC
[pagerduty.escalation_policies.PROD_ENG]
id = ""
integration_key = "" # Overridable via PAGERDUTY_ESCALATION_KEY_PROD_ENG
[linear]
client_id = ""
client_secret = "" # Overridable via LINEAR_CLIENT_SECRET
action_item_sync_throttle_seconds = 300
team_id = ""
project_id = ""
# When true, claim the Linear issue matching the incident number (e.g. INC-2160) instead of creating a new one.
sync_identifiers = false
# When true (and sync_identifiers is true), allocate incident ids by claiming or
# creating a matching INC-N placeholder in Linear at creation time, so the
# incident's numeric id and Linear parent are minted together. Requires
# sync_identifiers. Defaults to false (legacy: id from the local counter, Linear
# parent claimed/created afterwards by the hook).
adopt_on_create = false
# Tight timeout (seconds) and retry count for Linear calls on the incident
# allocation path, which runs while holding a DB lock. Kept lower than the
# default LinearService budget so a hung Linear can't hold the lock too long.
alloc_timeout_seconds = 8
alloc_max_retries = 1
# SLO deadlines (days from incident creation) for action items by priority tier.
# High priority covers Linear priorities 1 (Urgent) and 2 (High).
# Medium priority covers Linear priority 3 (Medium).
# Priority 4 (Low) and 0 (No priority) have no SLO.
action_item_slo_days_high_priority = 14
action_item_slo_days_medium_priority = 28
[notion]
integration_token = "" # Overridable via NOTION_INTEGRATION_TOKEN
database_id = ""
template_markdown = """
# Your postmortem template in Markdown here
"""
troubleshooting_database_id = ""
troubleshooting_template_markdown = """
# Your troubleshooting template in Markdown here
"""
[genai]
# OpenRouter API key (https://openrouter.ai). Leave blank or omit to disable AI timeline generation.
api_key = "" # Overridable via OPENROUTER_API_KEY
# OpenRouter model slug; routes to Google's Gemini 2.5 Flash.
model = "google/gemini-2.5-flash"
[statuspage]
api_key = "" # Overridable via STATUSPAGE_API_KEY
page_id = ""
url = "https://your-page.statuspage.io/"
warning_buffer_minutes = 5
# Set to enable statuspage reminders; omit to disable them
# initial_reminder_delay_minutes = 20
# followup_reminder_delay_minutes = 60