parent
1d1b19dced
commit
7a37d33ff2
@ -0,0 +1,56 @@
|
||||
version: '3'
|
||||
services:
|
||||
# the default synpase uses a sqlite database; this should be fixed at somepoint
|
||||
# matrix-db:
|
||||
# image: postgres:13.4-alpine
|
||||
# restart: unless-stopped
|
||||
# volumes:
|
||||
# - ./data/matrix/db:/var/lib/postgresql/data
|
||||
# environment:
|
||||
# - POSTGRES_DB=synapse
|
||||
# - POSTGRES_USER=synapse
|
||||
# - POSTGRES_PASSWORD=STRONGPASSWORD
|
||||
|
||||
matrix-element:
|
||||
image: vectorim/element-web:latest
|
||||
restart: unless-stopped
|
||||
container_name: matrix-element
|
||||
env_file:
|
||||
- env.production
|
||||
volumes:
|
||||
- ./matrix/10-envsubst-config.sh:/docker-entrypoint.d/10-envsubst-config.sh:ro
|
||||
- ./matrix/config.sample.json:/app/config.sample.json:ro
|
||||
depends_on:
|
||||
- matrix-synapse
|
||||
# ports:
|
||||
# - "5000:80"
|
||||
|
||||
matrix-synapse:
|
||||
image: matrixdotorg/synapse:latest
|
||||
restart: unless-stopped
|
||||
container_name: matrix-synapse
|
||||
volumes:
|
||||
- ./data/matrix/synapse:/data
|
||||
- ./matrix/entrypoint-synapse.sh:/entrypoint.sh:ro
|
||||
entrypoint: ["/entrypoint.sh"]
|
||||
env_file:
|
||||
- env.production
|
||||
environment:
|
||||
- MATRIX_CLIENT_SECRET=${MATRIX_CLIENT_SECRET}
|
||||
depends_on:
|
||||
- keycloak
|
||||
- nginx
|
||||
# ports:
|
||||
# - "5008:8008"
|
||||
|
||||
# add the nginx configuration into the nginx volume
|
||||
nginx:
|
||||
volumes:
|
||||
- ./matrix/nginx.conf:/etc/nginx/templates/matrix.conf.template:ro
|
||||
|
||||
# add the client secrets to the keycloak-setup volume
|
||||
keycloak-setup:
|
||||
env_file:
|
||||
- data/matrix/secrets
|
||||
volumes:
|
||||
- ./matrix/keycloak.sh:/keycloak-setup/matrix.sh:ro
|
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo >&2 "**** Configuring for $DOMAIN_NAME"
|
||||
envsubst < /app/config.sample.json > /app/config.json
|
||||
head /app/config.json
|
@ -0,0 +1,3 @@
|
||||
# Matrix/Element chat
|
||||
|
||||
The sample config for the JSON comes from 8891698745897388db037ea8692937edc199630c on vector-im/element-web
|
@ -0,0 +1,53 @@
|
||||
{
|
||||
"default_server_config": {
|
||||
"m.homeserver": {
|
||||
"base_url": "https://${MATRIX_HOSTNAME}.${DOMAIN_NAME}",
|
||||
"server_name": "${DOMAIN_NAME}"
|
||||
},
|
||||
"m.identity_server": {
|
||||
"base_url": "https://vector.im"
|
||||
}
|
||||
},
|
||||
"disable_custom_urls": false,
|
||||
"disable_guests": false,
|
||||
"disable_login_language_selector": false,
|
||||
"disable_3pid_login": false,
|
||||
"brand": "Element",
|
||||
"integrations_ui_url": "https://scalar.vector.im/",
|
||||
"integrations_rest_url": "https://scalar.vector.im/api",
|
||||
"integrations_widgets_urls": [
|
||||
"https://scalar.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar.vector.im/api",
|
||||
"https://scalar-staging.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar-staging.vector.im/api",
|
||||
"https://scalar-staging.riot.im/scalar/api"
|
||||
],
|
||||
"bug_report_endpoint_url": "https://element.io/bugreports/submit",
|
||||
"uisi_autorageshake_app": "element-auto-uisi",
|
||||
"default_country_code": "GB",
|
||||
"show_labs_settings": false,
|
||||
"features": { },
|
||||
"default_federate": true,
|
||||
"default_theme": "light",
|
||||
"room_directory": {
|
||||
"servers": [
|
||||
"matrix.org"
|
||||
]
|
||||
},
|
||||
"enable_presence_by_hs_url": {
|
||||
"https://matrix.org": false,
|
||||
"https://matrix-client.matrix.org": false
|
||||
},
|
||||
"setting_defaults": {
|
||||
"breadcrumbs": true
|
||||
},
|
||||
"jitsi": {
|
||||
"preferred_domain": "meet.element.io"
|
||||
},
|
||||
"element_call": {
|
||||
"url": "https://call.element.io",
|
||||
"participant_limit": 8,
|
||||
"brand": "Element Call"
|
||||
},
|
||||
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
version: '3'
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:13.4-alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../data/matrix/postgresdata:/var/lib/postgresql/data
|
||||
environment:
|
||||
- POSTGRES_DB=synapse
|
||||
- POSTGRES_USER=synapse
|
||||
- POSTGRES_PASSWORD=STRONGPASSWORD
|
||||
|
||||
element:
|
||||
image: vectorim/element-web:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../data/matrix/element-config.json:/app/config.json
|
||||
ports:
|
||||
- "5000:80"
|
||||
|
||||
synapse:
|
||||
image: matrixdotorg/synapse:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../data/matrix/synapse:/data
|
||||
ports:
|
||||
- "5008:8008"
|
@ -1,73 +0,0 @@
|
||||
{
|
||||
"default_server_config": {
|
||||
"m.homeserver": {
|
||||
"base_url": "https://${MATRIX_HOSTNAME}",
|
||||
"server_name": "${DOMAIN_NAME}"
|
||||
},
|
||||
"m.identity_server": {
|
||||
"base_url": "https://vector.im"
|
||||
}
|
||||
},
|
||||
"brand": "Element",
|
||||
"integrations_ui_url": "https://scalar.vector.im/",
|
||||
"integrations_rest_url": "https://scalar.vector.im/api",
|
||||
"integrations_widgets_urls": [
|
||||
"https://scalar.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar.vector.im/api",
|
||||
"https://scalar-staging.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar-staging.vector.im/api",
|
||||
"https://scalar-staging.riot.im/scalar/api"
|
||||
],
|
||||
"hosting_signup_link": "https://element.io/matrix-services?utm_source=element-web&utm_medium=web",
|
||||
"bug_report_endpoint_url": "https://element.io/bugreports/submit",
|
||||
"uisi_autorageshake_app": "element-auto-uisi",
|
||||
"showLabsSettings": true,
|
||||
"piwik": {
|
||||
"url": "https://piwik.riot.im/",
|
||||
"siteId": 1,
|
||||
"policyUrl": "https://element.io/cookie-policy"
|
||||
},
|
||||
"roomDirectory": {
|
||||
"servers": [
|
||||
"matrix.org",
|
||||
"gitter.im",
|
||||
"libera.chat"
|
||||
]
|
||||
},
|
||||
"enable_presence_by_hs_url": {
|
||||
"https://matrix.org": false,
|
||||
"https://matrix-client.matrix.org": false
|
||||
},
|
||||
"terms_and_conditions_links": [
|
||||
{
|
||||
"url": "https://element.io/privacy",
|
||||
"text": "Privacy Policy"
|
||||
},
|
||||
{
|
||||
"url": "https://element.io/cookie-policy",
|
||||
"text": "Cookie Policy"
|
||||
}
|
||||
],
|
||||
"hostSignup": {
|
||||
"brand": "Element Home",
|
||||
"cookiePolicyUrl": "https://element.io/cookie-policy",
|
||||
"domains": [
|
||||
"matrix.org"
|
||||
],
|
||||
"privacyPolicyUrl": "https://element.io/privacy",
|
||||
"termsOfServiceUrl": "https://element.io/terms-of-service",
|
||||
"url": "https://ems.element.io/element-home/in-app-loader"
|
||||
},
|
||||
"sentry": {
|
||||
"dsn": "https://029a0eb289f942508ae0fb17935bd8c5@sentry.matrix.org/6",
|
||||
"environment": "develop"
|
||||
},
|
||||
"posthog": {
|
||||
"projectApiKey": "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO",
|
||||
"apiHost": "https://posthog.element.io"
|
||||
},
|
||||
"features": {
|
||||
"feature_spotlight": true
|
||||
},
|
||||
"map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
#!/bin/bash
|
||||
# This is the custom startup script for the synpase server
|
||||
|
||||
# fix up the Element client config to have the correct hostname
|
||||
# based on the environment variables
|
||||
#export DOMAIN_NAME MATRIX_HOSTNAME
|
||||
#envsubst < "element-config.json.template" > "$DATA/element-config.json"
|
||||
|
||||
HOMESERVER_YAML="/data/homeserver.yaml"
|
||||
|
||||
if [ ! -r "$HOMESERVER_YAML" ]; then
|
||||
echo >&2 "***** Configuring the home server for $DOMAIN_NAME *****"
|
||||
|
||||
export SYNAPSE_SERVER_NAME="$DOMAIN_NAME"
|
||||
export SYNAPSE_REPORT_STATS="no"
|
||||
|
||||
/start.py generate \
|
||||
|| exit 1
|
||||
|
||||
echo >&2 "***** Adding OIDC provider *****"
|
||||
cat <<EOF >> "$HOMESERVER_YAML"
|
||||
#
|
||||
# added by hackerspace-zone setup scripts
|
||||
#
|
||||
suppress_key_server_warning: true
|
||||
web_client_location: https://${MATRIX_HOSTNAME}.${DOMAIN_NAME}
|
||||
public_baseurl: https://${MATRIX_HOSTNAME}.${DOMAIN_NAME}
|
||||
oidc_providers:
|
||||
- idp_id: keycloak
|
||||
idp_name: "Keycloak"
|
||||
issuer: "https://${KEYCLOAK_HOSTNAME}.${DOMAIN_NAME}/realms/${REALM}"
|
||||
client_id: "matrix"
|
||||
client_secret: "${MATRIX_CLIENT_SECRET}"
|
||||
scopes: ["openid", "profile"]
|
||||
user_mapping_provider:
|
||||
config:
|
||||
localpart_template: "{{ user.preferred_username }}"
|
||||
display_name_template: "{{ user.name }}"
|
||||
EOF
|
||||
|
||||
fi
|
||||
|
||||
if ! grep -q '^ smtp_host:' && [ -n "$SMTP_SERVER" ]; then
|
||||
echo >&2 "***** Adding SMTP setup to yaml"
|
||||
cat <<EOF >> "$HOMESERVER_YAML"
|
||||
#
|
||||
# added by hackerspace-zone setup scripts
|
||||
#
|
||||
email:
|
||||
smtp_host: ${SMTP_SERVER}
|
||||
smtp_port: ${SMTP_PORT}
|
||||
smtp_user: "${SMTP_USER}"
|
||||
smtp_pass: "${SMTP_PASSWORD}"
|
||||
require_transport_security: true
|
||||
notif_from: "%(app)s matrix homeserver <noreply@${DOMAIN_NAME}>"
|
||||
app_name: ${DOMAIN_NAME}
|
||||
EOF
|
||||
fi
|
||||
|
||||
# hack to let keycloak startup
|
||||
sleep 5
|
||||
exec /start.py
|
@ -1 +0,0 @@
|
||||
# variables
|
@ -0,0 +1,4 @@
|
||||
#!/bin/bash -x
|
||||
# Setup the OAuth client connection
|
||||
|
||||
client-create matrix "$MATRIX_HOSTNAME.$DOMAIN_NAME" "$MATRIX_CLIENT_SECRET" </dev/null
|
@ -0,0 +1,71 @@
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
server {
|
||||
server_name ${MATRIX_HOSTNAME} ${MATRIX_HOSTNAME}.${DOMAIN_NAME};
|
||||
client_max_body_size 128m;
|
||||
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 65;
|
||||
types_hash_max_size 2048;
|
||||
#include /etc/nginx/mime.types;
|
||||
#default_type application/octet-stream;
|
||||
|
||||
gzip on;
|
||||
gzip_disable "msie6";
|
||||
|
||||
proxy_read_timeout 1800s;
|
||||
|
||||
# required to avoid HTTP 411: see Issue #1486 (https://github.com/dotcloud/docker/issues/1486)
|
||||
chunked_transfer_encoding on;
|
||||
|
||||
location / {
|
||||
proxy_pass http://matrix-element:80;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location ~ ^(/_matrix|/_synapse/client) {
|
||||
# note: do not add a path (even a single /) after the port in `proxy_pass`,
|
||||
# otherwise nginx will canonicalise the URI and cause signature verification
|
||||
# errors.
|
||||
proxy_pass http://matrix-synapse:8008;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Host $host;
|
||||
|
||||
# Nginx by default only allows file uploads up to 1M in size
|
||||
# Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
|
||||
client_max_body_size 50M;
|
||||
}
|
||||
|
||||
# serve the static content for the well known files
|
||||
location /.well-known/matrix/server {
|
||||
default_type application/json;
|
||||
return 200 '{"m.server": "${MATRIX_HOSTNAME}.${DOMAIN_NAME}:443"}';
|
||||
}
|
||||
|
||||
location /.well-known/matrix/client {
|
||||
default_type application/json;
|
||||
return 200 '{"m.homeserver":{"base_url": "https://${MATRIX_HOSTNAME}.${DOMAIN_NAME}"}}';
|
||||
}
|
||||
|
||||
# The federation port is also enabled, although it can also go through 443
|
||||
listen 8448 ssl http2 default_server;
|
||||
#listen [::]:8448 ssl http2 default_server;
|
||||
|
||||
# For the user connection
|
||||
listen 443 ssl http2;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/${DOMAIN_NAME}/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/${DOMAIN_NAME}/privkey.pem;
|
||||
include /etc/nginx/includes/options-ssl-nginx.conf;
|
||||
include /etc/nginx/includes/challenge.conf;
|
||||
ssl_dhparam /etc/nginx/includes/ssl-dhparams.pem;
|
||||
}
|
@ -1,88 +0,0 @@
|
||||
#!/bin/bash
|
||||
die() { echo >&2 "matrix: ERROR $@" ; exit 1 ; }
|
||||
info() { echo >&2 "matrix: $@" ; }
|
||||
|
||||
DIRNAME="$(dirname $0)"
|
||||
cd "$DIRNAME"
|
||||
source ../env.production || die "no top levle env?"
|
||||
source ../env.smtp 2>/dev/null
|
||||
source env.production || die "no local env?"
|
||||
|
||||
DATA="../data/matrix"
|
||||
SYNAPSE_DIR="$DATA/synapse"
|
||||
HOMESERVER_YAML="$SYNAPSE_DIR/homeserver.yaml"
|
||||
if [ -r "$HOMESERVER_YAML" ]; then
|
||||
docker-compose up -d || die "matrix: unable to restart"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
docker-compose down 2>/dev/null
|
||||
mkdir -p "$DATA"
|
||||
|
||||
# fix up the Element client config to have the correct hostname
|
||||
# based on the environment variables
|
||||
export DOMAIN_NAME MATRIX_HOSTNAME
|
||||
envsubst < "element-config.json.template" > "$DATA/element-config.json"
|
||||
|
||||
|
||||
# This will create a *delegated* matrix server,
|
||||
# where the "servername" is just the top level domain,
|
||||
# but it is hosted on "matrix.DOMAIN_NAME".
|
||||
# the syntax here is confusing and it is not clear in
|
||||
# the docs *which* have to be updated.
|
||||
docker-compose run \
|
||||
--rm \
|
||||
-e SYNAPSE_SERVER_NAME="$DOMAIN_NAME" \
|
||||
-e SYNAPSE_REPORT_STATS="no" \
|
||||
synapse generate \
|
||||
|| die "unable to generate synapse config"
|
||||
|
||||
MATRIX_CLIENT_SECRET="$(openssl rand -hex 20)"
|
||||
|
||||
cat <<EOF >> "$HOMESERVER_YAML"
|
||||
web_client_location: https://${MATRIX_HOSTNAME}/
|
||||
public_baseurl: https://${MATRIX_HOSTNAME}/
|
||||
oidc_providers:
|
||||
- idp_id: keycloak
|
||||
idp_name: "KeyCloak"
|
||||
issuer: "https://${KEYCLOAK_HOSTNAME}/realms/${REALM}"
|
||||
client_id: "synapse"
|
||||
client_secret: "${MATRIX_CLIENT_SECRET}"
|
||||
scopes: ["openid", "profile"]
|
||||
user_mapping_provider:
|
||||
config:
|
||||
localpart_template: "{{ user.preferred_username }}"
|
||||
display_name_template: "{{ user.name }}"
|
||||
EOF
|
||||
|
||||
if [ -n "$SMTP_SERVER" ]; then
|
||||
info "configuring email"
|
||||
cat <<EOF >> "$HOMESERVER_YAML"
|
||||
email:
|
||||
smtp_host: ${SMTP_SERVER}
|
||||
smtp_port: ${SMTP_PORT}
|
||||
smtp_user: "${SMTP_USER}"
|
||||
smtp_pass: "${SMTP_PASSWORD}"
|
||||
require_transport_security: true
|
||||
notif_from: "%(app)s matrix homeserver <noreply@${DOMAIN_NAME}>"
|
||||
app_name: ${DOMAIN_NAME}
|
||||
EOF
|
||||
fi
|
||||
|
||||
|
||||
../keycloak/client-delete 'synapse' 2>/dev/null
|
||||
|
||||
../keycloak/client-create << EOF || die "unable to create client id"
|
||||
{
|
||||
"clientId": "synapse",
|
||||
"rootUrl": "https://$MATRIX_HOSTNAME/",
|
||||
"adminUrl": "https://$MATRIX_HOSTNAME/",
|
||||
"redirectUris": [ "https://$MATRIX_HOSTNAME/*" ],
|
||||
"webOrigins": [ "https://$MATRIX_HOSTNAME" ],
|
||||
"clientAuthenticatorType": "client-secret",
|
||||
"secret": "$MATRIX_CLIENT_SECRET"
|
||||
}
|
||||
EOF
|
||||
|
||||
|
||||
docker-compose up -d || die "matrix: unable to start container"
|
Loading…
Reference in new issue