컨테이너 재시작 - discourse가 재설치를 시도합니다

안녕하세요,

우선 최고의 포럼 소프트웨어를 제공해 주셔서 감사합니다.

Docker 컨테이너로 실행 중인 Discourse를 다시 시작할 때 문제가 발생합니다. Discourse가 항상 자신을 다시 설치하려고 합니다.

저는 멀티 컨테이너 구성을 선택했습니다(기본적으로 더 나은 선택지입니다).

Discourse 컨테이너를 다시 시작하면 프로세스가 항상 자신을 다시 설치하려고 합니다.

데이터베이스가 이미 존재하는 것을 인식하고 즉시 사용 가능해지기를 기대했지만, 항상 재설치를 시도하며 ID 충돌에 대해 오류를 보고합니다.

재설치를 하지 않도록 설정할 수 있는 옵션이 있을까요?

미리 감사드립니다.

컨테이너를 재시작하는 방법을 설명해 주실 수 있나요?

스티븐, 안녕하세요.

다른 컨테이너를 재시작하듯, 도커로 디스커스를 재시작하면 됩니다.

두 컨테이너를 어떻게 생성하셨나요?

설치를 시도하는 것처럼 보이는 메시지는 무엇인가요?

안녕하세요,

여러분, 이건 도커(Docker)라서 다른 시작 방법은 많지 않습니다.

환경 변수(env vars) 세트가 있습니다.

nami    INFO  Initializing postgresql-client
    nami    INFO  postgresql-client successfully initialized
    nami    INFO  Initializing discourse
    discour INFO  Patching Discourse...
    postgre INFO  Trying to connect to PostgreSQL server
    postgre INFO  Found PostgreSQL server listening at postgres:5432
    postgre INFO  PostgreSQL server listening and working at postgres:5432
    discour INFO  Preparing Discourse environment...
    discour INFO  Configuring the Discourse database files...
    discour INFO  Configuring Redis...
    discour INFO  Setting up SMTP in Discourse...
    discour INFO  Configuring Discourse database...
    discour INFO  Enabling PostgreSQL plugins for Discourse...
    discour INFO  Migrating database...
    discour INFO  Creating the Discourse admin user...
    discour INFO  Configuring your Discourse installation...
    Error executing 'postInstallation': ERROR:  duplicate key value violates unique constraint "index_site_settings_on_name"
    DETAIL:  Key (name)=(site_contact_username) already exists.

그래서 데이터베이스는 존재하는데, 어떤 이유로인지 Discourse가 다시 설치하려고 하는 것 같습니다. 그리고 질문은 이런 일이 일어나지 않도록 방지하는 방법이 무엇인지입니다.

환경 변수가 있을까요? (시스템이 데이터베이스와 설정이 이미 존재하는 것을 알아차릴 것으로 기대했는데요?)

bitnami를 사용 중이신가요?

컨테이너를 어떻게 생성하셨나요?

네, '공식 솔루션’은 실제로는 도커를 잘 활용하지 않고 사용자 지정 스크립트에 너무 많이 의존하거든요. 그래서 이거 지원 안 받을 것 같은데 ㅋㅋ..

bitnami 이미지는 지원되지 않습니다. 이 이미지를 사용하려면 해당 업체에 직접 문의해야 합니다.

또한 이미지가 매우 오래되었습니다.

알겠습니다… 멀티 컨테이너 솔루션에 대한 docker-compose가 있나요?

스티븐, 죄송하지만 대신 공식 이미지를 사용하고 싶습니다;

discourse/base - Docker Image 이걸로 대신 사용해도 될까요?

@Stephen 환경 변수 목록이 어딘가에 있나요?

DISCOURSE_ 접두사가 붙은 설정 파일 값들이겠군요.

?

