Container restart - discourse tries to reinstall

Are you using bitnami?

1 Like

How did you create the containers?

Yep, as the “official solution” is not really dockery and relies too much on custom scripts. I imagine then this gets no support lol…

The bitnami image isn’t supported. If you want to use it you will need to talk to them.

It’s also really out of date.

fair enough,… is there a docker-compose for the multi container solution?

Sorry Stephen, id love to use the official images instead;

Docker Hub Ill set about using this instead?

@Stephen is there a list of the environment variables somewhere?

I guess they are just the config file prefixed with DISCOURSE_

?

# Available options:
#
# default            - The default value of the setting. For upload site settings, use the id of the upload seeded in db/fixtures/010_uploads.rb.
# client             - Set to true if the javascript should have access to this setting's value.
# refresh            - Set to true if clients should refresh when the setting is changed.
# min                - For a string setting, the minimum length. For an integer setting, the minimum value.
# max                - For a string setting, the maximum length. For an integer setting, the maximum value.
# regex              - A regex that the value must match.
# validator          - The name of the class that will be use to validate the value of the setting.
# allow_any          - For choice settings allow items not specified in the choice list (default true)
# secret             - Set to true if input type should be password and value needs to be scrubbed from logs (default false).
# enum               - The setting has a fixed set of allowed values, and only one can be chosen.
#                      Set to the class name that defines the set.
# locale_default     - A hash which overrides according to `SiteSetting.default_locale`.
#                      The key should be as the same as possible value of default_locale.
#
#
# type: email    - Must be a valid email address.
# type: username - Must match the username of an existing user.
# type: list     - A list of values, chosen from a set of valid values defined in the choices option.
# type: enum     - A single value, chosen from a set of valid values in the choices option.
#
# A type:list setting with the word 'colors' in its name will make color values have a bold line of the corresponding color
#
required:
  title:
    client: true
    default: "Discourse"
  site_description:
    default: ""
  short_site_description:
    default: ""
    client: true
  contact_email:
    client: true
    default: ""
    type: email
  contact_url:
    client: true
    default: ""
  notification_email:
    default: "noreply@unconfigured.discourse.org"
    type: email
  site_contact_username:
    default: ""
    type: username
  site_contact_group_name:
    default: ""
    type: group
  exclude_rel_nofollow_domains:
    default: ""
    type: list
  company_name:
    default: ""
  governing_law:
    default: ""
  city_for_disputes:
    default: ""

branding:
  logo:
    default: -5
    client: true
    type: upload
  logo_small:
    default: -6
    client: true
    type: upload
  digest_logo:
    default: ""
    client: true
    type: upload
  mobile_logo:
    default: ""
    client: true
    type: upload
  large_icon:
    default: ""
    client: true
    type: upload
  manifest_icon:
    default: ""
    type: upload
  favicon:
    default: ""
    client: true
    type: upload
  apple_touch_icon:
    default: ""
    client: true
    type: upload
  opengraph_image:
    default: ""
    type: upload
  twitter_summary_large_image:
    default: ""
    type: upload

basic:
  display_local_time_in_user_card:
    client: true
    default: false
  allow_user_locale:
    client: true
    default: false
  set_locale_from_accept_language_header:
    default: false
    validator: "AllowUserLocaleEnabledValidator"
  support_mixed_text_direction:
    client: true
    default: false
  categories_topics:
    default: 20
    validator: "CategoriesTopicsValidator"
  suggested_topics:
    client: true
    default: 5
    max: 2000
  limit_suggested_to_category:
    default: false
  suggested_topics_unread_max_days_old:
    default: 90
    min: 0
    max: 36500
  suggested_topics_max_days_old:
    default: 365
    min: 7
    max: 36500
  ga_universal_tracking_code:
    client: true
    default: ""
    regex: "^UA-\\d+-\\d+$"
  ga_universal_domain_name:
    client: true
    default: "auto"
  ga_universal_auto_link_domains:
    default: ""
    type: list
  gtm_container_id:
    client: true
    default: ""
    regex: "^GTM-"
  top_menu:
    client: true
    refresh: true
    type: list
    list_type: compact
    default: "latest|new|unread|top|categories"
    regex: "latest"
    regex_error: "site_settings.errors.must_include_latest"
    validator: RegexPresenceValidator
    allow_any: false
    choices:
      - latest
      - new
      - unread
      - top
      - categories
      - read
      - posted
      - bookmarks
  post_menu:
    client: true
    type: list
    default: "read|like|share|flag|edit|bookmark|delete|admin|reply"
    allow_any: false
    choices:
      - read
      - like
      - edit
      - flag
      - delete
      - share
      - bookmark
      - admin
      - reply
  post_menu_hidden_items:
    client: true
    type: list
    default: "flag|bookmark|edit|delete|admin"
    allow_any: false
    choices:
      - like
      - edit
      - flag
      - delete
      - share
      - bookmark
      - admin
      - reply
  share_links:
    client: true
    type: list
    default: "twitter|facebook|email"
    allow_any: false
    choices:
      - twitter
      - facebook
      - email
  desktop_category_page_style:
    client: true
    enum: "CategoryPageStyle"
    default: "categories_and_latest_topics"
  category_colors:
    client: true
    type: list
    list_type: compact
    default: "BF1E2E|F1592A|F7941D|9EB83B|3AB54A|12A89D|25AAE2|0E76BD|652D90|92278F|ED207B|8C6238|231F20|808281|B3B5B4|E45735"
  category_style:
    client: true
    default: "bullet"
    type: enum
    choices:
      - bar
      - box
      - bullet
      - none
  max_category_nesting:
    client: true
    default: 2
    min: 2
    max: 3
    hidden: true
  enable_mobile_theme:
    client: true
    default: true
    hidden: true
  default_theme_id:
    default: -1
    hidden: true
  relative_date_duration:
    client: true
    default: 30
  topics_per_period_in_top_summary:
    default: 20
    min: 1
  topics_per_period_in_top_page:
    default: 50
    min: 1
  top_page_default_timeframe:
    default: "yearly"
    type: enum
    choices:
      - all
      - yearly
      - quarterly
      - monthly
      - weekly
      - daily
  fixed_category_positions:
    client: true
    default: false
  fixed_category_positions_on_create:
    client: true
    default: false
  enable_badges:
    client: true
    default: true
  enable_badge_sql:
    client: true
    default: false
    hidden: true
  enable_whispers:
    client: true
    default: false
  enable_bookmarks_with_reminders:
    client: true
    default: true
    hidden: true
  push_notifications_prompt:
    default: true
    client: true
  push_notifications_icon:
    default: ""
    type: upload
  short_title:
    default: ""
    max: 12
  vapid_public_key_bytes:
    default: ""
    client: true
    hidden: true
  vapid_public_key:
    default: ""
    hidden: true
  vapid_private_key:
    default: ""
    hidden: true
  vapid_base_url:
    default: ""
    hidden: true

