# ============================================================================= # This is the official example config for conduwuit. # If you use it for your server, you will need to adjust it to your own needs. # At the very least, change the server_name field! # ============================================================================= [global] # The server_name is the pretty name of this server. It is used as a suffix for user # and room ids. Examples: matrix.org, conduit.rs # The Conduit server needs all /_matrix/ requests to be reachable at # https://your.server.name/ on port 443 (client-server) and 8448 (federation). # If that's not possible for you, you can create /.well-known files to redirect # requests (delegation). See # https://spec.matrix.org/latest/client-server-api/#getwell-knownmatrixclient # and # https://spec.matrix.org/v1.9/server-server-api/#getwell-knownmatrixserver # for more information # YOU NEED TO EDIT THIS #server_name = "your.server.name" # Servers listed here will be used to gather public keys of other servers (notary trusted key servers). # # The default behaviour for conduwuit is to attempt to query trusted key servers before querying the individual servers. # This is done for performance reasons, but if you would like to query individual servers before the notary servers # configured below, set to # # (Currently, conduwuit doesn't support batched key requests, so this list should only contain Synapse servers) # Defaults to `matrix.org` # trusted_servers = ["matrix.org"] ### Database configuration # This is the only directory where conduwuit will save its data, including media database_path = "/var/lib/matrix-conduit/" # Database backend: Only rocksdb and sqlite are supported. Please note that sqlite # will perform significantly worse than rocksdb as it is not intended to be used the # way it is by conduwuit. sqlite only exists for historical reasons. database_backend = "rocksdb" ### Network # The port(s) conduwuit will be running on. You need to set up a reverse proxy such as # Caddy or Nginx so all requests to /_matrix on port 443 and 8448 will be # forwarded to the conduwuit instance running on this port # Docker users: Don't change this, you'll need to map an external port to this. # To listen on multiple ports, specify a vector e.g. [8080, 8448] port = 6167 # default address (IPv4 or IPv6) conduwuit will listen on. Generally you want this to be # localhost (127.0.0.1 / ::1). If you are using Docker or a container NAT networking setup, you # likely need this to be 0.0.0.0. address = "127.0.0.1" # How many requests conduwuit sends to other servers at the same time concurrently. Default is 500 # Note that because conduwuit is very fast unlike other homeserver implementations, setting this too # high could inadvertently result in ratelimits kicking in, or overloading lower-end homeservers out there. # # A valid use-case for enabling this is if you have a significant amount of overall federation activity # such as many rooms joined/tracked, and many servers in the true destination cache caused by that. Upon # rebooting conduwuit, depending on how fast your resources are, client and incoming federation requests # may timeout or be "stalled" for a period of time due to hitting the max concurrent requests limit from # refreshing federation/destination caches and such. # # If you have a lot of active users on your homeserver, you will definitely need to raise this. # # No this will not speed up room joins. #max_concurrent_requests = 500 # Max request size for file uploads max_request_size = 20_000_000 # in bytes # Uncomment unix_socket_path to listen on a UNIX socket at the specified path. # If listening on a UNIX socket, you must remove/comment the 'address' key if defined and add your # reverse proxy to the 'conduwuit' group, unless world RW permissions are specified with unix_socket_perms (666 minimum). #unix_socket_path = "/run/conduwuit/conduwuit.sock" #unix_socket_perms = 660 # Set this to true for conduwuit to compress HTTP response bodies using zstd. # This option does nothing if conduwuit was not built with `zstd_compression` feature. # Please be aware that enabling HTTP compression may weaken or even defeat TLS. # Most users should not need to enable this. # See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before deciding to enable this. zstd_compression = false # Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you do not want conduwuit to send outbound requests to. # Defaults to RFC1918, unroutable, loopback, multicast, and testnet addresses for security. # # To disable, set this to be an empty vector (`[]`). # Please be aware that this is *not* a guarantee. You should be using a firewall with zones as doing this on the application layer may have bypasses. # # Currently this does not account for proxies in use like Synapse does. ip_range_denylist = [ "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", ] ### Moderation / Privacy / Security # Set to true to allow user type "guest" registrations. Element attempts to register guest users automatically. # For private homeservers, this is best at false. allow_guest_registration = false # Vector list of servers that conduwuit will refuse to download remote media from. # No default. # prevent_media_downloads_from = ["example.com", "example.local"] # Enables registration. If set to false, no users can register on this # server. # If set to true without a token configured, users can register with no form of 2nd- # step only if you set # `yes_i_am_very_very_sure_i_want_an_open_registration_server_prone_to_abuse` to # true in your config. If you would like # registration only via token reg, please configure the `registration_token` key. allow_registration = false # Please note that an open registration homeserver with no second-step verification # is highly prone to abuse and potential defederation by homeservers, including # matrix.org. # A static registration token that new users will have to provide when creating # an account. If unset and `allow_registration` is true, registration is open # without any condition. YOU NEED TO EDIT THIS. registration_token = "change this token for something specific to your server" # controls whether federation is allowed or not # defaults to true # allow_federation = true # controls whether users are allowed to create rooms. # appservices and admins are always allowed to create rooms # defaults to true # allow_room_creation = true # controls whether non-admin local users are forbidden from sending room invites (local and remote), # and if non-admin users can receive remote room invites. admins are always allowed to send and receive all room invites. # defaults to false # block_non_admin_invites = false # List of forbidden username patterns/strings. Values in this list are matched as *contains*. # This is checked upon username availability check, registration, and startup as warnings if any local users in your database # have a forbidden username. # No default. # forbidden_usernames = [] # List of forbidden room aliases and room IDs as patterns/strings. Values in this list are matched as *contains*. # This is checked upon room alias creation, custom room ID creation if used, and startup as warnings if any room aliases # in your database have a forbidden room alias/ID. # No default. # forbidden_alias_names = [] # Set this to true to allow your server's public room directory to be federated. # Set this to false to protect against /publicRooms spiders, but will forbid external users # from viewing your server's public room directory. If federation is disabled entirely # (`allow_federation`), this is inherently false. allow_public_room_directory_over_federation = false # Set this to true to allow your server's public room directory to be queried without client # authentication (access token) through the Client APIs. Set this to false to protect against /publicRooms spiders. allow_public_room_directory_without_auth = false # Set this to true to allow federating device display names / allow external users to see your device display name. # If federation is disabled entirely (`allow_federation`), this is inherently false. For privacy, this is best disabled. allow_device_name_federation = false # Vector list of domains allowed to send requests to for URL previews. Defaults to none. # Note: this is a *contains* match, not an explicit match. Putting "google.com" will match "https://google.com" and "http://mymaliciousdomainexamplegoogle.com" # Setting this to "*" will allow all URL previews. Please note that this opens up significant attack surface to your server, you are expected to be aware of the risks by doing so. url_preview_domain_contains_allowlist = [] # Vector list of explicit domains allowed to send requests to for URL previews. Defaults to none. # Note: This is an *explicit* match, not a ccontains match. Putting "google.com" will match "https://google.com", "http://google.com", but not "https://mymaliciousdomainexamplegoogle.com" # Setting this to "*" will allow all URL previews. Please note that this opens up significant attack surface to your server, you are expected to be aware of the risks by doing so. url_preview_domain_explicit_allowlist = [] # Vector list of URLs allowed to send requests to for URL previews. Defaults to none. # Note that this is a *contains* match, not an explicit match. Putting "google.com" will match "https://google.com/", "https://google.com/url?q=https://mymaliciousdomainexample.com", and "https://mymaliciousdomainexample.com/hi/google.com" # Setting this to "*" will allow all URL previews. Please note that this opens up significant attack surface to your server, you are expected to be aware of the risks by doing so. url_preview_url_contains_allowlist = [] # Maximum amount of bytes allowed in a URL preview body size when spidering. Defaults to 1MB (1_000_000 bytes) url_preview_max_spider_size = 1_000_000 # Option to decide whether you would like to run the domain allowlist checks (contains and explicit) on the root domain or not. Does not apply to URL contains allowlist. Defaults to false. # Example: If this is enabled and you have "wikipedia.org" allowed in the explicit and/or contains domain allowlist, it will allow all subdomains under "wikipedia.org" such as "en.m.wikipedia.org" as the root domain is checked and matched. # Useful if the domain contains allowlist is still too broad for you but you still want to allow all the subdomains under a root domain. url_preview_check_root_domain = false ### Misc # max log level for conduwuit. allows debug, info, warn, or error # see also: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives # Defaults to "warn" #log = "warn" # controls whether encrypted rooms and events are allowed (default true) #allow_encryption = false # if enabled, conduwuit will send a simple GET request periodically to `https://pupbrain.dev/check-for-updates/stable` # for any new announcements made. Despite the name, this is not an update check # endpoint, it is simply an announcement check endpoint. # Defaults to false. #allow_check_for_updates = false # If you are using delegation via well-known files and you cannot serve them from your reverse proxy, you can # uncomment these to serve them directly from conduwuit. This requires proxying all requests to conduwuit, not just `/_matrix` to work. #well_known_server = "matrix.example.com:443" #well_known_client = "https://matrix.example.com" # Note that whatever you put will show up in the well-known JSON values. # Set to false to disable users from joining or creating room versions that aren't 100% officially supported by conduwuit. # conduwuit officially supports room versions 6 - 10. conduwuit has experimental/unstable support for 3 - 5, and 11. # Defaults to true. #allow_unstable_room_versions = true # Option to control adding arbitrary text to the end of the user's displayname upon registration with a space before the text. # This was the lightning bolt emoji option, just replaced with support for adding your own custom text or emojis. # To disable, set this to "" (an empty string) # Defaults to "🏳️‍⚧️" (trans pride flag) #new_user_displayname_suffix = "🏳️‍⚧️" # Option to control whether conduwuit will query your list of trusted notary key servers (`trusted_servers`) for # remote homeserver signing keys it doesn't know *first*, or query the individual servers first before falling back to the trusted # key servers. # # The former/default behaviour makes federated/remote rooms joins generally faster because we're querying a single (or list of) server # that we know works, is reasonably fast, and is reliable for just about all the homeserver signing keys in the room. Querying individual # servers may take longer depending on the general infrastructure of everyone in there, how many dead servers there are, etc. # # However, this does create an increased reliance on one single or multiple large entities as `trusted_servers` should generally # contain long-term and large servers who know a very large number of homeservers. # # If you don't know what any of this means, leave this and `trusted_servers` alone to their defaults. # # Defaults to true as this is the fastest option for federation. #query_trusted_key_servers_first = true # List/vector of room **IDs** that conduwuit will make newly registered users join. # The room IDs specified must be rooms that you have joined at least once on the server, and must be public. # # No default. #auto_join_rooms = [] ### Generic database options # Set this to any float value to multiply conduwuit's in-memory LRU caches with. # May be useful if you have significant memory to spare to increase performance. # Defaults to 1.0. #conduit_cache_capacity_modifier = 1.0 # Set this to any float value in megabytes for conduwuit to tell the database engine that this much memory is available for database-related caches. # May be useful if you have significant memory to spare to increase performance. # Defaults to 256.0 #db_cache_capacity_mb = 256.0 # Interval in seconds when conduwuit will run database cleanup operations. # # For SQLite: this will flush the WAL by executing `PRAGMA wal_checkpoint(RESTART)` (https://www.sqlite.org/pragma.html#pragma_wal_checkpoint) # For RocksDB: this will run `flush_opt` to flush database memtables to SST files on disk (https://docs.rs/rocksdb/latest/rocksdb/struct.DBCommon.html#method.flush_opt) # These operations always run on shutdown. # # Defaults to 30 minutes (1800 seconds) to avoid IO amplification from too frequent cleanups #cleanup_second_interval = 1800 ### RocksDB options # Set this to true to use RocksDB config options that are tailored to HDDs (slower device storage) # # It is worth noting that by default, conduwuit will use RocksDB with Direct IO enabled. *Generally* speaking this improves performance as it bypasses buffered I/O (system page cache). # However there is a potential chance that Direct IO may cause issues with database operations if your setup is uncommon. This has been observed with FUSE filesystems, and possibly ZFS filesystem. # RocksDB generally deals/corrects these issues but it cannot account for all setups. # If you experience any weird RocksDB issues, try enabling this option as it turns off Direct IO and feel free to report in the conduwuit Matrix room if this option fixes your DB issues. # See https://github.com/facebook/rocksdb/wiki/Direct-IO for more information. # # Defaults to false #rocksdb_optimize_for_spinning_disks = false # RocksDB log level. This is not the same as conduwuit's log level. This is the log level for the RocksDB engine/library # which show up in your database folder/path as `LOG` files. Defaults to error. conduwuit will typically log RocksDB errors as normal. #rocksdb_log_level = "error" # Max RocksDB `LOG` file size before rotating in bytes. Defaults to 4MB. #rocksdb_max_log_file_size = 4194304 # Time in seconds before RocksDB will forcibly rotate logs. Defaults to 0. #rocksdb_log_time_to_roll = 0 # Amount of threads that RocksDB will use for parallelism. Set to 0 to use all your physical cores. # Conduit eagerly spawns threads mainly for federation, so it may not be desirable to use all your cores / logical threads. # # Defaults to your CPU physical core count (not logical threads). #rocksdb_parallelism_threads = 0 # Maximum number of LOG files RocksDB will keep. This must *not* be set to 0. It must be at least 1. # Defaults to 3 as these are not very useful. #rocksdb_max_log_files = 3 # Type of RocksDB database compression to use. # Available options are "zstd", "zlib", "bz2" and "lz4" # It is best to use ZSTD as an overall good balance between speed/performance, storage, IO amplification, and CPU usage. # For more performance but less compression (more storage used) and less CPU usage, use LZ4. # See https://github.com/facebook/rocksdb/wiki/Compression for more details. # # Defaults to "zstd" #rocksdb_compression_algo = "zstd" # Level of compression the specified compression algorithm for RocksDB to use. # Default is 32767, which is internally read by RocksDB as the default magic number and # translated to the library's default compression level as they all differ. # See their `kDefaultCompressionLevel`. # #rocksdb_compression_level = 32767 # Level of compression the specified compression algorithm for the bottommost level/data for RocksDB to use. # Default is 32767, which is internally read by RocksDB as the default magic number and # translated to the library's default compression level as they all differ. # See their `kDefaultCompressionLevel`. # # Since this is the bottommost level (generally old and least used data), it may be desirable to have a very # high compression level here as it's lesss likely for this data to be used. Research your chosen compression algorithm. # #rocksdb_bottommost_compression_level = 32767 # Whether to enable RocksDB "bottommost_compression". # At the expense of more CPU usage, this will further compress the database to reduce more storage. # It is recommended to use ZSTD compression with this for best compression results. # See https://github.com/facebook/rocksdb/wiki/Compression for more details. # # Defaults to false as this uses more CPU when compressing. #rocksdb_bottommost_compression = false ### Request Timeouts, Connection Timeouts, and Connection Pooling ## Request Timeouts are HTTP response timeouts ## Connection Timeouts are TCP connection timeouts ## ## Connection Pooling Timeouts are timeouts for keeping an open idle connection alive. ## Connection pooling and keepalive is very useful for federation or other places where for performance reasons, ## we want to keep connections open that we will re-use frequently due to TCP and TLS 1.3 overhead/expensiveness. ## ## Generally these defaults are the best, but if you find a reason to need to change these they are here. # Default/base connection timeout # This is used only by URL previews and update/news endpoint checks # # Defaults to 10 seconds #request_conn_timeout = 10 # Default/base request timeout # This is used only by URL previews and update/news endpoint checks # # Defaults to 35 seconds #request_timeout = 35 # Default/base max idle connections per host # This is used only by URL previews and update/news endpoint checks # # Defaults to 1 as generally the same open connection can be re-used #request_idle_per_host = 1 # Default/base idle connection pool timeout # This is used only by URL previews and update/news endpoint checks # # Defaults to 5 seconds #request_idle_timeout = 5 # Federation well-known resolution connection timeout # # Defaults to 6 seconds #well_known_conn_timeout = 6 # Federation HTTP well-known resolution request timeout # # Defaults to 10 seconds #well_known_timeout = 10 # Federation client/server request timeout # You most definitely want this to be high to account for extremely large room joins, slow homeservers, your own resources etc. # # Defaults to 300 seconds #federation_timeout # Federation client/sender max idle connections per host # # Defaults to 1 as generally the same open connection can be re-used #federation_idle_per_host = 1 # Federation client/sender idle connection pool timeout # # Defaults to 25 seconds #federation_idle_timeout = 25 # Appservice URL request connection timeout # # Defaults to 120 seconds #appservice_timeout = 120 # Appservice URL idle connection pool timeout # # Defaults to 300 seconds #appservice_idle_timeout = 300 # Notification gateway pusher idle connection pool timeout # # Defaults to 15 seconds #pusher_idle_timeout = 15 ### Presence / Typing Indicators / Read Receipts # Config option to control local (your server only) presence updates/requests. Defaults to false. # Note that presence on conduwuit is very fast unlike Synapse's. # If using outgoing presence, this MUST be enabled. #allow_local_presence = false # Config option to control incoming federated presence updates/requests. Defaults to false. # This option receives presence updates from other servers, but does not send any unless `allow_outgoing_presence` is true. # Note that presence on conduwuit is very fast unlike Synapse's. #allow_incoming_presence = false # Config option to control outgoing presence updates/requests. Defaults to false. # This option sends presence updates to other servers, but does not receive any unless `allow_incoming_presence` is true. # Note that presence on conduwuit is very fast unlike Synapse's. # If using outgoing presence, you MUST enable `allow_local_presence` as well. # # Warning: Outgoing federated presence is not spec compliant due to relying on PDUs and EDUs combined. # Outgoing presence will not be very reliable due to this and any issues with federated outgoing presence are very likely attributed to this issue. # Incoming presence and local presence are unaffected. #allow_outgoing_presence = false # Config option to control how many seconds before presence updates that you are idle. Defaults to 5 minutes. #presence_idle_timeout_s = 300 # Config option to control how many seconds before presence updates that you are offline. Defaults to 30 minutes. #presence_offline_timeout_s = 1800 # Config option to control whether we should receive remote incoming read receipts. # Defaults to true. #allow_incoming_read_receipts = true # Other options not in [global]: # # # Enables running conduwuit with direct TLS support # It is strongly recommended you use a reverse proxy instead. This is primarily relevant for test suites like complement that require a private CA setup. # [global.tls] # certs = "/path/to/my/certificate.crt" # key = "/path/to/my/private_key.key" # # Whether to listen and allow for HTTP and HTTPS connections (insecure!) # This config option is only available if conduwuit was built with `axum_dual_protocol` feature (not default feature) # Defaults to false #dual_protocol = false