androidseb25 / iGotify-Notification-Assistent

Docker container for sending Gotify notifications to iOS devices (bridge to gotify websocket)
MIT License
99 stars 3 forks source link

Push Nachricht nicht mehr vorhanden #43

Closed thokich closed 3 months ago

thokich commented 4 months ago

Hi, folgendes Problem.

Gotify - Url: https://gotify.geheim.de Is Gotify - Url available: no SecNtfy Server - Url: https://api.secntfy.app/api Is SecNtfy Server - Url available: yes Client - Token: xxxxxxxxxxx Client connecting...

Der Notification Dienst greift jetzt nicht mehr intern auf gotify Server zu sondern über die öffentliche Internetadresse. nachdem ich im nginx aber die Adresse von gotify server nicht zulasse, macht hier der nginx proxy manager dank ip accessliste zu.

In deiner ersten version bist du über den Docker Stack gegangen und hast die URL mit dem parameter GOTIFY_SERVER_URL | http://gotify gesetzt. Das hat gut funktioniert und er funkt nicht ins Internet und wieder zurück, sondern bleibt auf dem docker host. Jetzt holst du dir die Einstellung des gotify Servers scheinbar über die Client App?

Hast du eine Idee wie ich den gotify server wieder intern im Docker Stack http://gotify ansprechen kann, ich kann aufgrund meiner nginx proxy konfiguration (ip accessliste) nicht von diesem host (gotify server) durch den nginx proxy.

androidseb25 commented 4 months ago

Wie wäre es den mit der ip und den Port?

Der Assistent muss ja nur drauf zugreifen und selbst über http://gotify müsste er intern im Netz trotzdem erreichbar sein

thokich commented 4 months ago

wie gebe ich dem notification assisten den die info das er die Verbindung zum gotify server nicht über https://gotify.geheim.de/ sondern über http://gotify interner Stack nacht ? sozusagen

Gotify - Url: http://gotify :-) Is Gotify - Url available: yes SecNtfy Server - Url: https://api.secntfy.app/api

ich könnte dan über eine interne host.conf gotify einer ip zuweisen. mit Gotify - Url: https://gotify.geheim.de/ geht die kiste erst mal in das internet

androidseb25 commented 4 months ago

Na über die App

App öffnen -> Einstellungen -> Instanzen Verwalten -> Instanz auswählen -> oben rechts Bearbeiten

Und dann die Einträge anpassen.

thokich commented 4 months ago

Das habe ich mir gedacht und die speicherst du dann in deiner sqllite db mit ab. somit geht dein notification dienst für die gotify server abfrage über das internet. und wo kannst du deinem notification assisten SAGEN DAS ER DEN LOKALEN DOCKER STACK nimmt. In deiner ersten Version gab es den parameter GOTIFY_SERVER_URL | http://gotify/. Den ignorierst du jetzt in der aktuellen version scheinbar. wenn ich deinen code ansehe könnte jetzt wahrscheinlich deine sql lite datenbank manipulieren und anstelle https://gotify.geheim.de/ http://gotify reinschreiben :-)

Warum hast die die ENV GOTIFY_SERVER_URL Variable raus geschmissen ?

androidseb25 commented 4 months ago

Wenn du die Anpassungen übers lokale Netz machst und der App die lokale Adresse des Gotify Servers gibst z.b. http://gotify (Adresse des Gotify Servers vom Stack der auch im lokalen Netzwerk erreichbar ist, wird diese url in die SQLite dB eingetragen.

Der Assistent startet daraufhin eine Socket Connection genau mit der URL die er bekommen hat über die App und dem dazugehörigen Client Token!!!

Es hat sich vom Aufbau nichts geändert nur dass die Config jetzt über die App geht und flexibler ist...

androidseb25 commented 4 months ago

Und der Dienst geht sobald er eine lokale Adresse bekommt nicht übers Netz sondern bleibt intern!!!