login:
  invite_only:
    refresh: true
    client: true
    default: false
    validator: "EnableInviteOnlyValidator"
  login_required:
    refresh: true
    client: true
    default: false
  must_approve_users:
    client: true
    default: false
  invite_code: ""
  enable_local_logins:
    client: true
    default: true
  enable_local_logins_via_email:
    client: true
    default: true
    validator: "EnableLocalLoginsViaEmailValidator"
  allow_new_registrations:
    client: true
    default: true
  enable_signup_cta:
    client: true
    default: true
  enable_google_oauth2_logins:
    default: false
  google_oauth2_client_id: ""
  google_oauth2_client_secret:
    default: ""
    secret: true
  google_oauth2_prompt:
    default: ""
    type: list
    choices:
      - ""
      - "none"
      - "consent"
      - "select_account"
  google_oauth2_hd:
    default: ""
  enable_twitter_logins:
    default: false
  twitter_consumer_key:
    default: ""
    regex: "^[\\w+-]+$"
  twitter_consumer_secret:
    default: ""
    regex: "^[\\w+-]+$"
    secret: true
  enable_instagram_logins:
    default: false
  instagram_consumer_key:
    default: ""
    regex: "^[a-z0-9]+$"
  instagram_consumer_secret:
    default: ""
    regex: "^[a-z0-9]+$"
    secret: true
  enable_facebook_logins:
    default: false
  facebook_app_id:
    default: ""
    regex: "^\\d+$"
  facebook_app_secret:
    default: ""
    regex: "^[a-f0-9]+$"
    secret: true
  enable_github_logins:
    default: false
  github_client_id:
    default: ""
    regex: "^[a-zA-Z0-9\\.]+$"
  github_client_secret:
    default: ""
    regex: "^[a-f0-9]+$"
    secret: true
  enable_discord_logins:
    default: false
  discord_client_id:
    default: ""
  discord_secret:
    default: ""
    secret: true
  discord_trusted_guilds:
    default: ""
    type: list
  enable_sso:
    client: true
    default: false
    validator: "EnableSsoValidator"
  sso_allows_all_return_paths: false
  enable_sso_provider: false
  verbose_sso_logging: false
  verbose_auth_token_logging:
    hidden: true
    default: true
  max_suspicious_distance_km:
    hidden: true
    default: 500
  sso_url:
    default: ""
    regex: '^https?:\/\/.+[^\/]$'
  sso_secret:
    default: ""
    secret: true
  sso_provider_secrets:
    default: ""
    type: list
    list_type: secret
    secret: true
    placeholder:
      key: "sso_provider.key_placeholder"
      value: "sso_provider.value_placeholder"
  sso_overrides_groups: false
  sso_overrides_bio: false
  sso_overrides_email:
    default: false
    validator: "SsoOverridesEmailValidator"
    client: true
  sso_overrides_username: false
  sso_overrides_name: false
  sso_overrides_avatar:
    default: false
    client: true
  sso_overrides_profile_background: false
  sso_overrides_location: false
  sso_overrides_website: false
  sso_overrides_card_background: false
  sso_not_approved_url: ""
  email_domains_blacklist:
    default: "mailinator.com"
    type: list
  email_domains_whitelist:
    default: ""
    type: list
  auto_approve_email_domains:
    default: ""
    type: list
  hide_email_address_taken: false
  log_out_strict: true
  pending_users_reminder_delay:
    min: -1
    default: 8
  maximum_session_age:
    default: 1440
    min: 1
    max: 175200
users:
  min_username_length:
    client: true
    default: 3
    min: 1
    max: 60
    validator: "MinUsernameLengthValidator"
  max_username_length:
    client: true
    default: 20
    min: 8
    max: 60
    validator: "MaxUsernameLengthValidator"
  unicode_usernames:
    default: false
    client: true
    validator: "UnicodeUsernameValidator"
  unicode_username_character_whitelist:
    validator: "UnicodeUsernameWhitelistValidator"
    default: ""
    locale_default:
      cs: "[ěščřžýáíéóůúďťňĚŠČŘŽÝÁÍÉÓŮÚĎŤŇ]"
      de: "[äöüßÄÖÜẞ]"
      fi: "[åäöÅÄÖ]"
      ja: '[\p{Han}\p{Katakana}\p{Hiragana}]'
      ko: '\p{Hangul}'
      zh_CN: '\p{Han}'
      zh_TW: '\p{Han}'
  reserved_usernames:
    type: list
    list_type: compact
    default: "admin|moderator|administrator|mod|sys|system|community|info|you|name|username|user|nickname|discourse|discourseorg|discourseforum|support|hp"
  min_password_length:
    client: true
    default: 10
    min: 8
    max: 500
  min_admin_password_length:
    client: true
    default: 15
    min: 8
    max: 500
  password_unique_characters:
    default: 6
    min: 1
    max: 10
  block_common_passwords: true
  username_change_period: 3
  email_editable: true
  logout_redirect:
    client: true
    default: ""
  full_name_required:
    client: true
    default: false
  enable_names:
    client: true
    default: true
  invite_expiry_days:
    default: 30
    max: 36500
  invites_per_page:
    client: true
    default: 40
    hidden: true
  delete_user_max_post_age:
    client: true
    default: 60
  delete_all_posts_max:
    client: true
    default: 15
    min: 1
  delete_user_self_max_post_count:
    default: 1
    min: -1
  redirect_users_to_top_page: true
  prioritize_username_in_ux:
    client: true
    default: true
  email_token_valid_hours:
    default: 48
    min: 1
  purge_unactivated_users_grace_period_days:
    default: 14
    max: 36500
  public_user_custom_fields:
    type: list
    default: ""
  staff_user_custom_fields:
    type: list
    default: ""
  enable_user_directory:
    client: true
    default: true
  allow_anonymous_posting:
    default: false
    client: true
  anonymous_posting_min_trust_level:
    default: 1
    enum: "TrustLevelSetting"
    client: true
  anonymous_account_duration_minutes:
    default: 10080
    max: 99000
  hide_user_profiles_from_public:
    default: false
    client: true
  allow_featured_topic_on_user_profiles:
    default: true
    client: true
  show_inactive_accounts:
    default: false
  user_website_domains_whitelist:
    default: ""
    type: list
  hide_suspension_reasons:
    default: false
    client: true
  log_personal_messages_views: false
  ignored_users_count_message_threshold:
    default: 5
    client: true
    min: 1
  ignored_users_message_gap_days:
    default: 365
    client: true
    min: 1
    max: 36500
  clean_up_inactive_users_after_days:
    default: 730
    min: 0
    max: 36500
  clean_up_unused_staged_users_after_days:
    default: 365
    min: 0
    max: 36500
  user_selected_primary_groups:
    default: false
    client: true
  max_notifications_per_user:
    default: 10000
  gravatar_name:
    default: Gravatar
    client: true
  gravatar_base_url:
    default: www.gravatar.com
    client: true
  gravatar_login_url:
    default: /emails
    client: true

groups:
  enable_group_directory:
    client: true
    default: true
  group_in_subject:
    default: false
  enable_category_group_review:
    client: true
    default: false

