Compare commits
96
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8b3003273 | ||
|
|
edd690c583 | ||
|
|
c2068a434e | ||
|
|
b981d3d039 | ||
|
|
80a2711f45 | ||
|
|
2f4885c2a1 | ||
|
|
3fec75a7b6 | ||
|
|
5094f8e7f1 | ||
|
|
cd19f02d3b | ||
|
|
dbfe16bdb2 | ||
|
|
5bdeb971d8 | ||
|
|
a38b23d56d | ||
|
|
25a81c480b | ||
|
|
1282405f1d | ||
|
|
ca4b676b4c | ||
|
|
3db558b2f8 | ||
|
|
5ea10bbd8e | ||
|
|
31b2728551 | ||
|
|
d48b96fda6 | ||
|
|
fe83c80a65 | ||
|
|
98ce5f62d5 | ||
|
|
870c178c8b | ||
|
|
1b9f56e48c | ||
|
|
3143d468c7 | ||
|
|
ac594f5502 | ||
|
|
75701f75e4 | ||
|
|
186722c51f | ||
|
|
fc3ff86ad9 | ||
|
|
a8d181e00e | ||
|
|
61adef8f2c | ||
|
|
13c9f2fb50 | ||
|
|
5d279159e3 | ||
|
|
e14db60b6c | ||
|
|
4cba464faf | ||
|
|
828611c0e4 | ||
|
|
e206b0ca8f | ||
|
|
4c971d7695 | ||
|
|
8aed9b7711 | ||
|
|
3f766d2a13 | ||
|
|
6d6ce0f697 | ||
|
|
8b4389e0c2 | ||
|
|
fc29ad088c | ||
|
|
b0aa4fc7f5 | ||
|
|
73ae29c0de | ||
|
|
8c7ae60518 | ||
|
|
4d6af6ee88 | ||
|
|
4ede0dc2d9 | ||
|
|
4ce02e8ff6 | ||
|
|
4ac40dec9a | ||
|
|
51b96b3538 | ||
|
|
5b904fbef4 | ||
|
|
6c0079f2c4 | ||
|
|
3a588c4561 | ||
|
|
f22ad5dfba | ||
|
|
2b50afcc0a | ||
|
|
8216abc8c5 | ||
|
|
981d054b0c | ||
|
|
72e2b643bb | ||
|
|
ee4b08c185 | ||
|
|
896427b67f | ||
|
|
95989241db | ||
|
|
10da08e260 | ||
|
|
6255406de0 | ||
|
|
4c44a7adf5 | ||
|
|
48fb8c5d4d | ||
|
|
d058f6522e | ||
|
|
8784df0d3a | ||
|
|
524b4960cd | ||
|
|
0176d40347 | ||
|
|
b74b8c48ce | ||
|
|
8a4b7cf4bd | ||
|
|
4a9483c07c | ||
|
|
8f1a41dcd2 | ||
|
|
6f58af0b99 | ||
|
|
ac9dce2bdf | ||
|
|
197a111748 | ||
|
|
b9f138450c | ||
|
|
1aecadf990 | ||
|
|
7514aa5d95 | ||
|
|
c0c783fdec | ||
|
|
b02e4bf46c | ||
|
|
87f5f17134 | ||
|
|
f1aea98384 | ||
|
|
caebb13a98 | ||
|
|
0b073c6534 | ||
|
|
f29a6d7945 | ||
|
|
8696e627b0 | ||
|
|
201de77db4 | ||
|
|
33e84c74ac | ||
|
|
39d1f86050 | ||
|
|
afa71756c0 | ||
|
|
d0e06b49da | ||
|
|
5547c0f579 | ||
|
|
66bc3958ff | ||
|
|
7e48567d4b | ||
|
|
10ee0a53f9 |
+18
-4
@@ -3,6 +3,7 @@ stages:
|
|||||||
- build docker image
|
- build docker image
|
||||||
- test
|
- test
|
||||||
- upload artifacts
|
- upload artifacts
|
||||||
|
- publish
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
GIT_SUBMODULE_STRATEGY: recursive
|
GIT_SUBMODULE_STRATEGY: recursive
|
||||||
@@ -75,12 +76,12 @@ build:release:cargo:aarch64-unknown-linux-gnu:
|
|||||||
extends: .build-cargo-shared-settings
|
extends: .build-cargo-shared-settings
|
||||||
variables:
|
variables:
|
||||||
TARGET: "aarch64-unknown-linux-gnu"
|
TARGET: "aarch64-unknown-linux-gnu"
|
||||||
NEEDED_PACKAGES: "build-essential gcc-10-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-dev-arm64-cross"
|
NEEDED_PACKAGES: "build-essential gcc-8-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-dev-arm64-cross"
|
||||||
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
|
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
|
||||||
CC_aarch64_unknown_linux_gnu: aarch64-linux-gnu-gcc
|
CC_aarch64_unknown_linux_gnu: aarch64-linux-gnu-gcc
|
||||||
CXX_aarch64_unknown_linux_gnu: aarch64-linux-gnu-g++
|
CXX_aarch64_unknown_linux_gnu: aarch64-linux-gnu-g++
|
||||||
TARGET_CC: "/usr/bin/aarch64-linux-gnu-gcc-10"
|
TARGET_CC: "/usr/bin/aarch64-linux-gnu-gcc-8"
|
||||||
TARGET_AR: "/usr/bin/aarch64-linux-gnu-gcc-ar-10"
|
TARGET_AR: "/usr/bin/aarch64-linux-gnu-gcc-ar-8"
|
||||||
artifacts:
|
artifacts:
|
||||||
name: "conduit-aarch64-unknown-linux-gnu"
|
name: "conduit-aarch64-unknown-linux-gnu"
|
||||||
paths:
|
paths:
|
||||||
@@ -222,7 +223,6 @@ build:docker:next:
|
|||||||
- >
|
- >
|
||||||
/kaniko/executor
|
/kaniko/executor
|
||||||
$KANIKO_CACHE_ARGS
|
$KANIKO_CACHE_ARGS
|
||||||
--force
|
|
||||||
--context $CI_PROJECT_DIR
|
--context $CI_PROJECT_DIR
|
||||||
--build-arg CREATED=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
--build-arg CREATED=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||||
--build-arg VERSION=$(grep -m1 -o '[0-9].[0-9].[0-9]' Cargo.toml)
|
--build-arg VERSION=$(grep -m1 -o '[0-9].[0-9].[0-9]' Cargo.toml)
|
||||||
@@ -370,3 +370,17 @@ publish:package:
|
|||||||
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file conduit-x86_64-unknown-linux-gnu.deb "${BASE_URL}/conduit-x86_64-unknown-linux-gnu.deb"'
|
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file conduit-x86_64-unknown-linux-gnu.deb "${BASE_URL}/conduit-x86_64-unknown-linux-gnu.deb"'
|
||||||
|
|
||||||
|
|
||||||
|
pages:
|
||||||
|
stage: "publish"
|
||||||
|
image:
|
||||||
|
name: "squidfunk/mkdocs-material"
|
||||||
|
entrypoint: [""]
|
||||||
|
tags: ["docker"]
|
||||||
|
needs: []
|
||||||
|
rules:
|
||||||
|
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
||||||
|
script:
|
||||||
|
- "mkdocs build --site-dir public"
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- "public"
|
||||||
|
|||||||
@@ -1,86 +0,0 @@
|
|||||||
# Setting up Appservices
|
|
||||||
|
|
||||||
## Getting help
|
|
||||||
|
|
||||||
If you run into any problems while setting up an Appservice, write an email to `timo@koesters.xyz`, ask us in `#conduit:matrix.org` or [open an issue on GitLab](https://gitlab.com/famedly/conduit/-/issues/new).
|
|
||||||
|
|
||||||
## Set up the appservice - general instructions
|
|
||||||
|
|
||||||
Follow whatever instructions are given by the appservice. This usually includes
|
|
||||||
downloading, changing its config (setting domain, homeserver url, port etc.)
|
|
||||||
and later starting it.
|
|
||||||
|
|
||||||
At some point the appservice guide should ask you to add a registration yaml
|
|
||||||
file to the homeserver. In Synapse you would do this by adding the path to the
|
|
||||||
homeserver.yaml, but in Conduit you can do this from within Matrix:
|
|
||||||
|
|
||||||
First, go into the #admins room of your homeserver. The first person that
|
|
||||||
registered on the homeserver automatically joins it. Then send a message into
|
|
||||||
the room like this:
|
|
||||||
|
|
||||||
@conduit:your.server.name: register_appservice
|
|
||||||
```
|
|
||||||
paste
|
|
||||||
the
|
|
||||||
contents
|
|
||||||
of
|
|
||||||
the
|
|
||||||
yaml
|
|
||||||
registration
|
|
||||||
here
|
|
||||||
```
|
|
||||||
|
|
||||||
You can confirm it worked by sending a message like this:
|
|
||||||
`@conduit:your.server.name: list_appservices`
|
|
||||||
|
|
||||||
The @conduit bot should answer with `Appservices (1): your-bridge`
|
|
||||||
|
|
||||||
Then you are done. Conduit will send messages to the appservices and the
|
|
||||||
appservice can send requests to the homeserver. You don't need to restart
|
|
||||||
Conduit, but if it doesn't work, restarting while the appservice is running
|
|
||||||
could help.
|
|
||||||
|
|
||||||
## Appservice-specific instructions
|
|
||||||
|
|
||||||
### Tested appservices
|
|
||||||
|
|
||||||
These appservices have been tested and work with Conduit without any extra steps:
|
|
||||||
|
|
||||||
- [matrix-appservice-discord](https://github.com/Half-Shot/matrix-appservice-discord)
|
|
||||||
- [mautrix-hangouts](https://github.com/mautrix/hangouts/)
|
|
||||||
- [mautrix-telegram](https://github.com/mautrix/telegram/)
|
|
||||||
|
|
||||||
### [mautrix-signal](https://github.com/mautrix/signal)
|
|
||||||
|
|
||||||
There are a few things you need to do, in order for the Signal bridge (at least
|
|
||||||
up to version `0.2.0`) to work. How you do this depends on whether you use
|
|
||||||
Docker or `virtualenv` to run it. In either case you need to modify
|
|
||||||
[portal.py](https://github.com/mautrix/signal/blob/master/mautrix_signal/portal.py).
|
|
||||||
Do this **before** following the bridge installation guide.
|
|
||||||
|
|
||||||
1. **Create a copy of `portal.py`**. Go to
|
|
||||||
[portal.py](https://github.com/mautrix/signal/blob/master/mautrix_signal/portal.py)
|
|
||||||
at [mautrix-signal](https://github.com/mautrix/signal) (make sure you change to
|
|
||||||
the correct commit/version of mautrix-signal you're using) and copy its
|
|
||||||
content. Create a new `portal.py` on your system and paste the content in.
|
|
||||||
2. **Patch the copy**. Exact line numbers may be slightly different, look nearby if they don't match:
|
|
||||||
- [Line 1020](https://github.com/mautrix/signal/blob/4ea831536f154aba6419d13292479eb383ea3308/mautrix_signal/portal.py#L1020)
|
|
||||||
```diff
|
|
||||||
--- levels.users[self.main_intent.mxid] = 9001 if is_initial else 100
|
|
||||||
+++ levels.users[self.main_intent.mxid] = 100 if is_initial else 100
|
|
||||||
```
|
|
||||||
- [Between lines 1041 and 1042](https://github.com/mautrix/signal/blob/4ea831536f154aba6419d13292479eb383ea3308/mautrix_signal/portal.py#L1041-L1042) add a new line:
|
|
||||||
```diff
|
|
||||||
"type": str(EventType.ROOM_POWER_LEVELS),
|
|
||||||
+++ "state_key": "",
|
|
||||||
"content": power_levels.serialize(),
|
|
||||||
```
|
|
||||||
3. **Deploy the patch**. This is different depending on how you have `mautrix-signal` deployed:
|
|
||||||
- [*If using virtualenv*] Copy your patched `portal.py` to `./lib/python3.7/site-packages/mautrix_signal/portal.py` (the exact version of Python may be different on your system).
|
|
||||||
- [*If using Docker*] Map the patched `portal.py` into the `mautrix-signal` container:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
volumes:
|
|
||||||
- ./your/path/on/host/portal.py:/usr/lib/python3.9/site-packages/mautrix_signal/portal.py
|
|
||||||
```
|
|
||||||
4. Now continue with the [bridge installation instructions ](https://docs.mau.fi/bridges/index.html) and the general bridge notes above.
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
Install docker:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo apt install docker
|
|
||||||
$ sudo usermod -aG docker $USER
|
|
||||||
$ exec sudo su -l $USER
|
|
||||||
$ sudo systemctl start docker
|
|
||||||
$ cargo install cross
|
|
||||||
$ cross build --release --target armv7-unknown-linux-musleabihf
|
|
||||||
```
|
|
||||||
The cross-compiled binary is at target/armv7-unknown-linux-musleabihf/release/conduit
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[book]
|
||||||
|
title = "Conduit Docs"
|
||||||
|
author = "The Conduit contributors"
|
||||||
|
description = "Conduit is a simple, fast and reliable chat server for the Matrix protocol"
|
||||||
|
language = "en"
|
||||||
|
src = "docs"
|
||||||
|
|
||||||
|
[rust]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
build-dir = "public"
|
||||||
|
create-missing = true
|
||||||
|
|
||||||
|
[output.html.search]
|
||||||
|
limit-results = 15
|
||||||
@@ -39,7 +39,7 @@ trusted_servers = ["matrix.org"]
|
|||||||
#log = "info,state_res=warn,rocket=off,_=off,sled=off"
|
#log = "info,state_res=warn,rocket=off,_=off,sled=off"
|
||||||
#workers = 4 # default: cpu core count * 2
|
#workers = 4 # default: cpu core count * 2
|
||||||
|
|
||||||
address = "127.0.0.1" # This makes sure Conduit can only be reached using the reverse proxy, if you are running conduit from docker, set this to 0.0.0.0
|
address = "127.0.0.1" # This makes sure Conduit can only be reached using the reverse proxy
|
||||||
|
|
||||||
proxy = "none" # more examples can be found at src/database/proxy.rs:6
|
proxy = "none" # more examples can be found at src/database/proxy.rs:6
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Summary
|
||||||
|
|
||||||
|
[Home](index.md)
|
||||||
|
|
||||||
|
- [Installation](installation.md)
|
||||||
|
- [Prerequisites](installation/prerequisites.md)
|
||||||
|
- [From Binaries](installation/manual.md)
|
||||||
|
- [From Packages](installation/packages.md)
|
||||||
|
- [With Docker](installation/docker.md)
|
||||||
|
- [Configuration](configuration.md)
|
||||||
|
- [Config options](configuration/configuration.md)
|
||||||
|
- [Appservices](configuration/appservices.md)
|
||||||
|
- [Contribute](contribute.md)
|
||||||
|
- [Basics](development/basics.md)
|
||||||
|
- [Cross compilation](development/cross-compilation.md)
|
||||||
|
- [Tests & CI](development/tests-ci.md)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Configuration
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Configuring Conduit
|
||||||
|
|
||||||
@@ -0,0 +1,220 @@
|
|||||||
|
# Configuring Conduit
|
||||||
|
|
||||||
|
Conduit can be configured via a config file (conventionally called Conduit.toml) or environment variables. If a config
|
||||||
|
file exists and environment variables are set, environment variables overwrite config options.
|
||||||
|
|
||||||
|
You absolutely need to set the environment variable `CONDUIT_CONFIG_FILE` to either point to a config file (
|
||||||
|
e.g. `CONDUIT_CONFIG_FILE=/etc/conduit/Conduit.toml`) or to an empty string (`CONDUIT_CONFIG_FILE=''`) if you want to
|
||||||
|
configure Conduit with just environment variables.
|
||||||
|
|
||||||
|
## Mandatory config options
|
||||||
|
|
||||||
|
Mandatory variables must be configured in order for Conduit to run properly.
|
||||||
|
|
||||||
|
### Server Name
|
||||||
|
|
||||||
|
- Config file key: `server_name`
|
||||||
|
- Envirnoment variable: `CONDUIT_SERVER_NAME`
|
||||||
|
- Default value: _None, you will need to choose your own._
|
||||||
|
|
||||||
|
The server_name is the name of this server. It is used as a suffix for user and room ids. Example: If you set it
|
||||||
|
to `conduit.rs`, your usernames will look like `@somebody:conduit.rs`.
|
||||||
|
|
||||||
|
The Conduit server needs to be reachable at https://your.server.name/ on port 443 (client-server) and 8448 (
|
||||||
|
server-server) OR you can create /.well-known files to redirect requests. See
|
||||||
|
the [Client-Server specs](https://matrix.org/docs/spec/client_server/latest#get-well-known-matrix-client) and
|
||||||
|
the [Server-Server specs](https://matrix.org/docs/spec/server_server/r0.1.4#get-well-known-matrix-server) for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
### Database Path
|
||||||
|
|
||||||
|
- Config file key: `database_path`
|
||||||
|
- Envirnoment variable: `CONDUIT_DATABASE_PATH`
|
||||||
|
- Default value: _None, but many people like to use `/var/lib/conduit/`_.
|
||||||
|
|
||||||
|
A **directory** where Conduit stores its database and media files. This directory must exist, have enough free space and
|
||||||
|
be readable and writable by the user Conduit is running as.
|
||||||
|
|
||||||
|
What does _enough free space_ mean? It heavily on the amount of messages your Conduit server will see and the amount and
|
||||||
|
size of media files users on your Conduit server send. As a rule of thumb, you should have at least 10 GB of free space
|
||||||
|
left. You should be comfortable for quite some time with 50 GB.
|
||||||
|
|
||||||
|
### TCP Port
|
||||||
|
|
||||||
|
- Config file key: `port`
|
||||||
|
- Environment variable: `CONDUIT_PORT`
|
||||||
|
- Default value: _None, but many people like to use `6167`_.
|
||||||
|
|
||||||
|
The TCP port Conduit will listen on for connections. The port needs to be free (no other program is listeing on it).
|
||||||
|
|
||||||
|
Conduit does currently (2021-09) not offer HTTPS by itself. Only unencrypted HTTP requests will be accepted on this
|
||||||
|
port. Unless you know what you are doing, this port should not be exposed to the internet. Instead, use a reverse proxy
|
||||||
|
capable of doing TLS to offer your Conduit server to the internet via HTTPS. See [TODO] for example configurations.
|
||||||
|
|
||||||
|
## Optional configuration options
|
||||||
|
|
||||||
|
These config options come with defaults and don't need to be configured for Conduit to run. That said, you should still
|
||||||
|
check them to make sure that your Conduit server behaves like you want it to do.
|
||||||
|
|
||||||
|
### Maximum request size
|
||||||
|
|
||||||
|
- Config file key: `max_request_size`
|
||||||
|
- Environment variable: `CONDUIT_MAX_REQUEST_SIZE`
|
||||||
|
- Default value: `20_000_000` (~= 20 MB)
|
||||||
|
|
||||||
|
The maximum size in bytes for incoming requests to Conduit. You can use underscores to improve readability.
|
||||||
|
|
||||||
|
This will effectively limit the size for images, videos and other files users on your Conduit server can send.
|
||||||
|
|
||||||
|
### Allow Registration?
|
||||||
|
|
||||||
|
- Config file key: `allow_registration`
|
||||||
|
- Environment variable: `CONDUIT_ALLOW_REGISTRATION`
|
||||||
|
- Default value: `true`
|
||||||
|
- Possible values: `true`, `false`
|
||||||
|
|
||||||
|
It this is set to `false`, no new users can register accounts on your Conduit server. Already registered users will not
|
||||||
|
be affected from this setting and can continue to user your server.
|
||||||
|
|
||||||
|
The first user to ever register on your Conduit server will be considered the admin account and is automatically invited
|
||||||
|
into the admin room.
|
||||||
|
|
||||||
|
### Allow Encryption?
|
||||||
|
|
||||||
|
- Config file key: `allow_encryption`
|
||||||
|
- Environment variable: `CONDUIT_ALLOW_ENCRYPTION`
|
||||||
|
- Default value: `true`
|
||||||
|
- Possible values: `true`, `false`
|
||||||
|
|
||||||
|
If this is set to `false`, Conduit disables the ability for users to create encrypted chats. Existing encrypted chats
|
||||||
|
may continue to work.
|
||||||
|
|
||||||
|
### Allow federation?
|
||||||
|
|
||||||
|
- Config file key: `allow_federation`
|
||||||
|
- Environment variable: `CONDUIT_ALLOW_FEDERATION`
|
||||||
|
- Default value: `false`
|
||||||
|
- Possible values: `true`, `false`
|
||||||
|
|
||||||
|
Federation means that users from different Matrix servers can chat with each other. E.g. `@mathew:matrix.org` can chat
|
||||||
|
with `@timo:conduit.rs`.
|
||||||
|
|
||||||
|
If this option is set to `false`, users on your Conduit server can only talk with other users on your Conduit server.
|
||||||
|
|
||||||
|
Federation with other servers needs to happen over HTTPS, so make sure you have set up a reverse proxy.
|
||||||
|
|
||||||
|
### Jaeger Tracing
|
||||||
|
|
||||||
|
- Config file key: `allow_jaeger`
|
||||||
|
- Environment variable: `CONDUIT_ALLOW_JAEGER`
|
||||||
|
- Default value: `false`
|
||||||
|
- Possible values: `true`, `false`
|
||||||
|
|
||||||
|
Enable Jaeger to support monitoring and troubleshooting through Jaeger.
|
||||||
|
|
||||||
|
If you don't know what Jaeger is, you can safely leave this set to `false`.
|
||||||
|
|
||||||
|
### Trusted servers
|
||||||
|
|
||||||
|
- Config file key: `trusted_servers`
|
||||||
|
- Environment variable: `CONDUIT_TRUSTED_SERVERS`
|
||||||
|
- Default value: `[]`
|
||||||
|
- Possible values: JSON-Array of server domains, e.g. `["matrix.org"]` or `["matrix.org", "conduit.rs"]`.
|
||||||
|
|
||||||
|
Matrix servers have so-called "server keys", which authenticate messages from their users. Because your Conduit server
|
||||||
|
might not know the server keys from every server it encounters, it can ask a _trusted server_ for them. This speeds
|
||||||
|
things up for rooms with people from a lot of different servers.
|
||||||
|
|
||||||
|
You should only set this to include trustworthy servers. Most people consider a good default to be `["matrix.org"]`.
|
||||||
|
|
||||||
|
Only relevant if you have federation enabled.
|
||||||
|
|
||||||
|
### Limit amount of concurrent requests
|
||||||
|
|
||||||
|
- Config file key: `max_concurrent_requests`
|
||||||
|
- Environment variable: `CONDUIT_MAX_CONCURRENT_REQUESTS`
|
||||||
|
- Default value: `100`
|
||||||
|
- Suggested values: `1` - `1000` (u16)
|
||||||
|
|
||||||
|
How many requests Conduit can make at the same time. This affects federation with other Matrix servers, push
|
||||||
|
notifications and app_services.
|
||||||
|
|
||||||
|
// TODO Timo: When does it make sense to change this?
|
||||||
|
|
||||||
|
### Configure logging
|
||||||
|
|
||||||
|
- Config file key: `log`
|
||||||
|
- Environment variable: `CONDUIT_LOG`
|
||||||
|
- Default value: `info,state_res=warn,rocket=off,_=off,sled=off`
|
||||||
|
|
||||||
|
Configures which kind of messages Conduit logs.
|
||||||
|
|
||||||
|
> // TODO: Better and more thorough explanation
|
||||||
|
|
||||||
|
### Worker threads
|
||||||
|
|
||||||
|
- Config file key: `workers`
|
||||||
|
- Environment variable: `CONDUIT_WORKERS`
|
||||||
|
- Default value: cpu core count * 2
|
||||||
|
- Possible values: // TODO
|
||||||
|
|
||||||
|
> // TODO: Which thing exactly threads? What not?
|
||||||
|
|
||||||
|
### Listening address
|
||||||
|
|
||||||
|
- Config file key: `address`
|
||||||
|
- Environment variable: `CONDUIT_ADDRESS`
|
||||||
|
- Default value: `127.0.0.1`
|
||||||
|
- Possible values: Valid IP addresses.
|
||||||
|
|
||||||
|
Which IP address conduit is listening on. 127.0.0.1 means that Conduit can only be accessed from the same server or
|
||||||
|
through a reverse proxy on that server. If you want it to be accessible from any network interface (which you should
|
||||||
|
not, because other matrix servers should talk to your Conduit via a reverse proxy and not directly), you can set it
|
||||||
|
to `0.0.0.0`.
|
||||||
|
|
||||||
|
### Database cache capacity
|
||||||
|
|
||||||
|
- Config file key: `db_cache_capacity_mb`
|
||||||
|
- Environment variable: `CONDUIT_DB_CACHE_CAPACITY_MB`
|
||||||
|
- Default value: `200`
|
||||||
|
- Possible values: `true`, `false`
|
||||||
|
|
||||||
|
The total amount of memory (RAM) that the database cache will be able to use.
|
||||||
|
|
||||||
|
> // TODO: this needs clearification: In RAM or on disk and for what exactly?
|
||||||
|
|
||||||
|
### PDU cache capacity
|
||||||
|
|
||||||
|
- Config file key: `pdu_cache_capacity`
|
||||||
|
- Environment variable: `CONDUIT_PDU_CACHE_CAPACITY`
|
||||||
|
- Default value: `100_000`
|
||||||
|
- Suggested values: `1_000` - `1_000_000` (u32)
|
||||||
|
|
||||||
|
The total capacity (read: number of items) the pdu cache can hold in memory. Setting this to a lower number may slow
|
||||||
|
Conduit down, as it must fetch more data from the database. Increasing it will mean that Conduit will start to use more
|
||||||
|
memory as the cache slowly fills up.
|
||||||
|
|
||||||
|
### SQLite WAL clean interval
|
||||||
|
|
||||||
|
- Config file key: `sqlite_wal_clean_second_interval`
|
||||||
|
- Environment variable: `CONDUIT_SQLITE_WAL_CLEAN_SECOND_INTERVAL`
|
||||||
|
- Default value: `60` (every 60 seconds)
|
||||||
|
- Suggested values: `1` - `3600` (u32)
|
||||||
|
|
||||||
|
How often the WAL file should be cleaned up. The WAL file will be written to until cleaned up, after which it restarts
|
||||||
|
writing from the beginning.
|
||||||
|
|
||||||
|
The file's size will correspond to how long it could write to it in one go. (e.g. if conduit writes 100MB of data to the
|
||||||
|
database inbetween that period, the file will grow to 100MB). You can read more about that in
|
||||||
|
the [SQLite Docs](https://www.sqlite.org/draft/wal.html).
|
||||||
|
|
||||||
|
Reducing this down too much can offset the benefits of using a WAL at all. However, having this too high can result in a
|
||||||
|
large WAL file.
|
||||||
|
|
||||||
|
Only relevant when using SQLite as the database.
|
||||||
|
|
||||||
|
### Still undocumented config options
|
||||||
|
|
||||||
|
- `tracing_flame`
|
||||||
|
- `proxy`
|
||||||
|
- `jwt_secret`
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Contribute
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Basics
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Cross compilation
|
||||||
|
|
||||||
|
Install docker:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install docker
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
exec sudo su -l $USER
|
||||||
|
sudo systemctl start docker
|
||||||
|
cargo install cross
|
||||||
|
cross build --release --target armv7-unknown-linux-musleabihf
|
||||||
|
```
|
||||||
|
The cross-compiled binary is at target/armv7-unknown-linux-musleabihf/release/conduit
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Tests & CI
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# Conduit
|
||||||
|
|
||||||
|
Conduit is a simple, fast and reliable chat server for the [Matrix] protocol written in [Rust].
|
||||||
|
|
||||||
|
-----
|
||||||
|
> Note: This project is work-in-progress. Do *not* rely on it yet.
|
||||||
|
|
||||||
|
## What is Matrix?
|
||||||
|
|
||||||
|
[Matrix] is an open network for secure and decentralized
|
||||||
|
communication. It allows you to chat with friends even if they are using
|
||||||
|
another servers and client. You can even use bridges to communicate with users
|
||||||
|
outside of Matrix, like a community on Discord or your family on Hangouts.
|
||||||
|
|
||||||
|
## Why Conduit?
|
||||||
|
|
||||||
|
Conduit is an open-source server implementation of the [Matrix
|
||||||
|
Specification] with a focus on easy setup and low
|
||||||
|
system requirements, making it very easy to set up.
|
||||||
|
|
||||||
|
Other server implementations try to be extremely scalable, which makes sense if
|
||||||
|
the goal is to support millions of users on a single instance, but makes
|
||||||
|
smaller deployments a lot more inefficient. Conduit tries to keep it simple but
|
||||||
|
takes full advantage of that, for example by using an in-memory database for
|
||||||
|
[huge performance gains](https://github.com/timokoesters/romeo-and-juliet-benchmark).
|
||||||
|
|
||||||
|
The future for Conduit in peer-to-peer Matrix (every client contains a server)
|
||||||
|
is also bright.
|
||||||
|
|
||||||
|
Conduit tries to be reliable by using the Rust programming language and paying
|
||||||
|
close attention to error handling to make sure that evil clients, misbehaving
|
||||||
|
servers or even a partially broken database will not cause the whole server to
|
||||||
|
stop working.
|
||||||
|
|
||||||
|
## Chat with us!
|
||||||
|
|
||||||
|
We have a room on Matrix: [#conduit:matrix.org](https://matrix.to/#/#conduit:matrix.org)
|
||||||
|
|
||||||
|
You can also contact us using:
|
||||||
|
- Matrix: [@timo:koesters.xyz](https://matrix.to/#/@timo:koesters.xyz)
|
||||||
|
- Email: [conduit@koesters.xyz](mailto:conduit@koesters.xyz)
|
||||||
|
|
||||||
|
|
||||||
|
## Donate
|
||||||
|
|
||||||
|
Liberapay: <https://liberapay.com/timokoesters/>\
|
||||||
|
Bitcoin: `bc1qnnykf986tw49ur7wx9rpw2tevpsztvar5x8w4n`
|
||||||
|
|
||||||
|
|
||||||
|
[Matrix]: https://matrix.org/
|
||||||
|
[Rust]: https://rust-lang.org
|
||||||
|
[Matrix Specification]: https://matrix.org/docs/spec
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Installation
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
:::warning Test
|
||||||
|
:::
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Distribution packages
|
||||||
|
|
||||||
|
## Debian / Ubuntu
|
||||||
|
|
||||||
|
[@paul:luon.net](https://matrix.to/#/@paul:luon.net) plans to package Conduit for Debian as soon as it reaches 1.0.
|
||||||
|
Until it is available in the official repos, you can install the development version of it manually:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get install ca-certificates
|
||||||
|
wget --https-only -O /tmp/conduit.deb https://gitlab.com/famedly/conduit/-/jobs/artifacts/master/raw/conduit-x86_64-unknown-linux-gnu.deb?job=build:cargo-deb:x86_64-unknown-linux-gnu
|
||||||
|
sudo dpkg -i /tmp/conduit.deb
|
||||||
|
```
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# Prerequisites for running Conduit
|
||||||
|
|
||||||
|
You'll need:
|
||||||
|
|
||||||
|
- A domain. Commonly cost about $10/year.
|
||||||
|
- A Linux server with a stable internet connection, at least 500 MB of RAM and some disk space for messages and
|
||||||
|
attachments. Commonly start at $5/month.
|
||||||
|
- Some basic knowledge about using a shell, SSH and configuring and protecting a server.
|
||||||
|
|
||||||
|
|
||||||
|
## A word of caution:
|
||||||
|
|
||||||
|
Don't underestimate the toll of administrating your own server.
|
||||||
|
Conduit can't protect your conversations if your server gets compromised or deleted.
|
||||||
|
|
||||||
|
Make sure that you got:
|
||||||
|
|
||||||
|
- Automatic security updates
|
||||||
|
- On Ubuntu/Debian: Set up unattended-upgrades
|
||||||
|
- On RHEL/CentOS: Have a look at yum-cron
|
||||||
|
- A firewall blocking all but the needed incoming ports
|
||||||
|
- ufw is an easy interface for the linux firewall
|
||||||
|
- Protection against automatic attacks
|
||||||
|
- fail2ban scans logs and bans IPs which try to brute force their way into your server.
|
||||||
|
- Disable ssh login for root and switch from password to key based authentication.
|
||||||
|
- Automated backups
|
||||||
|
- Most VPS hosting companies offer whole server backups for a small fee.
|
||||||
|
- Or run your own backup with something like borg.
|
||||||
|
- A way to get notified if your disk fills up.
|
||||||
|
- If you send too much cat videos to your friends, Conduit might at some point become unable to
|
||||||
|
store any important messages.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# About Matrix Homeservers
|
||||||
|
|
||||||
|
Matrix homeservers manage its users chats. Every Matrix username includes the homserver it belongs to:
|
||||||
|
`@alice:matrix.org` means that the `matrix.org` homeserver hosts a user called `@alice`.
|
||||||
|
Every time someone chats with Alice, the `matrix.org` homeserver stores these messages.
|
||||||
|
When `@alice:matrix.org` talks with `@adelaide:matrix.org`, that's easy. Both users use the same server.
|
||||||
|
|
||||||
|
But how can `@bob:vector.tld`, who uses the `vector.tld` homeserver, exchange messages with `@alice:matrix.org`?
|
||||||
|
This is where it get's a bit more complicated.
|
||||||
|
|
||||||
|
## Matrix Homeserver discovery
|
||||||
|
|
||||||
|
The Matrix specification specifies multiple ways how servers can discover and then talk to each other.
|
||||||
|
Let's look at the most common one:
|
||||||
|
|
||||||
|
### .well-known files
|
||||||
|
|
||||||
|
At first, the only information a server has about a user (e.g. `@bob:vector.tld`) is its homeserver name: `vector.tld`.
|
||||||
|
It then makes a HTTP GET request to `https://vector.tld/.well-known/matrix/server`.
|
||||||
|
In the ideal case, this file contains a content like this:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"m.server": "matrix.vector.tld:443"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This translates to: The matrix homeserver software for users with a username ending on `vector.tld`
|
||||||
|
can be found at the address `matrix.vector.tld` at port 443 (which is the common port for HTTPS).
|
||||||
|
|
||||||
|
The homeserver on it's quest to find `@bob:vector.tld` now contacts `matrix.vector.tld:443` and is then
|
||||||
|
able to exchange chat messages with it.
|
||||||
|
|
||||||
|
|
||||||
|
### Why so complicated?
|
||||||
|
|
||||||
|
Organizations often don't want to run their Matrix server on the same machine that hosts their website,
|
||||||
|
but `@foo:matrix.evil.corp` usernames are ugly and everyone wants to be `@foo:evil.corp`.
|
||||||
|
|
||||||
|
To solve that problem, Matrix implements this extra step via a .well-known file or a DNS entry.
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
site_name: Conduit Docs
|
||||||
|
site_description: Conduit is a simple, fast and reliable chat server for the Matrix protocol
|
||||||
|
theme:
|
||||||
|
name: material
|
||||||
|
repo_url: https://gitlab.com/famedly/conduit
|
||||||
|
nav:
|
||||||
|
- Home: index.md
|
||||||
|
- Installation:
|
||||||
|
- Prerequisites: installation/prerequisites.md
|
||||||
|
- Distribution Packages: installation/packages.md
|
||||||
|
- Manual: installation/manual.md
|
||||||
|
- Docker: installation/docker.md
|
||||||
|
- Configuration:
|
||||||
|
- Conduit.toml: configuration/conduit.toml.md
|
||||||
|
- Appservices: configuration/appservices.md
|
||||||
|
- Development:
|
||||||
|
- Basics: development/basics.md
|
||||||
|
- Cross compilation: development/cross-compilation.md
|
||||||
|
- Tests & CI: development/tests-ci.md
|
||||||
|
|
||||||
@@ -1092,13 +1092,14 @@ pub(crate) async fn invite_helper<'a>(
|
|||||||
"Could not accept incoming PDU as timeline event.",
|
"Could not accept incoming PDU as timeline event.",
|
||||||
))?;
|
))?;
|
||||||
|
|
||||||
let servers = db
|
for server in db
|
||||||
.rooms
|
.rooms
|
||||||
.room_servers(room_id)
|
.room_servers(room_id)
|
||||||
.filter_map(|r| r.ok())
|
.filter_map(|r| r.ok())
|
||||||
.filter(|server| &**server != db.globals.server_name());
|
.filter(|server| &**server != db.globals.server_name())
|
||||||
|
{
|
||||||
db.sending.send_pdu(servers, &pdu_id)?;
|
db.sending.send_pdu(&server, &pdu_id)?;
|
||||||
|
}
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2104,12 +2104,13 @@ impl Rooms {
|
|||||||
// where events in the current room state do not exist
|
// where events in the current room state do not exist
|
||||||
self.set_room_state(room_id, statehashid)?;
|
self.set_room_state(room_id, statehashid)?;
|
||||||
|
|
||||||
let servers = self
|
for server in self
|
||||||
.room_servers(room_id)
|
.room_servers(room_id)
|
||||||
.filter_map(|r| r.ok())
|
.filter_map(|r| r.ok())
|
||||||
.filter(|server| &**server != db.globals.server_name());
|
.filter(|server| &**server != db.globals.server_name())
|
||||||
|
{
|
||||||
db.sending.send_pdu(servers, &pdu_id)?;
|
db.sending.send_pdu(&server, &pdu_id)?;
|
||||||
|
}
|
||||||
|
|
||||||
for appservice in db.appservice.all()? {
|
for appservice in db.appservice.all()? {
|
||||||
if self.appservice_in_room(room_id, &appservice, db)? {
|
if self.appservice_in_room(room_id, &appservice, db)? {
|
||||||
|
|||||||
+8
-18
@@ -84,7 +84,7 @@ pub enum SendingEventType {
|
|||||||
pub struct Sending {
|
pub struct Sending {
|
||||||
/// The state for a given state hash.
|
/// The state for a given state hash.
|
||||||
pub(super) servername_educount: Arc<dyn Tree>, // EduCount: Count of last EDU sync
|
pub(super) servername_educount: Arc<dyn Tree>, // EduCount: Count of last EDU sync
|
||||||
pub(super) servernameevent_data: Arc<dyn Tree>, // ServernameEvent = (+ / $)SenderKey / ServerName / UserId + PduId / Id (for edus), Data = EDU content
|
pub(super) servernameevent_data: Arc<dyn Tree>, // ServernamEvent = (+ / $)SenderKey / ServerName / UserId + PduId / Id (for edus), Data = EDU content
|
||||||
pub(super) servercurrentevent_data: Arc<dyn Tree>, // ServerCurrentEvents = (+ / $)ServerName / UserId + PduId / Id (for edus), Data = EDU content
|
pub(super) servercurrentevent_data: Arc<dyn Tree>, // ServerCurrentEvents = (+ / $)ServerName / UserId + PduId / Id (for edus), Data = EDU content
|
||||||
pub(super) maximum_requests: Arc<Semaphore>,
|
pub(super) maximum_requests: Arc<Semaphore>,
|
||||||
pub sender: mpsc::UnboundedSender<(Vec<u8>, Vec<u8>)>,
|
pub sender: mpsc::UnboundedSender<(Vec<u8>, Vec<u8>)>,
|
||||||
@@ -423,23 +423,13 @@ impl Sending {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tracing::instrument(skip(self, servers, pdu_id))]
|
#[tracing::instrument(skip(self, server, pdu_id))]
|
||||||
pub fn send_pdu<I: Iterator<Item = Box<ServerName>>>(
|
pub fn send_pdu(&self, server: &ServerName, pdu_id: &[u8]) -> Result<()> {
|
||||||
&self,
|
let mut key = server.as_bytes().to_vec();
|
||||||
servers: I,
|
key.push(0xff);
|
||||||
pdu_id: &[u8],
|
key.extend_from_slice(pdu_id);
|
||||||
) -> Result<()> {
|
self.servernameevent_data.insert(&key, &[])?;
|
||||||
let mut batch = servers.map(|server| {
|
self.sender.unbounded_send((key, vec![])).unwrap();
|
||||||
let mut key = server.as_bytes().to_vec();
|
|
||||||
key.push(0xff);
|
|
||||||
key.extend_from_slice(pdu_id);
|
|
||||||
|
|
||||||
self.sender.unbounded_send((key.clone(), vec![])).unwrap();
|
|
||||||
|
|
||||||
(key, Vec::new())
|
|
||||||
});
|
|
||||||
|
|
||||||
self.servernameevent_data.insert_batch(&mut batch)?;
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2880,13 +2880,14 @@ async fn create_join_event(
|
|||||||
db,
|
db,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let servers = db
|
for server in db
|
||||||
.rooms
|
.rooms
|
||||||
.room_servers(room_id)
|
.room_servers(room_id)
|
||||||
.filter_map(|r| r.ok())
|
.filter_map(|r| r.ok())
|
||||||
.filter(|server| &**server != db.globals.server_name());
|
.filter(|server| &**server != db.globals.server_name())
|
||||||
|
{
|
||||||
db.sending.send_pdu(servers, &pdu_id)?;
|
db.sending.send_pdu(&server, &pdu_id)?;
|
||||||
|
}
|
||||||
|
|
||||||
db.flush()?;
|
db.flush()?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user