From 8377c72d60161fd81670ff5ee9b7b8b37c7968f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=9A=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Mon, 8 May 2023 16:17:31 +0300 Subject: [PATCH] app: Conduit --- README.md | 1 + apps/matrix-conduit/config.json | 54 ++++++++++++ apps/matrix-conduit/docker-compose.yml | 50 +++++++++++ apps/matrix-conduit/metadata/description.md | 82 ++++++++++++++++++ apps/matrix-conduit/metadata/logo.jpg | Bin 0 -> 16476 bytes apps/matrix-conduit/nginx/Dockerfile | 4 + .../matrix-conduit/nginx/matrix.conf.template | 19 ++++ 7 files changed, 210 insertions(+) create mode 100644 apps/matrix-conduit/config.json create mode 100644 apps/matrix-conduit/docker-compose.yml create mode 100644 apps/matrix-conduit/metadata/description.md create mode 100644 apps/matrix-conduit/metadata/logo.jpg create mode 100644 apps/matrix-conduit/nginx/Dockerfile create mode 100644 apps/matrix-conduit/nginx/matrix.conf.template diff --git a/README.md b/README.md index 0cb292d1..f0947919 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ This is the official repository for the Tipi App Store. It contains all the apps - [Chatpad AI](https://github.com/deiucanta/chatpad) - Not just another ChatGPT user-interface! - [Code-Server](https://github.com/coder/code-server) - Web VS Code - [Codex.Docs](https://github.com/codex-team/codex.docst) - Free Docs app powered by Editor.js ecosystem. +- [Conduit](https://gitlab.com/famedly/conduit) - Conduit is a simple, fast and reliable chat server written in Rust - [DailyTXT](https://github.com/PhiTux/DailyTxT) - Encrypted Diary Web-App - [Dash.](https://github.com/MauriceNino/dashdot) - A simple, modern server dashboard, primarily used by smaller private server - [Deluge](https://github.com/linuxserver/docker-deluge) - Deluge is a lightweight, Free Software, cross-platform BitTorrent client diff --git a/apps/matrix-conduit/config.json b/apps/matrix-conduit/config.json new file mode 100644 index 00000000..4ce82bb4 --- /dev/null +++ b/apps/matrix-conduit/config.json @@ -0,0 +1,54 @@ +{ + "$schema": "../schema.json", + "name": "Conduit", + "port": 6167, + "available": true, + "exposable": true, + "no_gui": true, + "id": "matrix-conduit", + "tipi_version": 1, + "version": "0.5.0", + "categories": ["social"], + "description": "Conduit is a fast Matrix homeserver that’s easy to set up and just works. You can install it on a mini-computer like the Raspberry Pi to host Matrix for your family, friends or company.", + "short_desc": "Conduit is a simple, fast and reliable chat server written in Rust", + "author": "Timo Kösters", + "source": "https://gitlab.com/famedly/conduit", + "website": "https://matrix.org/docs/projects/server/conduit", + "form_fields": [ + { + "type": "boolean", + "label": "Allow Registration", + "hint": "WARNING! First user will be admin", + "required": false, + "env_variable": "ALLOW_REGISTRATION" + }, + { + "type": "boolean", + "label": "Allow Federation", + "required": false, + "env_variable": "ALLOW_FEDERATION" + }, + { + "type": "array", + "label": "Trusted Servers", + "hint": "[\"matrix.org\"]", + "required": false, + "env_variable": "TRUSTED_SERVERS" + }, + { + "type": "number", + "label": "Max request size", + "hint": "In bytes, for example 20000000", + "required": false, + "env_variable": "MAX_REQUEST_SIZE" + }, + { + "type": "text", + "label": "Loggin Level", + "hint": "Available levels: error, warn, info, debug, trace", + "placeholder": "-warn,rocket=off,_=off,sled=off", + "required": false, + "env_variable": "LOG" + } + ] +} diff --git a/apps/matrix-conduit/docker-compose.yml b/apps/matrix-conduit/docker-compose.yml new file mode 100644 index 00000000..51a1cb01 --- /dev/null +++ b/apps/matrix-conduit/docker-compose.yml @@ -0,0 +1,50 @@ +version: "3.7" + +services: + homeserver: + container_name: matrix + image: matrixconduit/matrix-conduit:v0.5.0 + ports: + - ${APP_PORT}:6167 + environment: + CONDUIT_SERVER_NAME: ${APP_DOMAIN} + CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/ + CONDUIT_DATABASE_BACKEND: rocksdb + CONDUIT_PORT: 6167 + CONDUIT_MAX_REQUEST_SIZE: ${MAX_REQUEST_SIZE:-20000000} + CONDUIT_ALLOW_REGISTRATION: ${ALLOW_REGISTRATION:-false} + CONDUIT_ALLOW_FEDERATION: ${ALLOW_FEDERATION:-false} + CONDUIT_TRUSTED_SERVERS: ${TRUSTED_SERVERS:-[]} + CONDUIT_LOG: ${LOG:-warn,rocket=off,_=off,sled=off} + CONDUIT_ADDRESS: 0.0.0.0 + CONDUIT_CONFIG: '' # Ignore this + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data:/var/lib/matrix-conduit/ + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + traefik.http.routers.matrix.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.matrix.entrypoints: websecure + traefik.http.routers.matrix.service: matrix + traefik.http.routers.matrix.tls.certresolver: myresolver + traefik.http.services.matrix.loadbalancer.server.port: 6167 + + well-known: + container_name: matrix-well-known + build: + context: nginx + dockerfile: Dockerfile + environment: + APP_DOMAIN: ${APP_DOMAIN} + restart: unless-stopped + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + traefik.http.routers.matrix-well-knows.rule: Host(`${APP_DOMAIN}`) && PathPrefix(`/.well-known/matrix`) + traefik.http.routers.matrix-well-knows.entrypoints: websecure + traefik.http.routers.matrix-well-knows.service: matrix-well-knows + traefik.http.routers.matrix-well-knows.tls.certresolver: myresolver + traefik.http.services.matrix-well-knows.loadbalancer.server.port: 80 diff --git a/apps/matrix-conduit/metadata/description.md b/apps/matrix-conduit/metadata/description.md new file mode 100644 index 00000000..edc1d57d --- /dev/null +++ b/apps/matrix-conduit/metadata/description.md @@ -0,0 +1,82 @@ +# Conduit +### A Matrix homeserver written in Rust + +#### What is Matrix? +[Matrix](https://matrix.org) is an open network for secure and decentralized +communication. Users from every Matrix homeserver can chat with users from all +other Matrix servers. You can even use bridges (also called Matrix appservices) +to communicate with users outside of Matrix, like a community on Discord. + +#### What is the goal? + +An efficient Matrix homeserver that's easy to set up and just works. You can install +it on a mini-computer like the Raspberry Pi to host Matrix for your family, +friends or company. + +#### Can I try it out? + +Yes! You can test our Conduit instance by opening a Matrix client ( or Element Android for +example) and registering on the `conduit.rs` homeserver. + +*Registration is currently disabled because of scammers. For an account please + message us (see contact section below).* + +Server hosting for conduit.rs is donated by the Matrix.org Foundation. + +#### What is the current status? + +Conduit is Beta, meaning you can join and participate in most +Matrix rooms, but not all features are supported and you might run into bugs +from time to time. + +There are still a few important features missing: + +- E2EE emoji comparison over federation (E2EE chat works) +- Outgoing read receipts, typing, presence over federation (incoming works) + +Check out the [Conduit 1.0 Release Milestone](https://gitlab.com/famedly/conduit/-/milestones/3). + +#### How can I deploy my own? + +- Simple install (this was tested the most): [DEPLOY.md](DEPLOY.md) +- Debian package: [debian/README.Debian](debian/README.Debian) +- Nix/NixOS: [nix/README.md](nix/README.md) +- Docker: [docker/README.md](docker/README.md) + +If you want to connect an Appservice to Conduit, take a look at [APPSERVICES.md](APPSERVICES.md). + +#### How can I contribute? + +1. Look for an issue you would like to work on and make sure it's not assigned + to other users +2. Ask someone to assign the issue to you (comment on the issue or chat in + [#conduit:fachschaften.org](https://matrix.to/#/#conduit:fachschaften.org)) +3. Fork the repo and work on the issue.[#conduit:fachschaften.org](https://matrix.to/#/#conduit:fachschaften.org) is happy to help :) +4. Submit a MR + +#### Thanks to + +Thanks to FUTO, Famedly, Prototype Fund (DLR and German BMBF) and all individuals for financially supporting this project. + +Thanks to the contributors to Conduit and all libraries we use, for example: + +- Ruma: A clean library for the Matrix Spec in Rust +- axum: A modular web framework + +#### Contact + +If you run into any question, feel free to +- Ask us in `#conduit:fachschaften.org` on Matrix +- Write an E-Mail to `conduit@koesters.xyz` +- Send an direct message to `timo@fachschaften.org` on Matrix +- [Open an issue on GitLab](https://gitlab.com/famedly/conduit/-/issues/new) + +#### Donate + +Liberapay: \ +Bitcoin: `bc1qnnykf986tw49ur7wx9rpw2tevpsztvar5x8w4n` + +#### Logo + +Lightning Bolt Logo: https://github.com/mozilla/fxemoji/blob/gh-pages/svgs/nature/u26A1-bolt.svg \ +Logo License: https://github.com/mozilla/fxemoji/blob/gh-pages/LICENSE.md \ No newline at end of file diff --git a/apps/matrix-conduit/metadata/logo.jpg b/apps/matrix-conduit/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad3f78a2ba7049c8b8168721485f1e37614bb76f GIT binary patch literal 16476 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