# 사용 가능한 옵션:
#
# default            - 설정의 기본값. 업로드 사이트 설정의 경우, db/fixtures/010_uploads.rb에서 시드된 업로드의 id를 사용합니다.
# client             - 자바스크립트가 이 설정의 값에 접근할 수 있도록 하려면 true로 설정합니다.
# refresh            - 설정이 변경될 때 클라이언트가 새로고침하도록 하려면 true로 설정합니다.
# min                - 문자열 설정의 경우, 최소 길이. 정수 설정의 경우, 최소값.
# max                - 문자열 설정의 경우, 최대 길이. 정수 설정의 경우, 최대값.
# regex              - 값이 일치해야 하는 정규식.
# validator          - 설정 값을 검증하는 데 사용되는 클래스의 이름.
# allow_any          - 선택 설정에서 선택 목록에 지정되지 않은 항목을 허용 (기본값 true)
# secret             - 입력 유형이 비밀번호여야 하고 값이 로그에서 마스킹되어야 하면 true로 설정합니다 (기본값 false).
# enum               - 설정은 허용된 값의 고정 집합을 가지며, 하나만 선택할 수 있습니다.
#                      집합을 정의하는 클래스 이름으로 설정합니다.
# locale_default     - `SiteSetting.default_locale`에 따라 오버라이드하는 해시.
#                      키는 default_locale의 가능한 값과 동일해야 합니다.
#
#
# type: email    - 유효한 이메일 주소여야 합니다.
# type: username - 기존 사용자의 사용자명과 일치해야 합니다.
# type: list     - choices 옵션에서 정의된 유효한 값의 집합에서 선택된 값의 목록.
# type: enum     - choices 옵션에서 정의된 유효한 값의 집합에서 선택된 단일 값.
#
# 이름에 'colors'라는 단어가 포함된 type:list 설정은 색상 값에 해당 색상의 굵은 줄을 표시합니다.
#
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\-\/_]+$' # 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 # 18:9의 90%
    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\-\/]+$' # 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년
    max: 1825 # 5년
  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_score_threshold: 15
  summary_posts_required: 50
  summary_likes_required: 1
  summary_percent_filter: 20
  summary_max_results: 100

  automatic_topic_heat_values: true

  # 뷰 열기 임계값
  topic_views_heat_low:
    client: true
    default: 1000
  topic_views_heat_medium:
    client: true
    default: 2000
  topic_views_heat_high:
    client: true
    default: 3500

  # 게시글/좋아요 열기 임계값
  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_hours_low:
    client: true
    default: 12
  history_hours_medium:
    client: true
    default: 24
  history_hours_high:
    client: true
    default: 48

  # 콜드 맵 임계값
  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

  # 경고
  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

  # 이 임계값 이후의 것은 결코 새로움으로 간주되지 않습니다
  # 15분마다 동적으로 계산됩니다
  min_new_topics_time:
    default: 0
    hidden: true

  # 카테고리 ID
  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: "" # 값은 마이그레이션에서 추가됩니다
    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

솔직히 말해서, 설정 파일과 그 설정값을 마운트하는 방식으로 처리할 것 같습니다.

이 런처를 정말 좋아하신다는 건 알겠어요. 근데; docker-compose라는 게 있잖아요? 이미 백 번쯤 언급된 거라고 알고 있고, 제가 보기엔 여러분한테 아주 잘 작동하고 있는 것 같긴 해요 :slight_smile: 하지만 docker를 어떻게 다루는지 아는 docker 개발자들이 꽤 많은 세계가 있거든요… docker-compose 예제가 하나 있으면 정말 좋겠어요 :slight_smile:

discoursey를 더 선호하고 dockery는 덜 지원하는 쪽으로 가기를 제안합니다. 왜 이런 방식으로 진행되었는지를 이해할 수 있도록 많은 논의가 이루어졌습니다.

음, 아니야. 도커는 앱을 실행하는 표준 방식이니까. 그걸 맞춤 스크립트 같은 것에 감싸는 건.. 차를 다시 발명하는 거랑 비슷해.

docker-compose는 중간 규모의 서비스 제공업체에게 넘겨줄 수 있는 런북(runbook)이야. 그들은 그걸로 뭘 해야 하는지 알고 있어. 또한 saltstack 같은 도구와도 완벽하게 통합되는데, 스크립트는 그렇지 않아..

물론 왜 그랬는지 이해는 해. 그 스크립트는 도커가 신선했던 몇 년 전에 만들어졌으니까.. 그리고 앞서 말했듯이 지원팀에게 큰 도움이 되는 도구임은 분명해…

또한 쿠버네티스로 넘어가게 되면; 음.. 그건 흥미로울 거야.

이미 주변을 둘러보면 discourse용 helm 차트와 docker-compose를 만드는 사람들이 수없이 많아.. 적어도 그 부분에 대한 최소한의 지원이라도 있으면 좋겠어..

하지만 괜찮아.. 나는 이제 런처를 사용 중이고, 거기서 필요한 것들을 추출해서 쓸 거야 :slight_smile:

이 토론을 읽어보시라고 추천드립니다. Can Discourse ship frequent Docker images that do not need to be bootstrapped?

알려주셔서 감사합니다. 읽어보겠습니다.

하지만 알아두면 중요한 점은, 더 이상 도커가 낯선 기술이 아니라는 것입니다. 그리고 이를 제대로 지원하지 않으면 더 큰 조직들이 이를 고려하지 않게 될 수 있습니다.

모두 잘 되고 있으니, 좋은 일 계속하시고 열정에 감사드립니다.

그건 사실이 아닙니다. Discourse는 인터넷에서 가장 큰 커뮤니티 중 몇 곳에서 사용되고 있습니다.

큰 조직들은 숟가락으로 떠먹여 주는 패키지 형태를 원하지 않는 기술 인력을 고용하거나, CDCK 같은 회사에 아웃소싱하는 것을 선호합니다.

중간 규모는 물론 큰 커뮤니티를 위한 표준 설치 과정에 문제가 있는 것은 아닙니다. Launcher가 Docker와 어떻게 상호작용하는지 알고 싶다면, 이를 파고들 수 있는 소스 코드가 있습니다.