posting:
  min_post_length:
    client: true
    min: 1
    default: 20
    locale_default:
      ja: 8
      zh_CN: 8
      zh_TW: 8
  min_first_post_length:
    client: true
    min: 1
    default: 20
    locale_default:
      ja: 8
      zh_CN: 8
      zh_TW: 8
  min_personal_message_post_length:
    client: true
    min: 1
    default: 10
    locale_default:
      ja: 3
      zh_CN: 3
      zh_TW: 3
  max_post_length:
    client: true
    default: 32000
    max: 150000
  topic_featured_link_enabled:
    client: true
    default: true
  body_min_entropy:
    default: 7
    locale_default:
      ja: 3
      zh_CN: 3
      zh_TW: 3
  min_topic_title_length:
    client: true
    default: 15
    min: 1
    locale_default:
      ja: 6
      zh_CN: 6
      zh_TW: 6
  max_topic_title_length:
    client: true
    default: 255
    min: 5
    max: 255
  title_min_entropy:
    default: 10
    locale_default:
      ja: 3
      zh_CN: 3
      zh_TW: 3
  allow_uppercase_posts:
    default: false
    locale_default:
      ja: true
  max_consecutive_replies:
    default: 3
  title_prettify:
    default: true
    locale_default:
      ja: false
      zh_CN: false
      zh_TW: false
  title_remove_extraneous_space:
    default: false
    locale_default:
      en: true
      en_US: true
  title_fancy_entities: true
  min_personal_message_title_length:
    client: true
    default: 2
    min: 1
  max_emojis_in_title: 1
  allow_uncategorized_topics:
    client: true
    default: true
    refresh: true
  allow_duplicate_topic_titles: false
  allow_duplicate_topic_titles_category: false
  min_title_similar_length:
    client: true
    default: 10
    locale_default:
      ja: 4
      zh_CN: 4
      zh_TW: 4
  enable_personal_messages:
    default: true
    client: true
  enable_system_message_replies:
    default: true
  enable_personal_email_messages:
    hidden: true
    default: false
    client: true
    validator: "EnablePrivateEmailMessagesValidator"
  editing_grace_period: 300
  editing_grace_period_max_diff: 100
  editing_grace_period_max_diff_high_trust: 400
  staff_edit_locks_post: false
  shared_drafts_category:
    type: category
    default: ""
  post_edit_time_limit:
    default: 1440
    max: 10080
  tl2_post_edit_time_limit:
    default: 43200
    max: 525600
  edit_history_visible_to_public:
    client: true
    default: true
  delete_removed_posts_after:
    client: true
    default: 24
  traditional_markdown_linebreaks:
    client: true
    default: false
  enable_markdown_typographer:
    client: true
    default: true
  enable_markdown_linkify:
    client: true
    default: true
  markdown_linkify_tlds:
    client: true
    type: list
    default: "com|net|org|io|co|tv|ru|cn|us|uk|me|de|fr|fi|gov"
    list_type: compact
  markdown_typographer_quotation_marks:
    client: true
    type: list
    list_type: compact
    validator: "MarkdownTypographerQuotationMarksValidator"
    default: "“|”|‘|’"
    locale_default:
      de: "„|“|‚|‘"
      fr: "«\xA0|\xA0»|‹\xA0|\xA0›"
  enable_rich_text_paste:
    client: true
    default: true
  suppress_reply_directly_below:
    client: true
    default: true
  suppress_reply_directly_above:
    client: true
    default: true
  suppress_reply_when_quoting:
    default: true
  remove_full_quote:
    default: true
  max_reply_history:
    default: 1
    client: true
  post_undo_action_window_mins: 10
  enable_mentions:
    default: true
    client: true
  max_mentions_per_post: 10
  max_users_notified_per_group_mention: 100
  newuser_max_replies_per_topic: 3
  newuser_max_mentions_per_post: 2
  title_max_word_length:
    default: 30
    locale_default:
      ja: 50
      ko: 50
      zh_CN: 50
      zh_TW: 50
  whitelisted_link_domains:
    default: ""
    type: list
  newuser_max_links: 2
  newuser_max_images:
    client: true
    default: 1
  newuser_max_attachments:
    client: true
    default: 0
  post_excerpt_maxlength:
    default: 300
    locale_default:
      ja: 120
      zh_CN: 120
      zh_TW: 120
  topic_excerpt_maxlength:
    default: 220
    locale_default:
      ja: 120
      zh_CN: 120
      zh_TW: 120
  show_pinned_excerpt_mobile:
    client: true
    default: true
  show_pinned_excerpt_desktop:
    client: true
    default: true
  display_name_on_posts:
    client: true
    default: false
  show_time_gap_days:
    default: 7
    max: 36500
    client: true
  short_progress_text_threshold:
    client: true
    default: 10000
    max: 99000
  default_code_lang:
    client: true
    default: "auto"
  warn_reviving_old_topic_age: 180
  autohighlight_all_code:
    client: true
    default: false
  highlighted_languages:
    default: "apache|bash|cs|cpp|css|coffeescript|diff|xml|http|ini|json|java|javascript|makefile|markdown|nginx|objectivec|ruby|perl|php|python|sql|handlebars"
    choices: "HighlightJs.languages"
    type: list
    client: true
    list_type: compact
  show_copy_button_on_codeblocks:
    client: true
    default: false
  delete_old_hidden_posts: true
  enable_emoji:
    default: true
    client: true
  enable_emoji_shortcuts:
    default: true
    client: true
  emoji_set:
    default: "twitter"
    client: true
    enum: "EmojiSetSiteSetting"
  emoji_autocomplete_min_chars:
    client: true
    default: 0
    locale_default:
      fr: 1
  enable_inline_emoji_translation:
    client: true
    default: false
    locale_default:
      zh_CN: true
      zh_TW: true
      ja: true
      ko: true
  approve_post_count:
    default: 0
  approve_unless_trust_level:
    default: 0
    enum: "TrustLevelSetting"
  approve_new_topics_unless_trust_level:
    default: 0
    enum: "TrustLevelSetting"
  approve_suspect_users:
    default: true
  approve_unless_staged:
    default: false
  notify_about_queued_posts_after:
    default: 24
  auto_close_messages_post_count:
    default: 500
  auto_close_topics_post_count:
    default: 10000
  code_formatting_style:
    client: true
    type: enum
    default: "4-spaces-indent"
    choices:
      - 4-spaces-indent
      - code-fences
  embed_any_origin: false
  embed_topics_list: false
  embed_set_canonical_url: false
  embed_unlisted: false
  embed_truncate: true
  embed_support_markdown: false
  embed_whitelist_selector: ""
  allowed_href_schemes:
    client: true
    default: ""
    type: list
    list_type: compact
  max_allowed_message_recipients:
    default: 30
    min: 1
  watched_words_regular_expressions:
    client: true
    default: false
  enable_advanced_editor_preview_sync:
    hidden: true
    default: false
    client: true
  old_post_notice_days:
    default: 14
    max: 36500
    client: true
  new_user_notice_tl:
    default: 2
    enum: "TrustLevelSetting"
  returning_user_notice_tl:
    default: 2
    enum: "TrustLevelSetting"
  returning_users_days:
    default: 120
    max: 36500
  enable_page_publishing:
    default: false
  show_published_pages_login_required:
    default: false

