From 0af5959921401dfdb64de5a62b51c02490ac3e6f Mon Sep 17 00:00:00 2001 From: Wildschut <8668557+Wildschut@users.noreply.github.com> Date: Thu, 29 Sep 2022 21:50:15 +0200 Subject: [PATCH 1/2] Create the Gotify service for the Tipi App Store --- apps/gotify/config.json | 33 ++++++++++++++++++++++++++++ apps/gotify/docker-compose.yml | 14 ++++++++++++ apps/gotify/metadata/description.md | 10 +++++++++ apps/gotify/metadata/logo.jpg | Bin 0 -> 30928 bytes 4 files changed, 57 insertions(+) create mode 100644 apps/gotify/config.json create mode 100644 apps/gotify/docker-compose.yml create mode 100644 apps/gotify/metadata/description.md create mode 100644 apps/gotify/metadata/logo.jpg diff --git a/apps/gotify/config.json b/apps/gotify/config.json new file mode 100644 index 00000000..529b0c88 --- /dev/null +++ b/apps/gotify/config.json @@ -0,0 +1,33 @@ +{ + "$schema": "../schema.json", + "name": "Gotify", + "available": true, + "port": 8129, + "id": "gotify", + "tipi_version": 2, + "version": "2.1.7", + "categories": ["utilities"], + "description": "Simple server for sending and receiving notification messages.", + "short_desc": "Gotify, a simple server for sending and receiving notification messages.", + "author": "gotigy", + "source": "https://github.com/gotify/server", + "website": "https://gotify.net", + "form_fields": [ + { + "type": "text", + "label": "Traefik Domain", + "max": 50, + "min": 3, + "required": false, + "env_variable": "TRAEFIK_GOTIFY" + }, + { + "type": "password", + "label": "Password", + "max": 50, + "min": 3, + "required": true, + "env_variable": "GOTIFY_DEFAULTUSER_PASS" + } + ] +} diff --git a/apps/gotify/docker-compose.yml b/apps/gotify/docker-compose.yml new file mode 100644 index 00000000..38dd1e79 --- /dev/null +++ b/apps/gotify/docker-compose.yml @@ -0,0 +1,14 @@ +version: "3.7" +services: + gotify: + image: gotify/server:2.1.7 + container_name: gotify + restart: unless-stopped + volumes: + - "${APP_DATA_DIR}/datagit :/app/data" + environment: + - GOTIFY_DEFAULTUSER_PASS=${GOTIFY_DEFAULTUSER_PASS} + ports: + - ${APP_PORT}:80 + networks: + - tipi_main_network diff --git a/apps/gotify/metadata/description.md b/apps/gotify/metadata/description.md new file mode 100644 index 00000000..330f14d3 --- /dev/null +++ b/apps/gotify/metadata/description.md @@ -0,0 +1,10 @@ +# Selfhosted notification service + +We wanted a simple server for sending and receiving messages (in real time per WebSocket). For this, not many open source projects existed and most of the existing ones were abandoned. Also, a requirement was that it can be self-hosted. We know there are many free and commercial push services out there. + +At the heart of this project. (gotify/server)[https://hub.docker.com/r/gotify/server] features a WebUI and functionality for: + +- sending messages via a REST-API +- subscribing/receiving messages via a web socket connection +- managing users, clients and applications + diff --git a/apps/gotify/metadata/logo.jpg b/apps/gotify/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45e1ba216dfc7066da84af26eb1aadf1b8987a14 GIT binary patch literal 30928 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%0D1oaXBE^S9{a&c_v^7RGYrI!}=0&X*;$l7l#l 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 Date: Thu, 29 Sep 2022 22:56:09 +0200 Subject: [PATCH 2/2] feat(gotify): support other archs --- README.md | 1 + apps/gotify/config.json | 23 +++++++++++---------- apps/gotify/docker-compose.arm.yml | 30 ++++++++++++++++++++++++++++ apps/gotify/docker-compose.arm64.yml | 30 ++++++++++++++++++++++++++++ apps/gotify/docker-compose.yml | 19 +++++++++++++++++- 5 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 apps/gotify/docker-compose.arm.yml create mode 100644 apps/gotify/docker-compose.arm64.yml diff --git a/README.md b/README.md index 75c25c49..94af74f0 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 - [Freshrss](https://github.com/FreshRSS/FreshRSS) - A free, self-hostable RSS aggregator - [Ghost](https://github.com/TryGhost/Ghost) - Ghost - Turn your audience into a business - [Gitea](https://github.com/go-gitea/gitea) - Gitea - A painless self-hosted Git service +- [Gotify](https://github.com/gotify/server) - Gotify - Simple server for sending and receiving notification messages - [Headscale](https://github.com/juanfont/headscale) - An open source, self-hosted implementation of the Tailscale control server - [Homarr](https://github.com/ajnart/homarr) - A homepage for your server - [Home Assistant](https://github.com/home-assistant/core) - Open source home automation that puts local control and privacy first diff --git a/apps/gotify/config.json b/apps/gotify/config.json index 529b0c88..6083b878 100644 --- a/apps/gotify/config.json +++ b/apps/gotify/config.json @@ -4,7 +4,8 @@ "available": true, "port": 8129, "id": "gotify", - "tipi_version": 2, + "exposable": true, + "tipi_version": 1, "version": "2.1.7", "categories": ["utilities"], "description": "Simple server for sending and receiving notification messages.", @@ -15,19 +16,19 @@ "form_fields": [ { "type": "text", - "label": "Traefik Domain", - "max": 50, - "min": 3, - "required": false, - "env_variable": "TRAEFIK_GOTIFY" - }, - { - "type": "password", - "label": "Password", + "label": "Gotify username", "max": 50, "min": 3, "required": true, + "env_variable": "GOTIFY_DEFAULTUSER_NAME" + }, + { + "type": "password", + "label": "Gotify password", + "max": 50, + "min": 8, + "required": true, "env_variable": "GOTIFY_DEFAULTUSER_PASS" - } + } ] } diff --git a/apps/gotify/docker-compose.arm.yml b/apps/gotify/docker-compose.arm.yml new file mode 100644 index 00000000..8c8b53bb --- /dev/null +++ b/apps/gotify/docker-compose.arm.yml @@ -0,0 +1,30 @@ +version: "3.7" + +services: + gotify: + image: gotify/server-arm7:2.1.7 + container_name: gotify + restart: unless-stopped + volumes: + - "${APP_DATA_DIR}/data:/app/data" + environment: + - GOTIFY_DEFAULTUSER_PASS=${GOTIFY_DEFAULTUSER_PASS} + ports: + - ${APP_PORT}:80 + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + # Traefik Redirect to HTTPS + traefik.http.middlewares.redirect-https.redirectScheme.scheme: https + traefik.http.middlewares.redirect-https.redirectScheme.permanent: true + # Traefik Router + Service Configuration + traefik.http.routers.gotify.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.gotify.entrypoints: websecure + traefik.http.routers.gotify.tls.certresolver: myresolver + traefik.http.routers.gotify.middlewares: redirect-https + traefik.http.routers.gotify.service: gotify + traefik.http.services.gotify.loadbalancer.passhostheader: true + traefik.http.services.gotify.loadbalancer.server.port: 80 + traefik.http.services.gotify.loadbalancer.sticky: true + traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto: http diff --git a/apps/gotify/docker-compose.arm64.yml b/apps/gotify/docker-compose.arm64.yml new file mode 100644 index 00000000..1284452c --- /dev/null +++ b/apps/gotify/docker-compose.arm64.yml @@ -0,0 +1,30 @@ +version: "3.7" + +services: + gotify: + image: gotify/server-arm64:2.1.7 + container_name: gotify + restart: unless-stopped + volumes: + - "${APP_DATA_DIR}/data:/app/data" + environment: + - GOTIFY_DEFAULTUSER_PASS=${GOTIFY_DEFAULTUSER_PASS} + ports: + - ${APP_PORT}:80 + networks: + - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + # Traefik Redirect to HTTPS + traefik.http.middlewares.redirect-https.redirectScheme.scheme: https + traefik.http.middlewares.redirect-https.redirectScheme.permanent: true + # Traefik Router + Service Configuration + traefik.http.routers.gotify.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.gotify.entrypoints: websecure + traefik.http.routers.gotify.tls.certresolver: myresolver + traefik.http.routers.gotify.middlewares: redirect-https + traefik.http.routers.gotify.service: gotify + traefik.http.services.gotify.loadbalancer.passhostheader: true + traefik.http.services.gotify.loadbalancer.server.port: 80 + traefik.http.services.gotify.loadbalancer.sticky: true + traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto: http diff --git a/apps/gotify/docker-compose.yml b/apps/gotify/docker-compose.yml index 38dd1e79..975723a6 100644 --- a/apps/gotify/docker-compose.yml +++ b/apps/gotify/docker-compose.yml @@ -1,14 +1,31 @@ version: "3.7" + services: gotify: image: gotify/server:2.1.7 container_name: gotify restart: unless-stopped volumes: - - "${APP_DATA_DIR}/datagit :/app/data" + - "${APP_DATA_DIR}/data:/app/data" environment: + - GOTIFY_DEFAULTUSER_NAME=${GOTIFY_DEFAULTUSER_NAME} - GOTIFY_DEFAULTUSER_PASS=${GOTIFY_DEFAULTUSER_PASS} ports: - ${APP_PORT}:80 networks: - tipi_main_network + labels: + traefik.enable: ${APP_EXPOSED} + # Traefik Redirect to HTTPS + traefik.http.middlewares.redirect-https.redirectScheme.scheme: https + traefik.http.middlewares.redirect-https.redirectScheme.permanent: true + # Traefik Router + Service Configuration + traefik.http.routers.gotify.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.gotify.entrypoints: websecure + traefik.http.routers.gotify.tls.certresolver: myresolver + traefik.http.routers.gotify.middlewares: redirect-https + traefik.http.routers.gotify.service: gotify + traefik.http.services.gotify.loadbalancer.passhostheader: true + traefik.http.services.gotify.loadbalancer.server.port: 80 + traefik.http.services.gotify.loadbalancer.sticky: true + traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto: http