Compare commits

..

14 commits

Author SHA1 Message Date
nexy7574
f840372c92 Always calculate state diff IDs in syncv3
Some checks failed
Release Docker Image / define-variables (push) Failing after 1s
Release Docker Image / build-image (linux/amd64, linux-amd64) (push) Has been skipped
Release Docker Image / build-image (linux/arm64, linux-arm64) (push) Has been skipped
Release Docker Image / merge (push) Has been skipped
Rust Checks / Format (push) Failing after 2s
Rust Checks / Clippy (push) Failing after 17s
Rust Checks / Cargo Test (push) Failing after 10s
seemingly fixes #779
2025-05-26 11:41:43 -07:00
Jacob Taylor
f4b93e6fbf upgrade some settings
cache maxxing
2025-05-26 11:41:39 -07:00
Jacob Taylor
66e6d09acc add futures::FutureExt to make cba9ee5240 work 2025-05-26 11:41:34 -07:00
Jason Volk
9d9495d957 Mitigate large futures
Signed-off-by: Jason Volk <jason@zemos.net>
2025-05-26 11:41:30 -07:00
Jacob Taylor
b735ad0cf2 bump the number of allowed immutable memtables by 1, to allow for greater flood protection 2025-05-26 11:41:22 -07:00
Jacob Taylor
7ab623d694 probably incorrectly delete support for non-standardized matrix srv record 2025-05-26 11:41:06 -07:00
Jacob Taylor
d5b3755242 Fix spaces rooms list load error. rev2 2025-05-26 11:40:57 -07:00
Jade Ellis
3c44dccd65
ci: HACK, disable saving to actions cache
Some checks failed
Documentation / Build and Deploy Documentation (push) Failing after 3s
Release Docker Image / define-variables (push) Failing after 1s
Release Docker Image / build-image (linux/amd64, linux-amd64) (push) Has been skipped
Release Docker Image / build-image (linux/arm64, linux-arm64) (push) Has been skipped
Release Docker Image / merge (push) Has been skipped
Rust Checks / Format (push) Failing after 1s
Rust Checks / Clippy (push) Failing after 9s
Rust Checks / Cargo Test (push) Failing after 9s
2025-05-26 19:16:50 +01:00
Jade Ellis
b57be072c7
build: Don't rerun on git changes 2025-05-26 19:16:05 +01:00
Jade Ellis
ea5dc8e09d
fix: Use correct brand in clap version string 2025-05-26 19:16:05 +01:00
Jade Ellis
b9d60c64e5
ci: Don't specify container for image builder 2025-05-26 19:16:04 +01:00
Jade Ellis
94ae824149
ci: Don't install rustup if it's already there 2025-05-26 19:16:03 +01:00
Jade Ellis
640714922b
feat: For knock_restricted rooms, automatically join rooms we meet
restrictions for rather than knocking
2025-05-26 19:16:03 +01:00
Jade Ellis
2b268fdaf3
fix: Allow joining via invite for knock_restricted rooms 2025-05-26 19:16:01 +01:00
19 changed files with 605 additions and 581 deletions

View file

@ -19,11 +19,20 @@ outputs:
rustc_version: rustc_version:
description: The rustc version installed description: The rustc version installed
value: ${{ steps.rustc-version.outputs.version }} value: ${{ steps.rustc-version.outputs.version }}
rustup_version:
description: The rustup version installed
value: ${{ steps.rustup-version.outputs.version }}
runs: runs:
using: composite using: composite
steps: steps:
- name: Check if rustup is already installed
shell: bash
id: rustup-version
run: |
echo "version=$(rustup --version)" >> $GITHUB_OUTPUT
- name: Cache rustup toolchains - name: Cache rustup toolchains
if: steps.rustup-version.outputs.version == ''
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
path: | path: |
@ -33,6 +42,7 @@ runs:
# Requires repo to be cloned if toolchain is not specified # Requires repo to be cloned if toolchain is not specified
key: ${{ runner.os }}-rustup-${{ inputs.toolchain || hashFiles('**/rust-toolchain.toml') }} key: ${{ runner.os }}-rustup-${{ inputs.toolchain || hashFiles('**/rust-toolchain.toml') }}
- name: Install Rust toolchain - name: Install Rust toolchain
if: steps.rustup-version.outputs.version == ''
shell: bash shell: bash
run: | run: |
if ! command -v rustup &> /dev/null ; then if ! command -v rustup &> /dev/null ; then

View file

@ -3,7 +3,6 @@ concurrency:
group: "release-image-${{ github.ref }}" group: "release-image-${{ github.ref }}"
on: on:
pull_request:
push: push:
paths-ignore: paths-ignore:
- "*.md" - "*.md"
@ -58,7 +57,6 @@ jobs:
build-image: build-image:
runs-on: dind runs-on: dind
container: ghcr.io/catthehacker/ubuntu:act-latest
needs: define-variables needs: define-variables
permissions: permissions:
contents: read contents: read
@ -80,28 +78,14 @@ jobs:
run: echo '${{ toJSON(fromJSON(needs.define-variables.outputs.build_matrix)) }}' run: echo '${{ toJSON(fromJSON(needs.define-variables.outputs.build_matrix)) }}'
- name: Echo matrix - name: Echo matrix
run: echo '${{ toJSON(matrix) }}' run: echo '${{ toJSON(matrix) }}'
- run: |
if ! command -v rustup &> /dev/null ; then
curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused -fsSL "https://sh.rustup.rs" | sh -s -- --default-toolchain none -y
echo "${CARGO_HOME:-$HOME/.cargo}/bin" >> $GITHUB_PATH
fi
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
persist-credentials: false persist-credentials: false
- name: Install rust
- name: Cache timelord-cli installation id: rust-toolchain
id: cache-timelord-bin uses: ./.forgejo/actions/rust-toolchain
uses: actions/cache@v3
with:
path: ~/.cargo/bin/timelord
key: timelord-cli-v3.0.1
- name: Install timelord-cli
uses: https://github.com/cargo-bins/cargo-binstall@main
if: steps.cache-timelord-bin.outputs.cache-hit != 'true'
- run: cargo binstall timelord-cli@3.0.1
if: steps.cache-timelord-bin.outputs.cache-hit != 'true'
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
@ -136,18 +120,58 @@ jobs:
echo "COMMIT_SHORT_SHA=$calculatedSha" >> $GITHUB_ENV echo "COMMIT_SHORT_SHA=$calculatedSha" >> $GITHUB_ENV
- name: Get Git commit timestamps - name: Get Git commit timestamps
run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV
- name: Set up timelord
uses: actions/cache/restore@v3 - uses: ./.forgejo/actions/timelord
with: with:
path: /timelord/
key: timelord-v0 # Cache is already split per runner
- name: Run timelord to set timestamps
run: timelord sync --source-dir . --cache-dir /timelord/
- name: Save timelord
uses: actions/cache/save@v3
with:
path: /timelord/
key: timelord-v0 key: timelord-v0
path: .
- name: Cache Rust registry
uses: actions/cache@v3
with:
path: |
.cargo/git
.cargo/git/checkouts
.cargo/registry
.cargo/registry/src
key: rust-registry-image-${{hashFiles('**/Cargo.lock') }}
- name: Cache cargo target
id: cache-cargo-target
uses: actions/cache@v3
with:
path: |
cargo-target-${{ matrix.slug }}
key: cargo-target-${{ matrix.slug }}-${{hashFiles('**/Cargo.lock') }}-${{steps.rust-toolchain.outputs.rustc_version}}
- name: Cache apt cache
id: cache-apt
uses: actions/cache@v3
with:
path: |
var-cache-apt-${{ matrix.slug }}
key: var-cache-apt-${{ matrix.slug }}
- name: Cache apt lib
id: cache-apt-lib
uses: actions/cache@v3
with:
path: |
var-lib-apt-${{ matrix.slug }}
key: var-lib-apt-${{ matrix.slug }}
- name: inject cache into docker
uses: https://github.com/reproducible-containers/buildkit-cache-dance@v3.1.0
with:
cache-map: |
{
".cargo/registry": "/usr/local/cargo/registry",
".cargo/git/db": "/usr/local/cargo/git/db",
"cargo-target-${{ matrix.slug }}": {
"target": "/app/target",
"id": "cargo-target-${{ matrix.platform }}"
},
"var-cache-apt-${{ matrix.slug }}": "/var/cache/apt",
"var-lib-apt-${{ matrix.slug }}": "/var/lib/apt"
}
skip-extraction: ${{ steps.cache.outputs.cache-hit }}
- name: Build and push Docker image by digest - name: Build and push Docker image by digest
id: build id: build
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
@ -163,7 +187,7 @@ jobs:
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
annotations: ${{ steps.meta.outputs.annotations }} annotations: ${{ steps.meta.outputs.annotations }}
cache-from: type=gha cache-from: type=gha
cache-to: type=gha,mode=max # cache-to: type=gha,mode=max
sbom: true sbom: true
outputs: type=image,"name=${{ needs.define-variables.outputs.images_list }}",push-by-digest=true,name-canonical=true,push=true outputs: type=image,"name=${{ needs.define-variables.outputs.images_list }}",push-by-digest=true,name-canonical=true,push=true
env: env:
@ -186,7 +210,6 @@ jobs:
merge: merge:
runs-on: dind runs-on: dind
container: ghcr.io/catthehacker/ubuntu:act-latest
needs: [define-variables, build-image] needs: [define-variables, build-image]
steps: steps:
- name: Download digests - name: Download digests

View file

@ -1,5 +1,9 @@
[files]
extend-exclude = ["*.csr"]
[default.extend-words] [default.extend-words]
"allocatedp" = "allocatedp" "allocatedp" = "allocatedp"
"conduwuit" = "conduwuit" "conduwuit" = "conduwuit"
"continuwuity" = "continuwuity" "continuwuity" = "continuwuity"
"continuwity" = "continuwuity"
"execuse" = "execuse" "execuse" = "execuse"

476
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -298,7 +298,7 @@ version = "1.15.0"
default-features = false default-features = false
features = ["serde"] features = ["serde"]
# Used for reading the configuration from conduwuit.toml & environment variables # Used for reading the configuration from continuwuity.toml & environment variables
[workspace.dependencies.figment] [workspace.dependencies.figment]
version = "0.10.19" version = "0.10.19"
default-features = false default-features = false
@ -745,7 +745,6 @@ incremental = true
[profile.dev.package.conduwuit_core] [profile.dev.package.conduwuit_core]
inherits = "dev" inherits = "dev"
incremental = false
#rustflags = [ #rustflags = [
# '--cfg', 'conduwuit_mods', # '--cfg', 'conduwuit_mods',
# '-Ztime-passes', # '-Ztime-passes',
@ -785,7 +784,6 @@ inherits = "dev"
[profile.dev.package.'*'] [profile.dev.package.'*']
inherits = "dev" inherits = "dev"
debug = 'limited' debug = 'limited'
incremental = false
codegen-units = 1 codegen-units = 1
opt-level = 'z' opt-level = 'z'
#rustflags = [ #rustflags = [
@ -807,7 +805,6 @@ inherits = "dev"
strip = false strip = false
opt-level = 0 opt-level = 0
codegen-units = 16 codegen-units = 16
incremental = false
[profile.test.package.'*'] [profile.test.package.'*']
inherits = "dev" inherits = "dev"
@ -815,7 +812,6 @@ debug = 0
strip = false strip = false
opt-level = 0 opt-level = 0
codegen-units = 16 codegen-units = 16
incremental = false
############################################################################### ###############################################################################
# #
@ -992,3 +988,6 @@ let_underscore_future = { level = "allow", priority = 1 }
# rust doesnt understand conduwuit's custom log macros # rust doesnt understand conduwuit's custom log macros
literal_string_with_formatting_args = { level = "allow", priority = 1 } literal_string_with_formatting_args = { level = "allow", priority = 1 }
needless_raw_string_hashes = "allow"

View file

