Skip to content
Snippets Groups Projects
config_documentation.md 114 KiB
Newer Older
  • Learn to ignore specific revisions
  • 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
    # Configuring Synapse
    
    This is intended as a guide to the Synapse configuration. The behavior of a Synapse instance can be modified 
    through the many configuration settings documented here — each config option is explained, 
    including what the default is, how to change the default and what sort of behaviour the setting governs.
    Also included is an example configuration for each setting. If you don't want to spend a lot of time 
    thinking about options, the config as generated sets sensible defaults for all values. Do note however that the
    database defaults to SQLite, which is not recommended for production usage. You can read more on this subject 
    [here](../../setup/installation.md#using-postgresql).
    
    ## Config Conventions
    
    Configuration options that take a time period can be set using a number
    followed by a letter. Letters have the following meanings:
    
    * `s` = second
    * `m` = minute
    * `h` = hour
    * `d` = day
    * `w` = week
    * `y` = year
    
    For example, setting `redaction_retention_period: 5m` would remove redacted
    messages from the database after 5 minutes, rather than 5 months.
    
    ### YAML 
    The configuration file is a [YAML](https://yaml.org/) file, which means that certain syntax rules
    apply if you want your config file to be read properly. A few helpful things to know:
    * `#` before any option in the config will comment out that setting and either a default (if available) will 
       be applied or Synapse will ignore the setting. Thus, in example #1 below, the setting will be read and
       applied, but in example #2 the setting will not be read and a default will be applied.  
    
       Example #1:
       ```yaml
       pid_file: DATADIR/homeserver.pid
       ```
       Example #2:
       ```yaml
       #pid_file: DATADIR/homeserver.pid
       ```
    * Indentation matters! The indentation before a setting
      will determine whether a given setting is read as part of another
      setting, or considered on its own. Thus, in example #1, the `enabled` setting
      is read as a sub-option of the `presence` setting, and will be properly applied.
      
      However, the lack of indentation before the `enabled` setting in example #2 means
      that when reading the config, Synapse will consider both `presence` and `enabled` as
      different settings. In this case, `presence` has no value, and thus a default applied, and `enabled`
      is an option that Synapse doesn't recognize and thus ignores.
      
      Example #1: 
      ```yaml
      presence:
        enabled: false
      ```
      Example #2:
      ```yaml
      presence:
      enabled: false
      ```
      In this manual, all top-level settings (ones with no indentation) are identified 
      at the beginning of their section (i.e. "Config option: `example_setting`") and 
      the sub-options, if any, are identified and listed in the body of the section. 
      In addition, each setting has an example of its usage, with the proper indentation
      shown. 
    
      
    ## Modules
    
    Server admins can expand Synapse's functionality with external modules.
    
    See [here](../../modules/index.md) for more
    documentation on how to configure or create custom modules for Synapse.
    
    
    ---
    Config option: `modules`
    
    Use the `module` sub-option to add modules under this option to extend functionality. 
    The `module` setting then has a sub-option, `config`, which can be used to define some configuration
    for the `module`.
    
    Defaults to none.
    
    Example configuration:
    ```yaml
    modules:
      - module: my_super_module.MySuperClass
        config:
          do_thing: true
      - module: my_other_super_module.SomeClass
        config: {}
    ```
    ---
    ## Server ##
    
    Define your homeserver name and other base options.
    
    ---
    Config option: `server_name`
    
    This sets the public-facing domain of the server.
    
    The `server_name` name will appear at the end of usernames and room addresses
    created on your server. For example if the `server_name` was example.com,
    usernames on your server would be in the format `@user:example.com`
    
    In most cases you should avoid using a matrix specific subdomain such as
    matrix.example.com or synapse.example.com as the `server_name` for the same
    reasons you wouldn't use user@email.example.com as your email address.
    See [here](../../delegate.md)
    for information on how to host Synapse on a subdomain while preserving
    a clean `server_name`.
    
    The `server_name` cannot be changed later so it is important to
    configure this correctly before you start Synapse. It should be all
    lowercase and may contain an explicit port.
    
    There is no default for this option. 
     
    Example configuration #1:
    ```yaml
    server_name: matrix.org 
    ```
    Example configuration #2:
    ```yaml
    server_name: localhost:8080
    ```
    ---
    Config option: `pid_file`
    
    When running Synapse as a daemon, the file to store the pid in. Defaults to none.
    
    Example configuration:
    ```yaml
    pid_file: DATADIR/homeserver.pid
    ```
    ---
    Config option: `web_client_location`
    
    The absolute URL to the web client which `/` will redirect to. Defaults to none. 
    
    Example configuration:
    ```yaml
    web_client_location: https://riot.example.com/
    ```
    ---
    Config option: `public_baseurl`
    
    The public-facing base URL that clients use to access this Homeserver (not
    including _matrix/...). This is the same URL a user might enter into the
    'Custom Homeserver URL' field on their client. If you use Synapse with a
    reverse proxy, this should be the URL to reach Synapse via the proxy.
    Otherwise, it should be the URL to reach Synapse's client HTTP listener (see
    'listeners' below).
    
    Defaults to `https://<server_name>/`.
    
    Example configuration:
    ```yaml
    public_baseurl: https://example.com/
    ```
    ---
    Config option: `serve_server_wellknown`
    
    By default, other servers will try to reach our server on port 8448, which can
    be inconvenient in some environments.
    
    Provided `https://<server_name>/` on port 443 is routed to Synapse, this
    option configures Synapse to serve a file at `https://<server_name>/.well-known/matrix/server`. 
    This will tell other servers to send traffic to port 443 instead.
    
    This option currently defaults to false.
    
    See https://matrix-org.github.io/synapse/latest/delegate.html for more
    information.
    
    Example configuration:
    ```yaml
    serve_server_wellknown: true
    ```
    ---
    Config option: `soft_file_limit`
     
    Set the soft limit on the number of file descriptors synapse can use.
    Zero is used to indicate synapse should set the soft limit to the hard limit.
    Defaults to 0. 
    
    Example configuration:
    ```yaml
    soft_file_limit: 3
    ```
    ---
    Config option: `presence`
    
    Presence tracking allows users to see the state (e.g online/offline)
    of other local and remote users. Set the `enabled` sub-option to false to  
    disable presence tracking on this homeserver. Defaults to true. 
    This option replaces the previous top-level 'use_presence' option.
    
    Example configuration:
    ```yaml
    presence:
      enabled: false
    ```
    ---
    Config option: `require_auth_for_profile_requests`
    
    Whether to require authentication to retrieve profile data (avatars, display names) of other 
    users through the client API. Defaults to false. Note that profile data is also available 
    via the federation API, unless `allow_profile_lookup_over_federation` is set to false.
    
    Example configuration:
    ```yaml
    require_auth_for_profile_requests: true
    ```
    ---
    Config option: `limit_profile_requests_to_users_who_share_rooms`
    
    Use this option to require a user to share a room with another user in order
    to retrieve their profile information. Only checked on Client-Server 
    requests. Profile requests from other servers should be checked by the
    requesting server. Defaults to false.
    
    Example configuration: 
    ```yaml
    limit_profile_requests_to_users_who_share_rooms: true
    ```
    ---
    Config option: `include_profile_data_on_invite`
    
    Use this option to prevent a user's profile data from being retrieved and
    displayed in a room until they have joined it. By default, a user's
    profile data is included in an invite event, regardless of the values
    of the above two settings, and whether or not the users share a server.
    Defaults to true.
    
    Example configuration:
    ```yaml
    include_profile_data_on_invite: false
    ```
    ---
    Config option: `allow_public_rooms_without_auth`
    
    If set to true, removes the need for authentication to access the server's
    public rooms directory through the client API, meaning that anyone can
    query the room directory. Defaults to false.
    
    Example configuration:
    ```yaml
    allow_public_rooms_without_auth: true
    ```
    ---
    Config option: `allow_public_rooms_without_auth`
    
    If set to true, allows any other homeserver to fetch the server's public
    rooms directory via federation. Defaults to false.
    
    Example configuration:
    ```yaml
    allow_public_rooms_over_federation: true
    ```
    ---
    Config option: `default_room_version`
    
    The default room version for newly created rooms on this server.
    
    Known room versions are listed [here](https://spec.matrix.org/latest/rooms/#complete-list-of-room-versions)
    
    For example, for room version 1, `default_room_version` should be set
    to "1". 
    
    Currently defaults to "9".
    
    Example configuration:
    ```yaml
    default_room_version: "8"
    ```
    ---
    Config option: `gc_thresholds`
    
    The garbage collection threshold parameters to pass to `gc.set_threshold`, if defined.
    Defaults to none. 
    
    Example configuration:
    ```yaml
    gc_thresholds: [700, 10, 10]
    ```
    ---
    Config option: `gc_min_interval`
    
    The minimum time in seconds between each GC for a generation, regardless of
    the GC thresholds. This ensures that we don't do GC too frequently. A value of `[1s, 10s, 30s]` 
    indicates that a second must pass between consecutive generation 0 GCs, etc.
    
    Defaults to `[1s, 10s, 30s]`.
    
    Example configuration:
    ```yaml
    gc_min_interval: [0.5s, 30s, 1m]
    ```
    ---
    Config option: `filter_timeline_limit`
    
    Set the limit on the returned events in the timeline in the get
    and sync operations. Defaults to 100. A value of -1 means no upper limit.
    
    
    Example configuration:
    ```yaml
    filter_timeline_limit: 5000
    ```
    ---
    Config option: `block_non_admin_invites`
    
    Whether room invites to users on this server should be blocked
    (except those sent by local server admins). Defaults to false.
    
    Example configuration:
    ```yaml
    block_non_admin_invites: true
    ```
    ---
    Config option: `enable_search`
    
    If set to false, new messages will not be indexed for searching and users
    will receive errors when searching for messages. Defaults to true.
    
    Example configuration:
    ```yaml
    enable_search: false
    ```
    ---
    Config option: `ip_range_blacklist`
     
    This option prevents outgoing requests from being sent to the specified blacklisted IP address
    CIDR ranges. If this option is not specified then it defaults to private IP
    address ranges (see the example below).
    
    The blacklist applies to the outbound requests for federation, identity servers,
    push servers, and for checking key validity for third-party invite events.
    
    (0.0.0.0 and :: are always blacklisted, whether or not they are explicitly
    listed here, since they correspond to unroutable addresses.)
    
    This option replaces `federation_ip_range_blacklist` in Synapse v1.25.0.
    
    Note: The value is ignored when an HTTP proxy is in use.
    
    Example configuration:
    ```yaml
    ip_range_blacklist:
      - '127.0.0.0/8'
      - '10.0.0.0/8'
      - '172.16.0.0/12'
      - '192.168.0.0/16'
      - '100.64.0.0/10'
      - '192.0.0.0/24'
      - '169.254.0.0/16'
      - '192.88.99.0/24'
      - '198.18.0.0/15'
      - '192.0.2.0/24'
      - '198.51.100.0/24'
      - '203.0.113.0/24'
      - '224.0.0.0/4'
      - '::1/128'
      - 'fe80::/10'
      - 'fc00::/7'
      - '2001:db8::/32'
      - 'ff00::/8'
      - 'fec0::/10'
    ```
    ---
    Config option: `ip_range_whitelist`
    
    List of IP address CIDR ranges that should be allowed for federation,
    identity servers, push servers, and for checking key validity for
    third-party invite events. This is useful for specifying exceptions to
    wide-ranging blacklisted target IP ranges - e.g. for communication with
    a push server only visible in your network.
    
    This whitelist overrides `ip_range_blacklist` and defaults to an empty
    list.
    
    Example configuration:
    ```yaml
    ip_range_whitelist:
       - '192.168.1.1'
    ```
    ---
    Config option: `listeners`
    
    List of ports that Synapse should listen on, their purpose and their
    configuration.
    
    Sub-options for each listener include:
    
    * `port`: the TCP port to bind to. 
    
    * `bind_addresses`: a list of local addresses to listen on. The default is
           'all local interfaces'.
    
    * `type`: the type of listener. Normally `http`, but other valid options are:
        
       * `manhole`: (see the docs [here](../../manhole.md)),
    
       * `metrics`: (see the docs [here](../../metrics-howto.md)),
    
       * `replication`: (see the docs [here](../../workers.md)).
    
    * `tls`: set to true to enable TLS for this listener. Will use the TLS key/cert specified in tls_private_key_path / tls_certificate_path.
    
    * `x_forwarded`: Only valid for an 'http' listener. Set to true to use the X-Forwarded-For header as the client IP. Useful when Synapse is
       behind a reverse-proxy.
    
    * `resources`: Only valid for an 'http' listener. A list of resources to host
       on this port. Sub-options for each resource are:
    
       * `names`: a list of names of HTTP resources. See below for a list of valid resource names.
    
       * `compress`: set to true to enable HTTP compression for this resource.
    
    * `additional_resources`: Only valid for an 'http' listener. A map of
       additional endpoints which should be loaded via dynamic modules.
    
    Valid resource names are:
    
    * `client`: the client-server API (/_matrix/client), and the synapse admin API (/_synapse/admin). Also implies 'media' and 'static'.
    
    * `consent`: user consent forms (/_matrix/consent). See [here](../../consent_tracking.md) for more.
    
    * `federation`: the server-server API (/_matrix/federation). Also implies `media`, `keys`, `openid`
    
    * `keys`: the key discovery API (/_matrix/keys).
    
    * `media`: the media API (/_matrix/media).
    
    * `metrics`: the metrics interface. See [here](../../metrics-howto.md).
    
    * `openid`: OpenID authentication. See [here](../../openid.md).
    
    * `replication`: the HTTP replication API (/_synapse/replication). See [here](../../workers.md).
    
    * `static`: static resources under synapse/static (/_matrix/static). (Mostly useful for 'fallback authentication'.)
    
    Example configuration #1:
    ```yaml
    listeners:
      # TLS-enabled listener: for when matrix traffic is sent directly to synapse.
      #
      # (Note that you will also need to give Synapse a TLS key and certificate: see the TLS section
      # below.)
      #
      - port: 8448
        type: http
        tls: true
        resources:
          - names: [client, federation]
    ```
    Example configuration #2:
    ```yaml
    listeners:
      # Unsecure HTTP listener: for when matrix traffic passes through a reverse proxy
      # that unwraps TLS.
      #
      # If you plan to use a reverse proxy, please see
      # https://matrix-org.github.io/synapse/latest/reverse_proxy.html.
      #
      - port: 8008
        tls: false
        type: http
        x_forwarded: true
        bind_addresses: ['::1', '127.0.0.1']
    
        resources:
          - names: [client, federation]
            compress: false
    
        # example additional_resources:
        additional_resources:
          "/_matrix/my/custom/endpoint":
            module: my_module.CustomRequestHandler
            config: {}
    
      # Turn on the twisted ssh manhole service on localhost on the given
      # port.
      - port: 9000
        bind_addresses: ['::1', '127.0.0.1']
        type: manhole
    ```
    ---
    Config option: `manhole_settings`
    
    Connection settings for the manhole. You can find more information
    on the manhole [here](../../manhole.md). Manhole sub-options include:
    * `username` : the username for the manhole. This defaults to 'matrix'.
    * `password`: The password for the manhole. This defaults to 'rabbithole'.
    * `ssh_priv_key_path` and `ssh_pub_key_path`: The private and public SSH key pair used to encrypt the manhole traffic.
      If these are left unset, then hardcoded and non-secret keys are used,
      which could allow traffic to be intercepted if sent over a public network.
    
    Example configuration:
    ```yaml
    manhole_settings:
      username: manhole
      password: mypassword
      ssh_priv_key_path: CONFDIR/id_rsa
      ssh_pub_key_path: CONFDIR/id_rsa.pub
    ```
    ---
    Config option: `dummy_events_threshold`
    
    Forward extremities can build up in a room due to networking delays between
    homeservers. Once this happens in a large room, calculation of the state of
    that room can become quite expensive. To mitigate this, once the number of
    forward extremities reaches a given threshold, Synapse will send an
    `org.matrix.dummy_event` event, which will reduce the forward extremities
    in the room.
    
    This setting defines the threshold (i.e. number of forward extremities in the room) at which dummy events are sent. 
    The default value is 10.
    
    Example configuration:
    ```yaml
    dummy_events_threshold: 5
    ```
    ---
    ## Homeserver blocking ##
    Useful options for Synapse admins.
    
    ---
    
    Config option: `admin_contact`
    
    How to reach the server admin, used in `ResourceLimitError`. Defaults to none. 
    
    Example configuration:
    ```yaml
    admin_contact: 'mailto:admin@server.com'
    ```
    ---
    Config option: `hs_disabled` and `hs_disabled_message`
    
    Blocks users from connecting to the homeserver and provides a human-readable reason
    why the connection was blocked. Defaults to false. 
    
    Example configuration:
    ```yaml
    hs_disabled: true
    hs_disabled_message: 'Reason for why the HS is blocked'
    ```
    ---
    Config option: `limit_usage_by_mau`
    
    This option disables/enables monthly active user blocking. Used in cases where the admin or 
    server owner wants to limit to the number of monthly active users. When enabled and a limit is 
    reached the server returns a `ResourceLimitError` with error type `Codes.RESOURCE_LIMIT_EXCEEDED`.
    Defaults to false. If this is enabled, a value for `max_mau_value` must also be set.
    
    Example configuration:
    ```yaml
    limit_usage_by_mau: true 
    ```
    ---
    Config option: `max_mau_value`
    
    This option sets the hard limit of monthly active users above which the server will start 
    blocking user actions if `limit_usage_by_mau` is enabled. Defaults to 0.  
    
    Example configuration:
    ```yaml
    max_mau_value: 50
    ```
    ---
    Config option: `mau_trial_days`
    
    The option `mau_trial_days` is a means to add a grace period for active users. It
    means that users must be active for the specified number of days before they
    can be considered active and guards against the case where lots of users
    sign up in a short space of time never to return after their initial
    session. Defaults to 0. 
    
    Example configuration:
    ```yaml
    mau_trial_days: 5
    ```
    ---
    Config option: `mau_limit_alerting`
    
    The option `mau_limit_alerting` is a means of limiting client-side alerting
    should the mau limit be reached. This is useful for small instances
    where the admin has 5 mau seats (say) for 5 specific people and no
    interest increasing the mau limit further. Defaults to true, which
    means that alerting is enabled.
    
    Example configuration:
    ```yaml
    mau_limit_alerting: false
    ```
    ---
    Config option: `mau_stats_only`
    
    If enabled, the metrics for the number of monthly active users will
    be populated, however no one will be limited based on these numbers. If `limit_usage_by_mau`
    is true, this is implied to be true. Defaults to false. 
    
    Example configuration:
    ```yaml
    mau_stats_only: true
    ```
    ---
    Config option: `mau_limit_reserved_threepids`
    
    Sometimes the server admin will want to ensure certain accounts are
    never blocked by mau checking. These accounts are specified by this option.
    Defaults to none. Add accounts by specifying the `medium` and `address` of the
    reserved threepid (3rd party identifier).
    
    Example configuration:
    ```yaml
    mau_limit_reserved_threepids:
      - medium: 'email'
        address: 'reserved_user@example.com'
    ```
    ---
    Config option: `server_context`
    
    This option is used by phonehome stats to group together related servers.
    Defaults to none. 
    
    Example configuration:
    ```yaml
    server_context: context
    ```
    ---
    Config option: `limit_remote_rooms`
    
    When this option is enabled, the room "complexity" will be checked before a user
    joins a new remote room. If it is above the complexity limit, the server will
    disallow joining, or will instantly leave. This is useful for homeservers that are
    resource-constrained. Options for this setting include:
    * `enabled`: whether this check is enabled. Defaults to false.
    * `complexity`: the limit above which rooms cannot be joined. The default is 1.0.
    * `complexity_error`: override the error which is returned when the room is too complex with a
       custom message. 
    * `admins_can_join`: allow server admins to join complex rooms. Default is false.
    
    Room complexity is an arbitrary measure based on factors such as the number of
    users in the room. 
    
    Example configuration:
    ```yaml
    limit_remote_rooms:
      enabled: true
      complexity: 0.5
      complexity_error: "I can't let you do that, Dave."
      admins_can_join: true
    ```
    ---
    Config option: `require_membership_for_aliases`
    
    Whether to require a user to be in the room to add an alias to it.
    Defaults to true.
    
    Example configuration:
    ```yaml
    require_membership_for_aliases: false
    ```
    ---
    Config option: `allow_per_room_profiles`
    
    Whether to allow per-room membership profiles through the sending of membership
    events with profile information that differs from the target's global profile.
    Defaults to true.
    
    Example configuration:
    ```yaml
    allow_per_room_profiles: false
    ```
    ---
    Config option: `max_avatar_size`
    
    The largest permissible file size in bytes for a user avatar. Defaults to no restriction.
    Use M for MB and K for KB. 
    
    Note that user avatar changes will not work if this is set without using Synapse's media repository.
    
    Example configuration:
    ```yaml
    max_avatar_size: 10M
    ```
    ---
    Config option: `allowed_avatar_mimetypes`
    
    The MIME types allowed for user avatars. Defaults to no restriction.
    
    Note that user avatar changes will not work if this is set without
    using Synapse's media repository.
    
    Example configuration:
    ```yaml
    allowed_avatar_mimetypes: ["image/png", "image/jpeg", "image/gif"]
    ```
    ---
    Config option: `redaction_retention_period`
    
    How long to keep redacted events in unredacted form in the database. After
    this period redacted events get replaced with their redacted form in the DB.
    
    Defaults to `7d`. Set to `null` to disable.
    
    Example configuration:
    ```yaml
    redaction_retention_period: 28d
    ```
    ---
    Config option: `user_ips_max_age` 
    
    How long to track users' last seen time and IPs in the database.
    
    Defaults to `28d`. Set to `null` to disable clearing out of old rows.
    
    Example configuration:
    ```yaml
    user_ips_max_age: 14d
    ```
    ---
    Config option: `request_token_inhibit_3pid_errors`
    
    Inhibits the `/requestToken` endpoints from returning an error that might leak
    information about whether an e-mail address is in use or not on this
    homeserver. Defaults to false. 
    Note that for some endpoints the error situation is the e-mail already being
    used, and for others the error is entering the e-mail being unused.
    If this option is enabled, instead of returning an error, these endpoints will
    act as if no error happened and return a fake session ID ('sid') to clients.
    
    Example configuration:
    ```yaml
    request_token_inhibit_3pid_errors: true
    ```
    ---
    Config option: `next_link_domain_whitelist`
    
    A list of domains that the domain portion of `next_link` parameters
    must match.
    
    This parameter is optionally provided by clients while requesting
    validation of an email or phone number, and maps to a link that
    users will be automatically redirected to after validation
    succeeds. Clients can make use this parameter to aid the validation
    process.
    
    The whitelist is applied whether the homeserver or an identity server is handling validation.
    
    The default value is no whitelist functionality; all domains are
    allowed. Setting this value to an empty list will instead disallow
    all domains.
    
    Example configuration:
    ```yaml
    next_link_domain_whitelist: ["matrix.org"]
    ```
    ---
    Config option: `templates` and `custom_template_directory`
    
    These options define templates to use when generating email or HTML page contents.
    The `custom_template_directory` determines which directory Synapse will try to 
    find template files in to use to generate email or HTML page contents.
    If not set, or a file is not found within the template directory, a default 
    template from within the Synapse package will be used.
    
    See [here](../../templates.md) for more
    information about using custom templates.
    
    Example configuration:
    ```yaml
    templates:
      custom_template_directory: /path/to/custom/templates/
    ```
    ---
    Config option: `retention`
    
    This option and the associated options determine message retention policy at the
    server level.
    
    Room admins and mods can define a retention period for their rooms using the
    `m.room.retention` state event, and server admins can cap this period by setting
    the `allowed_lifetime_min` and `allowed_lifetime_max` config options.
    
    If this feature is enabled, Synapse will regularly look for and purge events
    which are older than the room's maximum retention period. Synapse will also
    filter events received over federation so that events that should have been 
    purged are ignored and not stored again. 
    
    The message retention policies feature is disabled by default.
    
    This setting has the following sub-options:
    * `default_policy`: Default retention policy. If set, Synapse will apply it to rooms that lack the
       'm.room.retention' state event. This option is further specified by the 
       `min_lifetime` and `max_lifetime` sub-options associated with it. Note that the 
        value of `min_lifetime` doesn't matter much because Synapse doesn't take it into account yet. 
    
    * `allowed_lifetime_min` and `allowed_lifetime_max`: Retention policy limits. If 
       set, and the state of a room contains a `m.room.retention` event in its state 
       which contains a `min_lifetime` or a `max_lifetime` that's out of these bounds,
       Synapse will cap the room's policy to these limits when running purge jobs.
    
    * `purge_jobs` and the associated `shortest_max_lifetime` and `longest_max_lifetime` sub-options:
       Server admins can define the settings of the background jobs purging the
       events whose lifetime has expired under the `purge_jobs` section.
       
      If no configuration is provided for this option, a single job will be set up to delete
      expired events in every room daily.
    
      Each job's configuration defines which range of message lifetimes the job
      takes care of. For example, if `shortest_max_lifetime` is '2d' and
      `longest_max_lifetime` is '3d', the job will handle purging expired events in
      rooms whose state defines a `max_lifetime` that's both higher than 2 days, and
      lower than or equal to 3 days. Both the minimum and the maximum value of a
      range are optional, e.g. a job with no `shortest_max_lifetime` and a
      `longest_max_lifetime` of '3d' will handle every room with a retention policy
      whose `max_lifetime` is lower than or equal to three days.
      
      The rationale for this per-job configuration is that some rooms might have a
      retention policy with a low `max_lifetime`, where history needs to be purged
      of outdated messages on a more frequent basis than for the rest of the rooms
      (e.g. every 12h), but not want that purge to be performed by a job that's
      iterating over every room it knows, which could be heavy on the server.
    
      If any purge job is configured, it is strongly recommended to have at least
      a single job with neither `shortest_max_lifetime` nor `longest_max_lifetime`
      set, or one job without `shortest_max_lifetime` and one job without
      `longest_max_lifetime` set. Otherwise some rooms might be ignored, even if
      `allowed_lifetime_min` and `allowed_lifetime_max` are set, because capping a
      room's policy to these values is done after the policies are retrieved from
      Synapse's database (which is done using the range specified in a purge job's
      configuration).
    
    Example configuration:
    ```yaml
    retention:
      enabled: true
      default_policy:
        min_lifetime: 1d
        max_lifetime: 1y
      allowed_lifetime_min: 1d
      allowed_lifetime_max: 1y
      purge_jobs:
        - longest_max_lifetime: 3d
          interval: 12h
        - shortest_max_lifetime: 3d
          interval: 1d  
    ```
    ---
    ## TLS ##
    
    Options related to TLS.
    
    ---
    Config option: `tls_certificate_path`
    
    This option specifies a PEM-encoded X509 certificate for TLS.
    This certificate, as of Synapse 1.0, will need to be a valid and verifiable
    certificate, signed by a recognised Certificate Authority. Defaults to none. 
    
    Be sure to use a `.pem` file that includes the full certificate chain including
    any intermediate certificates (for instance, if using certbot, use
    `fullchain.pem` as your certificate, not `cert.pem`). 
    
    Example configuration:
    ```yaml
    tls_certificate_path: "CONFDIR/SERVERNAME.tls.crt"
    ```
    ---
    Config option: `tls_private_key_path`
    
    PEM-encoded private key for TLS. Defaults to none. 
    
    Example configuration:
    ```yaml
    tls_private_key_path: "CONFDIR/SERVERNAME.tls.key"
    ```
    ---
    Config option: `federation_verify_certificates`
    Whether to verify TLS server certificates for outbound federation requests.
    
    Defaults to true. To disable certificate verification, set the option to false.
    
    Example configuration:
    ```yaml
    federation_verify_certificates: false
    ```
    ---
    Config option: `federation_client_minimum_tls_version`
    
    The minimum TLS version that will be used for outbound federation requests.
    
    Defaults to `1`. Configurable to `1`, `1.1`, `1.2`, or `1.3`. Note
    that setting this value higher than `1.2` will prevent federation to most
    of the public Matrix network: only configure it to `1.3` if you have an
    entirely private federation setup and you can ensure TLS 1.3 support.
    
    Example configuration:
    ```yaml
    federation_client_minimum_tls_version: 1.2
    ```
    ---
    Config option: `federation_certificate_verification_whitelist`
    
    Skip federation certificate verification on a given whitelist
    of domains.
    
    This setting should only be used in very specific cases, such as
    federation over Tor hidden services and similar. For private networks
    of homeservers, you likely want to use a private CA instead.
    
    Only effective if `federation_verify_certicates` is `true`.
    
    Example configuration:
    ```yaml
    federation_certificate_verification_whitelist:
      - lon.example.com
      - "*.domain.com"
      - "*.onion"
    ```
    ---
    Config option: `federation_custom_ca_list`
    
    List of custom certificate authorities for federation traffic.
    
    This setting should only normally be used within a private network of
    homeservers.
    
    Note that this list will replace those that are provided by your
    operating environment. Certificates must be in PEM format.
    
    Example configuration:
    ```yaml
    federation_custom_ca_list:
      - myCA1.pem
      - myCA2.pem
      - myCA3.pem
    ```
    ---
    ## Federation ##
    
    Options related to federation.
    
    ---
    Config option: `federation_domain_whitelist`
    
    Restrict federation to the given whitelist of domains.
    N.B. we recommend also firewalling your federation listener to limit
    inbound federation traffic as early as possible, rather than relying
    purely on this application-layer restriction.  If not specified, the
    default is to whitelist everything.
    
    Example configuration:
    ```yaml
    federation_domain_whitelist:
      - lon.example.com
      - nyc.example.com
      - syd.example.com
    ```
    ---
    Config option: `federation_metrics_domains`
    
    Report prometheus metrics on the age of PDUs being sent to and received from
    the given domains. This can be used to give an idea of "delay" on inbound
    and outbound federation, though be aware that any delay can be due to problems
    at either end or with the intermediate network.
    
    By default, no domains are monitored in this way.
    
    Example configuration:
    ```yaml
    federation_metrics_domains:
      - matrix.org
      - example.com
    ```
    ---
    Config option: `allow_profile_lookup_over_federation`
    
    Set to false to disable profile lookup over federation. By default, the
    Federation API allows other homeservers to obtain profile data of any user
    on this homeserver.
    
    Example configuration:
    ```yaml
    allow_profile_lookup_over_federation: false
    ```
    ---
    Config option: `allow_device_name_lookup_over_federation`
    
    Set this option to false to disable device display name lookup over federation. By default, the
    Federation API allows other homeservers to obtain device display names of any user
    on this homeserver.
    
    Example configuration: