{ "module": "matrix", "version": "1", "capabilities": [ "container-runtime" ], "listens": [ { "name": "client", "port": 6167, "protocol": "tcp", "from": "mesh", "why": "Conduit's client-server and federation APIs over plain HTTP. Both arrive through the route on 443: Conduit answers /.well-known/matrix/server with :443, so other homeservers federate through the proxy and nothing needs the traditional 8448" }, { "name": "web", "port": 80, "protocol": "tcp", "from": "mesh", "why": "Element Web, the static browser client, served by the image's nginx; reached through its route" } ], "requires": [ "route" ], "contributes": { "route": { "homeserver": { "label": "matrix", "endpoint": "client" }, "element": { "label": "element", "endpoint": "web" } } }, "binds": { "route": "${dir:state}/route.json" }, "resources": [ { "id": "state", "type": "directory", "mode": "0700", "place": "." }, { "id": "db", "type": "directory", "mode": "0700" }, { "id": "conduit-conf", "type": "file", "path": "${dir:state}/conduit.toml", "mode": "0644", "content": "# Written by the mesh (modules/matrix). Conduit reads this file (CONDUIT_CONFIG); nothing comes\n# from the environment. server_name is the homeserver's permanent identity: every user id, room id\n# and signature in the database carries it, so it is the name this module is served under\n# (${bound:route:name-homeserver}) and never changes once a database exists.\n[global]\nserver_name = \"${bound:route:name-homeserver}\"\ndatabase_backend = \"rocksdb\"\ndatabase_path = \"/var/lib/matrix-conduit/\"\naddress = \"0.0.0.0\"\nport = 6167\nmax_request_size = 20000000\nallow_registration = false\nallow_federation = true\nallow_check_for_updates = true\ntrusted_servers = [\"matrix.org\"]\n" }, { "id": "element-conf", "type": "file", "path": "${dir:state}/element.json", "mode": "0644", "merge": "json", "content": "{\n \"default_server_name\": \"${bound:route:name-homeserver}\",\n \"default_server_config\": {\n \"m.homeserver\": {\n \"base_url\": \"https://${bound:route:name-homeserver}\"\n },\n \"m.identity_server\": {\n \"base_url\": \"https://vector.im\"\n }\n },\n \"brand\": \"Element\",\n \"integrations_ui_url\": \"https://scalar.vector.im/\",\n \"integrations_rest_url\": \"https://scalar.vector.im/api\",\n \"integrations_widgets_urls\": [\n \"https://scalar.vector.im/_matrix/integrations/v1\",\n \"https://scalar.vector.im/api\",\n \"https://scalar-staging.vector.im/_matrix/integrations/v1\",\n \"https://scalar-staging.vector.im/api\",\n \"https://scalar-staging.riot.im/scalar/api\"\n ],\n \"bug_report_endpoint_url\": \"https://element.io/bugreports/submit\",\n \"uisi_autorageshake_app\": \"element-auto-uisi\",\n \"show_labs_settings\": true,\n \"room_directory\": {\n \"servers\": [\n \"${bound:route:name-homeserver}\",\n \"matrix.org\",\n \"gitter.im\",\n \"libera.chat\"\n ]\n },\n \"enable_presence_by_hs_url\": {\n \"https://matrix.org\": false,\n \"https://matrix-client.matrix.org\": false\n },\n \"terms_and_conditions_links\": [\n {\n \"url\": \"https://element.io/privacy\",\n \"text\": \"Privacy Policy\"\n },\n {\n \"url\": \"https://element.io/cookie-policy\",\n \"text\": \"Cookie Policy\"\n }\n ],\n \"features\": {\n \"feature_video_rooms\": true,\n \"feature_rust_crypto\": true\n },\n \"element_call\": {\n \"url\": \"https://call.element.dev\"\n }\n}\n" }, { "id": "net", "type": "network", "name": "matrix" }, { "id": "homeserver", "type": "container", "name": "matrix", "image": "matrixconduit/matrix-conduit@sha256:b0d24248e94f944ca49f90f10c429e3d65f4472bdde25661ecea9840134fb133", "network": "matrix", "env": { "CONDUIT_CONFIG": "/etc/conduit/conduit.toml" }, "ports": [ "6167" ], "volumes": [ "${dir:db}:/var/lib/matrix-conduit", "${dir:state}/conduit.toml:/etc/conduit/conduit.toml:ro" ], "restart-on": [ "conduit-conf" ] }, { "id": "element", "type": "container", "name": "element-web", "image": "vectorim/element-web@sha256:a8f415462ab8d2600a592ba1b92bea51efe5a4d10eb738aab9bed769f7099613", "network": "matrix", "ports": [ "80" ], "volumes": [ "${dir:state}/element.json:/app/config.json:ro" ], "restart-on": [ "element-conf" ] } ] }