email:
  email_time_window_mins:
    default: 10
    client: true
  personal_email_time_window_seconds: 20
  email_posts_context: 5
  digest_min_excerpt_length:
    default: 100
    locale_default:
      ja: 50
      zh_CN: 50
      zh_TW: 50
  digest_topics:
    default: 5
    min: 1
    max: 20
  digest_posts:
    default: 5
    min: 0
    max: 20
  digest_other_topics:
    default: 5
    min: 0
    max: 20
  suppress_digest_email_after_days:
    default: 365
    max: 36500
  digest_suppress_categories:
    type: category_list
    default: ""
  disable_digest_emails:
    default: false
    client: true
  apply_custom_styles_to_digest: true
  email_accent_bg_color:
    type: color
    default: "#2F70AC"
  email_accent_fg_color: "#FFFFFF"
  email_link_color: "#006699"
  show_topic_featured_link_in_digest: false
  email_custom_headers: "Auto-Submitted: auto-generated"
  email_subject: "[%{site_name}] %{optional_pm}%{optional_cat}%{topic_title}"
  reply_by_email_enabled:
    default: false
    validator: "ReplyByEmailEnabledValidator"
  reply_by_email_address:
    default: ""
    validator: "ReplyByEmailAddressValidator"
  alternative_reply_by_email_addresses:
    default: ""
    validator: "AlternativeReplyByEmailAddressesValidator"
  find_related_post_with_key:
    default: true
  manual_polling_enabled:
    default: false
  pop3_polling_enabled:
    default: false
    validator: "POP3PollingEnabledSettingValidator"
  pop3_polling_ssl: true
  pop3_polling_openssl_verify: true
  pop3_polling_period_mins: 5
  pop3_polling_host: ""
  pop3_polling_port: 995
  pop3_polling_username: ""
  pop3_polling_password:
    default: ""
    secret: true
  pop3_polling_delete_from_server: true
  log_mail_processing_failures: false
  incoming_email_prefer_html: true
  strip_incoming_email_lines: false
  email_in:
    default: false
    client: true
  email_in_min_trust:
    default: 2
    enum: "TrustLevelSetting"
  email_in_authserv_id:
    default: ""
  email_in_spam_header:
    type: enum
    default: "none"
    choices:
      - none
      - X-Spam-Flag
      - X-Spam-Status
      - X-SES-Spam-Verdict
  email_prefix: ""
  email_site_title: ""
  disable_emails:
    client: true
    type: enum
    default: "no"
    choices:
      - "no"
      - "yes"
      - "non-staff"
  strip_images_from_short_emails: true
  short_email_length: 2800
  display_name_on_email_from:
    default: true
  unsubscribe_via_email:
    default: true
  unsubscribe_via_email_footer:
    default: false
  disallow_reply_by_email_after_days:
    default: 90
    max: 36500
  delete_email_logs_after_days:
    default: 90
    max: 36500
  max_emails_per_day_per_user: 100
  enable_staged_users: true
  maximum_staged_users_per_email: 10
  auto_generated_whitelist:
    default: ""
    type: list
  block_auto_generated_emails: true
  ignore_by_title:
    type: list
    default: ""
  mailgun_api_key:
    default: ""
    regex: '^((key-)?\h{32}|\h{32}-\h{8}-\h{8})$'
    secret: true
  bounce_score_threshold:
    client: true
    default: 4
    min: 1
  bounce_score_erode_on_send:
    default: 0.1
    hidden: true
  soft_bounce_score:
    default: 1
    min: 1
  hard_bounce_score:
    default: 2
    min: 2
  reset_bounce_score_after_days:
    default: 30
    max: 36500
  attachment_content_type_blacklist:
    type: list
    default: "pkcs7|x-vcard"
    list_type: compact
  attachment_filename_blacklist:
    type: list
    default: "smime.p7s|signature.asc|winmail.dat"
    list_type: compact
  forwarded_emails_behaviour:
    type: enum
    default: hide
    choices:
      - hide
      - quote
      - create_replies
  always_show_trimmed_content: false
  private_email: false
  email_custom_template:
    default: ""
    hidden: true
  email_custom_css:
    default: ""
    hidden: true
  email_custom_css_compiled:
    default: ""
    hidden: true
  email_total_attachment_size_limit_kb:
    default: 0
    max: 51200
  post_excerpts_in_emails: false
  raw_email_max_length: 220000
  raw_rejected_email_max_length: 4000
  delete_rejected_email_after_days:
    default: 90
    max: 36500
  enable_secondary_emails:
    client: true
    default: true
    hidden: true

files:
  max_image_size_kb:
    client: true
    default: 4096
    max: 102400
  max_attachment_size_kb:
    client: true
    default: 4096
    max: 1024000
  max_image_megapixels:
    default: 40
    min: 5
    max: 150
  max_export_file_size_kb:
    hidden: true
    default: 50000
    max: 1024000
  theme_authorized_extensions:
    default: "jpg|jpeg|png|woff|woff2|svg|eot|ttf|otf|gif|js"
    type: list
    list_type: compact
  authorized_extensions:
    client: true
    default: "jpg|jpeg|png|gif"
    refresh: true
    type: list
    list_type: compact
  authorized_extensions_for_staff:
    client: true
    default: ""
    refresh: true
    type: list
    list_type: compact
  export_authorized_extensions:
    hidden: true
    default: "zip"
    type: list
    list_type: compact
  responsive_post_image_sizes:
    default: "1|1.5|2"
    type: list
    list_type: compact
  crawl_images:
    default: true
  max_image_width:
    client: true
    default: 690
  max_image_height:
    client: true
    default: 500
  download_remote_images_to_local:
    default: true
  download_remote_images_threshold: 10
  disabled_image_download_domains:
    type: list
    default: ""
  create_thumbnails: true
  clean_up_uploads: true
  clean_orphan_uploads_grace_period_hours: 48
  purge_deleted_uploads_grace_period_days:
    default: 30
    max: 36500
  prevent_anons_from_downloading_files:
    default: false
    client: true
  secure_media:
    default: false
    client: true
  enable_s3_uploads:
    default: false
    client: true
  s3_use_iam_profile:
    default: false
  s3_access_key_id:
    default: ""
    secret: true
  s3_secret_access_key:
    default: ""
    secret: true
  s3_region:
    default: "us-east-1"
    enum: "S3RegionSiteSetting"
  s3_upload_bucket:
    default: ""
    regex: '^[a-z0-9\-\/_]+$' # can't use '.' when using HTTPS
  s3_endpoint:
    default: ""
    regex: '^https?:\/\/.+[^\/]$'
  s3_http_continue_timeout:
    default: 1
    hidden: true
  s3_install_cors_rule:
    default: true
    hidden: true
  s3_cdn_url:
    default: ""
    regex: '^https?:\/\/.+[^\/]$'
  s3_configure_tombstone_policy:
    default: true
  enable_s3_inventory:
    default: false
  s3_configure_inventory_policy:
    default: true
    hidden: true
  allow_profile_backgrounds:
    client: true
    default: true
  automatically_download_gravatars: true
  allow_uploaded_avatars:
    client: true
    default: true
  allow_animated_avatars:
    client: true
    default: false
  allow_animated_thumbnails: true
  default_avatars:
    default: ""
    type: url_list
    client: true
  avatar_sizes:
    default: "20|25|32|45|60|120"
    type: list
    list_type: compact
  external_system_avatars_enabled:
    default: true
    client: true
    validator: "ExternalSystemAvatarsValidator"
  external_system_avatars_url:
    default: "/letter_avatar_proxy/v4/letter/{first_letter}/{color}/{size}.png"
    client: true
    regex: '^((https?:)?\/)?\/.+[^\/]'
  restrict_letter_avatar_colors:
    default: ""
    type: list
    list_type: compact
    validator: "ColorListValidator"
  selectable_avatars_enabled:
    default: false
    client: true
    validator: "SelectableAvatarsEnabledValidator"
  selectable_avatars:
    default: ""
    type: uploaded_image_list
  allow_all_attachments_for_group_messages: false
  png_to_jpg_quality:
    default: 95
    min: 1
    max: 100
  allow_staff_to_upload_any_file_in_pm:
    default: true
    client: true
  strip_image_metadata: true
  min_ratio_to_crop:
    type: float
    default: 0.45 # 90% of 18:9
    min: 0
    max: 1
  simultaneous_uploads:
    client: true
    default: 5
    min: 0
    max: 20
  decompressed_theme_max_file_size_mb:
    default: 1000
    hidden: true
  decompressed_backup_max_file_size_mb:
    default: 100000
    hidden: true