@ -1,4 +1,4 @@
### conduwuit Configuration ### continuwuity Configuration
### ###
### THIS FILE IS GENERATED. CHANGES/CONTRIBUTIONS IN THE REPO WILL BE ### THIS FILE IS GENERATED. CHANGES/CONTRIBUTIONS IN THE REPO WILL BE
### OVERWRITTEN! ### OVERWRITTEN!
@ -13,7 +13,7 @@
### that say "YOU NEED TO EDIT THIS". ### that say "YOU NEED TO EDIT THIS".
### ###
### For more information, see: ### For more information, see:
### https://conduwuit.puppyirl.gay/configuration.html ### https://continuwuity.org/configuration.html
[global] [global]
@ -21,7 +21,7 @@
# suffix for user and room IDs/aliases. # suffix for user and room IDs/aliases.
# #
# See the docs for reverse proxying and delegation: # See the docs for reverse proxying and delegation:
# https://conduwuit.puppyirl.gay/deploying/generic.html#setting-up-the-reverse-proxy # https://continuwuity.org/deploying/generic.html#setting-up-the-reverse-proxy
# #
# Also see the `[global.well_known]` config section at the very bottom. # Also see the `[global.well_known]` config section at the very bottom.
# #
@ -32,11 +32,11 @@
# YOU NEED TO EDIT THIS. THIS CANNOT BE CHANGED AFTER WITHOUT A DATABASE # YOU NEED TO EDIT THIS. THIS CANNOT BE CHANGED AFTER WITHOUT A DATABASE
# WIPE. # WIPE.
# #
# example: "conduwuit.woof" # example: "continuwuity.org"
# #
#server_name = #server_name =
# The default address (IPv4 or IPv6) conduwuit will listen on. # The default address (IPv4 or IPv6) continuwuity will listen on.
# #
# If you are using Docker or a container NAT networking setup, this must # If you are using Docker or a container NAT networking setup, this must
# be "0.0.0.0". # be "0.0.0.0".
@ -46,10 +46,10 @@
# #
#address = ["127.0.0.1", "::1"] #address = ["127.0.0.1", "::1"]
# The port(s) conduwuit will listen on. # The port(s) continuwuity will listen on.
# #
# For reverse proxying, see: # For reverse proxying, see:
# https://conduwuit.puppyirl.gay/deploying/generic.html#setting-up-the-reverse-proxy # https://continuwuity.org/deploying/generic.html#setting-up-the-reverse-proxy
# #
# If you are using Docker, don't change this, you'll need to map an # If you are using Docker, don't change this, you'll need to map an
# external port to this. # external port to this.
@ -58,16 +58,17 @@
# #
#port = 8008 #port = 8008
# The UNIX socket conduwuit will listen on. # The UNIX socket continuwuity will listen on.
# #
# conduwuit cannot listen on both an IP address and a UNIX socket. If # continuwuity cannot listen on both an IP address and a UNIX socket. If
# listening on a UNIX socket, you MUST remove/comment the `address` key. # listening on a UNIX socket, you MUST remove/comment the `address` key.
# #
# Remember to make sure that your reverse proxy has access to this socket # Remember to make sure that your reverse proxy has access to this socket
# file, either by adding your reverse proxy to the 'conduwuit' group or # file, either by adding your reverse proxy to the appropriate user group
# granting world R/W permissions with `unix_socket_perms` (666 minimum). # or granting world R/W permissions with `unix_socket_perms` (666
# minimum).
# #
# example: "/run/conduwuit/conduwuit.sock" # example: "/run/continuwuity/continuwuity.sock"
# #
#unix_socket_path = #unix_socket_path =
@ -75,23 +76,23 @@
# #
#unix_socket_perms = 660 #unix_socket_perms = 660
# This is the only directory where conduwuit will save its data, including # This is the only directory where continuwuity will save its data,
# media. Note: this was previously "/var/lib/matrix-conduit". # including media. Note: this was previously "/var/lib/matrix-conduit".
# #
# YOU NEED TO EDIT THIS. # YOU NEED TO EDIT THIS.
# #
# example: "/var/lib/conduwuit" # example: "/var/lib/continuwuity"
# #
#database_path = #database_path =
# conduwuit supports online database backups using RocksDB's Backup engine # continuwuity supports online database backups using RocksDB's Backup
# API. To use this, set a database backup path that conduwuit can write # engine API. To use this, set a database backup path that continuwuity
# to. # can write to.
# #
# For more information, see: # For more information, see:
# https://conduwuit.puppyirl.gay/maintenance.html#backups # https://continuwuity.org/maintenance.html#backups
# #
# example: "/opt/conduwuit-db-backups" # example: "/opt/continuwuity-db-backups"
# #
#database_backup_path = #database_backup_path =
@ -112,14 +113,14 @@
# #
#new_user_displayname_suffix = "🏳️‍⚧️" #new_user_displayname_suffix = "🏳️‍⚧️"
# If enabled, conduwuit will send a simple GET request periodically to # If enabled, continuwuity will send a simple GET request periodically to
# `https://continuwuity.org/.well-known/continuwuity/announcements` for any new # `https://continuwuity.org/.well-known/continuwuity/announcements` for any new
# announcements or major updates. This is not an update check endpoint. # announcements or major updates. This is not an update check endpoint.
# #
#allow_announcements_check = true #allow_announcements_check = true
# Set this to any float value to multiply conduwuit's in-memory LRU caches # Set this to any float value to multiply continuwuity's in-memory LRU
# with such as "auth_chain_cache_capacity". # caches with such as "auth_chain_cache_capacity".
# #
# May be useful if you have significant memory to spare to increase # May be useful if you have significant memory to spare to increase
# performance. # performance.
@ -131,7 +132,7 @@
# #
#cache_capacity_modifier = 1.0 #cache_capacity_modifier = 1.0
# Set this to any float value in megabytes for conduwuit to tell the # Set this to any float value in megabytes for continuwuity to tell the
# database engine that this much memory is available for database read # database engine that this much memory is available for database read
# caches. # caches.
# #
@ -145,7 +146,7 @@
# #
#db_cache_capacity_mb = varies by system #db_cache_capacity_mb = varies by system
# Set this to any float value in megabytes for conduwuit to tell the # Set this to any float value in megabytes for continuwuity to tell the
# database engine that this much memory is available for database write # database engine that this much memory is available for database write
# caches. # caches.
# #
@ -250,9 +251,9 @@
# Enable using *only* TCP for querying your specified nameservers instead # Enable using *only* TCP for querying your specified nameservers instead
# of UDP. # of UDP.
# #
# If you are running conduwuit in a container environment, this config # If you are running continuwuity in a container environment, this config
# option may need to be enabled. For more details, see: # option may need to be enabled. For more details, see:
# https://conduwuit.puppyirl.gay/troubleshooting.html#potential-dns-issues-when-using-docker # https://continuwuity.org/troubleshooting.html#potential-dns-issues-when-using-docker
# #
#query_over_tcp_only = false #query_over_tcp_only = false
@ -418,9 +419,9 @@
# tokens. Multiple tokens can be added if you separate them with # tokens. Multiple tokens can be added if you separate them with
# whitespace # whitespace
# #
# conduwuit must be able to access the file, and it must not be empty # continuwuity must be able to access the file, and it must not be empty
# #
# example: "/etc/conduwuit/.reg_token" # example: "/etc/continuwuity/.reg_token"
# #
#registration_token_file = #registration_token_file =
@ -512,16 +513,16 @@
#allow_room_creation = true #allow_room_creation = true
# Set to false to disable users from joining or creating room versions # Set to false to disable users from joining or creating room versions
# that aren't officially supported by conduwuit. # that aren't officially supported by continuwuity.
# #
# conduwuit officially supports room versions 6 - 11. # continuwuity officially supports room versions 6 - 11.
# #
# conduwuit has slightly experimental (though works fine in practice) # continuwuity has slightly experimental (though works fine in practice)
# support for versions 3 - 5. # support for versions 3 - 5.
# #
#allow_unstable_room_versions = true #allow_unstable_room_versions = true
# Default room version conduwuit will create rooms with. # Default room version continuwuity will create rooms with.
# #
# Per spec, room version 11 is the default. # Per spec, room version 11 is the default.
# #
@ -587,7 +588,7 @@
# Servers listed here will be used to gather public keys of other servers # Servers listed here will be used to gather public keys of other servers
# (notary trusted key servers). # (notary trusted key servers).
# #
# Currently, conduwuit doesn't support inbound batched key requests, so # Currently, continuwuity doesn't support inbound batched key requests, so
# this list should only contain other Synapse servers. # this list should only contain other Synapse servers.
# #
# example: ["matrix.org", "tchncs.de"] # example: ["matrix.org", "tchncs.de"]
@ -628,7 +629,7 @@
# #
#trusted_server_batch_size = 1024 #trusted_server_batch_size = 1024
# Max log level for conduwuit. Allows debug, info, warn, or error. # Max log level for continuwuity. Allows debug, info, warn, or error.
# #
# See also: # See also:
# https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives # https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
@ -649,8 +650,9 @@
# #
#log_span_events = "none" #log_span_events = "none"
# Configures whether CONDUWUIT_LOG EnvFilter matches values using regular # Configures whether CONTINUWUITY_LOG EnvFilter matches values using
# expressions. See the tracing_subscriber documentation on Directives. # regular expressions. See the tracing_subscriber documentation on
# Directives.
# #
#log_filter_regex = true #log_filter_regex = true
@ -718,7 +720,7 @@
# This takes priority over "turn_secret" first, and falls back to # This takes priority over "turn_secret" first, and falls back to
# "turn_secret" if invalid or failed to open. # "turn_secret" if invalid or failed to open.
# #
# example: "/etc/conduwuit/.turn_secret" # example: "/etc/continuwuity/.turn_secret"
# #
#turn_secret_file = #turn_secret_file =
@ -726,12 +728,12 @@
# #
#turn_ttl = 86400 #turn_ttl = 86400
# List/vector of room IDs or room aliases that conduwuit will make newly # List/vector of room IDs or room aliases that continuwuity will make
# registered users join. The rooms specified must be rooms that you have # newly registered users join. The rooms specified must be rooms that you
# joined at least once on the server, and must be public. # have joined at least once on the server, and must be public.
# #
# example: ["#conduwuit:puppygock.gay", # example: ["#continuwuity:continuwuity.org",
# "!eoIzvAvVwY23LPDay8:puppygock.gay"] # "!main-1:continuwuity.org"]
# #
#auto_join_rooms = [] #auto_join_rooms = []
@ -754,10 +756,10 @@
# #
#auto_deactivate_banned_room_attempts = false #auto_deactivate_banned_room_attempts = false
# RocksDB log level. This is not the same as conduwuit's log level. This # RocksDB log level. This is not the same as continuwuity's log level.
# is the log level for the RocksDB engine/library which show up in your # This is the log level for the RocksDB engine/library which show up in
# database folder/path as `LOG` files. conduwuit will log RocksDB errors # your database folder/path as `LOG` files. continuwuity will log RocksDB
# as normal through tracing or panics if severe for safety. # errors as normal through tracing or panics if severe for safety.
# #
#rocksdb_log_level = "error" #rocksdb_log_level = "error"
@ -777,7 +779,7 @@
# Set this to true to use RocksDB config options that are tailored to HDDs # Set this to true to use RocksDB config options that are tailored to HDDs
# (slower device storage). # (slower device storage).
# #
# It is worth noting that by default, conduwuit will use RocksDB with # It is worth noting that by default, continuwuity will use RocksDB with
# Direct IO enabled. *Generally* speaking this improves performance as it # Direct IO enabled. *Generally* speaking this improves performance as it
# bypasses buffered I/O (system page cache). However there is a potential # bypasses buffered I/O (system page cache). However there is a potential
# chance that Direct IO may cause issues with database operations if your # chance that Direct IO may cause issues with database operations if your
@ -785,7 +787,7 @@
# possibly ZFS filesystem. RocksDB generally deals/corrects these issues # possibly ZFS filesystem. RocksDB generally deals/corrects these issues
# but it cannot account for all setups. If you experience any weird # 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 # 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 # feel free to report in the continuwuity Matrix room if this option fixes
# your DB issues. # your DB issues.
# #
# For more information, see: # For more information, see:
@ -840,7 +842,7 @@
# as they all differ. See their `kDefaultCompressionLevel`. # as they all differ. See their `kDefaultCompressionLevel`.
# #
# Note when using the default value we may override it with a setting # Note when using the default value we may override it with a setting
# tailored specifically conduwuit. # tailored specifically for continuwuity.
# #
#rocksdb_compression_level = 32767 #rocksdb_compression_level = 32767
@ -856,7 +858,7 @@
# algorithm. # algorithm.
# #
# Note when using the default value we may override it with a setting # Note when using the default value we may override it with a setting
# tailored specifically conduwuit. # tailored specifically for continuwuity.
# #
#rocksdb_bottommost_compression_level = 32767 #rocksdb_bottommost_compression_level = 32767
@ -896,13 +898,13 @@
# 0 = AbsoluteConsistency # 0 = AbsoluteConsistency
# 1 = TolerateCorruptedTailRecords (default) # 1 = TolerateCorruptedTailRecords (default)
# 2 = PointInTime (use me if trying to recover) # 2 = PointInTime (use me if trying to recover)
# 3 = SkipAnyCorruptedRecord (you now voided your Conduwuit warranty) # 3 = SkipAnyCorruptedRecord (you now voided your Continuwuity warranty)
# #
# For more information on these modes, see: # For more information on these modes, see:
# https://github.com/facebook/rocksdb/wiki/WAL-Recovery-Modes # https://github.com/facebook/rocksdb/wiki/WAL-Recovery-Modes
# #
# For more details on recovering a corrupt database, see: # For more details on recovering a corrupt database, see:
# https://conduwuit.puppyirl.gay/troubleshooting.html#database-corruption # https://continuwuity.org/troubleshooting.html#database-corruption
# #
#rocksdb_recovery_mode = 1 #rocksdb_recovery_mode = 1
@ -942,7 +944,7 @@
# - Disabling repair mode and restarting the server is recommended after # - Disabling repair mode and restarting the server is recommended after
# running the repair. # running the repair.
# #
# See https://conduwuit.puppyirl.gay/troubleshooting.html#database-corruption for more details on recovering a corrupt database. # See https://continuwuity.org/troubleshooting.html#database-corruption for more details on recovering a corrupt database.
# #
#rocksdb_repair = false #rocksdb_repair = false
@ -969,7 +971,7 @@
# Enables RocksDB compaction. You should never ever have to set this # Enables RocksDB compaction. You should never ever have to set this
# option to false. If you for some reason find yourself needing to use # option to false. If you for some reason find yourself needing to use
# this option as part of troubleshooting or a bug, please reach out to us # this option as part of troubleshooting or a bug, please reach out to us
# in the conduwuit Matrix room with information and details. # in the continuwuity Matrix room with information and details.
# #
# Disabling compaction will lead to a significantly bloated and # Disabling compaction will lead to a significantly bloated and
# explosively large database, gradually poor performance, unnecessarily # explosively large database, gradually poor performance, unnecessarily
@ -995,7 +997,7 @@
# purposes such as recovering/recreating your admin room, or inviting # purposes such as recovering/recreating your admin room, or inviting
# yourself back. # yourself back.
# #
# See https://conduwuit.puppyirl.gay/troubleshooting.html#lost-access-to-admin-room for other ways to get back into your admin room. # See https://continuwuity.org/troubleshooting.html#lost-access-to-admin-room for other ways to get back into your admin room.
# #
# Once this password is unset, all sessions will be logged out for # Once this password is unset, all sessions will be logged out for
# security purposes. # security purposes.
@ -1010,8 +1012,8 @@
# Allow local (your server only) presence updates/requests. # Allow local (your server only) presence updates/requests.
# #
# Note that presence on conduwuit is very fast unlike Synapse's. If using # Note that presence on continuwuity is very fast unlike Synapse's. If
# outgoing presence, this MUST be enabled. # using outgoing presence, this MUST be enabled.
# #
#allow_local_presence = true #allow_local_presence = true
@ -1019,7 +1021,7 @@
# #
# This option receives presence updates from other servers, but does not # This option receives presence updates from other servers, but does not
# send any unless `allow_outgoing_presence` is true. Note that presence on # send any unless `allow_outgoing_presence` is true. Note that presence on
# conduwuit is very fast unlike Synapse's. # continuwuity is very fast unlike Synapse's.
# #
#allow_incoming_presence = true #allow_incoming_presence = true
@ -1027,8 +1029,8 @@
# #
# This option sends presence updates to other servers, but does not # This option sends presence updates to other servers, but does not
# receive any unless `allow_incoming_presence` is true. Note that presence # receive any unless `allow_incoming_presence` is true. Note that presence
# on conduwuit is very fast unlike Synapse's. If using outgoing presence, # on continuwuity is very fast unlike Synapse's. If using outgoing
# you MUST enable `allow_local_presence` as well. # presence, you MUST enable `allow_local_presence` as well.
# #
#allow_outgoing_presence = true #allow_outgoing_presence = true
@ -1081,8 +1083,8 @@
# #
#typing_client_timeout_max_s = 45 #typing_client_timeout_max_s = 45
# Set this to true for conduwuit to compress HTTP response bodies using # Set this to true for continuwuity to compress HTTP response bodies using
# zstd. This option does nothing if conduwuit was not built with # zstd. This option does nothing if continuwuity was not built with
# `zstd_compression` feature. Please be aware that enabling HTTP # `zstd_compression` feature. Please be aware that enabling HTTP
# compression may weaken TLS. Most users should not need to enable this. # compression may weaken TLS. Most users should not need to enable this.
# See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH # See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH
@ -1090,8 +1092,8 @@
# #
#zstd_compression = false #zstd_compression = false
# Set this to true for conduwuit to compress HTTP response bodies using # Set this to true for continuwuity to compress HTTP response bodies using
# gzip. This option does nothing if conduwuit was not built with # gzip. This option does nothing if continuwuity was not built with
# `gzip_compression` feature. Please be aware that enabling HTTP # `gzip_compression` feature. Please be aware that enabling HTTP
# compression may weaken TLS. Most users should not need to enable this. # compression may weaken TLS. Most users should not need to enable this.
# See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before # See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before
@ -1102,8 +1104,8 @@
# #
#gzip_compression = false #gzip_compression = false
# Set this to true for conduwuit to compress HTTP response bodies using # Set this to true for continuwuity to compress HTTP response bodies using
# brotli. This option does nothing if conduwuit was not built with # brotli. This option does nothing if continuwuity was not built with
# `brotli_compression` feature. Please be aware that enabling HTTP # `brotli_compression` feature. Please be aware that enabling HTTP
# compression may weaken TLS. Most users should not need to enable this. # compression may weaken TLS. Most users should not need to enable this.
# See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH # See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH
@ -1165,7 +1167,7 @@
# Otherwise setting this to false reduces filesystem clutter and overhead # Otherwise setting this to false reduces filesystem clutter and overhead
# for managing these symlinks in the directory. This is now disabled by # for managing these symlinks in the directory. This is now disabled by
# default. You may still return to upstream Conduit but you have to run # default. You may still return to upstream Conduit but you have to run
# conduwuit at least once with this set to true and allow the # continuwuity at least once with this set to true and allow the
# media_startup_check to take place before shutting down to return to # media_startup_check to take place before shutting down to return to
# Conduit. # Conduit.
# #
@ -1210,8 +1212,8 @@
# #
#allowed_remote_server_names = [] #allowed_remote_server_names = []
# Vector list of regex patterns of server names that conduwuit will refuse # Vector list of regex patterns of server names that continuwuity will
# to download remote media from. # refuse to download remote media from.
# #
# example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"] # example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
# #
@ -1225,7 +1227,7 @@
# #
#forbidden_remote_room_directory_server_names = [] #forbidden_remote_room_directory_server_names = []
# Vector list of regex patterns of server names that conduwuit will not # Vector list of regex patterns of server names that continuwuity will not
# send messages to the client from. # send messages to the client from.
# #
# Note that there is no way for clients to receive messages once a server # Note that there is no way for clients to receive messages once a server
@ -1249,7 +1251,7 @@
#send_messages_from_ignored_users_to_client = false #send_messages_from_ignored_users_to_client = false
# Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you # Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you
# do not want conduwuit to send outbound requests to. Defaults to # do not want continuwuity to send outbound requests to. Defaults to
# RFC1918, unroutable, loopback, multicast, and testnet addresses for # RFC1918, unroutable, loopback, multicast, and testnet addresses for
# security. # security.
# #
@ -1399,26 +1401,26 @@
# Allow admins to enter commands in rooms other than "#admins" (admin # Allow admins to enter commands in rooms other than "#admins" (admin
# room) by prefixing your message with "\!admin" or "\\!admin" followed up # room) by prefixing your message with "\!admin" or "\\!admin" followed up
# a normal conduwuit admin command. The reply will be publicly visible to # a normal continuwuity admin command. The reply will be publicly visible
# the room, originating from the sender. # to the room, originating from the sender.
# #
# example: \\!admin debug ping puppygock.gay # example: \\!admin debug ping puppygock.gay
# #
#admin_escape_commands = true #admin_escape_commands = true
# Automatically activate the conduwuit admin room console / CLI on # Automatically activate the continuwuity admin room console / CLI on
# startup. This option can also be enabled with `--console` conduwuit # startup. This option can also be enabled with `--console` continuwuity
# argument. # argument.
# #
#admin_console_automatic = false #admin_console_automatic = false
# List of admin commands to execute on startup. # List of admin commands to execute on startup.
# #
# This option can also be configured with the `--execute` conduwuit # This option can also be configured with the `--execute` continuwuity
# argument and can take standard shell commands and environment variables # argument and can take standard shell commands and environment variables
# #
# For example: `./conduwuit --execute "server admin-notice conduwuit has # For example: `./continuwuity --execute "server admin-notice continuwuity
# started up at $(date)"` # has started up at $(date)"`
# #
# example: admin_execute = ["debug ping puppygock.gay", "debug echo hi"]` # example: admin_execute = ["debug ping puppygock.gay", "debug echo hi"]`
# #
@ -1426,7 +1428,7 @@
# Ignore errors in startup commands. # Ignore errors in startup commands.
# #
# If false, conduwuit will error and fail to start if an admin execute # If false, continuwuity will error and fail to start if an admin execute
# command (`--execute` / `admin_execute`) fails. # command (`--execute` / `admin_execute`) fails.
# #
#admin_execute_errors_ignore = false #admin_execute_errors_ignore = false
@ -1447,15 +1449,14 @@
# The default room tag to apply on the admin room. # The default room tag to apply on the admin room.
# #
# On some clients like Element, the room tag "m.server_notice" is a # On some clients like Element, the room tag "m.server_notice" is a
# special pinned room at the very bottom of your room list. The conduwuit # special pinned room at the very bottom of your room list. The
# admin room can be pinned here so you always have an easy-to-access # continuwuity admin room can be pinned here so you always have an
# shortcut dedicated to your admin room. # easy-to-access shortcut dedicated to your admin room.
# #
#admin_room_tag = "m.server_notice" #admin_room_tag = "m.server_notice"
# Sentry.io crash/panic reporting, performance monitoring/metrics, etc. # Sentry.io crash/panic reporting, performance monitoring/metrics, etc.
# This is NOT enabled by default. conduwuit's default Sentry reporting # This is NOT enabled by default.
# endpoint domain is `o4506996327251968.ingest.us.sentry.io`.
# #
#sentry = false #sentry = false
@ -1463,7 +1464,7 @@
# #
#sentry_endpoint = "" #sentry_endpoint = ""
# Report your conduwuit server_name in Sentry.io crash reports and # Report your continuwuity server_name in Sentry.io crash reports and
# metrics. # metrics.
# #
#sentry_send_server_name = false #sentry_send_server_name = false
@ -1500,7 +1501,7 @@
# Enable the tokio-console. This option is only relevant to developers. # Enable the tokio-console. This option is only relevant to developers.
# #
# For more information, see: # For more information, see:
# https://conduwuit.puppyirl.gay/development.html#debugging-with-tokio-console # https://continuwuity.org/development.html#debugging-with-tokio-console
# #
#tokio_console = false #tokio_console = false
@ -1640,19 +1641,29 @@
# #
#server = #server =
# This item is undocumented. Please contribute documentation for it. # URL to a support page for the server, which will be served as part of
# the MSC1929 server support endpoint at /.well-known/matrix/support.
# Will be included alongside any contact information
# #
#support_page = #support_page =
# This item is undocumented. Please contribute documentation for it. # Role string for server support contacts, to be served as part of the
# MSC1929 server support endpoint at /.well-known/matrix/support.
# #
#support_role = #support_role = "m.role.admin"
# This item is undocumented. Please contribute documentation for it. # Email address for server support contacts, to be served as part of the
# MSC1929 server support endpoint.
# This will be used along with support_mxid if specified.
# #
#support_email = #support_email =
# This item is undocumented. Please contribute documentation for it. # Matrix ID for server support contacts, to be served as part of the
# MSC1929 server support endpoint.
# This will be used along with support_email if specified.
#
# If no email or mxid is specified, all of the server's admins will be
# listed.
# #
#support_mxid = #support_mxid =

