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