2
0

feat: Improve configuration to be less Docker-specific

This removes auto-binding of various values (specified in config.yaml) when they're not actually configured. It ensures that these values can then be configured from the web UI as Sentry has intended.
This commit is contained in:
David Cramer 2019-04-15 10:01:10 -07:00
parent d876a6c902
commit 41200b79a6

View File

@ -40,6 +40,7 @@ from sentry.conf.server import * # NOQA
import os import os
import os.path import os.path
import six
CONF_ROOT = os.path.dirname(__file__) CONF_ROOT = os.path.dirname(__file__)
@ -250,46 +251,54 @@ SENTRY_WEB_OPTIONS = {
# 'workers': 3, # the number of web workers # 'workers': 3, # the number of web workers
} }
###############
# Mail Server #
###############
email = env('SENTRY_EMAIL_HOST') or (env('SMTP_PORT_25_TCP_ADDR') and 'smtp') ##########
if email: # Docker #
SENTRY_OPTIONS['mail.backend'] = 'smtp' ##########
SENTRY_OPTIONS['mail.host'] = email
SENTRY_OPTIONS['mail.password'] = env('SENTRY_EMAIL_PASSWORD') or ''
SENTRY_OPTIONS['mail.username'] = env('SENTRY_EMAIL_USER') or ''
SENTRY_OPTIONS['mail.port'] = int(env('SENTRY_EMAIL_PORT') or 25)
SENTRY_OPTIONS['mail.use-tls'] = env('SENTRY_EMAIL_USE_TLS', False)
else:
SENTRY_OPTIONS['mail.backend'] = 'dummy'
# The email address to send on behalf of # Docker's environment configuration needs to happen
SENTRY_OPTIONS['mail.from'] = env('SENTRY_SERVER_EMAIL') or 'root@localhost' # prior to anything that might rely on these values to
# enable more "smart" configuration.
ENV_CONFIG_MAPPING = {
'SENTRY_EMAIL_PASSWORD': 'mail.password',
'SENTRY_EMAIL_USER': 'mail.username',
'SENTRY_EMAIL_PORT': ('mail.port', int),
'SENTRY_EMAIL_USE_TLS': ('mail.use-tls', bool),
'SENTRY_EMAIL_HOST': 'mail.host',
'SENTRY_SERVER_EMAIL': 'mail.from',
'SENTRY_ENABLE_EMAIL_REPLIES': 'mail.enable-replies',
'SENTRY_SMTP_HOSTNAME': 'mail.reply-hostname',
# If you're using mailgun for inbound mail, set your API key and configure a # If you're using mailgun for inbound mail, set your API key and configure a
# route to forward to /api/hooks/mailgun/inbound/ # route to forward to /api/hooks/mailgun/inbound/
SENTRY_OPTIONS['mail.mailgun-api-key'] = env('SENTRY_MAILGUN_API_KEY') or '' 'SENTRY_MAILGUN_API_KEY': 'mail.mailgun-api-key',
# If you specify a MAILGUN_API_KEY, you definitely want EMAIL_REPLIES 'SLACK_CLIENT_ID': 'slack.client-id',
if SENTRY_OPTIONS['mail.mailgun-api-key']: 'SLACK_CLIENT_SECRET': 'slack.client-secret',
SENTRY_OPTIONS['mail.enable-replies'] = True 'SLACK_VERIFICATION_TOKEN': 'slack.verification-token',
'SECRET_KEY': 'system.secret-key',
}
def bind_env_config(config=SENTRY_OPTIONS, mapping=ENV_CONFIG_MAPPING):
"""
Automatically bind SENTRY_OPTIONS from a set of environment variables.
"""
for env_var, item in six.iteritems(mapping):
value = env(env_var)
if value is None:
continue
if isinstance(item, tuple):
opt_key, type_ = item
# only coerce the value if its not falsey (e.g. '')
if value:
value = type_(value)
else: else:
SENTRY_OPTIONS['mail.enable-replies'] = env('SENTRY_ENABLE_EMAIL_REPLIES', False) opt_key = item
config[opt_key] = value
if SENTRY_OPTIONS['mail.enable-replies']:
SENTRY_OPTIONS['mail.reply-hostname'] = env('SENTRY_SMTP_HOSTNAME') or ''
#####################
# SLACK INTEGRATION #
#####################
slack = env('SLACK_CLIENT_ID') and env('SLACK_CLIENT_SECRET')
if slack:
SENTRY_OPTIONS['slack.client-id'] = env('SLACK_CLIENT_ID')
SENTRY_OPTIONS['slack.client-secret'] = env('SLACK_CLIENT_SECRET')
SENTRY_OPTIONS['slack.verification-token'] = env('SLACK_VERIFICATION_TOKEN') or ''
# If this value ever becomes compromised, it's important to regenerate your # If this value ever becomes compromised, it's important to regenerate your
# SENTRY_SECRET_KEY. Changing this value will result in all current sessions # SENTRY_SECRET_KEY. Changing this value will result in all current sessions
@ -306,7 +315,13 @@ if 'SENTRY_RUNNING_UWSGI' not in os.environ and len(secret_key) < 32:
print('!! Regenerate with `generate-secret-key`. !!') print('!! Regenerate with `generate-secret-key`. !!')
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
SENTRY_OPTIONS['system.secret-key'] = secret_key # Grab the easy configuration first - these are all fixed
# key=value with no logic behind them
bind_env_config()
# If you specify a MAILGUN_API_KEY, you definitely want EMAIL_REPLIES
if SENTRY_OPTIONS.get('mail.mailgun-api-key'):
SENTRY_OPTIONS.setdefault('mail.enable-replies', True)
if 'GITHUB_APP_ID' in os.environ: if 'GITHUB_APP_ID' in os.environ:
GITHUB_EXTENDED_PERMISSIONS = ['repo'] GITHUB_EXTENDED_PERMISSIONS = ['repo']