View file

@ -18,13 +18,14 @@ ARG LLVM_VERSION=19
# Line three: for xx-verify # Line three: for xx-verify
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \
apt-get update && apt-get install -y \ apt-get update && apt-get install -y \
clang-${LLVM_VERSION} lld-${LLVM_VERSION} pkg-config make jq \ clang-${LLVM_VERSION} lld-${LLVM_VERSION} pkg-config make jq \
curl git \ curl git \
file file
# Create symlinks for LLVM tools # Create symlinks for LLVM tools
RUN <<EOF RUN <<EOF
set -o xtrace
# clang # clang
ln -s /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang ln -s /usr/bin/clang-${LLVM_VERSION} /usr/bin/clang
ln -s "/usr/bin/clang++-${LLVM_VERSION}" "/usr/bin/clang++" ln -s "/usr/bin/clang++-${LLVM_VERSION}" "/usr/bin/clang++"
@ -46,6 +47,7 @@ ENV LDDTREE_VERSION=0.3.7
# Install unpackaged tools # Install unpackaged tools
RUN <<EOF RUN <<EOF
set -o xtrace
curl --retry 5 -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash curl --retry 5 -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
cargo binstall --no-confirm cargo-sbom --version $CARGO_SBOM_VERSION cargo binstall --no-confirm cargo-sbom --version $CARGO_SBOM_VERSION
cargo binstall --no-confirm lddtree --version $LDDTREE_VERSION cargo binstall --no-confirm lddtree --version $LDDTREE_VERSION
@ -59,7 +61,7 @@ ARG TARGETPLATFORM
# xx-* are xx-specific meta-packages # xx-* are xx-specific meta-packages
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \
xx-apt-get install -y \ xx-apt-get install -y \
xx-c-essentials xx-cxx-essentials pkg-config \ xx-c-essentials xx-cxx-essentials pkg-config \
liburing-dev liburing-dev
@ -75,6 +77,7 @@ RUN echo "CARGO_INCREMENTAL=0" >> /etc/environment
# Configure pkg-config # Configure pkg-config
RUN <<EOF RUN <<EOF
set -o xtrace
echo "PKG_CONFIG_LIBDIR=/usr/lib/$(xx-info)/pkgconfig" >> /etc/environment echo "PKG_CONFIG_LIBDIR=/usr/lib/$(xx-info)/pkgconfig" >> /etc/environment
echo "PKG_CONFIG=/usr/bin/$(xx-info)-pkg-config" >> /etc/environment echo "PKG_CONFIG=/usr/bin/$(xx-info)-pkg-config" >> /etc/environment
echo "PKG_CONFIG_ALLOW_CROSS=true" >> /etc/environment echo "PKG_CONFIG_ALLOW_CROSS=true" >> /etc/environment
@ -82,12 +85,14 @@ EOF
# Configure cc to use clang version # Configure cc to use clang version
RUN <<EOF RUN <<EOF
set -o xtrace
echo "CC=clang" >> /etc/environment echo "CC=clang" >> /etc/environment
echo "CXX=clang++" >> /etc/environment echo "CXX=clang++" >> /etc/environment
EOF EOF
# Cross-language LTO # Cross-language LTO
RUN <<EOF RUN <<EOF
set -o xtrace
echo "CFLAGS=-flto" >> /etc/environment echo "CFLAGS=-flto" >> /etc/environment
echo "CXXFLAGS=-flto" >> /etc/environment echo "CXXFLAGS=-flto" >> /etc/environment
# Linker is set to target-compatible clang by xx # Linker is set to target-compatible clang by xx
@ -98,6 +103,7 @@ EOF
ARG TARGET_CPU= ARG TARGET_CPU=
RUN <<EOF RUN <<EOF
set -o allexport set -o allexport
set -o xtrace
. /etc/environment . /etc/environment
if [ -n "${TARGET_CPU}" ]; then if [ -n "${TARGET_CPU}" ]; then
echo "CFLAGS='${CFLAGS} -march=${TARGET_CPU}'" >> /etc/environment echo "CFLAGS='${CFLAGS} -march=${TARGET_CPU}'" >> /etc/environment
@ -118,7 +124,6 @@ COPY . .
ARG TARGETPLATFORM ARG TARGETPLATFORM
# Verify environment configuration # Verify environment configuration
RUN cat /etc/environment
RUN xx-cargo --print-target-triple RUN xx-cargo --print-target-triple
# Conduwuit version info # Conduwuit version info
@ -139,9 +144,10 @@ ENV CONTINUWUITY_VERSION_EXTRA=$CONTINUWUITY_VERSION_EXTRA
# Build the binary # Build the binary
RUN --mount=type=cache,target=/usr/local/cargo/registry \ RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/git/db \
--mount=type=cache,target=/app/target \ --mount=type=cache,target=/app/target,id=cargo-target-${TARGETPLATFORM} \
bash <<'EOF' bash <<'EOF'
set -o allexport set -o allexport
set -o xtrace
. /etc/environment . /etc/environment
TARGET_DIR=($(cargo metadata --no-deps --format-version 1 | \ TARGET_DIR=($(cargo metadata --no-deps --format-version 1 | \
jq -r ".target_directory")) jq -r ".target_directory"))
@ -162,6 +168,7 @@ EOF
RUN --mount=type=cache,target=/usr/local/cargo/registry \ RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/git/db \
bash <<'EOF' bash <<'EOF'
set -o xtrace
mkdir /out/sbom mkdir /out/sbom
typeset -A PACKAGES typeset -A PACKAGES
for BINARY in /out/sbin/*; do for BINARY in /out/sbin/*; do
@ -180,6 +187,7 @@ EOF
# Extract dynamically linked dependencies # Extract dynamically linked dependencies
RUN <<EOF RUN <<EOF
set -o xtrace
mkdir /out/libs mkdir /out/libs
mkdir /out/libs-root mkdir /out/libs-root
for BINARY in /out/sbin/*; do for BINARY in /out/sbin/*; do

View file

@ -7,30 +7,30 @@ services:
image: forgejo.ellis.link/continuwuation/continuwuity:latest image: forgejo.ellis.link/continuwuation/continuwuity:latest
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- db:/var/lib/conduwuit - db:/var/lib/continuwuity
- /etc/resolv.conf:/etc/resolv.conf:ro # Use the host's DNS resolver rather than Docker's. - /etc/resolv.conf:/etc/resolv.conf:ro # Use the host's DNS resolver rather than Docker's.
#- ./conduwuit.toml:/etc/conduwuit.toml #- ./continuwuity.toml:/etc/continuwuity.toml
networks: networks:
- proxy - proxy
environment: environment:
CONDUWUIT_SERVER_NAME: your.server.name.example # EDIT THIS CONTINUWUITY_SERVER_NAME: your.server.name.example # EDIT THIS
CONDUWUIT_DATABASE_PATH: /var/lib/conduwuit CONTINUWUITY_DATABASE_PATH: /var/lib/continuwuity
CONDUWUIT_PORT: 6167 # should match the loadbalancer traefik label CONTINUWUITY_PORT: 6167 # should match the loadbalancer traefik label
CONDUWUIT_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB CONTINUWUITY_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB
CONDUWUIT_ALLOW_REGISTRATION: 'true' CONTINUWUITY_ALLOW_REGISTRATION: 'true'
CONDUWUIT_REGISTRATION_TOKEN: 'YOUR_TOKEN' # A registration token is required when registration is allowed. CONTINUWUITY_REGISTRATION_TOKEN: 'YOUR_TOKEN' # A registration token is required when registration is allowed.
#CONDUWUIT_YES_I_AM_VERY_VERY_SURE_I_WANT_AN_OPEN_REGISTRATION_SERVER_PRONE_TO_ABUSE: 'true' #CONTINUWUITY_YES_I_AM_VERY_VERY_SURE_I_WANT_AN_OPEN_REGISTRATION_SERVER_PRONE_TO_ABUSE: 'true'
CONDUWUIT_ALLOW_FEDERATION: 'true' CONTINUWUITY_ALLOW_FEDERATION: 'true'
CONDUWUIT_ALLOW_CHECK_FOR_UPDATES: 'true' CONTINUWUITY_ALLOW_CHECK_FOR_UPDATES: 'true'
CONDUWUIT_TRUSTED_SERVERS: '["matrix.org"]' CONTINUWUITY_TRUSTED_SERVERS: '["matrix.org"]'
#CONDUWUIT_LOG: warn,state_res=warn #CONTINUWUITY_LOG: warn,state_res=warn
CONDUWUIT_ADDRESS: 0.0.0.0 CONTINUWUITY_ADDRESS: 0.0.0.0
#CONDUWUIT_CONFIG: '/etc/conduwuit.toml' # Uncomment if you mapped config toml above #CONTINUWUITY_CONFIG: '/etc/continuwuity.toml' # Uncomment if you mapped config toml above
# We need some way to serve the client and server .well-known json. The simplest way is via the CONDUWUIT_WELL_KNOWN # We need some way to serve the client and server .well-known json. The simplest way is via the CONTINUWUITY_WELL_KNOWN
# variable / config option, there are multiple ways to do this, e.g. in the conduwuit.toml file, and in a separate # variable / config option, there are multiple ways to do this, e.g. in the continuwuity.toml file, and in a separate
# see the override file for more information about delegation # see the override file for more information about delegation
CONDUWUIT_WELL_KNOWN: | CONTINUWUITY_WELL_KNOWN: |
{ {
client=https://your.server.name.example, client=https://your.server.name.example,
server=your.server.name.example:443 server=your.server.name.example:443

View file

@ -7,38 +7,38 @@ services:
image: forgejo.ellis.link/continuwuation/continuwuity:latest image: forgejo.ellis.link/continuwuation/continuwuity:latest
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- db:/var/lib/conduwuit - db:/var/lib/continuwuity
- /etc/resolv.conf:/etc/resolv.conf:ro # Use the host's DNS resolver rather than Docker's. - /etc/resolv.conf:/etc/resolv.conf:ro # Use the host's DNS resolver rather than Docker's.
#- ./conduwuit.toml:/etc/conduwuit.toml #- ./continuwuity.toml:/etc/continuwuity.toml
networks: networks:
- proxy - proxy
environment: environment:
CONDUWUIT_SERVER_NAME: your.server.name.example # EDIT THIS CONTINUWUITY_SERVER_NAME: your.server.name.example # EDIT THIS
CONDUWUIT_TRUSTED_SERVERS: '["matrix.org"]' CONTINUWUITY_TRUSTED_SERVERS: '["matrix.org"]'
CONDUWUIT_ALLOW_REGISTRATION: 'false' # After setting a secure registration token, you can enable this CONTINUWUITY_ALLOW_REGISTRATION: 'false' # After setting a secure registration token, you can enable this
CONDUWUIT_REGISTRATION_TOKEN: "" # This is a token you can use to register on the server CONTINUWUITY_REGISTRATION_TOKEN: "" # This is a token you can use to register on the server
#CONDUWUIT_REGISTRATION_TOKEN_FILE: "" # Alternatively you can configure a path to a token file to read #CONTINUWUITY_REGISTRATION_TOKEN_FILE: "" # Alternatively you can configure a path to a token file to read
CONDUWUIT_ADDRESS: 0.0.0.0 CONTINUWUITY_ADDRESS: 0.0.0.0
CONDUWUIT_PORT: 6167 # you need to match this with the traefik load balancer label if you're want to change it CONTINUWUITY_PORT: 6167 # you need to match this with the traefik load balancer label if you're want to change it
CONDUWUIT_DATABASE_PATH: /var/lib/conduwuit CONTINUWUITY_DATABASE_PATH: /var/lib/continuwuity
#CONDUWUIT_CONFIG: '/etc/conduit.toml' # Uncomment if you mapped config toml above #CONTINUWUITY_CONFIG: '/etc/continuwuity.toml' # Uncomment if you mapped config toml above
### Uncomment and change values as desired, note that Continuwuity has plenty of config options, so you should check out the example example config too ### Uncomment and change values as desired, note that Continuwuity has plenty of config options, so you should check out the example example config too
# Available levels are: error, warn, info, debug, trace - more info at: https://docs.rs/env_logger/*/env_logger/#enabling-logging # Available levels are: error, warn, info, debug, trace - more info at: https://docs.rs/env_logger/*/env_logger/#enabling-logging
# CONDUWUIT_LOG: info # default is: "warn,state_res=warn" # CONTINUWUITY_LOG: info # default is: "warn,state_res=warn"
# CONDUWUIT_ALLOW_ENCRYPTION: 'true' # CONTINUWUITY_ALLOW_ENCRYPTION: 'true'
# CONDUWUIT_ALLOW_FEDERATION: 'true' # CONTINUWUITY_ALLOW_FEDERATION: 'true'
# CONDUWUIT_ALLOW_CHECK_FOR_UPDATES: 'true' # CONTINUWUITY_ALLOW_CHECK_FOR_UPDATES: 'true'
# CONDUWUIT_ALLOW_INCOMING_PRESENCE: true # CONTINUWUITY_ALLOW_INCOMING_PRESENCE: true
# CONDUWUIT_ALLOW_OUTGOING_PRESENCE: true # CONTINUWUITY_ALLOW_OUTGOING_PRESENCE: true
# CONDUWUIT_ALLOW_LOCAL_PRESENCE: true # CONTINUWUITY_ALLOW_LOCAL_PRESENCE: true
# CONDUWUIT_WORKERS: 10 # CONTINUWUITY_WORKERS: 10
# CONDUWUIT_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB # CONTINUWUITY_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB
# CONDUWUIT_NEW_USER_DISPLAYNAME_SUFFIX = "🏳<200d>⚧" # CONTINUWUITY_NEW_USER_DISPLAYNAME_SUFFIX = "🏳<200d>⚧"
# We need some way to serve the client and server .well-known json. The simplest way is via the CONDUWUIT_WELL_KNOWN # We need some way to serve the client and server .well-known json. The simplest way is via the CONTINUWUITY_WELL_KNOWN
# variable / config option, there are multiple ways to do this, e.g. in the conduwuit.toml file, and in a separate # variable / config option, there are multiple ways to do this, e.g. in the continuwuity.toml file, and in a separate
# reverse proxy, but since you do not have a reverse proxy and following this guide, this example is included # reverse proxy, but since you do not have a reverse proxy and following this guide, this example is included
CONDUWUIT_WELL_KNOWN: | CONTINUWUITY_WELL_KNOWN: |
{ {
client=https://your.server.name.example, client=https://your.server.name.example,
server=your.server.name.example:443 server=your.server.name.example:443

View file

@ -1,5 +1,6 @@
use axum::{Json, extract::State, response::IntoResponse}; use axum::{Json, extract::State, response::IntoResponse};
use conduwuit::{Error, Result}; use conduwuit::{Error, Result};
use futures::StreamExt;
use ruma::api::client::{ use ruma::api::client::{
discovery::{ discovery::{
discover_homeserver::{self, HomeserverInfo, SlidingSyncProxyInfo}, discover_homeserver::{self, HomeserverInfo, SlidingSyncProxyInfo},
@ -17,7 +18,7 @@ pub(crate) async fn well_known_client(
State(services): State<crate::State>, State(services): State<crate::State>,
_body: Ruma<discover_homeserver::Request>, _body: Ruma<discover_homeserver::Request>,
) -> Result<discover_homeserver::Response> { ) -> Result<discover_homeserver::Response> {
let client_url = match services.server.config.well_known.client.as_ref() { let client_url = match services.config.well_known.client.as_ref() {
| Some(url) => url.to_string(), | Some(url) => url.to_string(),
| None => return Err(Error::BadRequest(ErrorKind::NotFound, "Not found.")), | None => return Err(Error::BadRequest(ErrorKind::NotFound, "Not found.")),
}; };
@ -33,44 +34,63 @@ pub(crate) async fn well_known_client(
/// # `GET /.well-known/matrix/support` /// # `GET /.well-known/matrix/support`
/// ///
/// Server support contact and support page of a homeserver's domain. /// Server support contact and support page of a homeserver's domain.
/// Implements MSC1929 for server discovery.
/// If no configuration is set, uses admin users as contacts.
pub(crate) async fn well_known_support( pub(crate) async fn well_known_support(
State(services): State<crate::State>, State(services): State<crate::State>,
_body: Ruma<discover_support::Request>, _body: Ruma<discover_support::Request>,
) -> Result<discover_support::Response> { ) -> Result<discover_support::Response> {
let support_page = services let support_page = services
.server
.config .config
.well_known .well_known
.support_page .support_page
.as_ref() .as_ref()
.map(ToString::to_string); .map(ToString::to_string);
let role = services.server.config.well_known.support_role.clone(); let email_address = services.config.well_known.support_email.clone();
let matrix_id = services.config.well_known.support_mxid.clone();
// support page or role must be either defined for this to be valid
if support_page.is_none() && role.is_none() {
return Err(Error::BadRequest(ErrorKind::NotFound, "Not found."));
}
let email_address = services.server.config.well_known.support_email.clone();
let matrix_id = services.server.config.well_known.support_mxid.clone();
// if a role is specified, an email address or matrix id is required
if role.is_some() && (email_address.is_none() && matrix_id.is_none()) {
return Err(Error::BadRequest(ErrorKind::NotFound, "Not found."));
}
// TODO: support defining multiple contacts in the config // TODO: support defining multiple contacts in the config
let mut contacts: Vec<Contact> = vec![]; let mut contacts: Vec<Contact> = vec![];
if let Some(role) = role { let role_value = services
let contact = Contact { role, email_address, matrix_id }; .config
.well_known
.support_role
.clone()
.unwrap_or_else(|| "m.role.admin".to_owned().into());
contacts.push(contact); // Add configured contact if at least one contact method is specified
if email_address.is_some() || matrix_id.is_some() {
contacts.push(Contact {
role: role_value.clone(),
email_address: email_address.clone(),
matrix_id: matrix_id.clone(),
});
}
// Try to add admin users as contacts if no contacts are configured
if contacts.is_empty() {
if let Ok(admin_room) = services.admin.get_admin_room().await {
let admin_users = services.rooms.state_cache.room_members(&admin_room);
let mut stream = admin_users;
while let Some(user_id) = stream.next().await {
// Skip server user
if *user_id == services.globals.server_user {
break;
}
contacts.push(Contact {
role: role_value.clone(),
email_address: None,
matrix_id: Some(user_id.to_owned()),
});
}
}
} }
// support page or role+contacts must be either defined for this to be valid
if contacts.is_empty() && support_page.is_none() { if contacts.is_empty() && support_page.is_none() {
// No admin room, no configured contacts, and no support page
return Err(Error::BadRequest(ErrorKind::NotFound, "Not found.")); return Err(Error::BadRequest(ErrorKind::NotFound, "Not found."));
} }
@ -84,9 +104,9 @@ pub(crate) async fn well_known_support(
pub(crate) async fn syncv3_client_server_json( pub(crate) async fn syncv3_client_server_json(
State(services): State<crate::State>, State(services): State<crate::State>,
) -> Result<impl IntoResponse> { ) -> Result<impl IntoResponse> {
let server_url = match services.server.config.well_known.client.as_ref() { let server_url = match services.config.well_known.client.as_ref() {
| Some(url) => url.to_string(), | Some(url) => url.to_string(),
| None => match services.server.config.well_known.server.as_ref() { | None => match services.config.well_known.server.as_ref() {
| Some(url) => url.to_string(), | Some(url) => url.to_string(),
| None => return Err(Error::BadRequest(ErrorKind::NotFound, "Not found.")), | None => return Err(Error::BadRequest(ErrorKind::NotFound, "Not found.")),
}, },

View file

@ -13,13 +13,13 @@ version.workspace = true
build = "build.rs" build = "build.rs"
# [[bin]] # [[bin]]
# path = "main.rs" # path = "main.rs"
# name = "conduwuit_build_metadata" # name = "conduwuit_build_metadata"
[lib] [lib]
path = "mod.rs" path = "mod.rs"
crate-type = [ crate-type = [
"rlib", "rlib",
# "dylib", # "dylib",
] ]
[features] [features]
@ -28,7 +28,7 @@ crate-type = [
[dependencies] [dependencies]
[build-dependencies] [build-dependencies]
built = {version = "0.7", features = ["cargo-lock", "dependency-tree"]} built = { version = "0.8", features = [] }
[lints] [lints]
workspace = true workspace = true

View file

@ -78,12 +78,13 @@ fn main() {
} }
// --- Rerun Triggers --- // --- Rerun Triggers ---
// Rerun if the git HEAD changes // TODO: The git rerun triggers seem to always run
println!("cargo:rerun-if-changed=.git/HEAD"); // // Rerun if the git HEAD changes
// Rerun if the ref pointed to by HEAD changes (e.g., new commit on branch) // println!("cargo:rerun-if-changed=.git/HEAD");
if let Some(ref_path) = run_git_command(&["symbolic-ref", "--quiet", "HEAD"]) { // // Rerun if the ref pointed to by HEAD changes (e.g., new commit on branch)
println!("cargo:rerun-if-changed=.git/{ref_path}"); // if let Some(ref_path) = run_git_command(&["symbolic-ref", "--quiet", "HEAD"])
} // { println!("cargo:rerun-if-changed=.git/{ref_path}");
// }
println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH"); println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH");
println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH_SHORT"); println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH_SHORT");

View file

@ -12,11 +12,17 @@ pub static VERSION_EXTRA: Option<&str> =
v v
} else if let v @ Some(_) = option_env!("CONDUWUIT_VERSION_EXTRA") { } else if let v @ Some(_) = option_env!("CONDUWUIT_VERSION_EXTRA") {
v v
} else if let v @ Some(_) = option_env!("CONDUIT_VERSION_EXTRA") {
v
} else { } else {
GIT_COMMIT_HASH_SHORT option_env!("CONDUIT_VERSION_EXTRA")
}; };
#[must_use]
pub fn version_tag() -> Option<&'static str> {
VERSION_EXTRA
.filter(|s| !s.is_empty())
.or(GIT_COMMIT_HASH_SHORT)
}
pub static GIT_REMOTE_WEB_URL: Option<&str> = option_env!("GIT_REMOTE_WEB_URL"); pub static GIT_REMOTE_WEB_URL: Option<&str> = option_env!("GIT_REMOTE_WEB_URL");
pub static GIT_REMOTE_COMMIT_URL: Option<&str> = option_env!("GIT_REMOTE_COMMIT_URL"); pub static GIT_REMOTE_COMMIT_URL: Option<&str> = option_env!("GIT_REMOTE_COMMIT_URL");

View file

@ -27,7 +27,7 @@ use self::proxy::ProxyConfig;
pub use self::{check::check, manager::Manager}; pub use self::{check::check, manager::Manager};
use crate::{Result, err, error::Error, utils::sys}; use crate::{Result, err, error::Error, utils::sys};
/// All the config options for conduwuit. /// All the config options for continuwuity.
#[allow(clippy::struct_excessive_bools)] #[allow(clippy::struct_excessive_bools)]
#[allow(rustdoc::broken_intra_doc_links, rustdoc::bare_urls)] #[allow(rustdoc::broken_intra_doc_links, rustdoc::bare_urls)]
#[derive(Clone, Debug, Deserialize)] #[derive(Clone, Debug, Deserialize)]
@ -35,7 +35,7 @@ use crate::{Result, err, error::Error, utils::sys};
filename = "conduwuit-example.toml", filename = "conduwuit-example.toml",
section = "global", section = "global",
undocumented = "# This item is undocumented. Please contribute documentation for it.", undocumented = "# This item is undocumented. Please contribute documentation for it.",
header = r#"### conduwuit Configuration header = r#"### continuwuity Configuration
### ###
### THIS FILE IS GENERATED. CHANGES/CONTRIBUTIONS IN THE REPO WILL BE ### THIS FILE IS GENERATED. CHANGES/CONTRIBUTIONS IN THE REPO WILL BE
### OVERWRITTEN! ### OVERWRITTEN!
@ -50,7 +50,7 @@ use crate::{Result, err, error::Error, utils::sys};
### that say "YOU NEED TO EDIT THIS". ### that say "YOU NEED TO EDIT THIS".
### ###
### For more information, see: ### For more information, see:
### https://conduwuit.puppyirl.gay/configuration.html ### https://continuwuity.org/configuration.html
"#, "#,
ignore = "catchall well_known tls blurhashing allow_invalid_tls_certificates_yes_i_know_what_the_fuck_i_am_doing_with_this_and_i_know_this_is_insecure" ignore = "catchall well_known tls blurhashing allow_invalid_tls_certificates_yes_i_know_what_the_fuck_i_am_doing_with_this_and_i_know_this_is_insecure"
)] )]
@ -59,7 +59,7 @@ pub struct Config {
/// suffix for user and room IDs/aliases. /// suffix for user and room IDs/aliases.
/// ///
/// See the docs for reverse proxying and delegation: /// See the docs for reverse proxying and delegation:
/// https://conduwuit.puppyirl.gay/deploying/generic.html#setting-up-the-reverse-proxy /// https://continuwuity.org/deploying/generic.html#setting-up-the-reverse-proxy
/// ///
/// Also see the `[global.well_known]` config section at the very bottom. /// Also see the `[global.well_known]` config section at the very bottom.
/// ///
@ -70,10 +70,10 @@ pub struct Config {
/// YOU NEED TO EDIT THIS. THIS CANNOT BE CHANGED AFTER WITHOUT A DATABASE /// YOU NEED TO EDIT THIS. THIS CANNOT BE CHANGED AFTER WITHOUT A DATABASE
/// WIPE. /// WIPE.
/// ///
/// example: "conduwuit.woof" /// example: "continuwuity.org"
pub server_name: OwnedServerName, pub server_name: OwnedServerName,
/// The default address (IPv4 or IPv6) conduwuit will listen on. /// The default address (IPv4 or IPv6) continuwuity will listen on.
/// ///
/// If you are using Docker or a container NAT networking setup, this must /// If you are using Docker or a container NAT networking setup, this must
/// be "0.0.0.0". /// be "0.0.0.0".
@ -85,10 +85,10 @@ pub struct Config {
#[serde(default = "default_address")] #[serde(default = "default_address")]
address: ListeningAddr, address: ListeningAddr,
/// The port(s) conduwuit will listen on. /// The port(s) continuwuity will listen on.
/// ///
/// For reverse proxying, see: /// For reverse proxying, see:
/// https://conduwuit.puppyirl.gay/deploying/generic.html#setting-up-the-reverse-proxy /// https://continuwuity.org/deploying/generic.html#setting-up-the-reverse-proxy
/// ///
/// If you are using Docker, don't change this, you'll need to map an /// If you are using Docker, don't change this, you'll need to map an
/// external port to this. /// external port to this.
@ -103,16 +103,17 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub tls: TlsConfig, pub tls: TlsConfig,
/// The UNIX socket conduwuit will listen on. /// The UNIX socket continuwuity will listen on.
/// ///
/// conduwuit cannot listen on both an IP address and a UNIX socket. If /// continuwuity cannot listen on both an IP address and a UNIX socket. If
/// listening on a UNIX socket, you MUST remove/comment the `address` key. /// listening on a UNIX socket, you MUST remove/comment the `address` key.
/// ///
/// Remember to make sure that your reverse proxy has access to this socket /// Remember to make sure that your reverse proxy has access to this socket
/// file, either by adding your reverse proxy to the 'conduwuit' group or /// file, either by adding your reverse proxy to the appropriate user group
/// granting world R/W permissions with `unix_socket_perms` (666 minimum). /// or granting world R/W permissions with `unix_socket_perms` (666
/// minimum).
/// ///
/// example: "/run/conduwuit/conduwuit.sock" /// example: "/run/continuwuity/continuwuity.sock"
pub unix_socket_path: Option<PathBuf>, pub unix_socket_path: Option<PathBuf>,
/// The default permissions (in octal) to create the UNIX socket with. /// The default permissions (in octal) to create the UNIX socket with.
@ -121,22 +122,22 @@ pub struct Config {
#[serde(default = "default_unix_socket_perms")] #[serde(default = "default_unix_socket_perms")]
pub unix_socket_perms: u32, pub unix_socket_perms: u32,
/// This is the only directory where conduwuit will save its data, including /// This is the only directory where continuwuity will save its data,
/// media. Note: this was previously "/var/lib/matrix-conduit". /// including media. Note: this was previously "/var/lib/matrix-conduit".
/// ///
/// YOU NEED TO EDIT THIS. /// YOU NEED TO EDIT THIS.
/// ///
/// example: "/var/lib/conduwuit" /// example: "/var/lib/continuwuity"
pub database_path: PathBuf, pub database_path: PathBuf,
/// conduwuit supports online database backups using RocksDB's Backup engine /// continuwuity supports online database backups using RocksDB's Backup
/// API. To use this, set a database backup path that conduwuit can write /// engine API. To use this, set a database backup path that continuwuity
/// to. /// can write to.
/// ///
/// For more information, see: /// For more information, see:
/// https://conduwuit.puppyirl.gay/maintenance.html#backups /// https://continuwuity.org/maintenance.html#backups
/// ///
/// example: "/opt/conduwuit-db-backups" /// example: "/opt/continuwuity-db-backups"
pub database_backup_path: Option<PathBuf>, pub database_backup_path: Option<PathBuf>,
/// The amount of online RocksDB database backups to keep/retain, if using /// The amount of online RocksDB database backups to keep/retain, if using
@ -160,7 +161,7 @@ pub struct Config {
#[serde(default = "default_new_user_displayname_suffix")] #[serde(default = "default_new_user_displayname_suffix")]
pub new_user_displayname_suffix: String, pub new_user_displayname_suffix: String,
/// If enabled, conduwuit will send a simple GET request periodically to /// If enabled, continuwuity will send a simple GET request periodically to
/// `https://continuwuity.org/.well-known/continuwuity/announcements` for any new /// `https://continuwuity.org/.well-known/continuwuity/announcements` for any new
/// announcements or major updates. This is not an update check endpoint. /// announcements or major updates. This is not an update check endpoint.
/// ///
@ -168,8 +169,8 @@ pub struct Config {
#[serde(alias = "allow_check_for_updates", default = "true_fn")] #[serde(alias = "allow_check_for_updates", default = "true_fn")]
pub allow_announcements_check: bool, pub allow_announcements_check: bool,
/// Set this to any float value to multiply conduwuit's in-memory LRU caches /// Set this to any float value to multiply continuwuity's in-memory LRU
/// with such as "auth_chain_cache_capacity". /// caches with such as "auth_chain_cache_capacity".
/// ///
/// May be useful if you have significant memory to spare to increase /// May be useful if you have significant memory to spare to increase
/// performance. /// performance.
@ -186,7 +187,7 @@ pub struct Config {
)] )]
pub cache_capacity_modifier: f64, pub cache_capacity_modifier: f64,
/// Set this to any float value in megabytes for conduwuit to tell the /// Set this to any float value in megabytes for continuwuity to tell the
/// database engine that this much memory is available for database read /// database engine that this much memory is available for database read
/// caches. /// caches.
/// ///
@ -202,7 +203,7 @@ pub struct Config {
#[serde(default = "default_db_cache_capacity_mb")] #[serde(default = "default_db_cache_capacity_mb")]
pub db_cache_capacity_mb: f64, pub db_cache_capacity_mb: f64,
/// Set this to any float value in megabytes for conduwuit to tell the /// Set this to any float value in megabytes for continuwuity to tell the
/// database engine that this much memory is available for database write /// database engine that this much memory is available for database write
/// caches. /// caches.
/// ///
@ -319,9 +320,9 @@ pub struct Config {
/// Enable using *only* TCP for querying your specified nameservers instead /// Enable using *only* TCP for querying your specified nameservers instead
/// of UDP. /// of UDP.
/// ///
/// If you are running conduwuit in a container environment, this config /// If you are running continuwuity in a container environment, this config
/// option may need to be enabled. For more details, see: /// option may need to be enabled. For more details, see:
/// https://conduwuit.puppyirl.gay/troubleshooting.html#potential-dns-issues-when-using-docker /// https://continuwuity.org/troubleshooting.html#potential-dns-issues-when-using-docker
#[serde(default)] #[serde(default)]
pub query_over_tcp_only: bool, pub query_over_tcp_only: bool,
@ -534,9 +535,9 @@ pub struct Config {
/// tokens. Multiple tokens can be added if you separate them with /// tokens. Multiple tokens can be added if you separate them with
/// whitespace /// whitespace
/// ///
/// conduwuit must be able to access the file, and it must not be empty /// continuwuity must be able to access the file, and it must not be empty
/// ///
/// example: "/etc/conduwuit/.reg_token" /// example: "/etc/continuwuity/.reg_token"
pub registration_token_file: Option<PathBuf>, pub registration_token_file: Option<PathBuf>,
/// Controls whether encrypted rooms and events are allowed. /// Controls whether encrypted rooms and events are allowed.
@ -627,16 +628,16 @@ pub struct Config {
pub allow_room_creation: bool, pub allow_room_creation: bool,
/// Set to false to disable users from joining or creating room versions /// Set to false to disable users from joining or creating room versions
/// that aren't officially supported by conduwuit. /// that aren't officially supported by continuwuity.
/// ///
/// conduwuit officially supports room versions 6 - 11. /// continuwuity officially supports room versions 6 - 11.
/// ///
/// conduwuit has slightly experimental (though works fine in practice) /// continuwuity has slightly experimental (though works fine in practice)
/// support for versions 3 - 5. /// support for versions 3 - 5.
#[serde(default = "true_fn")] #[serde(default = "true_fn")]
pub allow_unstable_room_versions: bool, pub allow_unstable_room_versions: bool,
/// Default room version conduwuit will create rooms with. /// Default room version continuwuity will create rooms with.
/// ///
/// Per spec, room version 11 is the default. /// Per spec, room version 11 is the default.
/// ///
@ -710,7 +711,7 @@ pub struct Config {
/// Servers listed here will be used to gather public keys of other servers /// Servers listed here will be used to gather public keys of other servers
/// (notary trusted key servers). /// (notary trusted key servers).
/// ///
/// Currently, conduwuit doesn't support inbound batched key requests, so /// Currently, continuwuity doesn't support inbound batched key requests, so
/// this list should only contain other Synapse servers. /// this list should only contain other Synapse servers.
/// ///
/// example: ["matrix.org", "tchncs.de"] /// example: ["matrix.org", "tchncs.de"]
@ -755,7 +756,7 @@ pub struct Config {
#[serde(default = "default_trusted_server_batch_size")] #[serde(default = "default_trusted_server_batch_size")]
pub trusted_server_batch_size: usize, pub trusted_server_batch_size: usize,
/// Max log level for conduwuit. Allows debug, info, warn, or error. /// Max log level for continuwuity. Allows debug, info, warn, or error.
/// ///
/// See also: /// See also:
/// https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives /// https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
@ -780,8 +781,9 @@ pub struct Config {
#[serde(default = "default_log_span_events")] #[serde(default = "default_log_span_events")]
pub log_span_events: String, pub log_span_events: String,
/// Configures whether CONDUWUIT_LOG EnvFilter matches values using regular /// Configures whether CONTINUWUITY_LOG EnvFilter matches values using
/// expressions. See the tracing_subscriber documentation on Directives. /// regular expressions. See the tracing_subscriber documentation on
/// Directives.
/// ///
/// default: true /// default: true
#[serde(default = "true_fn")] #[serde(default = "true_fn")]
@ -863,7 +865,7 @@ pub struct Config {
/// This takes priority over "turn_secret" first, and falls back to /// This takes priority over "turn_secret" first, and falls back to
/// "turn_secret" if invalid or failed to open. /// "turn_secret" if invalid or failed to open.
/// ///
/// example: "/etc/conduwuit/.turn_secret" /// example: "/etc/continuwuity/.turn_secret"
pub turn_secret_file: Option<PathBuf>, pub turn_secret_file: Option<PathBuf>,
/// TURN TTL, in seconds. /// TURN TTL, in seconds.
@ -872,12 +874,12 @@ pub struct Config {
#[serde(default = "default_turn_ttl")] #[serde(default = "default_turn_ttl")]
pub turn_ttl: u64, pub turn_ttl: u64,
/// List/vector of room IDs or room aliases that conduwuit will make newly /// List/vector of room IDs or room aliases that continuwuity will make
/// registered users join. The rooms specified must be rooms that you have /// newly registered users join. The rooms specified must be rooms that you
/// joined at least once on the server, and must be public. /// have joined at least once on the server, and must be public.
/// ///
/// example: ["#conduwuit:puppygock.gay", /// example: ["#continuwuity:continuwuity.org",
/// "!eoIzvAvVwY23LPDay8:puppygock.gay"] /// "!main-1:continuwuity.org"]
/// ///
/// default: [] /// default: []
#[serde(default = "Vec::new")] #[serde(default = "Vec::new")]
@ -902,10 +904,10 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub auto_deactivate_banned_room_attempts: bool, pub auto_deactivate_banned_room_attempts: bool,
/// RocksDB log level. This is not the same as conduwuit's log level. This /// RocksDB log level. This is not the same as continuwuity's log level.
/// is the log level for the RocksDB engine/library which show up in your /// This is the log level for the RocksDB engine/library which show up in
/// database folder/path as `LOG` files. conduwuit will log RocksDB errors /// your database folder/path as `LOG` files. continuwuity will log RocksDB
/// as normal through tracing or panics if severe for safety. /// errors as normal through tracing or panics if severe for safety.
/// ///
/// default: "error" /// default: "error"
#[serde(default = "default_rocksdb_log_level")] #[serde(default = "default_rocksdb_log_level")]
@ -930,7 +932,7 @@ pub struct Config {
/// Set this to true to use RocksDB config options that are tailored to HDDs /// Set this to true to use RocksDB config options that are tailored to HDDs
/// (slower device storage). /// (slower device storage).
/// ///
/// It is worth noting that by default, conduwuit will use RocksDB with /// It is worth noting that by default, continuwuity will use RocksDB with
/// Direct IO enabled. *Generally* speaking this improves performance as it /// Direct IO enabled. *Generally* speaking this improves performance as it
/// bypasses buffered I/O (system page cache). However there is a potential /// bypasses buffered I/O (system page cache). However there is a potential
/// chance that Direct IO may cause issues with database operations if your /// chance that Direct IO may cause issues with database operations if your
@ -938,7 +940,7 @@ pub struct Config {
/// possibly ZFS filesystem. RocksDB generally deals/corrects these issues /// possibly ZFS filesystem. RocksDB generally deals/corrects these issues
/// but it cannot account for all setups. If you experience any weird /// 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 /// 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 /// feel free to report in the continuwuity Matrix room if this option fixes
/// your DB issues. /// your DB issues.
/// ///
/// For more information, see: /// For more information, see:
@ -999,7 +1001,7 @@ pub struct Config {
/// as they all differ. See their `kDefaultCompressionLevel`. /// as they all differ. See their `kDefaultCompressionLevel`.
/// ///
/// Note when using the default value we may override it with a setting /// Note when using the default value we may override it with a setting
/// tailored specifically conduwuit. /// tailored specifically for continuwuity.
/// ///
/// default: 32767 /// default: 32767
#[serde(default = "default_rocksdb_compression_level")] #[serde(default = "default_rocksdb_compression_level")]
@ -1017,7 +1019,7 @@ pub struct Config {
/// algorithm. /// algorithm.
/// ///
/// Note when using the default value we may override it with a setting /// Note when using the default value we may override it with a setting
/// tailored specifically conduwuit. /// tailored specifically for continuwuity.
/// ///
/// default: 32767 /// default: 32767
#[serde(default = "default_rocksdb_bottommost_compression_level")] #[serde(default = "default_rocksdb_bottommost_compression_level")]
@ -1059,13 +1061,13 @@ pub struct Config {
/// 0 = AbsoluteConsistency /// 0 = AbsoluteConsistency
/// 1 = TolerateCorruptedTailRecords (default) /// 1 = TolerateCorruptedTailRecords (default)
/// 2 = PointInTime (use me if trying to recover) /// 2 = PointInTime (use me if trying to recover)
/// 3 = SkipAnyCorruptedRecord (you now voided your Conduwuit warranty) /// 3 = SkipAnyCorruptedRecord (you now voided your Continuwuity warranty)
/// ///
/// For more information on these modes, see: /// For more information on these modes, see:
/// https://github.com/facebook/rocksdb/wiki/WAL-Recovery-Modes /// https://github.com/facebook/rocksdb/wiki/WAL-Recovery-Modes
/// ///
/// For more details on recovering a corrupt database, see: /// For more details on recovering a corrupt database, see:
/// https://conduwuit.puppyirl.gay/troubleshooting.html#database-corruption /// https://continuwuity.org/troubleshooting.html#database-corruption
/// ///
/// default: 1 /// default: 1
#[serde(default = "default_rocksdb_recovery_mode")] #[serde(default = "default_rocksdb_recovery_mode")]
@ -1109,7 +1111,7 @@ pub struct Config {
/// - Disabling repair mode and restarting the server is recommended after /// - Disabling repair mode and restarting the server is recommended after
/// running the repair. /// running the repair.
/// ///
/// See https://conduwuit.puppyirl.gay/troubleshooting.html#database-corruption for more details on recovering a corrupt database. /// See https://continuwuity.org/troubleshooting.html#database-corruption for more details on recovering a corrupt database.
#[serde(default)] #[serde(default)]
pub rocksdb_repair: bool, pub rocksdb_repair: bool,
@ -1134,7 +1136,7 @@ pub struct Config {
/// Enables RocksDB compaction. You should never ever have to set this /// Enables RocksDB compaction. You should never ever have to set this
/// option to false. If you for some reason find yourself needing to use /// option to false. If you for some reason find yourself needing to use
/// this option as part of troubleshooting or a bug, please reach out to us /// this option as part of troubleshooting or a bug, please reach out to us
/// in the conduwuit Matrix room with information and details. /// in the continuwuity Matrix room with information and details.
/// ///
/// Disabling compaction will lead to a significantly bloated and /// Disabling compaction will lead to a significantly bloated and
/// explosively large database, gradually poor performance, unnecessarily /// explosively large database, gradually poor performance, unnecessarily
@ -1162,7 +1164,7 @@ pub struct Config {
/// purposes such as recovering/recreating your admin room, or inviting /// purposes such as recovering/recreating your admin room, or inviting
/// yourself back. /// yourself back.
/// ///
/// See https://conduwuit.puppyirl.gay/troubleshooting.html#lost-access-to-admin-room for other ways to get back into your admin room. /// See https://continuwuity.org/troubleshooting.html#lost-access-to-admin-room for other ways to get back into your admin room.
/// ///
/// Once this password is unset, all sessions will be logged out for /// Once this password is unset, all sessions will be logged out for
/// security purposes. /// security purposes.
@ -1178,8 +1180,8 @@ pub struct Config {
/// Allow local (your server only) presence updates/requests. /// Allow local (your server only) presence updates/requests.
/// ///
/// Note that presence on conduwuit is very fast unlike Synapse's. If using /// Note that presence on continuwuity is very fast unlike Synapse's. If
/// outgoing presence, this MUST be enabled. /// using outgoing presence, this MUST be enabled.
#[serde(default = "true_fn")] #[serde(default = "true_fn")]
pub allow_local_presence: bool, pub allow_local_presence: bool,
@ -1187,7 +1189,7 @@ pub struct Config {
/// ///
/// This option receives presence updates from other servers, but does not /// This option receives presence updates from other servers, but does not
/// send any unless `allow_outgoing_presence` is true. Note that presence on /// send any unless `allow_outgoing_presence` is true. Note that presence on
/// conduwuit is very fast unlike Synapse's. /// continuwuity is very fast unlike Synapse's.
#[serde(default = "true_fn")] #[serde(default = "true_fn")]
pub allow_incoming_presence: bool, pub allow_incoming_presence: bool,
@ -1195,8 +1197,8 @@ pub struct Config {
/// ///
/// This option sends presence updates to other servers, but does not /// This option sends presence updates to other servers, but does not
/// receive any unless `allow_incoming_presence` is true. Note that presence /// receive any unless `allow_incoming_presence` is true. Note that presence
/// on conduwuit is very fast unlike Synapse's. If using outgoing presence, /// on continuwuity is very fast unlike Synapse's. If using outgoing
/// you MUST enable `allow_local_presence` as well. /// presence, you MUST enable `allow_local_presence` as well.
#[serde(default = "true_fn")] #[serde(default = "true_fn")]
pub allow_outgoing_presence: bool, pub allow_outgoing_presence: bool,
@ -1259,8 +1261,8 @@ pub struct Config {
#[serde(default = "default_typing_client_timeout_max_s")] #[serde(default = "default_typing_client_timeout_max_s")]
pub typing_client_timeout_max_s: u64, pub typing_client_timeout_max_s: u64,
/// Set this to true for conduwuit to compress HTTP response bodies using /// Set this to true for continuwuity to compress HTTP response bodies using
/// zstd. This option does nothing if conduwuit was not built with /// zstd. This option does nothing if continuwuity was not built with
/// `zstd_compression` feature. Please be aware that enabling HTTP /// `zstd_compression` feature. Please be aware that enabling HTTP
/// compression may weaken TLS. Most users should not need to enable this. /// compression may weaken TLS. Most users should not need to enable this.
/// See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH /// See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH
@ -1268,8 +1270,8 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub zstd_compression: bool, pub zstd_compression: bool,
/// Set this to true for conduwuit to compress HTTP response bodies using /// Set this to true for continuwuity to compress HTTP response bodies using
/// gzip. This option does nothing if conduwuit was not built with /// gzip. This option does nothing if continuwuity was not built with
/// `gzip_compression` feature. Please be aware that enabling HTTP /// `gzip_compression` feature. Please be aware that enabling HTTP
/// compression may weaken TLS. Most users should not need to enable this. /// compression may weaken TLS. Most users should not need to enable this.
/// See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before /// See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before
@ -1280,8 +1282,8 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub gzip_compression: bool, pub gzip_compression: bool,
/// Set this to true for conduwuit to compress HTTP response bodies using /// Set this to true for continuwuity to compress HTTP response bodies using
/// brotli. This option does nothing if conduwuit was not built with /// brotli. This option does nothing if continuwuity was not built with
/// `brotli_compression` feature. Please be aware that enabling HTTP /// `brotli_compression` feature. Please be aware that enabling HTTP
/// compression may weaken TLS. Most users should not need to enable this. /// compression may weaken TLS. Most users should not need to enable this.
/// See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH /// See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH
@ -1342,7 +1344,7 @@ pub struct Config {
/// Otherwise setting this to false reduces filesystem clutter and overhead /// Otherwise setting this to false reduces filesystem clutter and overhead
/// for managing these symlinks in the directory. This is now disabled by /// for managing these symlinks in the directory. This is now disabled by
/// default. You may still return to upstream Conduit but you have to run /// default. You may still return to upstream Conduit but you have to run
/// conduwuit at least once with this set to true and allow the /// continuwuity at least once with this set to true and allow the
/// media_startup_check to take place before shutting down to return to /// media_startup_check to take place before shutting down to return to
/// Conduit. /// Conduit.
#[serde(default)] #[serde(default)]
@ -1391,8 +1393,8 @@ pub struct Config {
#[serde(default, with = "serde_regex")] #[serde(default, with = "serde_regex")]
pub allowed_remote_server_names: RegexSet, pub allowed_remote_server_names: RegexSet,
/// Vector list of regex patterns of server names that conduwuit will refuse /// Vector list of regex patterns of server names that continuwuity will
/// to download remote media from. /// refuse to download remote media from.
/// ///
/// example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"] /// example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
/// ///
@ -1410,7 +1412,7 @@ pub struct Config {
#[serde(default, with = "serde_regex")] #[serde(default, with = "serde_regex")]
pub forbidden_remote_room_directory_server_names: RegexSet, pub forbidden_remote_room_directory_server_names: RegexSet,
/// Vector list of regex patterns of server names that conduwuit will not /// Vector list of regex patterns of server names that continuwuity will not
/// send messages to the client from. /// send messages to the client from.
/// ///
/// Note that there is no way for clients to receive messages once a server /// Note that there is no way for clients to receive messages once a server
@ -1436,7 +1438,7 @@ pub struct Config {
pub send_messages_from_ignored_users_to_client: bool, pub send_messages_from_ignored_users_to_client: bool,
/// Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you /// Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you
/// do not want conduwuit to send outbound requests to. Defaults to /// do not want continuwuity to send outbound requests to. Defaults to
/// RFC1918, unroutable, loopback, multicast, and testnet addresses for /// RFC1918, unroutable, loopback, multicast, and testnet addresses for
/// security. /// security.
/// ///
@ -1604,26 +1606,26 @@ pub struct Config {
/// Allow admins to enter commands in rooms other than "#admins" (admin /// Allow admins to enter commands in rooms other than "#admins" (admin
/// room) by prefixing your message with "\!admin" or "\\!admin" followed up /// room) by prefixing your message with "\!admin" or "\\!admin" followed up
/// a normal conduwuit admin command. The reply will be publicly visible to /// a normal continuwuity admin command. The reply will be publicly visible
/// the room, originating from the sender. /// to the room, originating from the sender.
/// ///
/// example: \\!admin debug ping puppygock.gay /// example: \\!admin debug ping puppygock.gay
#[serde(default = "true_fn")] #[serde(default = "true_fn")]
pub admin_escape_commands: bool, pub admin_escape_commands: bool,
/// Automatically activate the conduwuit admin room console / CLI on /// Automatically activate the continuwuity admin room console / CLI on
/// startup. This option can also be enabled with `--console` conduwuit /// startup. This option can also be enabled with `--console` continuwuity
/// argument. /// argument.
#[serde(default)] #[serde(default)]
pub admin_console_automatic: bool, pub admin_console_automatic: bool,
/// List of admin commands to execute on startup. /// List of admin commands to execute on startup.
/// ///
/// This option can also be configured with the `--execute` conduwuit /// This option can also be configured with the `--execute` continuwuity
/// argument and can take standard shell commands and environment variables /// argument and can take standard shell commands and environment variables
/// ///
/// For example: `./conduwuit --execute "server admin-notice conduwuit has /// For example: `./continuwuity --execute "server admin-notice continuwuity
/// started up at $(date)"` /// has started up at $(date)"`
/// ///
/// example: admin_execute = ["debug ping puppygock.gay", "debug echo hi"]` /// example: admin_execute = ["debug ping puppygock.gay", "debug echo hi"]`
/// ///
@ -1633,7 +1635,7 @@ pub struct Config {
/// Ignore errors in startup commands. /// Ignore errors in startup commands.
/// ///
/// If false, conduwuit will error and fail to start if an admin execute /// If false, continuwuity will error and fail to start if an admin execute
/// command (`--execute` / `admin_execute`) fails. /// command (`--execute` / `admin_execute`) fails.
#[serde(default)] #[serde(default)]
pub admin_execute_errors_ignore: bool, pub admin_execute_errors_ignore: bool,
@ -1658,17 +1660,16 @@ pub struct Config {
/// The default room tag to apply on the admin room. /// The default room tag to apply on the admin room.
/// ///
/// On some clients like Element, the room tag "m.server_notice" is a /// On some clients like Element, the room tag "m.server_notice" is a
/// special pinned room at the very bottom of your room list. The conduwuit /// special pinned room at the very bottom of your room list. The
/// admin room can be pinned here so you always have an easy-to-access /// continuwuity admin room can be pinned here so you always have an
/// shortcut dedicated to your admin room. /// easy-to-access shortcut dedicated to your admin room.
/// ///
/// default: "m.server_notice" /// default: "m.server_notice"
#[serde(default = "default_admin_room_tag")] #[serde(default = "default_admin_room_tag")]
pub admin_room_tag: String, pub admin_room_tag: String,
/// Sentry.io crash/panic reporting, performance monitoring/metrics, etc. /// Sentry.io crash/panic reporting, performance monitoring/metrics, etc.
/// This is NOT enabled by default. conduwuit's default Sentry reporting /// This is NOT enabled by default.
/// endpoint domain is `o4506996327251968.ingest.us.sentry.io`.
#[serde(default)] #[serde(default)]
pub sentry: bool, pub sentry: bool,
@ -1679,7 +1680,7 @@ pub struct Config {
#[serde(default = "default_sentry_endpoint")] #[serde(default = "default_sentry_endpoint")]
pub sentry_endpoint: Option<Url>, pub sentry_endpoint: Option<Url>,
/// Report your conduwuit server_name in Sentry.io crash reports and /// Report your continuwuity server_name in Sentry.io crash reports and
/// metrics. /// metrics.
#[serde(default)] #[serde(default)]
pub sentry_send_server_name: bool, pub sentry_send_server_name: bool,
@ -1720,7 +1721,7 @@ pub struct Config {
/// Enable the tokio-console. This option is only relevant to developers. /// Enable the tokio-console. This option is only relevant to developers.
/// ///
/// For more information, see: /// For more information, see:
/// https://conduwuit.puppyirl.gay/development.html#debugging-with-tokio-console /// https://continuwuity.org/development.html#debugging-with-tokio-console
#[serde(default)] #[serde(default)]
pub tokio_console: bool, pub tokio_console: bool,
@ -1896,12 +1897,28 @@ pub struct WellKnownConfig {
/// example: "matrix.example.com:443" /// example: "matrix.example.com:443"
pub server: Option<OwnedServerName>, pub server: Option<OwnedServerName>,
/// URL to a support page for the server, which will be served as part of
/// the MSC1929 server support endpoint at /.well-known/matrix/support.
/// Will be included alongside any contact information
pub support_page: Option<Url>, pub support_page: Option<Url>,
/// Role string for server support contacts, to be served as part of the
/// MSC1929 server support endpoint at /.well-known/matrix/support.
///
/// default: "m.role.admin"
pub support_role: Option<ContactRole>, pub support_role: Option<ContactRole>,
/// Email address for server support contacts, to be served as part of the
/// MSC1929 server support endpoint.
/// This will be used along with support_mxid if specified.
pub support_email: Option<String>, pub support_email: Option<String>,
/// Matrix ID for server support contacts, to be served as part of the
/// MSC1929 server support endpoint.
/// This will be used along with support_email if specified.
///
/// If no email or mxid is specified, all of the server's admins will be
/// listed.
pub support_mxid: Option<OwnedUserId>, pub support_mxid: Option<OwnedUserId>,
} }

View file

@ -26,6 +26,6 @@ pub fn user_agent() -> &'static str { USER_AGENT.get_or_init(init_user_agent) }
fn init_user_agent() -> String { format!("{}/{}", name(), version()) } fn init_user_agent() -> String { format!("{}/{}", name(), version()) }
fn init_version() -> String { fn init_version() -> String {
conduwuit_build_metadata::VERSION_EXTRA conduwuit_build_metadata::version_tag()
.map_or(SEMANTIC.to_owned(), |extra| format!("{SEMANTIC} ({extra})")) .map_or(SEMANTIC.to_owned(), |extra| format!("{SEMANTIC} ({extra})"))
} }

View file

@ -21,7 +21,10 @@ pub use ::toml;
pub use ::tracing; pub use ::tracing;
pub use config::Config; pub use config::Config;
pub use error::Error; pub use error::Error;
pub use info::{rustc_flags_capture, version, version::version}; pub use info::{
rustc_flags_capture, version,
version::{name, version},
};
pub use matrix::{Event, EventTypeExt, PduCount, PduEvent, PduId, RoomVersion, pdu, state_res}; pub use matrix::{Event, EventTypeExt, PduCount, PduEvent, PduId, RoomVersion, pdu, state_res};
pub use server::Server; pub use server::Server;
pub use utils::{ctor, dtor, implement, result, result::Result}; pub use utils::{ctor, dtor, implement, result, result::Result};

View file

@ -15,7 +15,7 @@ use conduwuit_core::{
#[clap( #[clap(
about, about,
long_about = None, long_about = None,
name = "conduwuit", name = conduwuit_core::name(),
version = conduwuit_core::version(), version = conduwuit_core::version(),
)] )]
pub(crate) struct Args { pub(crate) struct Args {

View file

@ -6,7 +6,7 @@ use axum::{
response::{Html, IntoResponse, Response}, response::{Html, IntoResponse, Response},
routing::get, routing::get,
}; };
use conduwuit_build_metadata::{GIT_REMOTE_COMMIT_URL, GIT_REMOTE_WEB_URL, VERSION_EXTRA}; use conduwuit_build_metadata::{GIT_REMOTE_COMMIT_URL, GIT_REMOTE_WEB_URL, version_tag};
use conduwuit_service::state; use conduwuit_service::state;
pub fn build() -> Router<state::State> { pub fn build() -> Router<state::State> {

View file

@ -18,7 +18,7 @@
{%~ block footer ~%} {%~ block footer ~%}
<footer> <footer>
<p>Powered by <a href="https://continuwuity.org">Continuwuity</a> <p>Powered by <a href="https://continuwuity.org">Continuwuity</a>
{%~ if let Some(version_info) = VERSION_EXTRA ~%} {%~ if let Some(version_info) = self::version_tag() ~%}
{%~ if let Some(url) = GIT_REMOTE_COMMIT_URL.or(GIT_REMOTE_WEB_URL) ~%} {%~ if let Some(url) = GIT_REMOTE_COMMIT_URL.or(GIT_REMOTE_WEB_URL) ~%}
(<a href="{{ url }}">{{ version_info }}</a>) (<a href="{{ url }}">{{ version_info }}</a>)
{%~ else ~%} {%~ else ~%}