trust:
  default_trust_level:
    default: 0
    enum: "TrustLevelSetting"
  default_invitee_trust_level:
    default: 1
    enum: "TrustLevelSetting"
  min_trust_to_create_topic:
    default: 0
    enum: "TrustLevelSetting"
  min_trust_to_edit_wiki_post:
    default: 1
    enum: "TrustLevelSetting"
  min_trust_to_edit_post:
    default: 0
    enum: "TrustLevelSetting"
  min_trust_to_allow_self_wiki:
    default: 3
    enum: "TrustLevelSetting"
  min_trust_to_send_messages:
    default: 1
    enum: "TrustLevelSetting"
  min_trust_to_send_email_messages:
    hidden: true
    default: 4
    enum: "TrustLevelSetting"
  min_trust_to_flag_posts:
    default: 1
    enum: "TrustLevelSetting"
  min_trust_to_post_links:
    default: 0
    enum: "TrustLevelSetting"
  min_trust_to_post_images:
    default: 0
    enum: "TrustLevelSetting"
  allow_flagging_staff: true
  send_tl1_welcome_message: true
  tl1_requires_topics_entered: 5
  tl1_requires_read_posts:
    default: 30
    client: true
  tl1_requires_time_spent_mins: 10
  tl2_requires_topics_entered: 20
  tl2_requires_read_posts: 100
  tl2_requires_time_spent_mins: 60
  tl2_requires_days_visited:
    default: 15
    max: 36500
  tl2_requires_likes_received: 1
  tl2_requires_likes_given: 1
  tl2_requires_topic_reply_count: 3
  tl3_time_period:
    default: 100
    min: 1
    max: 1000000
  tl3_requires_days_visited:
    default: 50
    max: 36500
  tl3_requires_topics_replied_to:
    default: 10
  tl3_requires_topics_viewed:
    default: 25
    max: 100
  tl3_requires_topics_viewed_cap:
    default: 500
  tl3_requires_posts_read:
    default: 25
    max: 100
  tl3_requires_posts_read_cap:
    default: 20000
    max: 99000
  tl3_requires_topics_viewed_all_time:
    default: 200
  tl3_requires_posts_read_all_time:
    default: 500
  tl3_requires_max_flagged:
    default: 5
  tl3_promotion_min_duration:
    default: 14
    max: 10000
  tl3_requires_likes_given:
    default: 30
  tl3_requires_likes_received:
    default: 20
  tl3_links_no_follow:
    default: false
    client: true
  trusted_users_can_edit_others:
    default: true

security:
  detailed_404: false
  enforce_second_factor:
    client: true
    type: enum
    default: "no"
    choices:
      - "no"
      - "staff"
      - "all"
  force_https:
    default: {{ config | traverse("force_https", False) }}
  same_site_cookies:
    default: Lax
    type: enum
    choices:
      - Lax
      - Strict
      - Disabled
      - None
    regex: "^(Lax|Strict|Disabled|None)$"
  enable_escaped_fragments: true
  allow_index_in_robots_txt: true
  moderators_create_categories: false
  moderators_view_emails:
    client: true
    default: false
  non_crawler_user_agents:
    hidden: true
    default: "trident|webkit|gecko|chrome|safari|msie|opera|goanna|discourse"
    type: list
    list_type: compact
  crawler_user_agents:
    hidden: true
    default: "rss|bot|spider|crawler|facebook|archive|wayback|ping|monitor|lighthouse"
    type: list
    list_type: compact
  crawler_check_bypass_agents:
    hidden: true
    default: "cubot"
  cors_origins:
    default: ""
    type: list
  use_admin_ip_whitelist:
    default: false
    client: true
  blacklist_ip_blocks:
    default: ""
    type: list
    list_type: compact
  whitelist_internal_hosts:
    default: ""
    type: list
  allowed_iframes:
    default: "https://www.google.com/maps/embed?|https://www.openstreetmap.org/export/embed.html?|https://calendar.google.com/calendar/embed?|https://codepen.io/"
    type: list
    client: true
  whitelisted_crawler_user_agents:
    type: list
    default: ""
    list_type: compact
  blacklisted_crawler_user_agents:
    type: list
    default: "mauibot|semrushbot|ahrefsbot|blexbot|seo spider"
    list_type: compact
  slow_down_crawler_user_agents:
    type: list
    default: "bingbot"
    list_type: compact
  slow_down_crawler_rate: 60
  content_security_policy:
    default: true
  content_security_policy_report_only:
    default: false
  content_security_policy_collect_reports:
    default: false
  content_security_policy_script_src:
    type: simple_list
    default: ""
  invalidate_inactive_admin_email_after_days:
    default: 365
    min: 0
    max: 36500
  allow_embedding_site_in_an_iframe:
    default: false
    hidden: true
  send_old_credential_reminder_days:
    default: 0
    hidden: true

onebox:
  enable_flash_video_onebox: false
  post_onebox_maxlength:
    default: 500
    locale_default:
      ja: 200
      zh_CN: 200
      zh_TW: 200
  onebox_domains_blacklist:
    default: ""
    type: list
    list_type: compact
  max_oneboxes_per_post:
    default: 50
    client: true
  inline_onebox_domains_whitelist:
    default: ""
    type: list
    list_type: compact
  enable_inline_onebox_on_all_domains:
    default: false
  force_custom_user_agent_hosts:
    default: "http://codepen.io"
    type: list
spam:
  add_rel_nofollow_to_user_content: true
  hide_post_sensitivity:
    type: enum
    enum: "ReviewableSensitivitySetting"
    default: 6
  cooldown_minutes_after_hiding_posts: 10
  silence_new_user_sensitivity:
    type: enum
    enum: "ReviewableSensitivitySetting"
    default: 3
  num_users_to_silence_new_user: 3
  notify_mods_when_user_silenced: false
  flag_sockpuppets: false
  newuser_spam_host_threshold: 3
  white_listed_spam_host_domains:
    default: ""
    type: list
  levenshtein_distance_spammer_emails:
    default: 2
    max: 3
  max_new_accounts_per_registration_ip: 3
  min_ban_entries_for_roll_up: 5
  max_age_unmatched_emails: 365
  max_age_unmatched_ips: 365
  num_flaggers_to_close_topic: 5
  auto_close_topic_sensitivity:
    type: enum
    enum: "ReviewableSensitivitySetting"
    default: 9
  num_hours_to_close_topic:
    default: 4
    min: 1
  auto_respond_to_flag_actions: true
  min_first_post_typing_time: 3000
  auto_silence_fast_typers_on_first_post: true
  auto_silence_fast_typers_max_trust_level: 0
  auto_silence_first_post_regex: ""
  high_trust_flaggers_auto_hide_posts: true
  cooldown_hours_until_reflag:
    default: 24
    min: 0

  reviewable_claiming:
    client: true
    type: enum
    default: disabled
    choices:
      - disabled
      - optional
      - required

  reviewable_default_topics:
    default: false
    client: true
  reviewable_default_visibility:
    client: true
    type: enum
    default: low
    enum: "ReviewablePrioritySetting"

rate_limits:
  unique_posts_mins: 5
  rate_limit_create_topic: 15
  rate_limit_create_post: 5
  rate_limit_new_user_create_topic: 120
  rate_limit_new_user_create_post: 30
  rate_limit_search_anon:
    hidden: true
    default: 15
  rate_limit_search_user:
    hidden: true
    default: 30
  max_topics_per_day: 20
  max_personal_messages_per_day: 20
  max_likes_per_day: 50
  max_bookmarks_per_day: 20
  max_flags_per_day: 20
  max_edits_per_day: 30
  max_invites_per_day: 10
  max_topic_invitations_per_day: 30
  max_topics_in_first_day: 3
  max_replies_in_first_day: 10
  tl2_additional_likes_per_day_multiplier: 1.5
  tl3_additional_likes_per_day_multiplier: 2
  tl4_additional_likes_per_day_multiplier: 3
  alert_admins_if_errors_per_minute:
    client: true
    default: 0
  alert_admins_if_errors_per_hour:
    client: true
    default: 0
  max_prints_per_hour_per_user:
    default: 5
    client: true
  max_logins_per_ip_per_hour:
    min: 1
    default: 30
  max_logins_per_ip_per_minute:
    min: 1
    default: 6
  max_post_deletions_per_minute:
    min: 1
    default: 2
  max_post_deletions_per_day:
    min: 1
    default: 10
  invite_link_max_redemptions_limit:
    min: 2
    max: 1000000
    default: 5000
    client: true

developer:
  force_hostname:
    hidden: true
    default: ""
  port:
    hidden: true
    default: ""
  enable_long_polling:
    client: true
    default: true
  long_polling_interval:
    default: 25000
    max: 25000
  long_polling_base_url:
    client: true
    default: "/"
  background_polling_interval:
    client: true
    default: 60000
    max: 99000
  polling_interval:
    client: true
    default: 3000
    max: 99000
  anon_polling_interval:
    client: true
    default: 30000
    max: 99000
  flush_timings_secs:
    client: true
    default: 60
  active_user_rate_limit_secs: 60
  verbose_localization:
    default: false
    client: true
  top_topics_formula_log_views_multiplier:
    default: 2
  top_topics_formula_first_post_likes_multiplier:
    default: 0.5
  top_topics_formula_least_likes_per_post_multiplier:
    default: 3
  rebake_old_posts_count:
    default: 80
    min: 1
  migrate_to_new_scheme:
    hidden: true
    default: false
  max_new_topics:
    default: 500
    client: true
    hidden: true
  wizard_enabled:
    default: true
    hidden: true
  bypass_wizard_check:
    default: false
    hidden: true
  logging_provider:
    hidden: true
    default: "default"
    type: "list"
    choices:
      - "default"
      - "lograge"
  bootstrap_error_pages:
    hidden: true
    default: false
  enable_safe_mode:
    default: true
    client: true

embedding:
  embed_by_username:
    default: ""
    type: username
    hidden: true
  embed_post_limit:
    default: 100
    hidden: true
  embed_title_scrubber:
    default: ""
    hidden: true
  embed_blacklist_selector:
    default: ""
    hidden: true
  embed_classname_whitelist:
    default: "emoji"
    hidden: true

legal:
  tos_url:
    client: true
    default: ""
  privacy_policy_url:
    client: true
    default: ""
  faq_url:
    client: true
    default: ""
  log_anonymizer_details:
    default: true

backups:
  enable_backups:
    default: true
    client: true
  allow_restore:
    default: false
  backup_location:
    default: "local"
    type: enum
    enum: "BackupLocationSiteSetting"
    client: true
  maximum_backups:
    client: true
    default: 5
  automatic_backups_enabled:
    default: true
  backup_frequency:
    min: 1
    max: 30
    default: 7
  s3_backup_bucket:
    default: ""
    regex: '^[a-z0-9\-\/]+$' # can't use '.' when using HTTPS
  s3_disable_cleanup:
    default: false
  backup_time_of_day:
    default: "3:30"
    regex: "^((0?(0|1|2|3|4|5|6|7|8|9)|(10|11|12|13|14|15|16|17|18|19|20|21|22|23))):\\d\\d$"
  backup_with_uploads: true
  backup_gzip_compression_level_for_uploads:
    default: 1
    min: 1
    max: 9
  include_thumbnails_in_backups:
    default: false
  include_s3_uploads_in_backups:
    default: false
    hidden: true

search:
  min_search_term_length:
    client: true
    default: 3
    locale_default:
      zh_CN: 2
      zh_TW: 2
      ko: 2
      ja: 2
  search_tokenize_chinese_japanese_korean: false
  search_prefer_recent_posts: false
  search_recent_posts_size:
    default: 100000
    max: 100000
  log_search_queries:
    client: true
    default: true
  search_query_log_max_size:
    default: 1000000
    max: 1000000
  search_query_log_max_retention_days:
    default: 365 # 1 year
    max: 1825 # 5 years
  search_ignore_accents:
    default: false
    locale_default:
      ar: true
      ca: true
      cs: true
      el: true
      es: true
      fa_IR: true
      fr: true
      hu: true
      pt: true
      pt_BR: true
      ro: true
      sk: true
      tr_TR: true
  category_search_priority_very_low_weight:
    default: 0.6
    hidden: true
    validator: "CategorySearchPriorityWeightsValidator"
  category_search_priority_low_weight:
    default: 0.8
    hidden: true
    validator: "CategorySearchPriorityWeightsValidator"
  category_search_priority_high_weight:
    default: 1.2
    hidden: true
    validator: "CategorySearchPriorityWeightsValidator"
  category_search_priority_very_high_weight:
    default: 1.4
    hidden: true
    validator: "CategorySearchPriorityWeightsValidator"

uncategorized:
  version_checks:
    client: true
    default: true
  new_version_emails: true
  send_welcome_message: true

  suppress_uncategorized_badge:
    client: true
    default: true

  header_dropdown_category_count:
    client: true
    default: 8

  slug_generation_method:
    default: "ascii"
    enum: "SlugSetting"
    client: true
    locale_default:
      ja: "none"
      zh_CN: "none"
      zh_TW: "none"

  permalink_normalizations:
    default: ""
    type: list

  max_similar_results: 5
  minimum_topics_similar: 50

  previous_visit_timeout_hours: 1
  staff_like_weight: 3
  topic_view_duration_hours: 8
  user_profile_view_duration_hours: 8

  # Summary mode
  summary_score_threshold: 15
  summary_posts_required: 50
  summary_likes_required: 1
  summary_percent_filter: 20
  summary_max_results: 100

  automatic_topic_heat_values: true

  # View heat thresholds
  topic_views_heat_low:
    client: true
    default: 1000
  topic_views_heat_medium:
    client: true
    default: 2000
  topic_views_heat_high:
    client: true
    default: 3500

  # Post/Like heat thresholds
  topic_post_like_heat_low:
    client: true
    default: 0.5
  topic_post_like_heat_medium:
    client: true
    default: 1.0
  topic_post_like_heat_high:
    client: true
    default: 2.0

  # History edit heat thresholds
  history_hours_low:
    client: true
    default: 12
  history_hours_medium:
    client: true
    default: 24
  history_hours_high:
    client: true
    default: 48

  # Cold map thresholds
  cold_age_days_low:
    default: 14
    max: 36500
    client: true
  cold_age_days_medium:
    default: 90
    max: 36500
    client: true
  cold_age_days_high:
    default: 180
    max: 36500
    client: true

  # Warnings
  educate_until_posts: 2
  sequential_replies_threshold: 2
  get_a_room_threshold: 3
  dominating_topic_minimum_percent: 20
  disable_avatar_education_message: false

  global_notice:
    default: ""
    client: true
  has_login_hint:
    default: false
    hidden: true

  # Nothing past this threshold is ever considered new
  # this is calculated dynamically every 15 minutes
  min_new_topics_time:
    default: 0
    hidden: true

  # Category IDs
  lounge_category_id:
    default: -1
    hidden: true
  meta_category_id:
    default: -1
    hidden: true
  staff_category_id:
    default: -1
    hidden: true
  uncategorized_category_id:
    default: -1
    hidden: true

  notify_about_flags_after: 48

  show_create_topics_notice:
    client: true
    default: true

  enable_system_avatars:
    hidden: true
    default: true

  disable_system_edit_notifications: true

  notification_consolidation_threshold:
    default: 3
    min: 0

  likes_notification_consolidation_window_mins:
    default: 120
    min: 1

  delete_drafts_older_than_n_days:
    default: 180
    max: 36500

  backup_drafts_to_pm_length:
    default: 0
    hidden: true

  tos_topic_id:
    default: -1
    hidden: true
  guidelines_topic_id:
    default: -1
    hidden: true
  privacy_topic_id:
    default: -1
    hidden: true
  welcome_topic_id:
    default: -1
    hidden: true
  lounge_welcome_topic_id:
    default: -1
    hidden: true
  admin_quick_start_topic_id:
    default: -1
    hidden: true

  bootstrap_mode_min_users:
    default: 50
    client: true
    max: 5000

  bootstrap_mode_enabled:
    default: false
    client: true
    hidden: true

  automatically_unpin_topics:
    default: true
    client: true

  read_time_word_count:
    default: 500
    client: true
    locale_default:
      ja: 350
      zh_CN: 350
      zh_TW: 350

  topic_page_title_includes_category:
    default: true
    client: true

  native_app_install_banner_ios: false

  native_app_install_banner_android: false

  ios_app_id:
    default: "1173672076"
    hidden: true

  android_app_id:
    default: "com.discourse"
    hidden: true

  pwa_display_browser_regex:
    default: "a^"
    hidden: true

  app_association_android:
    default: ""
    textarea: true

  app_association_ios:
    default: ""
    textarea: true

  share_anonymized_statistics: true

  auto_handle_queued_age:
    default: 60
    min: 0

  svg_icon_subset:
    default: ""
    type: "list"
    list_type: "compact"
    client: true

  always_include_topic_excerpts:
    default: false
    hidden: true

  max_bulk_invites:
    default: 50000
    hidden: true

  overridden_robots_txt:
    default: ""
    hidden: true