thokich commented 4 months ago

ich probiere es aus und melde mich hier wieder. leider nicht so einfach die Kiste läuft in der Cloud (Firewall usw.) und nicht in einem lokalen Netz. Ach und noch etwas sehr positives. Super schnelle Reaktionszeit, ich danke dir dafür.

thokich commented 4 months ago

Danke für die Unterstützung. Leider läßt es das Konzept meiner Infrastruktur nicht zu, das ein hinter der Firewall befindlicher Dienst eine Anfrage ins Internet stellt um dann über den nginx proxy wieder zurück aus dem Internet über die Firewall auf den internen Server zugreift. Mein Konzept ist es hier das ein interner Verkehr auch intern hinter der Firewall bleibt. Dafür war deine erste Version geeignet mit dem ENV Parameter ENV GOTIFY_SERVER_URL. Hier sprachen gotify Server und Notification Assisten im Internen Netz. Das einzige was jetzt hilft wäre das ich den gotify Server frei über das Internet erreichbar mache und nicht über eine IP Acessliste beim nginx proxy für bestimmte Server eingrenze.

androidseb25 commented 4 months ago

Hast du es mal mit der IP Adresse des Gotify Servers probiert?

thokich commented 4 months ago

Hier mein Infrastruktur Konzept das die Sache aubremst. (https://surl.it-tkcloud.de/d6hsD)

thokich commented 4 months ago

Habe im nginx die IP Accesliste einmal deaktiviert, den Notification Assistent gestartet Gotify - Url: https://gotify.geheim.de Is Gotify - Url available: yes SecNtfy Server - Url: https://api.secntfy.app/api Is SecNtfy Server - Url available: yes Client - Token: xxxxxx Client connecting... hat die push notification auf das apple device funktioniert. Habe danach den Docker Container nicht mehr angefasst und im nginx die IP Accessliste wieder aktiviert. Es funktionierte die push notification auf das apple device weiter. Prüfst du nur beim Container Start ab ob dier Gotify Server zur Verfügung steht und wenn ja dann arbeitet dein Programm gewollt/ungewollt auch noch mit http://gotify ? Nur so kann ich mir gerade erklären das jetzt notifications auf das handy kommen; denn der Weg über den nginx ist durch die IP Accesliste eigentlich wieder gesperrt.

androidseb25 commented 4 months ago

Eigentlich wird mit dem Websocket dauerhaft eine Verbindung zum Server gehalten, sonst könnte er ja keinen Push machen.

Die überprüfen ist nur am Start da, der Websocket startet diese, aber nach einem reconnect nochmal neu

thokich commented 4 months ago

Ich denke die Kommunikation zwischen Notification-Assistent und gotify server läuft weiterhin intern im Docker Netz. Ich habe an meiner Firewall bei push an iPhone keinen out/in Datenverkehr von 8681 (notification assistent) sondern nur von 8680 (gotify.server) gesehen. Nur beim start des Containers sucht er den gotify Server über externes Netz (https://gotify.geheim.de/) Netzlast beim push sehe ich nur im Docker internen Netzwerk vom prozess dotnet iGotify Notification Assist.dll Im Log sehe ich noc diese Meldungen. Disconnection happened, type: Websocket.Client.DisconnectionInfo warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3] Failed to determine the https port for redirect. info: Microsoft.Hosting.Lifetime[0] Application is shutting down... Database is created: True info: Microsoft.Hosting.Lifetime[14] Now listening on: http://[::]:8080 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Production info: Microsoft.Hosting.Lifetime[0] Content root path: /app

Ich könnte ja mit diesem Workaround leben.

thokich commented 4 months ago

Bei meinen Kommunikationsrecherchen habe ich festgestellt das du einen http; https service auf 167.235.79.55 (Hetzner) api.secntfy.app laufen hast. Welche Daten empfängst du hier und wohin leitest du sie weiter ? Ich sehe sie werden mit TLS 1.3 zu deinem Service übertragen :-) ich gehe mal davon aus das sie von hier aus zur App als PUSH Message gelangen. Wie sieht es allgemein mit End to End Verschlüsselung aus ? Zur Transparenz wäre es cool wenn du ein Kommunikationsschaubild veröffentlichst.

androidseb25 commented 4 months ago

Ich würde später dir mal das alles erklären hab bloß grad keine Zeit

thokich commented 4 months ago

Alles gut, keinen Stress. Hast auf jeden Fall ein super c# Programm geschrieben. Ich finde es gut. Das Problem mit der Zeit kenne ich auch.

androidseb25 commented 4 months ago

So, jetzt kann ich dir hier mal die Abfolge erklären. Ich beachte dabei jedoch nicht das HTTPS-Protokoll in Bezug auf Verschlüsselung.

Gotify Server

Der Gotify Server erhält eine Nachricht mit einem Curl-Event oder ähnlichem. Diese empfängt er und leitet sie direkt an den Websocket weiter. Der Websocket wird über den API-Endpunkt http/s:///stream?token= bereitgestellt.

iGotify Notification Service

Über den oben angegebenen Endpunkt verbinde ich den Service, damit ich die Nachrichten erhalte. Die Android-App von Gotify funktioniert genauso, nur bei Apple funktioniert das nicht aufgrund des "Energy Efficiency Mode". Aber jetzt zur Verarbeitung der Nachrichtendaten. Damit der Service überhaupt weiß, wohin er sich verbinden muss, benötigt er ab Version 1.2 die Informationen der App. Diese gibt den Gotify Server an, mit dem er sich verbinden muss, und zusätzlich das Client-Token, damit er überhaupt zuhören darf. Wenn alles passt, baut der Service die Verbindung zum Gotify Server auf und speichert die Daten, Client-Token, Notification-Token und die URL des Gotify Servers ab. Dadurch kann er sich im Falle eines Ausfalls direkt mit dem Gotify Server verbinden.

Zum Thema Verarbeitung der Notifications von Gotify: Diese kommen alle unverschlüsselt an, das heißt im Klartext. Mein Service holt sich über das Device-Token den Public Key des Gerätes, um die Nachricht asymmetrisch zu verschlüsseln. Die verschlüsselte Nachricht wird dann an meinen Service SecNtfy gesendet, der die Daten an Apple weitergibt, da für das Versenden ein Zertifikat benötigt wird. Falls jetzt die Frage kommt, was alles gespeichert wird: Es werden nur Typeninformationen (OS-Version, Gerätetyp, PubKey, APN ID) sowie Statistiken gespeichert. Alle Daten, die erhoben werden, enthalten keinerlei personenbezogene Informationen. Wenn die Nachricht an Apple gesendet wurde, leitet Apple diese an das Gerät weiter und entschlüsselt sie mit dem Private Key, der auf dem Gerät liegt.

Ich denke, das sollte ein bisschen Licht ins Dunkle bringen. Hätte ich das über ein Bild gemacht, wäre das, glaube ich, ein bisschen chaotisch und unverständlich geworden.

Falls fragen sind hau raus

thokich commented 3 months ago

Hi, wie cool ist das den. Danke das du dir die Zeit genommen hast, ist ja nicht selbstverständlich. Du hast recht, in Worten gefasst ist es besser verständlich als in einem Bild. Apple hat ja ganz schön Aufwand produziert. aber es klappt jetzt erstmal bei mir mit dem Workaround (warum auch immer, aber es klappt). Ich verwende es um meine Cloud Hobbyumgebung bei Hetzner mittels checkmk und gotify zu monitoren. checkmk macht die notification mit seinen events, sendet diese über ein phyton Skript an igotify und dann geht es weiter mit deiner Lösung bis zum Apple Handy.Ich sage dann erst mal Danke und ich bin schon gespannt was du noch so um die Kiste drum rum programmierts.