Compare commits
100 Commits
2.1.0+v1.6
...
main
Author | SHA1 | Date |
---|---|---|
Moritz | c36c147dff | |
Moritz | 8a37984e15 | |
Moritz | 63a1abb2c0 | |
3wc | 86106b6b6f | |
3wc | 8250916051 | |
3wc | e007bda255 | |
3wc | 951fc56434 | |
Moritz | 6fe14edef7 | |
Moritz | a0a9c2b863 | |
3wc | bdf8e11dc5 | |
3wc | 2658fed366 | |
Simon | 72b59ce4ad | |
Moritz | dfed1e54da | |
3wc | d4ccb3588b | |
3wc | 11f70b7878 | |
Moritz | fd601c23f3 | |
knoflook | b9097c1f94 | |
Moritz | 75d1303118 | |
Moritz | 90c8d0dbba | |
decentral1se | a85310346b | |
decentral1se | 116840623b | |
decentral1se | 919aaf0116 | |
decentral1se | 43a3502fad | |
decentral1se | 08b49c14d9 | |
decentral1se | 7683ebd189 | |
decentral1se | a3c9dfd65b | |
decentral1se | 6dacecbfac | |
decentral1se | 4770a03cb7 | |
decentral1se | 7ead29b750 | |
decentral1se | 3c772cc1e5 | |
decentral1se | e146435394 | |
decentral1se | 795c2eb685 | |
Moritz | 7b1b5c37ed | |
Philipp Rothmann | 84204b03a7 | |
Philipp Rothmann | b57b73d5d6 | |
Philipp Rothmann | 66bd6be8fc | |
Moritz | dda7f2a369 | |
Moritz | d22a8257fb | |
Philipp Rothmann | 2445d9f33a | |
Moritz | 2a45273541 | |
decentral1se | 48efb7de51 | |
decentral1se | b2e8bf9c8b | |
decentral1se | d02981a2bf | |
decentral1se | c6f9b117e2 | |
3wc | ade6147f35 | |
3wc | 50e0aa06cc | |
3wc | f3732c8392 | |
decentral1se | e171ce052e | |
knoflook | 5d5bd70818 | |
knoflook | fd1a6c7a4a | |
decentral1se | 39a47a2515 | |
knoflook | 6e556c8b2d | |
decentral1se | 74fb8014fa | |
decentral1se | 787e0fb3a9 | |
knoflook | ead52c1acd | |
knoflook | fca551b735 | |
decentral1se | f43a47d4c8 | |
decentral1se | beeb1e47b1 | |
decentral1se | 931e89f5f5 | |
josef | 5a72540db2 | |
3wc | 703b8d91d2 | |
3wc | 05e9ee0732 | |
3wc | ec22040bd3 | |
3wc | d5c70f5567 | |
decentral1se | 4445e0249f | |
decentral1se | 89f5069aa2 | |
decentral1se | 77b3dbdaa9 | |
decentral1se | 1a0211b743 | |
decentral1se | eb541c41ee | |
decentral1se | 008ec1126b | |
decentral1se | 0c26ea22f9 | |
decentral1se | e3bf165da0 | |
decentral1se | 245e81e4bb | |
decentral1se | 9b12e4a0eb | |
decentral1se | e7f81cb9ea | |
decentral1se | 88bcc2186b | |
decentral1se | 9b3e1793e0 | |
decentral1se | ee6d1e92f4 | |
decentral1se | 3e3c239c88 | |
decentral1se | e905c24eb2 | |
decentral1se | 91d29cfe92 | |
decentral1se | 9eb0856888 | |
decentral1se | 2cc70498f6 | |
decentral1se | 92a9ea2f22 | |
decentral1se | ca2e0d7dc0 | |
decentral1se | 09ff470ba6 | |
Philipp Rothmann | 09c4ca146f | |
decentral1se | 99f45636f5 | |
decentral1se | 1e8b616cba | |
decentral1se | 13edf77ece | |
decentral1se | f56d9db3f6 | |
decentral1se | 4cae5f5b75 | |
decentral1se | 77170432eb | |
decentral1se | c423db2cb7 | |
decentral1se | e59de33d5b | |
decentral1se | 998583c2a5 | |
decentral1se | 0dff883beb | |
decentral1se | cd0f6359b1 | |
decentral1se | edf72453a6 | |
decentral1se | f18f098b45 |
|
@ -0,0 +1,49 @@
|
|||
---
|
||||
kind: pipeline
|
||||
name: deploy to swarm-test.autonomic.zone
|
||||
steps:
|
||||
- name: deployment
|
||||
image: git.coopcloud.tech/coop-cloud/stack-ssh-deploy:latest
|
||||
settings:
|
||||
host: swarm-test.autonomic.zone
|
||||
stack: matrix-synapse
|
||||
generate_secrets: true
|
||||
purge: true
|
||||
deploy_key:
|
||||
from_secret: drone_ssh_swarm_test
|
||||
networks:
|
||||
- proxy
|
||||
environment:
|
||||
DOMAIN: matrix-synapse.swarm-test.autonomic.zone
|
||||
STACK_NAME: matrix-synapse
|
||||
LETS_ENCRYPT_ENV: production
|
||||
DISCORD_BRIDGE_YAML_VERSION: v1
|
||||
ENTRYPOINT_CONF_VERSION: v1
|
||||
HOMESERVER_YAML_VERSION: v17
|
||||
LOG_CONFIG_VERSION: v1
|
||||
SHARED_SECRET_AUTH_VERSION: v1
|
||||
SIGNAL_BRIDGE_YAML_VERSION: v1
|
||||
TELEGRAM_BRIDGE_YAML_VERSION: v1
|
||||
SECRET_DB_PASSWORD_VERSION: v1
|
||||
SECRET_FORM_SECRET_VERSION: v1
|
||||
SECRET_MACAROON_SECRET_KEY_VERSION: v1
|
||||
SECRET_REGISTRATION_SHARED_SECRET_VERSION: v1
|
||||
trigger:
|
||||
branch:
|
||||
- main
|
||||
---
|
||||
kind: pipeline
|
||||
name: generate recipe catalogue
|
||||
steps:
|
||||
- name: release a new version
|
||||
image: plugins/downstream
|
||||
settings:
|
||||
server: https://build.coopcloud.tech
|
||||
token:
|
||||
from_secret: drone_abra-bot_token
|
||||
fork: true
|
||||
repositories:
|
||||
- coop-cloud/auto-recipes-catalogue-json
|
||||
|
||||
trigger:
|
||||
event: tag
|
116
.env.sample
116
.env.sample
|
@ -1,35 +1,55 @@
|
|||
TYPE=matrix-synapse
|
||||
|
||||
DOMAIN=matrix.example.com
|
||||
DOMAIN=matrix-synapse.example.com
|
||||
TIMEOUT=300
|
||||
ENABLE_AUTO_UPDATE=true
|
||||
LETS_ENCRYPT_ENV=production
|
||||
COMPOSE_FILE="compose.yml"
|
||||
# POST_DEPLOY_CMDS="db set_admin"
|
||||
|
||||
## Admin details
|
||||
|
||||
ADMIN_EMAIL=admin@example.com
|
||||
|
||||
## Secrets
|
||||
|
||||
SECRET_DB_PASSWORD_VERSION=v1
|
||||
|
||||
SYNAPSE_ADMIN_EMAIL=admin@example.com
|
||||
|
||||
SECRET_REGISTRATION_SHARED_SECRET_VERSION=v1
|
||||
SECRET_MACAROON_SECRET_KEY_VERSION=v1
|
||||
SECRET_FORM_SECRET_VERSION=v1
|
||||
SECRET_MACAROON_VERSION=v1
|
||||
SECRET_REGISTRATION_VERSION=v1
|
||||
|
||||
COMPOSE_FILE="compose.yml"
|
||||
## Federation
|
||||
|
||||
#DISABLE_FEDERATION=1
|
||||
|
||||
# Set "true" to enable federation endpoint on $DOMAIN/.well-known/matrix/server
|
||||
SERVE_SERVER_WELLKNOWN=false
|
||||
|
||||
ALLOW_PUBLIC_ROOMS_FEDERATION=false
|
||||
|
||||
## Registration
|
||||
|
||||
ENABLE_REGISTRATION=false
|
||||
PASSWORD_LOGIN_ENABLED=true
|
||||
|
||||
## Room auto-join
|
||||
|
||||
#AUTO_JOIN_ROOM_ENABLED=1
|
||||
#AUTO_JOIN_ROOM="#example:example.com"
|
||||
|
||||
## Logging
|
||||
|
||||
# for the homserver
|
||||
SQL_LOG_LEVEL=WARN
|
||||
ROOT_LOG_LEVEL=WARN
|
||||
|
||||
REDACTION_RETENTION_PERIOD=7d
|
||||
# for nginx
|
||||
NGINX_ACCESS_LOG_LOCATION="/dev/null"
|
||||
NGINX_ERROR_LOG_LOCATION="/dev/null"
|
||||
# Comment the previous two lines and uncomment these to enable logging
|
||||
#NGINX_ACCESS_LOG_LOCATION="/dev/stdout"
|
||||
#NGINX_ERROR_LOG_LOCATION="/dev/stderr"
|
||||
|
||||
RETENTION_MAX_LIFETIME=4w
|
||||
## Privacy
|
||||
|
||||
ENABLE_3PID_LOOKUP=true
|
||||
|
||||
|
@ -40,6 +60,28 @@ ENCRYPTED_BY_DEFAULT=all
|
|||
#ENABLE_ALLOWLIST=1
|
||||
#FEDERATION_ALLOWLIST="[]"
|
||||
|
||||
# Set these to keyservers you trust - usually the same as your federation allowlist
|
||||
#TRUSTED_KEYSERVERS="trusted_key_servers:\n - server_name: 'example.com'\n - server_name: 'example2.com'"
|
||||
|
||||
## Retention
|
||||
|
||||
ALLOWED_LIFETIME_MAX=4w
|
||||
|
||||
REDACTION_RETENTION_PERIOD=7d
|
||||
RETENTION_MAX_LIFETIME=4w
|
||||
|
||||
#MEDIA_RETENTION_LOCAL_LIFETIME=30d
|
||||
#MEDIA_RETENTION_REMOTE_LIFETIME=14d
|
||||
|
||||
## Ratelimit
|
||||
|
||||
#LOGIN_LIMIT_IP_PER_SECOND=5
|
||||
#LOGIN_LIMIT_IP_BURST=15
|
||||
#LOGIN_LIMIT_ACCOUNT_PER_SECOND=1
|
||||
#LOGIN_LIMIT_ACCOUNT_BURST=10
|
||||
|
||||
## Keycloak SSO
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.keycloak.yml"
|
||||
#KEYCLOAK_ENABLED=1
|
||||
#KEYCLOAK_ID=keycloak
|
||||
|
@ -50,23 +92,26 @@ ENCRYPTED_BY_DEFAULT=all
|
|||
#KEYCLOAK_ALLOW_EXISTING_USERS=false
|
||||
#SECRET_KEYCLOAK_CLIENT_SECRET_VERSION=v1
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.keycloak2.yml"
|
||||
#KEYCLOAK2_ENABLED=1
|
||||
#KEYCLOAK2_ID=keycloak2
|
||||
#KEYCLOAK2_NAME=
|
||||
#KEYCLOAK2_URL=
|
||||
#KEYCLOAK2_CLIENT_ID=
|
||||
#KEYCLOAK2_CLIENT_DOMAIN=
|
||||
#KEYCLOAK2_ALLOW_EXISTING_USERS=false
|
||||
#SECRET_KEYCLOAK2_CLIENT_SECRET_VERSION=v1
|
||||
## TURN
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.keycloak3.yml"
|
||||
#KEYCLOAK3_ENABLED=1
|
||||
#KEYCLOAK3_ID=keycloak3
|
||||
#KEYCLOAK3_NAME=
|
||||
#KEYCLOAK3_URL=
|
||||
#KEYCLOAK3_CLIENT_ID=
|
||||
#KEYCLOAK3_CLIENT_DOMAIN=
|
||||
#KEYCLOAK3_ALLOW_EXISTING_USERS=false
|
||||
#SECRET_KEYCLOAK3_CLIENT_SECRET_VERSION=v1
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.turn.yml"
|
||||
#TURN_ENABLED=1
|
||||
#TURN_URIS="[\"turns:coturn.foo.zone?transport=udp\", \"turns:coturn.foo.zone?transport=tcp\"]"
|
||||
#TURN_ALLOW_GUESTS=true
|
||||
#KEYCLOAK2_ALLOW_EXISTING_USERS=false
|
||||
#SECRET_TURN_SHARED_SECRET_VERSION=v1
|
||||
|
||||
## SMTP
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml"
|
||||
#SMTP_ENABLED=1
|
||||
#SMTP_APP_NAME=
|
||||
|
@ -76,28 +121,49 @@ ENCRYPTED_BY_DEFAULT=all
|
|||
#SMTP_USER=
|
||||
#SECRET_SMTP_PASSWORD_VERSION=v1
|
||||
|
||||
## App services
|
||||
|
||||
#APP_SERVICES_ENABLED=1
|
||||
#APP_SERVICE_CONFIGS="[\"...\"]"
|
||||
|
||||
## Telegram bridge
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.telegram.yml"
|
||||
#APP_SERVICE_BOT_USERNAME=telegrambot
|
||||
#APP_SERVICE_DISPLAY_NAME="Telegram bridge bot"
|
||||
#APP_SERVICE_ID=
|
||||
#HOMESERVER_DOMAIN=
|
||||
#HOMESERVER_URL=
|
||||
#HOMESERVER_DOMAIN=$DOMAIN
|
||||
#HOMESERVER_URL=https://$DOMAIN
|
||||
#VERIFY_SSL=false
|
||||
#ENABLE_ENCRYPTION=true
|
||||
#TELEGRAM_APP_ID=
|
||||
#TELEGRAM_BRIDGE_ADMIN_1=
|
||||
#TELEGRAM_BRIDGE_ADMIN_2=
|
||||
#TELEGRAM_BRIDGE_PERMISSIONS="{ \"*\": \"relaybot\", \"@foo:matrix.example.com\": \"admin\" }"
|
||||
#TELEGRAM_SYNC_CHANNEL_MEMBERS=true
|
||||
#SECRET_TELEGRAM_DB_PASSWORD_VERSION=v1
|
||||
#SECRET_TELEGRAM_API_HASH_VERSION=v1
|
||||
#SECRET_TELEGRAM_BOT_TOKEN_VERSION=v1
|
||||
#SECRET_TELEGRAM_AS_TOKEN_VERSION=v1
|
||||
#SECRET_TELEGRAM_HS_TOKEN_VERSION=v1
|
||||
|
||||
COMPOSE_FILE="$COMPOSE_FILE:compose.discord.yml"
|
||||
## Discord bridge
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.discord.yml"
|
||||
#DISCORD_CLIENT_ID=
|
||||
#DISCORD_BRIDGE_ADMIN=
|
||||
#SECRET_DISCORD_BOT_TOKEN_VERSION=v1
|
||||
#SECRET_DISCORD_DB_PASSWORD_VERSION=v1
|
||||
|
||||
## Signal bridge
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.signal.yml"
|
||||
#SIGNAL_ENABLE_ENCRYPTION=true
|
||||
#SIGNAL_BRIDGE_PERMISSIONS="{ \"*\": \"relay\" }"
|
||||
#SECRET_SIGNAL_AS_TOKEN_VERSION=v1
|
||||
#SECRET_SIGNAL_DB_PASSWORD_VERSION=v1
|
||||
#SECRET_SIGNAL_HS_TOKEN_VERSION=v1
|
||||
|
||||
## Shared auth
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.shared_secret_auth.yml"
|
||||
#SHARED_SECRET_AUTH_ENABLED=1
|
||||
#SECRET_SHARED_SECRET_AUTH_VERSION=v1 # length=128
|
||||
|
|
89
README.md
89
README.md
|
@ -18,75 +18,36 @@
|
|||
1. Set up Docker Swarm and [`abra`](https://docs.coopcloud.tech/abra/)
|
||||
2. Deploy [`coop-cloud/traefik`](https://git.coopcloud.tech/coop-cloud/traefik)
|
||||
3. `abra app new matrix-synapse --secrets` (optionally with `--pass` if you'd like to save secrets in `pass`)
|
||||
4. `abra app YOURAPPDOMAIN config` - be sure to change `$DOMAIN` to something that resolves to your Docker swarm box
|
||||
5. `abra app YOURAPPDOMAIN deploy`
|
||||
6. Create an initial user: `abra app YOURAPPDOMAIN run app register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008`
|
||||
4. `abra app config YOURAPPDOMAIN` - be sure to change `$DOMAIN` to something that resolves to your Docker swarm box
|
||||
5. `abra app deploy YOURAPPDOMAIN`
|
||||
6. Create an initial user: `abra app run YOURAPPDOMAIN app register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008`
|
||||
|
||||
## Tips & Tricks
|
||||
|
||||
### Set Admin User
|
||||
|
||||
`abra app cmd YOURAPPDOMAIN db set_admin <adminuser>`
|
||||
|
||||
### Disabling federation
|
||||
|
||||
> We're not sure this does it exactly and there is still a discussion running
|
||||
> upstrem about whether this is the right way to do it & whether it could be
|
||||
> more convenient. We welcome issues / change sets to close up more federation
|
||||
> functionality.
|
||||
|
||||
- use `DISABLE_FEDERATION=1` to turn off federation listeners
|
||||
- don't use [`compose.matrix.yml`](https://git.coopcloud.tech/coop-cloud/traefik/src/branch/master/compose.matrix.yml) in your traefik config to keep the federation ports closed
|
||||
- Use `DISABLE_FEDERATION=1` to turn off federation listeners
|
||||
- Don't use [`compose.matrix.yml`](https://git.coopcloud.tech/coop-cloud/traefik/src/branch/master/compose.matrix.yml) in your traefik config to keep the federation ports closed
|
||||
|
||||
### Enabling federation
|
||||
|
||||
See [`#27`](https://git.coopcloud.tech/coop-cloud/matrix-synapse/pulls/27) for more.
|
||||
|
||||
Depending on your setup, using `SERVE_SERVER_WELLKNOWN=true` might work to start federating.
|
||||
|
||||
### Seeing what changed in `homeserver.yaml` between versions
|
||||
|
||||
Change the version range to suit your needs.
|
||||
|
||||
```
|
||||
git clone https://github.com/matrix-org/synapse
|
||||
cd synapse/docs
|
||||
git log --follow -p v1.48.0..v1.51.0 sample_config.yaml
|
||||
```
|
||||
|
||||
### Generating a new `homeserver.yaml`
|
||||
|
||||
The default is also available to see [here](https://matrix-org.github.io/synapse/latest/usage/configuration/homeserver_sample_config.html).
|
||||
|
||||
```
|
||||
docker run -it \
|
||||
--entrypoint="" \
|
||||
-e SYNAPSE_SERVER_NAME=foo.com \
|
||||
-e SYNAPSE_REPORT_STATS=no \
|
||||
matrixdotorg/synapse:v1.48.0 \
|
||||
sh -c '/start.py generate; cat /data/homeserver.yaml' > homeserver.yaml.tmpl`
|
||||
```
|
||||
|
||||
### Generating a new `<server>.log.config`
|
||||
|
||||
```
|
||||
docker run -it \
|
||||
--entrypoint="" \
|
||||
-e SYNAPSE_SERVER_NAME=foo.com \
|
||||
-e SYNAPSE_REPORT_STATS=no \
|
||||
matrixdotorg/synapse:v1.48.0 \
|
||||
sh -c '/start.py generate; cat /data/foo.com.log.config' > log.config
|
||||
```
|
||||
See [`#27`](https://git.coopcloud.tech/coop-cloud/matrix-synapse/pulls/27) for more. Depending on your setup, using `SERVE_SERVER_WELLKNOWN=true` might work to start federating. Make sure you don't leave `DISABLE_FEDERATION=1` set!
|
||||
|
||||
### Getting client discovery on a custom domain
|
||||
|
||||
You'll need to deploy something like [this](https://git.autonomic.zone/ruangrupa/well-known-uris).
|
||||
|
||||
This could be implemented in this recipe but we haven't merged it in yet. Change sets are welcome.
|
||||
You'll need to deploy something like [this](https://git.autonomic.zone/ruangrupa/well-known-uris). This could be implemented in this recipe but we haven't merged it in yet. Change sets are welcome.
|
||||
|
||||
### Telegram bridging
|
||||
|
||||
> WIP
|
||||
> WIP docs
|
||||
|
||||
Setting it up is a bit of a chicken/egg & chasing cats moment.
|
||||
|
||||
You need to get your bot setup on the telegram side first and have these values:
|
||||
You need to get your bot setup on the telegram side first by creating a [telegram app](https://my.telegram.org/apps) and a [telegram bot](https://docs.mau.fi/bridges/python/telegram/relay-bot.html#setup) and have these values:
|
||||
|
||||
```
|
||||
api_id: ...
|
||||
|
@ -94,7 +55,12 @@ api_hash: ...
|
|||
telegram_bot_token: ...
|
||||
```
|
||||
|
||||
Here is a rough guide:
|
||||
Also:
|
||||
- Make sure to uncomment `APP_SERVICES_ENABLED`
|
||||
- include the registration in synapse: `APP_SERVICE_CONFIGS="[\"/telegram-data/registration.yaml\"]"`
|
||||
- and set yourself as admin under `TELEGRAM_BRIDGE_PERMISSIONS`
|
||||
|
||||
A rough guide for the following steps:
|
||||
|
||||
```
|
||||
abra app secret insert <domain> telegram_api_hash v1 <secret>
|
||||
|
@ -121,7 +87,7 @@ Some helpful documentation:
|
|||
|
||||
### Discord bridging
|
||||
|
||||
> WIP
|
||||
> WIP docs
|
||||
|
||||
Just as messy as the Telegram bridging above! Rough guide:
|
||||
|
||||
|
@ -137,3 +103,18 @@ Some helpful documentation:
|
|||
|
||||
- [`matrix-org/matrix-appservice-discord` docs](https://github.com/matrix-org/matrix-appservice-discord#bridging-a-room)
|
||||
- [`t2bot.io/discord`](https://t2bot.io/discord/)
|
||||
|
||||
### Signal bridging
|
||||
|
||||
> WIP docs
|
||||
|
||||
OK, it's also awful to set this up. Do you see a pattern emerging :)
|
||||
|
||||
- fake that you have the required tokens:
|
||||
- `abra app secret insert example.com signal_hs_token v1 foo`
|
||||
- `abra app secret insert example.com signal_as_token v1 foo`
|
||||
- generate the database password:
|
||||
- `abra app secret generate example.com -a`
|
||||
- deploy the thing and then check the `/data/registration.yaml`
|
||||
- rm the fake `signal_hs/as_token` values and re-insert the new ones from `registration.yaml`
|
||||
- re-deploy the whole thing and then it should come up, message `@signalbot:example.com` to test
|
||||
|
|
22
abra.sh
22
abra.sh
|
@ -1,5 +1,19 @@
|
|||
export ENTRYPOINT_CONF_VERSION=v1
|
||||
export HOMESERVER_YAML_VERSION=v11
|
||||
export DISCORD_BRIDGE_YAML_VERSION=v2
|
||||
export ENTRYPOINT_CONF_VERSION=v2
|
||||
export HOMESERVER_YAML_VERSION=v28
|
||||
export LOG_CONFIG_VERSION=v2
|
||||
export TELEGRAM_BRIDGE_YAML_VERSION=v2
|
||||
export DISCORD_BRIDGE_YAML_VERSION=v1
|
||||
export SHARED_SECRET_AUTH_VERSION=v1
|
||||
export SIGNAL_BRIDGE_YAML_VERSION=v4
|
||||
export TELEGRAM_BRIDGE_YAML_VERSION=v6
|
||||
export NGINX_CONFIG_VERSION=v6
|
||||
export WK_SERVER_VERSION=v1
|
||||
export WK_CLIENT_VERSION=v1
|
||||
|
||||
set_admin () {
|
||||
admin=akadmin
|
||||
if [ -n "$1" ]
|
||||
then
|
||||
admin=$1
|
||||
fi
|
||||
psql -U synapse -c "UPDATE users SET admin = 1 WHERE name = '@$admin:$DOMAIN'";
|
||||
}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
authentik:
|
||||
env:
|
||||
KEYCLOAK_ID: authentik
|
||||
KEYCLOAK_NAME: sso
|
||||
KEYCLOAK_URL: https://authentik.example.com/application/o/matrix/
|
||||
KEYCLOAK_CLIENT_DOMAIN: https://element-web.example.com
|
||||
KEYCLOAK_ALLOW_EXISTING_USERS: "true"
|
||||
KEYCLOAK_CLIENT_ID: matrix
|
||||
uncomment:
|
||||
- compose.keycloak.yml
|
||||
- KEYCLOAK_ENABLED
|
||||
- KEYCLOAK_CLIENT_ID
|
||||
- SECRET_KEYCLOAK_CLIENT_SECRET_VERSION
|
||||
shared_secrets:
|
||||
matrix_secret: keycloak_client_secret
|
|
@ -43,7 +43,7 @@ services:
|
|||
networks:
|
||||
- internal
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "synapse"]
|
||||
test: ["CMD", "pg_isready", "-U", "$POSTGRES_USER" ]
|
||||
volumes:
|
||||
- discord-postgres:/var/lib/postgresql/data
|
||||
|
||||
|
|
|
@ -7,8 +7,8 @@ services:
|
|||
- db_password
|
||||
- form_secret
|
||||
- keycloak_client_secret
|
||||
- macaroon_secret_key
|
||||
- registration_shared_secret
|
||||
- macaroon
|
||||
- registration
|
||||
environment:
|
||||
- KEYCLOAK_CLIENT_DOMAIN
|
||||
- KEYCLOAK_CLIENT_ID
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
app:
|
||||
secrets:
|
||||
- keycloak3_client_secret
|
||||
environment:
|
||||
- KEYCLOAK3_ALLOW_EXISTING_USERS
|
||||
- KEYCLOAK3_CLIENT_ID
|
||||
- KEYCLOAK3_ENABLED
|
||||
- KEYCLOAK3_ID
|
||||
- KEYCLOAK3_NAME
|
||||
- KEYCLOAK3_URL
|
||||
|
||||
secrets:
|
||||
keycloak3_client_secret:
|
||||
external: true
|
||||
name: ${STACK_NAME}_keycloak3_client_secret_${SECRET_KEYCLOAK3_CLIENT_SECRET_VERSION}
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
app:
|
||||
environment:
|
||||
- SHARED_SECRET_AUTH_ENABLED
|
||||
secrets:
|
||||
- shared_secret_auth
|
||||
configs:
|
||||
- source: shared_secret_auth
|
||||
target: /usr/local/lib/python3.11/site-packages/shared_secret_authenticator.py
|
||||
|
||||
configs:
|
||||
shared_secret_auth:
|
||||
name: ${STACK_NAME}_shared_secret_auth_${SHARED_SECRET_AUTH_VERSION}
|
||||
file: shared_secret_authenticator.py
|
||||
|
||||
secrets:
|
||||
shared_secret_auth:
|
||||
external: true
|
||||
name: ${STACK_NAME}_shared_secret_auth_${SECRET_SHARED_SECRET_AUTH_VERSION}
|
|
@ -0,0 +1,81 @@
|
|||
---
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
app:
|
||||
environment:
|
||||
- APP_SERVICES_ENABLED
|
||||
- APP_SERVICE_CONFIGS
|
||||
volumes:
|
||||
- signal-data:/signal-data
|
||||
|
||||
signald:
|
||||
image: docker.io/signald/signald:0.23.2-non-root
|
||||
networks:
|
||||
- internal
|
||||
volumes:
|
||||
- signald-data:/signald
|
||||
|
||||
signalbridge:
|
||||
image: dock.mau.dev/mautrix/signal:v0.4.3
|
||||
depends_on:
|
||||
- signaldb
|
||||
configs:
|
||||
- source: signal_bridge_yaml
|
||||
target: /data/config.yaml
|
||||
environment:
|
||||
- HOMESERVER_DOMAIN
|
||||
- HOMESERVER_URL
|
||||
- SIGNAL_BRIDGE_PERMISSIONS
|
||||
- SIGNAL_ENABLE_ENCRYPTION
|
||||
- VERIFY_SSL
|
||||
secrets:
|
||||
- signal_as_token
|
||||
- signal_db_password
|
||||
- signal_hs_token
|
||||
- shared_secret_auth
|
||||
volumes:
|
||||
- signal-data:/data
|
||||
- signald-data:/signald
|
||||
networks:
|
||||
- internal
|
||||
|
||||
signaldb:
|
||||
image: postgres:13-alpine
|
||||
secrets:
|
||||
- signal_db_password
|
||||
environment:
|
||||
- LC_COLLATE=C
|
||||
- LC_CTYPE=C
|
||||
- POSTGRES_DB=signalbridge
|
||||
- POSTGRES_INITDB_ARGS="-E \"UTF8\""
|
||||
- POSTGRES_PASSWORD_FILE=/run/secrets/signal_db_password
|
||||
- POSTGRES_USER=signalbridge
|
||||
networks:
|
||||
- internal
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "$POSTGRES_USER" ]
|
||||
volumes:
|
||||
- signal-postgres:/var/lib/postgresql/data
|
||||
|
||||
configs:
|
||||
signal_bridge_yaml:
|
||||
name: ${STACK_NAME}_signal_bridge_yaml_${SIGNAL_BRIDGE_YAML_VERSION}
|
||||
file: signal_bridge.yaml.tmpl
|
||||
template_driver: golang
|
||||
|
||||
volumes:
|
||||
signald-data:
|
||||
signal-data:
|
||||
signal-postgres:
|
||||
|
||||
secrets:
|
||||
signal_db_password:
|
||||
external: true
|
||||
name: ${STACK_NAME}_signal_db_password_${SECRET_SIGNAL_DB_PASSWORD_VERSION}
|
||||
signal_as_token:
|
||||
external: true
|
||||
name: ${STACK_NAME}_signal_as_token_${SECRET_SIGNAL_AS_TOKEN_VERSION}
|
||||
signal_hs_token:
|
||||
external: true
|
||||
name: ${STACK_NAME}_signal_hs_token_${SECRET_SIGNAL_HS_TOKEN_VERSION}
|
|
@ -6,8 +6,8 @@ services:
|
|||
secrets:
|
||||
- db_password
|
||||
- form_secret
|
||||
- macaroon_secret_key
|
||||
- registration_shared_secret
|
||||
- macaroon
|
||||
- registration
|
||||
- smtp_password
|
||||
environment:
|
||||
- SMTP_APP_NAME
|
||||
|
|
|
@ -10,7 +10,7 @@ services:
|
|||
- telegram-data:/telegram-data
|
||||
|
||||
telegrambridge:
|
||||
image: dock.mau.dev/mautrix/telegram:1f5b91cbec7866663d8dd8f4c9a62115e2905552-amd64
|
||||
image: dock.mau.dev/mautrix/telegram:v0.15.1
|
||||
depends_on:
|
||||
- telegramdb
|
||||
configs:
|
||||
|
@ -24,8 +24,8 @@ services:
|
|||
- HOMESERVER_DOMAIN
|
||||
- HOMESERVER_URL
|
||||
- TELEGRAM_APP_ID
|
||||
- TELEGRAM_BRIDGE_ADMIN_1
|
||||
- TELEGRAM_BRIDGE_ADMIN_2
|
||||
- TELEGRAM_BRIDGE_PERMISSIONS
|
||||
- TELEGRAM_SYNC_CHANNEL_MEMBERS
|
||||
- VERIFY_SSL
|
||||
secrets:
|
||||
- telegram_api_hash
|
||||
|
@ -33,6 +33,7 @@ services:
|
|||
- telegram_bot_token
|
||||
- telegram_db_password
|
||||
- telegram_hs_token
|
||||
- shared_secret_auth
|
||||
volumes:
|
||||
- telegram-data:/data
|
||||
networks:
|
||||
|
@ -52,7 +53,7 @@ services:
|
|||
networks:
|
||||
- internal
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "synapse"]
|
||||
test: ["CMD", "pg_isready", "-U", "$POSTGRES_USER" ]
|
||||
volumes:
|
||||
- telegram-postgres:/var/lib/postgresql/data
|
||||
|
||||
|
|
|
@ -6,8 +6,8 @@ services:
|
|||
secrets:
|
||||
- db_password
|
||||
- form_secret
|
||||
- macaroon_secret_key
|
||||
- registration_shared_secret
|
||||
- macaroon
|
||||
- registration
|
||||
- turn_shared_secret
|
||||
environment:
|
||||
- TURN_ALLOW_GUESTS
|
||||
|
|
102
compose.yml
102
compose.yml
|
@ -2,19 +2,50 @@
|
|||
version: "3.8"
|
||||
|
||||
services:
|
||||
web:
|
||||
image: nginx:1.25.3
|
||||
networks:
|
||||
- proxy
|
||||
- internal
|
||||
environment:
|
||||
- DOMAIN
|
||||
- STACK_NAME
|
||||
- NGINX_ACCESS_LOG_LOCATION
|
||||
- NGINX_ERROR_LOG_LOCATION
|
||||
configs:
|
||||
- source: nginx_config
|
||||
target: /etc/nginx/nginx.conf
|
||||
- source: wk_server
|
||||
target: /var/www/.well-known/matrix/server
|
||||
- source: wk_client
|
||||
target: /var/www/.well-known/matrix/client
|
||||
deploy:
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.${STACK_NAME}.loadbalancer.server.port=80"
|
||||
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`)"
|
||||
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
|
||||
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
|
||||
healthcheck:
|
||||
test: curl -f http://${STACK_NAME}_app:8008/health || exit 1
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 20
|
||||
|
||||
app:
|
||||
image: "matrixdotorg/synapse:v1.62.0"
|
||||
image: "matrixdotorg/synapse:v1.100.0"
|
||||
volumes:
|
||||
- "data:/data"
|
||||
depends_on:
|
||||
- db
|
||||
secrets:
|
||||
- db_password
|
||||
- registration_shared_secret
|
||||
- macaroon_secret_key
|
||||
- registration
|
||||
- macaroon
|
||||
- form_secret
|
||||
environment:
|
||||
- ENCRYPTED_BY_DEFAULT
|
||||
- ALLOWED_LIFETIME_MAX
|
||||
- ALLOW_PUBLIC_ROOMS_FEDERATION
|
||||
- AUTO_JOIN_ROOM
|
||||
- AUTO_JOIN_ROOM_ENABLED
|
||||
- DISABLE_FEDERATION
|
||||
|
@ -22,10 +53,14 @@ services:
|
|||
- ENABLE_3PID_LOOKUP
|
||||
- ENABLE_ALLOWLIST
|
||||
- ENABLE_REGISTRATION
|
||||
- ENCRYPTED_BY_DEFAULT
|
||||
- FEDERATION_ALLOWLIST
|
||||
- LETSENCRYPT_HOST=${DOMAIN}
|
||||
- MEDIA_RETENTION_LOCAL_LIFETIME
|
||||
- MEDIA_RETENTION_REMOTE_LIFETIME
|
||||
- PASSWORD_LOGIN_ENABLED
|
||||
- REDACTION_RETENTION_PERIOD
|
||||
- RETENTION_MAX_LIFETIME
|
||||
- ROOT_LOG_LEVEL
|
||||
- SERVE_SERVER_WELLKNOWN
|
||||
- SQL_LOG_LEVEL
|
||||
|
@ -36,9 +71,11 @@ services:
|
|||
- USER_IPS_MAX_AGE
|
||||
- VIRTUAL_HOST=${DOMAIN}
|
||||
- VIRTUAL_PORT=8008
|
||||
- RETENTION_MAX_LIFETIME
|
||||
- LOGIN_LIMIT_IP_PER_SECOND=${LOGIN_LIMIT_IP_PER_SECOND:-0.003}
|
||||
- LOGIN_LIMIT_IP_BURST=${LOGIN_LIMIT_IP_BURST:-5}
|
||||
- LOGIN_LIMIT_ACCOUNT_PER_SECOND=${LOGIN_LIMIT_ACCOUNT_PER_SECOND:-0.003}
|
||||
- LOGIN_LIMIT_ACCOUNT_BURST=${LOGIN_LIMIT_ACCOUNT_BURST:-5}
|
||||
networks:
|
||||
- proxy
|
||||
- internal
|
||||
entrypoint: /docker-entrypoint.sh
|
||||
configs:
|
||||
|
@ -53,12 +90,14 @@ services:
|
|||
restart_policy:
|
||||
condition: on-failure
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.${STACK_NAME}.loadbalancer.server.port=8008"
|
||||
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`)"
|
||||
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
|
||||
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
|
||||
- "coop-cloud.${STACK_NAME}.version=2.1.0+v1.62.0"
|
||||
- "coop-cloud.${STACK_NAME}.version=6.0.2+v1.100.0"
|
||||
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}"
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8008/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 10
|
||||
start_period: 1m
|
||||
|
||||
db:
|
||||
image: postgres:13-alpine
|
||||
|
@ -71,18 +110,23 @@ services:
|
|||
- POSTGRES_INITDB_ARGS="-E \"UTF8\""
|
||||
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
|
||||
- POSTGRES_USER=synapse
|
||||
- DOMAIN
|
||||
networks:
|
||||
- internal
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "synapse"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 10
|
||||
start_period: 1m
|
||||
volumes:
|
||||
- postgres:/var/lib/postgresql/data
|
||||
deploy:
|
||||
labels:
|
||||
backupbot.backup: "true"
|
||||
backupbot.backup.pre-hook: "mkdir -p /tmp/backup/ && PGPASSWORD=$$(cat $${POSTGRES_PASSWORD_FILE}) pg_dump -U $${POSTGRES_USER} $${POSTGRES_DB} > /tmp/backup/backup.sql"
|
||||
backupbot.backup.post-hook: "rm -rf /tmp/backup"
|
||||
backupbot.backup.path: "/tmp/backup/"
|
||||
backupbot.backup.pre-hook: "PGPASSWORD=$$(cat $${POSTGRES_PASSWORD_FILE}) pg_dump -U $${POSTGRES_USER} $${POSTGRES_DB} > /var/lib/postgresql/data/backup.sql"
|
||||
backupbot.backup.post-hook: "rm -r /var/lib/postgresql/data/backup.sql"
|
||||
backupbot.backup.path: "/var/lib/postgresql/data"
|
||||
|
||||
volumes:
|
||||
data:
|
||||
|
@ -99,24 +143,36 @@ configs:
|
|||
file: entrypoint.sh.tmpl
|
||||
template_driver: golang
|
||||
homeserver_yaml:
|
||||
name: ${STACK_NAME}_homserver_yaml_${HOMESERVER_YAML_VERSION}
|
||||
name: ${STACK_NAME}_homeserver_yaml_${HOMESERVER_YAML_VERSION}
|
||||
file: homeserver.yaml.tmpl
|
||||
template_driver: golang
|
||||
log_config:
|
||||
name: ${STACK_NAME}_log_config_${LOG_CONFIG_VERSION}
|
||||
file: log.config.tmpl
|
||||
template_driver: golang
|
||||
nginx_config:
|
||||
name: ${STACK_NAME}_nginx_config_${NGINX_CONFIG_VERSION}
|
||||
file: nginx.conf.tmpl
|
||||
template_driver: golang
|
||||
wk_server:
|
||||
name: ${STACK_NAME}_wk_server_${WK_SERVER_VERSION}
|
||||
file: well_known_server.conf.tmpl
|
||||
template_driver: golang
|
||||
wk_client:
|
||||
name: ${STACK_NAME}_wk_client_${WK_CLIENT_VERSION}
|
||||
file: well_known_client.conf.tmpl
|
||||
template_driver: golang
|
||||
|
||||
secrets:
|
||||
db_password:
|
||||
external: true
|
||||
name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION}
|
||||
registration_shared_secret:
|
||||
registration:
|
||||
external: true
|
||||
name: ${STACK_NAME}_db_password_${SECRET_REGISTRATION_SHARED_SECRET_VERSION}
|
||||
macaroon_secret_key:
|
||||
name: ${STACK_NAME}_registration_${SECRET_REGISTRATION_VERSION}
|
||||
macaroon:
|
||||
external: true
|
||||
name: ${STACK_NAME}_db_password_${SECRET_MACAROON_SECRET_KEY_VERSION}
|
||||
name: ${STACK_NAME}_macaroon_${SECRET_MACAROON_VERSION}
|
||||
form_secret:
|
||||
external: true
|
||||
name: ${STACK_NAME}_db_password_${SECRET_FORM_SECRET_VERSION}
|
||||
name: ${STACK_NAME}_form_secret_${SECRET_FORM_SECRET_VERSION}
|
||||
|
|
|
@ -50,7 +50,7 @@ auth:
|
|||
|
||||
logging:
|
||||
# What level should the logger output to the console at.
|
||||
console: "warn" #silly, verbose, info, http, warn, error, silent
|
||||
console: "error" #silly, verbose, info, http, warn, error, silent
|
||||
lineDateFormat: "MMM-D HH:mm:ss.SSS" # This is in moment.js format
|
||||
files:
|
||||
- file: "debug.log"
|
||||
|
|
|
@ -6,6 +6,7 @@ chown 991:991 /data
|
|||
|
||||
if [[ ! -f /data/{{ env "DOMAIN" }}.signing.key ]]; then
|
||||
/start.py generate
|
||||
chown -R 991:991 /data/*.config /data/*.key
|
||||
fi
|
||||
|
||||
/start.py
|
||||
|
|
2592
homeserver.yaml.tmpl
2592
homeserver.yaml.tmpl
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,31 @@
|
|||
user www-data;
|
||||
|
||||
events {
|
||||
worker_connections 768;
|
||||
}
|
||||
|
||||
http {
|
||||
server {
|
||||
listen 80;
|
||||
|
||||
access_log {{ or (env "NGINX_ACCESS_LOG_LOCATION") "/dev/null" }};
|
||||
error_log {{ or (env "NGINX_ERROR_LOG_LOCATION") "/dev/null" }};
|
||||
|
||||
server_name {{ env "DOMAIN" }};
|
||||
|
||||
location ~* ^(\/_matrix|\/_synapse\/client) {
|
||||
proxy_pass http://{{ env "STACK_NAME"}}_app:8008;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_set_header Host $host;
|
||||
client_max_body_size 50M;
|
||||
proxy_http_version 1.1;
|
||||
}
|
||||
|
||||
location /.well-known/matrix/ {
|
||||
root /var/www/;
|
||||
default_type application/json;
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,9 @@
|
|||
The only release note worthy point for this release is: if you're using the
|
||||
horrendous `compose.keycloak2.yml` (as creator of this horrible hack, I am
|
||||
allowed to call it horrendous ;)), you will need to re-check the new
|
||||
~/.abra/recipes/matrix-synapse/.env.sample, there are some new default env vars
|
||||
which you'll have to add in (e.g. KEYCLOAK2_ID=...).
|
||||
If you're using the horrendous `compose.keycloak2.yml` (as creator of this
|
||||
horrible hack, I am allowed to call it horrendous ;)), you will need to
|
||||
re-check the new ~/.abra/recipes/matrix-synapse/.env.sample, there are some new
|
||||
default env vars which you'll have to add in (e.g. KEYCLOAK2_ID=...).
|
||||
|
||||
You'll also need to add `KEYCLOAK_ID=keycloak` if using `compose.keycloak.yml`,
|
||||
it isn't vendored any more.
|
||||
|
||||
@decentral1se
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
WARNING: There are a lot of config breaking changes in this one, watch out!
|
||||
|
||||
* KEYCLOAK2* env vars have gone away, they were experimental.
|
||||
|
||||
* TELEGRAM_BRIDGE_ADMIN* is replaced by TELEGRAM_BRIDGE_PERMISSIONS.
|
||||
|
||||
* SIGNAL_BRIDGE_ADMIN* is replaced by SIGNAL_BRIDGE_PERMISSIONS.
|
||||
|
||||
* The homeserver config has been trimmed, see coop-cloud/matrix-synapse#33 for more.
|
||||
|
||||
* Bridge logging is only ERROR level now to minimise leaking plaintext.
|
||||
|
||||
* It is possible to use SSO & federation env vars in combination now.
|
||||
|
||||
* Media retention is now configurable with #MEDIA_RETENTION_* env vars.
|
||||
|
||||
@decentral1se
|
|
@ -0,0 +1,10 @@
|
|||
We had to rename some secrets: https://git.coopcloud.tech/coop-cloud/matrix-synapse/issues/35
|
||||
|
||||
Copy the secrets:
|
||||
|
||||
* `registration_shared_secret` to `registration`
|
||||
* `macaroon_secret_key` to `macaroon`
|
||||
|
||||
The easiest way to do this is to run `abra app run <matrix.example.com> app bash` BEFORE this upgrade, then `cat /run/secrets/registration_shared_secret`. If you haven't saved the secrets yet, and would like to, please Ctrl+C out of this upgrade and do that first.
|
||||
|
||||
Regeneration of these secrets should also work.
|
|
@ -0,0 +1 @@
|
|||
It's recommended not to upgrade / downgrade directly to this version (or other 5.y.z versions), because of service renaming which was reverted in 6.0.0+v1.100.0.
|
|
@ -0,0 +1,6 @@
|
|||
Logging is now disabled by default. If you want to reënable it, set these options:
|
||||
|
||||
```
|
||||
NGINX_ACCESS_LOG_LOCATION="/dev/stdout"
|
||||
NGINX_ERROR_LOG_LOCATION="/dev/stderr"
|
||||
```
|
|
@ -0,0 +1 @@
|
|||
If you are upgrading from verison 5.y.z of this recipe, you will need to `undeploy` then `deploy`, because of a service rename which was reverted.
|
|
@ -0,0 +1,123 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Shared Secret Authenticator module for Matrix Synapse
|
||||
# Copyright (C) 2018 Slavi Pantaleev
|
||||
#
|
||||
# https://devture.com/
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from typing import Awaitable, Callable, Optional, Tuple
|
||||
|
||||
import hashlib
|
||||
import hmac
|
||||
import logging
|
||||
|
||||
import synapse
|
||||
from synapse import module_api
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class SharedSecretAuthProvider:
|
||||
def __init__(self, config: dict, api: module_api):
|
||||
for k in ('shared_secret',):
|
||||
if k not in config:
|
||||
raise KeyError('Required `{0}` configuration key not found'.format(k))
|
||||
|
||||
m_login_password_support_enabled = bool(config['m_login_password_support_enabled']) if 'm_login_password_support_enabled' in config else False
|
||||
com_devture_shared_secret_auth_support_enabled = bool(config['com_devture_shared_secret_auth_support_enabled']) if 'com_devture_shared_secret_auth_support_enabled' in config else True
|
||||
|
||||
self.api = api
|
||||
self.shared_secret = config['shared_secret']
|
||||
|
||||
auth_checkers: Optional[Dict[Tuple[str, Tuple], CHECK_AUTH_CALLBACK]] = {}
|
||||
if com_devture_shared_secret_auth_support_enabled:
|
||||
auth_checkers[("com.devture.shared_secret_auth", ("token",))] = self.check_com_devture_shared_secret_auth
|
||||
if m_login_password_support_enabled:
|
||||
auth_checkers[("m.login.password", ("password",))] = self.check_m_login_password
|
||||
|
||||
enabled_login_types = [k[0] for k in auth_checkers]
|
||||
|
||||
if len(enabled_login_types) == 0:
|
||||
raise RuntimeError('At least one login type must be enabled')
|
||||
|
||||
logger.info('Enabled login types: %s', enabled_login_types)
|
||||
|
||||
api.register_password_auth_provider_callbacks(
|
||||
auth_checkers=auth_checkers,
|
||||
)
|
||||
|
||||
async def check_com_devture_shared_secret_auth(
|
||||
self,
|
||||
username: str,
|
||||
login_type: str,
|
||||
login_dict: "synapse.module_api.JsonDict",
|
||||
) -> Optional[
|
||||
Tuple[
|
||||
str,
|
||||
Optional[Callable[["synapse.module_api.LoginResponse"], Awaitable[None]]],
|
||||
]
|
||||
]:
|
||||
if login_type != "com.devture.shared_secret_auth":
|
||||
return None
|
||||
return await self._log_in_username_with_token("com.devture.shared_secret_auth", username, login_dict.get("token"))
|
||||
|
||||
async def check_m_login_password(
|
||||
self,
|
||||
username: str,
|
||||
login_type: str,
|
||||
login_dict: "synapse.module_api.JsonDict",
|
||||
) -> Optional[
|
||||
Tuple[
|
||||
str,
|
||||
Optional[Callable[["synapse.module_api.LoginResponse"], Awaitable[None]]],
|
||||
]
|
||||
]:
|
||||
if login_type != "m.login.password":
|
||||
return None
|
||||
return await self._log_in_username_with_token("m.login.password", username, login_dict.get("password"))
|
||||
|
||||
async def _log_in_username_with_token(
|
||||
self,
|
||||
login_type: str,
|
||||
username: str,
|
||||
token: str,
|
||||
) -> Optional[
|
||||
Tuple[
|
||||
str,
|
||||
Optional[Callable[["synapse.module_api.LoginResponse"], Awaitable[None]]],
|
||||
]
|
||||
]:
|
||||
logger.info('Authenticating user `%s` with login type `%s`', username, login_type)
|
||||
|
||||
full_user_id = self.api.get_qualified_user_id(username)
|
||||
|
||||
# The password (token) is supposed to be an HMAC of the full user id, keyed with the shared secret.
|
||||
given_hmac = token.encode('utf-8')
|
||||
|
||||
h = hmac.new(self.shared_secret.encode('utf-8'), full_user_id.encode('utf-8'), hashlib.sha512)
|
||||
computed_hmac = h.hexdigest().encode('utf-8')
|
||||
|
||||
if not hmac.compare_digest(computed_hmac, given_hmac):
|
||||
logger.info('Bad hmac value for user: %s', full_user_id)
|
||||
return None
|
||||
|
||||
user_info = await self.api.get_userinfo_by_id(full_user_id)
|
||||
if user_info is None:
|
||||
logger.info('Refusing to authenticate missing user: %s', full_user_id)
|
||||
return None
|
||||
|
||||
logger.info('Authenticated user: %s', full_user_id)
|
||||
|
||||
return full_user_id, None
|
|
@ -0,0 +1,324 @@
|
|||
# Homeserver details
|
||||
homeserver:
|
||||
# The address that this appservice can use to connect to the homeserver.
|
||||
address: {{ env "HOMESERVER_URL" }}
|
||||
# The domain of the homeserver (for MXIDs, etc).
|
||||
domain: {{ env "HOMESERVER_DOMAIN" }}
|
||||
# Whether or not to verify the SSL certificate of the homeserver.
|
||||
# Only applies if address starts with https://
|
||||
verify_ssl: {{ env "VERIFY_SSL" }}
|
||||
# What software is the homeserver running?
|
||||
# Standard Matrix homeservers like Synapse, Dendrite and Conduit should just use "standard" here.
|
||||
software: standard
|
||||
# Number of retries for all HTTP requests if the homeserver isn't reachable.
|
||||
http_retry_count: 4
|
||||
# The URL to push real-time bridge status to.
|
||||
# If set, the bridge will make POST requests to this URL whenever a user's Signal connection state changes.
|
||||
# The bridge will use the appservice as_token to authorize requests.
|
||||
status_endpoint: null
|
||||
# Endpoint for reporting per-message status.
|
||||
message_send_checkpoint_endpoint: null
|
||||
# Maximum number of simultaneous HTTP connections to the homeserver.
|
||||
connection_limit: 100
|
||||
# Whether asynchronous uploads via MSC2246 should be enabled for media.
|
||||
# Requires a media repo that supports MSC2246.
|
||||
async_media: false
|
||||
|
||||
# Application service host/registration related details
|
||||
# Changing these values requires regeneration of the registration.
|
||||
appservice:
|
||||
# The address that the homeserver can use to connect to this appservice.
|
||||
address: http://signalbridge:29328
|
||||
# When using https:// the TLS certificate and key files for the address.
|
||||
tls_cert: false
|
||||
tls_key: false
|
||||
# The hostname and port where this appservice should listen.
|
||||
hostname: 0.0.0.0
|
||||
port: 29328
|
||||
# The maximum body size of appservice API requests (from the homeserver) in mebibytes
|
||||
# Usually 1 is enough, but on high-traffic bridges you might need to increase this to avoid 413s
|
||||
max_body_size: 1
|
||||
# The full URI to the database. SQLite and Postgres are supported.
|
||||
# However, SQLite support is extremely experimental and should not be used.
|
||||
# Format examples:
|
||||
# SQLite: sqlite:///filename.db
|
||||
# Postgres: postgres://username:password@hostname/dbname
|
||||
database: postgres://signalbridge:{{ secret "signal_db_password" }}@signaldb/signalbridge
|
||||
# Additional arguments for asyncpg.create_pool() or sqlite3.connect()
|
||||
# https://magicstack.github.io/asyncpg/current/api/index.html#asyncpg.pool.create_pool
|
||||
# https://docs.python.org/3/library/sqlite3.html#sqlite3.connect
|
||||
# For sqlite, min_size is used as the connection thread pool size and max_size is ignored.
|
||||
# Additionally, SQLite supports init_commands as an array of SQL queries to run on connect (e.g. to set PRAGMAs).
|
||||
database_opts:
|
||||
min_size: 1
|
||||
max_size: 10
|
||||
# The unique ID of this appservice.
|
||||
id: signal
|
||||
# Username of the appservice bot.
|
||||
bot_username: signalbot
|
||||
# Display name and avatar for bot. Set to "remove" to remove display name/avatar, leave empty
|
||||
# to leave display name/avatar as-is.
|
||||
bot_displayname: Signal bridge bot
|
||||
bot_avatar: mxc://maunium.net/wPJgTQbZOtpBFmDNkiNEMDUp
|
||||
# Whether or not to receive ephemeral events via appservice transactions.
|
||||
# Requires MSC2409 support (i.e. Synapse 1.22+).
|
||||
# You should disable bridge -> sync_with_custom_puppets when this is enabled.
|
||||
ephemeral_events: true
|
||||
# Authentication tokens for AS <-> HS communication. Autogenerated; do not modify.
|
||||
as_token: "{{ secret "signal_as_token" }}"
|
||||
hs_token: "{{ secret "signal_hs_token" }}"
|
||||
|
||||
# Prometheus telemetry config. Requires prometheus-client to be installed.
|
||||
metrics:
|
||||
enabled: false
|
||||
listen_port: 8000
|
||||
|
||||
# Manhole config.
|
||||
manhole:
|
||||
# Whether or not opening the manhole is allowed.
|
||||
enabled: false
|
||||
# The path for the unix socket.
|
||||
path: /var/tmp/mautrix-signal.manhole
|
||||
# The list of UIDs who can be added to the whitelist.
|
||||
# If empty, any UIDs can be specified in the open-manhole command.
|
||||
whitelist:
|
||||
- 0
|
||||
|
||||
signal:
|
||||
# Path to signald unix socket
|
||||
socket_path: /signald/signald.sock
|
||||
# Directory for temp files when sending files to Signal. This should be an
|
||||
# absolute path that signald can read. For attachments in the other direction,
|
||||
# make sure signald is configured to use an absolute path as the data directory.
|
||||
outgoing_attachment_dir: /signald/attachments
|
||||
# Directory where signald stores avatars for groups.
|
||||
avatar_dir: /signald/avatars
|
||||
# Directory where signald stores auth data. Used to delete data when logging out.
|
||||
data_dir: /signald/data
|
||||
# Whether or not unknown signald accounts should be deleted when the bridge is started.
|
||||
# When this is enabled, any UserInUse errors should be resolved by restarting the bridge.
|
||||
delete_unknown_accounts_on_start: false
|
||||
# Whether or not message attachments should be removed from disk after they're bridged.
|
||||
remove_file_after_handling: true
|
||||
# Whether or not users can register a primary device
|
||||
registration_enabled: true
|
||||
# Whether or not to enable disappearing messages in groups. If enabled, then the expiration
|
||||
# time of the messages will be determined by the first users to read the message, rather
|
||||
# than individually. If the bridge has a single user, this can be turned on safely.
|
||||
enable_disappearing_messages_in_groups: false
|
||||
|
||||
# Bridge config
|
||||
bridge:
|
||||
# Localpart template of MXIDs for Signal users.
|
||||
# {userid} is replaced with an identifier for the Signal user.
|
||||
username_template: "signal_{userid}"
|
||||
# Displayname template for Signal users.
|
||||
# {displayname} is replaced with the displayname of the Signal user, which is the first
|
||||
# available variable in displayname_preference. The variables in displayname_preference
|
||||
# can also be used here directly.
|
||||
displayname_template: "{displayname} (Signal)"
|
||||
# Whether or not contact list displaynames should be used.
|
||||
# Possible values: disallow, allow, prefer
|
||||
#
|
||||
# Multi-user instances are recommended to disallow contact list names, as otherwise there can
|
||||
# be conflicts between names from different users' contact lists.
|
||||
contact_list_names: disallow
|
||||
# Available variables: full_name, first_name, last_name, phone, uuid
|
||||
displayname_preference:
|
||||
- full_name
|
||||
- phone
|
||||
# Whether or not to create portals for all groups on login/connect.
|
||||
autocreate_group_portal: true
|
||||
# Whether or not to create portals for all contacts on login/connect.
|
||||
autocreate_contact_portal: false
|
||||
# Whether or not to make portals of Signal groups in which joining via invite link does
|
||||
# not need to be approved by an administrator publicly joinable on Matrix.
|
||||
public_portals: false
|
||||
# Whether or not to use /sync to get read receipts and typing notifications
|
||||
# when double puppeting is enabled
|
||||
sync_with_custom_puppets: false
|
||||
# Whether or not to update the m.direct account data event when double puppeting is enabled.
|
||||
# Note that updating the m.direct event is not atomic (except with mautrix-asmux)
|
||||
# and is therefore prone to race conditions.
|
||||
sync_direct_chat_list: false
|
||||
# Allow using double puppeting from any server with a valid client .well-known file.
|
||||
double_puppet_allow_discovery: false
|
||||
# Servers to allow double puppeting from, even if double_puppet_allow_discovery is false.
|
||||
double_puppet_server_map:
|
||||
{{ env "HOMESERVER_DOMAIN" }}: {{ env "HOMESERVER_URL" }}
|
||||
# Shared secret for https://github.com/devture/matrix-synapse-shared-secret-auth
|
||||
#
|
||||
# If set, custom puppets will be enabled automatically for local users
|
||||
# instead of users having to find an access token and run `login-matrix`
|
||||
# manually.
|
||||
# If using this for other servers than the bridge's server,
|
||||
# you must also set the URL in the double_puppet_server_map.
|
||||
login_shared_secret_map:
|
||||
{{ env "HOMESERVER_DOMAIN" }}: {{ secret "shared_secret_auth" }}
|
||||
# Whether or not created rooms should have federation enabled.
|
||||
# If false, created portal rooms will never be federated.
|
||||
federate_rooms: true
|
||||
# End-to-bridge encryption support options.
|
||||
#
|
||||
# See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info.
|
||||
encryption:
|
||||
# Allow encryption, work in group chat rooms with e2ee enabled
|
||||
allow: {{ env "SIGNAL_ENABLE_ENCRYPTION" }}
|
||||
# Default to encryption, force-enable encryption in all portals the bridge creates
|
||||
# This will cause the bridge bot to be in private chats for the encryption to work properly.
|
||||
default: false
|
||||
# Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data.
|
||||
appservice: false
|
||||
# Require encryption, drop any unencrypted messages.
|
||||
require: false
|
||||
# Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled.
|
||||
# You must use a client that supports requesting keys from other users to use this feature.
|
||||
allow_key_sharing: false
|
||||
# What level of device verification should be required from users?
|
||||
#
|
||||
# Valid levels:
|
||||
# unverified - Send keys to all device in the room.
|
||||
# cross-signed-untrusted - Require valid cross-signing, but trust all cross-signing keys.
|
||||
# cross-signed-tofu - Require valid cross-signing, trust cross-signing keys on first use (and reject changes).
|
||||
# cross-signed-verified - Require valid cross-signing, plus a valid user signature from the bridge bot.
|
||||
# Note that creating user signatures from the bridge bot is not currently possible.
|
||||
# verified - Require manual per-device verification
|
||||
# (currently only possible by modifying the `trust` column in the `crypto_device` database table).
|
||||
verification_levels:
|
||||
# Minimum level for which the bridge should send keys to when bridging messages from Telegram to Matrix.
|
||||
receive: unverified
|
||||
# Minimum level that the bridge should accept for incoming Matrix messages.
|
||||
send: unverified
|
||||
# Minimum level that the bridge should require for accepting key requests.
|
||||
share: cross-signed-tofu
|
||||
# Options for Megolm room key rotation. These options allow you to
|
||||
# configure the m.room.encryption event content. See:
|
||||
# https://spec.matrix.org/v1.3/client-server-api/#mroomencryption for
|
||||
# more information about that event.
|
||||
rotation:
|
||||
# Enable custom Megolm room key rotation settings. Note that these
|
||||
# settings will only apply to rooms created after this option is
|
||||
# set.
|
||||
enable_custom: false
|
||||
# The maximum number of milliseconds a session should be used
|
||||
# before changing it. The Matrix spec recommends 604800000 (a week)
|
||||
# as the default.
|
||||
milliseconds: 604800000
|
||||
# The maximum number of messages that should be sent with a given a
|
||||
# session before changing it. The Matrix spec recommends 100 as the
|
||||
# default.
|
||||
messages: 100
|
||||
# Whether or not to explicitly set the avatar and room name for private
|
||||
# chat portal rooms. This will be implicitly enabled if encryption.default is true.
|
||||
private_chat_portal_meta: false
|
||||
# Whether or not the bridge should send a read receipt from the bridge bot when a message has
|
||||
# been sent to Signal. This let's you check manually whether the bridge is receiving your
|
||||
# messages.
|
||||
# Note that this is not related to Signal delivery receipts.
|
||||
delivery_receipts: false
|
||||
# Whether or not delivery errors should be reported as messages in the Matrix room.
|
||||
delivery_error_reports: true
|
||||
# Whether the bridge should send the message status as a custom com.beeper.message_send_status event.
|
||||
message_status_events: false
|
||||
# Set this to true to tell the bridge to re-send m.bridge events to all rooms on the next run.
|
||||
# This field will automatically be changed back to false after it,
|
||||
# except if the config file is not writable.
|
||||
resend_bridge_info: false
|
||||
# Interval at which to resync contacts (in seconds).
|
||||
periodic_sync: 0
|
||||
# Should leaving the room on Matrix make the user leave on Signal?
|
||||
bridge_matrix_leave: true
|
||||
# Provisioning API part of the web server for automated portal creation and fetching information.
|
||||
# Used by things like mautrix-manager (https://github.com/tulir/mautrix-manager).
|
||||
provisioning:
|
||||
# Whether or not the provisioning API should be enabled.
|
||||
enabled: true
|
||||
# The prefix to use in the provisioning API endpoints.
|
||||
prefix: /_matrix/provision
|
||||
# The shared secret to authorize users of the API.
|
||||
# Set to "generate" to generate and save a new token.
|
||||
shared_secret: generate
|
||||
# Segment API key to enable analytics tracking for web server
|
||||
# endpoints. Set to null to disable.
|
||||
# Currently the only events are login start, QR code scan, and login
|
||||
# success/failure.
|
||||
segment_key: null
|
||||
# The prefix for commands. Only required in non-management rooms.
|
||||
command_prefix: "!signal"
|
||||
# Messages sent upon joining a management room.
|
||||
# Markdown is supported. The defaults are listed below.
|
||||
management_room_text:
|
||||
# Sent when joining a room.
|
||||
welcome: "Hello, I'm a Signal bridge bot."
|
||||
# Sent when joining a management room and the user is already logged in.
|
||||
welcome_connected: "Use `help` for help."
|
||||
# Sent when joining a management room and the user is not logged in.
|
||||
welcome_unconnected: "Use `help` for help or `link` to log in."
|
||||
# Optional extra text sent when joining a management room.
|
||||
additional_help: ""
|
||||
# Send each message separately (for readability in some clients)
|
||||
management_room_multiple_messages: false
|
||||
# Permissions for using the bridge.
|
||||
# Permitted values:
|
||||
# relay - Allowed to be relayed through the bridge, no access to commands.
|
||||
# user - Use the bridge with puppeting.
|
||||
# admin - Use and administrate the bridge.
|
||||
# Permitted keys:
|
||||
# * - All Matrix users
|
||||
# domain - All users on that homeserver
|
||||
# mxid - Specific user
|
||||
permissions: {{ env "SIGNAL_BRIDGE_PERMISSIONS" }}
|
||||
|
||||
relay:
|
||||
# Whether relay mode should be allowed. If allowed, `!signal set-relay` can be used to turn any
|
||||
# authenticated user into a relaybot for that chat.
|
||||
enabled: false
|
||||
# The formats to use when sending messages to Signal via a relay user.
|
||||
#
|
||||
# Available variables:
|
||||
# $sender_displayname - The display name of the sender (e.g. Example User)
|
||||
# $sender_username - The username (Matrix ID localpart) of the sender (e.g. exampleuser)
|
||||
# $sender_mxid - The Matrix ID of the sender (e.g. @exampleuser:example.com)
|
||||
# $message - The message content
|
||||
message_formats:
|
||||
m.text: '$sender_displayname: $message'
|
||||
m.notice: '$sender_displayname: $message'
|
||||
m.emote: '* $sender_displayname $message'
|
||||
m.file: '$sender_displayname sent a file'
|
||||
m.image: '$sender_displayname sent an image'
|
||||
m.audio: '$sender_displayname sent an audio file'
|
||||
m.video: '$sender_displayname sent a video'
|
||||
m.location: '$sender_displayname sent a location'
|
||||
# Specify a dedicated relay account. Must be a regular matrix account logged into this bridge
|
||||
# and double puppeting working to auto-accept invites. When this user is invited to a room
|
||||
# it will automatically be set as the relay user. May be overridden with `set-relay` or `unset-relay`
|
||||
relaybot: '@relaybot:example.com'
|
||||
# Format for generting URLs from location messages for sending to Signal
|
||||
# Google Maps: 'https://www.google.com/maps/place/{lat},{long}'
|
||||
# OpenStreepMap: 'https://www.openstreetmap.org/?mlat={lat}&mlon={long}'
|
||||
location_format: 'https://www.google.com/maps/place/{lat},{long}'
|
||||
|
||||
# Python logging configuration.
|
||||
#
|
||||
# See section 16.7.2 of the Python documentation for more info:
|
||||
# https://docs.python.org/3.6/library/logging.config.html#configuration-dictionary-schema
|
||||
logging:
|
||||
version: 1
|
||||
formatters:
|
||||
colored:
|
||||
(): mautrix_signal.util.ColorFormatter
|
||||
format: "[%(asctime)s] [%(levelname)s@%(name)s] %(message)s"
|
||||
normal:
|
||||
format: "[%(asctime)s] [%(levelname)s@%(name)s] %(message)s"
|
||||
handlers:
|
||||
console:
|
||||
class: logging.StreamHandler
|
||||
formatter: colored
|
||||
loggers:
|
||||
mau:
|
||||
level: ERROR
|
||||
aiohttp:
|
||||
level: ERROR
|
||||
root:
|
||||
level: ERROR
|
||||
handlers: [console]
|
|
@ -151,7 +151,7 @@ bridge:
|
|||
# Whether or not to sync the member list in channels.
|
||||
# If no channel admins have logged into the bridge, the bridge won't be able to sync the member
|
||||
# list regardless of this setting.
|
||||
sync_channel_members: true
|
||||
sync_channel_members: {{ env "TELEGRAM_SYNC_CHANNEL_MEMBERS" }}
|
||||
# Whether or not to skip deleted members when syncing members.
|
||||
skip_deleted_members: true
|
||||
# Whether or not to automatically synchronize contacts and chats of Matrix users logged into
|
||||
|
@ -189,7 +189,7 @@ bridge:
|
|||
sync_direct_chat_list: false
|
||||
# Servers to always allow double puppeting from
|
||||
double_puppet_server_map:
|
||||
example.com: https://example.com
|
||||
{{ env "HOMESERVER_DOMAIN" }}: {{ env "HOMESERVER_URL" }}
|
||||
# Allow using double puppeting from any server with a valid client .well-known file.
|
||||
double_puppet_allow_discovery: false
|
||||
# Shared secrets for https://github.com/devture/matrix-synapse-shared-secret-auth
|
||||
|
@ -200,7 +200,7 @@ bridge:
|
|||
# If using this for other servers than the bridge's server,
|
||||
# you must also set the URL in the double_puppet_server_map.
|
||||
login_shared_secret_map:
|
||||
example.com: foobar
|
||||
{{ env "HOMESERVER_DOMAIN" }}: {{ secret "shared_secret_auth" }}
|
||||
# Set to false to disable link previews in messages sent to Telegram.
|
||||
telegram_link_preview: true
|
||||
# Whether or not the !tg join command should do a HTTP request
|
||||
|
@ -412,10 +412,7 @@ bridge:
|
|||
# * - All Matrix users
|
||||
# domain - All users on that homeserver
|
||||
# mxid - Specific user
|
||||
permissions:
|
||||
"*": "relaybot"
|
||||
"{{ env "TELEGRAM_BRIDGE_ADMIN_1" }}": "admin"
|
||||
"{{ env "TELEGRAM_BRIDGE_ADMIN_2" }}": "admin"
|
||||
permissions: {{ env "TELEGRAM_BRIDGE_PERMISSIONS" }}
|
||||
|
||||
# Options related to the message relay Telegram bot.
|
||||
relaybot:
|
||||
|
@ -537,11 +534,11 @@ logging:
|
|||
formatter: colored
|
||||
loggers:
|
||||
mau:
|
||||
level: DEBUG
|
||||
level: ERROR
|
||||
telethon:
|
||||
level: INFO
|
||||
level: ERROR
|
||||
aiohttp:
|
||||
level: INFO
|
||||
level: ERROR
|
||||
root:
|
||||
level: DEBUG
|
||||
level: ERROR
|
||||
handlers: [file, console]
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"m.homeserver": {
|
||||
"base_url": "https://{{ env "DOMAIN" }}"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"m.server": "{{ env "DOMAIN" }}:443"
|
||||
}
|
Loading…
Reference in New Issue