user_preferences:
  default_email_digest_frequency:
    enum: "DigestEmailSiteSetting"
    default: 10080
  default_include_tl0_in_digests: false
  default_email_level:
    enum: "EmailLevelSiteSetting"
    default: 1
  default_email_messages_level:
    enum: "EmailLevelSiteSetting"
    default: 0
  default_email_mailing_list_mode: false
  default_email_mailing_list_mode_frequency:
    enum: "MailingListModeSiteSetting"
    default: 1
  disable_mailing_list_mode:
    default: false
    client: true
  default_email_previous_replies:
    enum: "PreviousRepliesSiteSetting"
    default: 2
  default_email_in_reply_to:
    default: true

  default_other_new_topic_duration_minutes:
    enum: "NewTopicDurationSiteSetting"
    default: 2880
  default_other_auto_track_topics_after_msecs:
    enum: "AutoTrackDurationSiteSetting"
    default: 240000
  default_other_notification_level_when_replying:
    enum: "NotificationLevelWhenReplyingSiteSetting"
    default: 2
  default_other_external_links_in_new_tab: false
  default_other_enable_quoting: true
  default_other_enable_defer: false
  default_other_dynamic_favicon: false
  default_other_like_notification_frequency:
    enum: "LikeNotificationFrequencySiteSetting"
    default: 1

  default_topics_automatic_unpin:
    default: true
    client: true

  default_categories_watching:
    type: category_list
    default: ""
  default_categories_tracking:
    type: category_list
    default: ""
  default_categories_muted:
    type: category_list
    default: ""
  default_categories_watching_first_post:
    type: category_list
    default: ""
  mute_all_categories_by_default:
    default: false
    client: true

  default_tags_watching:
    type: tag_list
    default: ""
  default_tags_tracking:
    type: tag_list
    default: ""
  default_tags_muted:
    type: tag_list
    default: ""
  default_tags_watching_first_post:
    type: tag_list
    default: ""

  default_text_size:
    type: enum
    default: normal
    choices:
      - smaller
      - normal
      - larger
      - largest

  default_title_count_mode:
    type: enum
    default: notifications
    choices:
      - notifications
      - contextual
api:
  retain_web_hook_events_period_days:
    default: 30
    max: 36500
  retry_web_hook_events:
    default: false
  api_key_last_used_epoch:
    default: "" # Value is added in a migration
    hidden: true
  revoke_api_keys_days:
    default: 180
    max: 36500

user_api:
  allow_user_api_keys:
    default: true
  allow_user_api_key_scopes:
    default: "read|write|message_bus|push|notifications|session_info|one_time_password"
    type: list
  max_api_keys_per_user:
    default: 10
  push_api_secret_key:
    default: ""
    hidden: true
  min_trust_level_for_user_api_key:
    default: 0
    enum: "TrustLevelSetting"
  allowed_user_api_push_urls:
    default: ""
    type: list
  allowed_user_api_auth_redirects:
    default: "https://api.discourse.org/api/auth_redirect|discourse://auth_redirect"
    type: list
  expire_user_api_keys_days:
    default: 180
    max: 36500

tags:
  tagging_enabled:
    client: true
    default: false
    refresh: true
  tag_style:
    client: true
    type: enum
    default: "simple"
    choices:
      - simple
      - bullet
      - box
    {% raw %}
    preview: '<div class="discourse-tags"><span class="discourse-tag {{value}}">tag1</span><span class="discourse-tag {{value}}">tag2</span></div>'
    {% endraw %}
  max_tags_per_topic:
    default: 5
    client: true
  max_tag_length:
    default: 20
    client: true
  min_trust_to_create_tag:
    default: "3"
    enum: "TrustLevelAndStaffSetting"
  min_trust_level_to_tag_topics:
    default: "0"
    enum: "TrustLevelAndStaffSetting"
    client: true
  max_tag_search_results:
    client: true
    default: 5
    min: 1
  show_filter_by_tag:
    client: true
    default: false
    refresh: true
  max_tags_in_filter_list:
    client: true
    default: 30
    min: 1
    refresh: true
  tags_sort_alphabetically:
    client: true
    default: false
    refresh: true
  tags_listed_by_group:
    client: true
    default: false
  allow_staff_to_tag_pms:
    default: false
  suppress_overlapping_tags_in_list:
    default: false
    client: true
  remove_muted_tags_from_latest:
    client: true
    type: enum
    default: always
    enum: RemoveMutedTagsFromLatestSiteSetting
  force_lowercase_tags:
    default: true
    client: true

dashboard:
  dashboard_hidden_reports:
    client: true
    type: list
    list_type: compact
    default: ""
    allow_any: true
  dashboard_visible_tabs:
    client: true
    type: list
    list_type: compact
    default: "moderation|security|reports"
    allow_any: false
    choices:
      - moderation
      - security
      - reports
  dashboard_general_tab_activity_metrics:
    client: true
    type: list
    list_type: compact
    default: "page_view_total_reqs|visits|time_to_first_response|likes|flags|user_to_user_private_messages_with_replies"
    allow_any: false
    choices:
      - page_view_total_reqs
      - visits
      - time_to_first_response
      - likes
      - flags
      - user_to_user_private_messages_with_replies
      - signups

but i think tbh ill probably just mount the config file with its settings…

I now you guys love this launcher thing but; docker-compose is a thing? I know its been raised a hundred times and im sure it works for you very well from what i can see :slight_smile: but there is a whole world of docker developers that know how it works… it would be great to have an example docker-compose :slight_smile:

1 Like

I think you should prefer discoursey more and less dockery to be supported. There’s a lot of things said about this for folks to understand why things were done this way.

hmm, no because docker is a standard way of running apps; and wrapping it in a bespoke scripty thing is … reinventing the wheel.

docker-compose is a runbook that can be given to any mid tier service provider and they know what to do with it. It also integrates perfectly into things like saltstack whereas the script does not…

of course i understand why. the script was made all those years back when docker was new… and as i said before its clear its a great assist for the support people…

also when you move to kube; well… that will be interesting.

And already when you look around there are tonnes of people creating helm charts for discurse and docker-composes … it would be nice to at least have some support for it…

but all good… im using the launcher now and will extract what i need from it :slight_smile:

1 Like

I’ll suggest you read this discussion. Can Discourse ship frequent Docker images that do not need to be bootstrapped?

Thanks for that, will read.

but whats important to know is docker is not an unknown anymore; and nto supporting it properly will prevent bigger orgs from considering it.

all good … keep up the good work and thanks for the passion

That just isn’t true, discourse is used on some of the largest communities on the internet.

Large orgs either employ technical personnel who don’t want spoon-fed packages, or are happy to outsource to companies like CDCK.

There’s nothing wrong with the standard install for medium and even large communities. If you want to know how launcher interacts with docker the source code is there to dig into.

A side conversation with @rosscdh revealed his main end-goal is Discourse on Kubernetes. This is not a supported configuration here. There’s valid criticism with the way we do things in relation to Docker/Kubernetes; however, we’ve chosen to take this approach with launcher for ease of use in the self-hosting world.

I’ve reopened this topic but please keep it civil and constructive.

2 Likes

But it wasn’t a thing until after ./launcher was developed. :wink:

If you want to launch to k8s or similar then what I do is use launcher to build the image and push it somewhere and then have k8ts launch that image. Launcher does some stuff like migrate the database on upgrades, so you need to pay attention to how that works.

1 Like

Thanks for that,

The goal is to make it more docker like so it can run on kube as well as jsut using docker with stand alone containers.

I’ve managed to use the launcher and generate an image 2+Gb in size (4 plugins, cant do 6 because limits)

I’ve also docker composed it so its now a clean runbook
am familiar with GlobalSettings and have slightly modified the application.rb and routes.rb so im just mounting customizations.

version: '3'

networks:
  discourse-net:

services:
  mailhog:
    image: mailhog/mailhog:latest
    networks:
      - discourse-net
    ports:
      - 8025:8025

  postgres:
    image: postgres:9.6
    networks:
      - discourse-net
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: discourse
      POSTGRES_DB: discourse

  redis:
    image: redis:alpine
    networks:
      - discourse-net

  discourse:
    image: discourse-monkey:latest
    working_dir: /var/www/discourse
    command: bash /var/www/discourse/entrypoint.sh
    # ports:
    #   - 3000:3000 # use the nginx entrypoint
    networks:
      - discourse-net
    volumes:
      - ./entrypoint.sh:/var/www/discourse/entrypoint.sh
      - ./config/unicorn.rb:/var/www/discourse/config/unicorn.rb
      - ./config/application.rb:/var/www/discourse/config/application.rb
      - ./envs/production.rb:/var/www/discourse/config/environments/production.rb
      - ./overrides/routes.rb:/var/www/discourse/config/routes.rb
      - ./generated/public/assets:/var/www/discourse/public/assets
      - ./generated/public/images:/var/www/discourse/public/images
      - ./generated/public/uploads:/var/www/discourse/public/uploads
      - ./generated/public/javascripts:/var/www/discourse/public/javascripts
      - ./generated/public/svg-sprite:/var/www/discourse/public/svg-sprite

    environment:
      LANG: en_US.UTF-8
      DISCOURSE_DEFAULT_LOCALE: en
      RAILS_ENV: production
      ## How many concurrent web requests are supported? Depends on memory and CPU cores.
      ## will be set automatically by bootstrap based on detected CPUs, or you can override
      UNICORN_WORKERS: 3

      ## TODO: The domain name this Discourse instance will respond to
      DISCOURSE_HOSTNAME: discuss.monkey.tech:3001
      DOCKER_USE_HOSTNAME: "true"

      ## Uncomment if you want the container to be started with the same
      ## hostname (-h option) as specified above (default "$hostname-$config")
      #DOCKER_USE_HOSTNAME: true

      ## TODO: List of comma delimited emails that will be made admin and developer
      ## on initial signup example 'user1@example.com,user2@example.com'
      DISCOURSE_DEVELOPER_EMAILS: 'me@example.com,you@example.com'

      ## TODO: The SMTP mail server used to validate new accounts and send notifications
      # SMTP ADDRESS, username, and password are required
      # WARNING the char '#' in SMTP password can cause problems!
      DISCOURSE_SMTP_ADDRESS: mailhog
      #DISCOURSE_SMTP_PORT: 587
      DISCOURSE_SMTP_USER_NAME: mailhog
      DISCOURSE_SMTP_PASSWORD: password
      #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)

      ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
      #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

      ## TODO: configure connectivity to the databases
      # DISCOURSE_DB_SOCKET: ''
      DISCOURSE_DB_HOST: postgres
      DISCOURSE_DB_USERNAME: discourse
      DISCOURSE_DB_PASSWORD: password
      DISCOURSE_REDIS_HOST: redis

      ## The http or https CDN address for this Discourse instance (configured to pull)
      ## see https://meta.discourse.org/t/14857 for details
      DISCOURSE_CDN_URL: http://discuss.monkey.tech:3001
      DISCOURSE_SERVE_STATIC_ASSETS: "true"

      SKIP_ENFORCE_HOSTNAME: '0'
      ENABLE_ASSETS_PIPELINE: '0'
      ENABLE_DB_MIGRATE: '0'

      DISCOURSE_ENABLE_CORS: 'false'
      DISCOURSE_CORS_ORIGIN: '*'
      #SKIP_DB_AND_REDIS: '1'

  nginx:
    image: fholzer/nginx-brotli
    # command: /bin/sh -c "envsubst < /etc/nginx/conf.d/discourse.template.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" 
    ports:
      - 3001:80
    depends_on:
      - discourse
    networks:
      - discourse-net
    volumes:
      - ./config/nginx.application.conf:/etc/nginx/conf.d/default.conf
      - ./generated/public:/var/www/discourse/public
      - ./generated/nginx/cache:/var/nginx/cache

Works beautifully; and all traffic routes via nginx which also shares the assets:precompile output

next steps is simply to have a set of calls to the image to precompile assets and db:migrate “on demand” or jsut use exec to do the same (as those items dont change that often) and maybe see if i can reduce this 2.6 Gb image size…

Its feeling quite a bit cleaner, as mentioned before the pup functioanlity is ok; and i can appreciate what it offers. I have quite a few reservations about the build where you run it and using sudo strategies… (this is very rarely how I/anyone i know works) usually images are built independently and deployed elsewhere (kube, saltstack, nomad, docker-compose)

I’ve got a potential PR to add a sample/kube.yml and applications/kubernetes.template.yml as there are certain items, overrides and settings to disable db and redis and then actually disable redis and db at build as well as disable precompile… if thats interesting.

Was an interesting experience thanks for the bump…

There is only one small weirdness todo with the fixtures (perhaps from calling migrate a few times)
see attached image

3 Likes

I believe docker-compose was based on a tool called “fig”.

1 Like