haumacher / phoneblock

Der Spam-Filter für die Fritz!Box
https://phoneblock.net
GNU General Public License v3.0
161 stars 15 forks source link

Dockerimage #97

Open geimist opened 1 week ago

geimist commented 1 week ago

Wäre es nicht praktisch, ein Dockerimage zum selbshosten des ABs bereitzustellen? Ich weiß nicht, wie kompliziert eine manuelle Installation ist und wie modular die Projekte (Frontend, CardDAV-Server, AB) aufgebaut sind. Es müssten halt ein paar Umgebungsvariablen festgelegt werden können (Sip User und Kennwort könnte in dem Fall der User angeben und halt die URL zur FritzBox). Zusätzlich müsste noch ein Sync für die Spamliste implementiert werden und als opt-in ein Rückkanal, damit PhoneBlock die Trefferquote validieren kann.

einige Vorteile, die ich sehe:

Bitte entschuldige, falls das falsch rüberkommt: Ich möchte hier nicht fordernd auftreten. Das sind nur ein paar Gedanken und Begehrlichkeiten, die so bei einem Neueinsteiger geweckt werden 🤗

Revan335 commented 1 week ago

Wie im anderen Thema bereits geschrieben, wäre das very nice!

haumacher commented 1 week ago

Lokale Installation ist auf jeden Fall zu bevorzugen, das ist keine Frage. Das ist auch jetzt schon möglich, es gibt aber noch keine vernünftige Anleitung dafür. Das Modul "phoneblock-ab" baut eine Java-Anwendung, die man "einfach" lokal starten kann, überall da wo man eine Java 17 VM zur Verfügung hat - Windows, Linux, RaspberryPI:

https://github.com/haumacher/phoneblock/blob/af672a674452136498682ca009ed32f334b63fc8/phoneblock-ab/src/main/java/de/haumacher/phoneblock/answerbot/AnswerBot.java#L379

Das Problem bei einem Docker-Image ist die Tatsache, dass das VOIP/RTP-Protokoll, dass der AB mit der Fritz!Box sprechen muss, nicht wie HTTP eine Einwegekommunikation ist, sondern beide Beteiligten müssen sich gegenseitig "aufrufen" können. Wenn man den AB in ein Docker-Image packt, dann muss man alle Ports, die für diese Kommunikation notwendig sind. von dem Docker-Image an Host weiterleiten, was die Konfiguration noch aufwendiger und fehleranfälliger macht. Auf jeden Fall möglich, aber nicht simpel. Eine "normale" Installation als Service auf einem RaspberryPI hat aber weniger Fehlerpotential. Siehe #90.

geimist commented 1 week ago

Für den Fall kann man das Netzwerk des Containers statt im Bridge- im Host-Mode laufen lassen. Damit kann er frei sprechen und hören. (Ich frage für mein Synology NAS, wo man grundsätzlich nicht ohne Drittanbieter eine Laufzeitumgebung wie Java installieren kann, aber Docker vorhanden ist)

Wäre es eine Möglichkeit, die kompilierte Java Anwendung in den Releases zur Verfügung zu stellen? Da müsste die nicht jeder selbst bauen, wenn sie statisch kompiliert eh für jeden gleich ist (ich hatte bisher noch keine Berührung zu Java). Das wäre vielleicht ein guter Startpunkt, oder?

haumacher commented 1 week ago

... Containers statt im Bridge- im Host-Mode laufen lassen...

Das kingt gut - da sieht man, dass ich mich mit Container zu wenig auskenne... :-)

...für mein Synology NAS, wo man grundsätzlich nicht ohne Drittanbieter...

Ja, das ist natürlich eine vollkommen valide Anforderung - sollten wir ausprobieren.

Wäre es eine Möglichkeit, die kompilierte Java Anwendung in den Releases zur Verfügung zu stellen?

Ja, das bereite ich vor. Angefangen habe ich schon mal das Build&Configure&Run zu beschreiben: https://github.com/haumacher/phoneblock/tree/master/phoneblock-ab aber wenn man das ganze Tooling noch nicht hat (Maven & Co) dann ist es etwas lästig, ja.

haumacher commented 1 week ago

Um so ein Docker-Image "vernünftig" (=massentauglich) nutzen zu können, müsste dieses auch eine Konfigurations-Weboberfläche anbieten, da man doch eine ganze Reihe Optionen ausfüllen muss und WAV-Files für die Ansagetexte zur Verfügung stellen muss. Das muss aber eigentlich alles in das Dockerimage rein.

geimist commented 1 week ago

GUI finde ich super, aber so etwas ist für mich immer ein rotes Tuch, weil ich da 0 dazu beitragen kann. Man sollte doch das Meiste über Umgebungsvariablen realisieren können (oder man bindet ein JSON für die Konfiguration ein, welches der User im Hostsystem modifizieren kann).

Welche Parameter (von Benutzerseite) sind denn nötig? Mir fällt ein:

Die Logs sieht man entweder direkt in Docker oder du schreibst in ein Logfile, welches man mit herausmappen könnte.

hduelme commented 1 week ago

Für Docker-Images ist zu beachten, dass diese nicht plattformunabhängig sind. Es müssten Images für amd64 und arm und co bereitgestellt werden.

geimist commented 1 week ago

Das stimmt. Ich sehe das auch eher als Alternative für die klassische JAVA-Installation. Ein Dockerimage würde wohl hauptsächlich Linux mit x86_64 adressieren. Im vorliegenden Fall könnte man wahrscheinlich auch ein plattformunabhängiges Image erstellen. Das müsste man dann in einem weiteren Schritt probieren.

haumacher commented 6 days ago

Synology NAS - was ist denn das für eine Prozessor-Architektur?

geimist commented 6 days ago

Das lässt sich nicht pauschal beantworten. Die meisten Docker fähgigen Geräte haben eine x86_64 CPU. Das sind in der Regel dann die Anwender, die ihr NAS nicht nur als Datenspeicher betrachten, sondern eher als Homeserver. Inzwischen gibt es aber auch schon welche mit arm64 (also Docker kompatible). Darüber hinaus gibt es noch diverse ARM-CPUs (in der Regel bei Einstiegsgeräten) ohne Docker Support, deren Anwender wahrscheinlich nicht die Zielgruppe sind.

haumacher commented 6 days ago

Es ist soweit - hier ist ein erster Aufschlag für ein Docker-Image, mit dem man den Answerbot lokal laufen lassen kann: https://hub.docker.com/r/phoneblock/answerbot

Jetzt seid Ihr am Zug... :-)

geimist commented 6 days ago

Du bist ja schneller als die Spammer 🤣

Gleich probiert und läuft 🙂 Klasse! Vielen Dank für deine Arbeit‼️

Noch eine Frage: Wie wird die FRITZ!Box adressiert? Wenn ich das richtig sehe, dann wohl über fritz.box. Wenn man aber mehrere Geräte (in einem Netzwerk) hat, wäre es vielleicht für den einen oder anderen User günstig, hier optional die gewünschte Adresse mit übergeben zu können. #36 (3.)

Ich würde außerdem noch vorschlagen, den Docker run Befehl noch etwas anzupassen: docker run --network=host -d --rm --name phoneblock -v $PWD/conversation:/opt/phoneblock/conversation -e "USER=phoneblock" -e "PASSWD=your-password" phoneblock/answerbot:latest

Oder als Docker-compose:

version: '3.9'
services:
  phoneblock:
    image: phoneblock/answerbot:latest
    container_name: phoneblock
    network_mode: host
    environment:
      - USER=phoneblock
      - PASSWD=your-password
    volumes:
      - ./conversation:/opt/phoneblock/conversation
    restart: unless-stopped
geimist commented 4 days ago

Was mir noch aufgefallen ist: Aufnahmen werden ja sogar auch schon mit bereitgestellt. Prima – das hatte ich mir als ein Feature in der Zukunft vorgestellt. Allerdings werden diese im Rootverzeichnis des Containers abgelegt und nicht im Verzeichnis /opt/phoneblock/recordings, weil im Konfigfile /opt/phoneblock/.phoneblock die Zeile #recodings=/opt/phoneblock/recordings auskommentiert ist. Gibt es dafür einen Grund? (Wenn ich das richtig sehe, kann man das mit der nächsten Version eh überschreiben).

Ich hab jetzt mal im Compose-File die Konfiguration mit gemappt. So kann man bequem vom Host aus nötige Anpassungen vornehmen.

    volumes:
      - ./conversation:/opt/phoneblock/conversation
      - ./recordings:/opt/phoneblock/recordings
      - ./phoneblock_config.conf:/opt/phoneblock/.phoneblock

Allerdings sind in den Aufnahmen nur die Audiosegmente des Anrufers. Der Dialog durch den AB ist so nicht nachvollziehbar. Ist das eine Konfigurationsfrage?

hduelme commented 4 days ago

Aktuell wird in den Recordings nur das Ankommende Audio aufgezeichnet. Es wäre aber bestimmt möglich auch das ausgehende Audio da mit aufzunehmen.

Auch in der aktuellen Version kann der Befehlt überschrieben werden. Jedoch muss hier: java - jar /opt/phoneblock/bin/phoneblock-ab.jar -f /opt/phoneblock/.phoneblock angegeben werden.

geimist commented 4 days ago

Auch in der aktuellen Version kann der Befehlt überschrieben werden. Jedoch muss hier: java - jar /opt/phoneblock/bin/phoneblock-ab.jar -f /opt/phoneblock/.phoneblock angegeben werden.

Das entspricht bei mir dem Ausführungsbefehl des aktuellen Images. Klappt also schon mit einer angepassten /opt/phoneblock/.phoneblock. 😊

sig10680 commented 4 days ago

Hallo, ich wollte es gerade mal auf meinen Raspberry Pi 4 im Docker starten, aber es wird kein passendes Plattform gefunden. Wäre es möglich noch für den Pi aarch 64 (platform (linux/arm64/v8) mit einzubauen? Das wäre echt toll.

Kann ich dann in der Config Datei auch statt der Fritz.box auch eine IP Hinterlegen? Sind die Audiofile sehr wichtig oder kann man diese auch zum Anfang weglassen?

MFG sig10680

hduelme commented 4 days ago

@sig10680 Anstelle der Domain fritz.box kannst du auch die IP deines Routers eintragen. Du kannst die Audiodatei auch weglassen, dies führt aktuell aber dazu, dass der Anrufende in kein Gespräch verwickelt wird und es kann zu Fehlern im Log kommen.

Es wäre prinzipiell auch möglich Multiplattform Images bereitzustellen. Hier ist aber noch ein wenig Vorarbeit notwendig.

sig10680 commented 4 days ago

@hduelme Es wäre prinzipiell auch möglich Multiplattform Images bereitzustellen. Hier ist aber noch ein wenig Vorarbeit notwendig.

Kann ich da irgendwie helfen?

hduelme commented 4 days ago

@sig10680 in der Dokumentation von Docker werden 3 Möglichkeiten zum Bauen für Multiplattform beschriebe. Ich denke die für dieses Projekt nützlichste Möglichkeit ist QEMU. Ich probiere das einmal aus und würde dann in meinem Merge-Request #100 eine Anleitung hinterlegen.

Sobald das Neue Image bereitgestellt ist, könntest du einmal testen, ob es für dich funktioniert und uns Feedback geben.

sig10680 commented 4 days ago

@hduelme Sobald das Neue Image bereitgestellt ist, könntest du einmal testen, ob es für dich funktioniert und uns Feedback geben.

Danke wenn es verfügbar ist werde ich es Testen und mich wieder melden!

Danke sig10680

geimist commented 4 days ago

Ich denke die für dieses Projekt nützlichste Möglichkeit ist QEMU

Ich wollte es gerade bei mir probieren, aber leider enthält meine Dockerinstanz kein buildx. Wäre das nicht der einfachste Weg, oder bin ich da zu blauäugig? Das zugrunde liegende Java-Image sollte eh mulitiarchfähig sein und sonst gibt es doch keine CPU-Abhängigkeit im Dockerfile.

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t phoneblock:latest .
hduelme commented 4 days ago

@geimist ich hab gerade ein Anleitung für das Nutzen von buildx in den Merge-Request hinzugefügt. Unter Ubuntu und WSL sollte das Bauen damit funktionieren.

haumacher commented 3 days ago

Was mir noch aufgefallen ist: Aufnahmen werden ja sogar auch schon mit bereitgestellt. Prima – das hatte ich mir als ein Feature in der Zukunft vorgestellt. Allerdings werden diese im Rootverzeichnis des Containers abgelegt...

Eigentlich ist die Aufnahme ein optionales Feature, das per-default ausgeschaltet ist. Das scheint aber in dem Image so nicht richtig zu funktionieren. Ob man das hierzulande überhaupt einschalten darf, weiß ich gar nicht. Verbrecher stehen ja unter Schutz und das Anfertigen eines Telefonmitschnitts würde ja ein Beweismittel erzeugen - das ist - wie die Videoaufnahme eines Taschendiebs - nur mit vorheriger Zustimmung des Verbrechers erlaubt - oder so ähnlich :-)

geimist commented 3 days ago

Dann weist man halt bei der Begrüßung darauf hin, sofern man das Feature aktiviert. Aber ja: mit Dashcams ist es ja das Gleiche. 🙈

haumacher commented 3 days ago

Habe mit @hduelme 's Anleitung Images für linux/amd64, linux/arm/v7 und linux/arm64/v8 erzeugt und auf dockerhub gepusht: https://hub.docker.com/r/phoneblock/answerbot/tags

sig10680 commented 3 days ago

Ich werde es morgen mal auf meinen Pi testen! DANKE für die Erstellung.

haumacher commented 3 days ago

Ich habe die Umgebungvariablen USER und PASSWD noch zu SIP_USER und SIP_PASSWD angepasst, um ein Clash mit der Standard-Umgebungsvariable "USER" zu vermeiden. Die Besschreibung auf https://hub.docker.com/repository/docker/phoneblock/answerbot/general ist entsprechend angepasst und ein Link zu einem Docker-Compose-Script ist hinzugefügt, mit dem man eine Vielzahl der Optionen setzen kann.

Wenn ich allerdings mehr als einen Bot auf derselben Maschine laufen lassen wollte, dann müsste ich für jeden Bot unterschiedliche Ports vergeben. In der Konfiguration kann man das anpassen, aber das EXPOSE-Kommando in dem Dockerfile kann man ja nicht mehr anpassen. Es reicht auch nicht, einfach extern die Ports umzumappen, da die Ports in die SIP-Kommunikation eingebaut werden müssen - da ist wohl noch ein offener Punkt.

geimist commented 3 days ago

Prima - läuft 👌 Was mir aufgefallen ist: in dem Composefile ist die Zeile 16 ein Duplikat von Zeile 10.

sig10680 commented 3 days ago

Hallo, ich habe es auf meinen Raspberry getest und auf den ersten Blick läuft alles! Ausser wenn ich den Bot Intern Anrufe kommt folgende Fehlermeldung!

`[org.mjsip.ua.registration.RegistrationClient]: Registration of sip:phoneblock@192.168.0.86:50060 timed out.

[2024-11-19 09:02:34] INFO: [org.mjsip.ua.registration.RegistrationLogger]: Registration of 'sip:phoneblock@192.168.0.86:50060' failed: Timeout

[2024-11-19 09:02:34] INFO: [org.mjsip.ua.registration.RegistrationClient]: Waiting 60s for next registration of sip:phoneblock@192.168.0.86:50060.`

Das ist meine config: `version: '3.9' services: phoneblock: image: phoneblock/answerbot:latest container_name: phoneblock network_mode: host environment:

Vielleicht habt ihr eine Idee!

sig10680 commented 1 day ago

Was mir noch aufgefallen ist, ist das er die Porteinstellung (Host_Port=55560) nicht übernimmt im log bleibt immer das original 50060 eingestellt.

hduelme commented 17 hours ago

@sig10680 Ich vermute es liegt dran, dass die Default Config File Werte überschreibt. Könntest du command: "-f none" für deinen Service einfügen und es nochmal ausprobieren?

hduelme commented 16 hours ago

@sig10680 ich konnte es selber lokal reproduzieren. Der Fehler liegt daran, dass vor und nach den = Leerzeichen sind

sig10680 commented 10 hours ago

@hduelme Ich vermute es liegt dran, dass die Default Config File Werte überschreibt. Könntest du command: "-f none" für deinen Service einfügen und es nochmal ausprobieren?

Wo genau soll ich das command: "-f none" eingeben? Ich steh auf den schlauch

hduelme commented 8 hours ago

@sig10680 eine Zeile nach Image

sig10680 commented 7 hours ago

@hduelme das Portändern geht mit dem command aber ich kann micht nicht registrieren an der Fritzbox!

Fehlermeldung! `[org.mjsip.ua.registration.RegistrationClient]: Registration of sip:test@192.168.0.86 timed out.

[2024-11-22 09:21:23] INFO: [org.mjsip.ua.registration.RegistrationLogger]: Registration of 'sip:test@192.168.0.86' failed: Timeout

[2024-11-22 09:21:23] INFO: [org.mjsip.ua.registration.RegistrationClient]: Waiting 60s for next registration of sip:test@192.168.0.86.`

Wenn ich eine feste IP der Fritzbox eingeben will muss ich doch folgende Befehle verändern doer sehe ich das falsch! `REGISTRAR=192.168.0.200

hduelme commented 7 hours ago

Sieht richtig aus. Sofern du nicht die Standard-Ports nutzt, musst du noch das Port-Mapping überschreiben.

sig10680 commented 7 hours ago

Irgendwie gehts nicht Port 5060 geht nicht aber auch diverse andere gehen nicht!

hduelme commented 7 hours ago

Wenn du den Container gestartet hast, könntest du docker inspect <Name deines Containers> ausführen und das Ergebnis teilen?

sig10680 commented 7 hours ago

@hduelme

{ "AppArmorProfile": "", "Args": [ "-jar", "/opt/phoneblock/bin/phoneblock-ab.jar", "-f", "none" ], "Config": { "AttachStderr": true, "AttachStdin": false, "AttachStdout": true, "Cmd": [ "-f", "none" ], "Domainname": "", "Entrypoint": [ "java", "-jar", "/opt/phoneblock/bin/phoneblock-ab.jar" ], "Env": [ "MEDIA_PORT=50100", "MIN_SILENCE_TIME=1500", "RECODINGS=none", "REGISTRAR=192.168.0.200", "PHONEBLOCK_PASSWORD=??????????????", "PHONEBLOCK_USERNAME=???????????, "SIP_PASSWD=??????????????", "VIA_ADDR_V6=fe80::b814:5374:32c8:8e38", "SILENCE_DB=-35", "REALM=192.168.0.200", "VIA_ADDR=192.168.0.86", "HOST_PORT=5080", "PORT_COUNT=10", "ROUTE=192.168.0.200;lr", "CONVERSATION=/opt/phoneblock/conversation", "PADDING_TIME=500", "SIP_USER=????????", "MEDIA=audio 4080 RTP/AVP { 8 PCMA 8000 160 }", "PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "JAVA_HOME=/opt/java/openjdk", "LANG=en_US.UTF-8", "LANGUAGE=en_US:en", "LC_ALL=en_US.UTF-8", "JAVA_VERSION=jdk-17.0.13+11" ], "ExposedPorts": { "50060/tcp": {}, "50060/udp": {}, "50100/udp": {}, "50101/udp": {}, "50102/udp": {}, "50103/udp": {}, "50104/udp": {}, "50105/udp": {}, "50106/udp": {}, "50107/udp": {}, "50108/udp": {}, "50109/udp": {} }, "Hostname": "RPI-4-2", "Image": "phoneblock/answerbot:latest", "Labels": { "com.docker.compose.config-hash": "7bf71b7d1557e18b810a1293dff9341acd154985806a6328a81d5460aa9272c3", "com.docker.compose.container-number": "1", "com.docker.compose.depends_on": "", "com.docker.compose.image": "sha256:96cd2d3e4d394111c1c15a7244c87f6c42d49657a0398a3dc524ea377bbfb762", "com.docker.compose.oneoff": "False", "com.docker.compose.project": "phoneblock", "com.docker.compose.project.config_files": "/data/compose/34/docker-compose.yml", "com.docker.compose.project.working_dir": "/data/compose/34", "com.docker.compose.service": "phoneblock", "com.docker.compose.version": "2.29.2", "org.opencontainers.image.authors": "play@haumacher.de", "org.opencontainers.image.ref.name": "ubuntu", "org.opencontainers.image.version": "24.04" }, "OnBuild": null, "OpenStdin": false, "StdinOnce": false, "Tty": false, "User": "phoneblock", "Volumes": null, "WorkingDir": "/opt/phoneblock/" }, "Created": "2024-11-22T08:44:58.81383506Z", "Driver": "overlay2", "ExecIDs": null, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/4a0cb4205a4b686a9bdd424d82e76c4cba77e2e269b35f9e5cf39bd023176fe4-init/diff:/var/lib/docker/overlay2/4d91981dffd8f49def2a4740eb6b51c3d54ca2330738b28e0fb9241eea02d36b/diff:/var/lib/docker/overlay2/01dd4c64bc59d52f6f603a44172d52044384b9d97c4ec3e0c9e1e6acde7c69cc/diff:/var/lib/docker/overlay2/952d2ee1f2141fa77f7de3aeef318f517d540a638176dacdf8e268d622150ded/diff:/var/lib/docker/overlay2/ba099f8b4a651e895ef79a179d2cc41b403593f3d520eeaa974e18b75bbfef46/diff:/var/lib/docker/overlay2/070c21051981255a5578af86799b348365ea272789b6b748f32117969f336982/diff:/var/lib/docker/overlay2/63cea2d70901a470fa8b8ebda2d656ec92823b3135e1386a8d40d50a5457f311/diff:/var/lib/docker/overlay2/cd296c1d012c565f5d4ae1d393100295d7ce529796091f0f9f2924efc1c1c402/diff:/var/lib/docker/overlay2/9fe32e734d302af4b171f354a37ad63869f09d679654141133ee2b405427a2fb/diff:/var/lib/docker/overlay2/1486869b73e317b5fe6bf709324633f4ed532ee11e7c59af3187f4fe1450333d/diff:/var/lib/docker/overlay2/791ec1692fe142e4d0e2c919f2927062cf76059e2c8d385c69966634fa11c0b6/diff", "MergedDir": "/var/lib/docker/overlay2/4a0cb4205a4b686a9bdd424d82e76c4cba77e2e269b35f9e5cf39bd023176fe4/merged", "UpperDir": "/var/lib/docker/overlay2/4a0cb4205a4b686a9bdd424d82e76c4cba77e2e269b35f9e5cf39bd023176fe4/diff", "WorkDir": "/var/lib/docker/overlay2/4a0cb4205a4b686a9bdd424d82e76c4cba77e2e269b35f9e5cf39bd023176fe4/work" }, "Name": "overlay2" }, "HostConfig": { "AutoRemove": false, "Binds": [ "/home/pi/docker/phoneblock_ab/conversation:/opt/phoneblock/conversation:rw", "/home/pi/docker/phoneblock_ab/recordings:/opt/phoneblock/recordings:rw" ], "BlkioDeviceReadBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceWriteIOps": null, "BlkioWeight": 0, "BlkioWeightDevice": null, "CapAdd": null, "CapDrop": null, "Cgroup": "", "CgroupParent": "", "CgroupnsMode": "private", "ConsoleSize": [ 0, 0 ], "ContainerIDFile": "", "CpuCount": 0, "CpuPercent": 0, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpuShares": 0, "CpusetCpus": "", "CpusetMems": "", "DeviceCgroupRules": null, "DeviceRequests": null, "Devices": null, "Dns": null, "DnsOptions": null, "DnsSearch": null, "ExtraHosts": [], "GroupAdd": null, "IOMaximumBandwidth": 0, "IOMaximumIOps": 0, "IpcMode": "private", "Isolation": "", "Links": null, "LogConfig": { "Config": {}, "Type": "json-file" }, "MaskedPaths": [ "/proc/asound", "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware", "/sys/devices/virtual/powercap" ], "Memory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "NanoCpus": 0, "NetworkMode": "host", "OomKillDisable": null, "OomScoreAdj": 0, "PidMode": "", "PidsLimit": null, "PortBindings": {}, "Privileged": false, "PublishAllPorts": false, "ReadonlyPaths": [ "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ], "ReadonlyRootfs": false, "RestartPolicy": { "MaximumRetryCount": 0, "Name": "unless-stopped" }, "Runtime": "runc", "SecurityOpt": null, "ShmSize": 67108864, "UTSMode": "", "Ulimits": null, "UsernsMode": "", "VolumeDriver": "", "VolumesFrom": null }, "HostnamePath": "/var/lib/docker/containers/3ebde7ab740b1befaf5068ff53229013cf238511e3d35c9d8b8ef4a1814d0dc1/hostname", "HostsPath": "/var/lib/docker/containers/3ebde7ab740b1befaf5068ff53229013cf238511e3d35c9d8b8ef4a1814d0dc1/hosts", "Id": "3ebde7ab740b1befaf5068ff53229013cf238511e3d35c9d8b8ef4a1814d0dc1", "Image": "sha256:96cd2d3e4d394111c1c15a7244c87f6c42d49657a0398a3dc524ea377bbfb762", "LogPath": "/var/lib/docker/containers/3ebde7ab740b1befaf5068ff53229013cf238511e3d35c9d8b8ef4a1814d0dc1/3ebde7ab740b1befaf5068ff53229013cf238511e3d35c9d8b8ef4a1814d0dc1-json.log", "MountLabel": "", "Mounts": [ { "Destination": "/opt/phoneblock/conversation", "Mode": "rw", "Propagation": "rprivate", "RW": true, "Source": "/home/pi/docker/phoneblock_ab/conversation", "Type": "bind" }, { "Destination": "/opt/phoneblock/recordings", "Mode": "rw", "Propagation": "rprivate", "RW": true, "Source": "/home/pi/docker/phoneblock_ab/recordings", "Type": "bind" } ], "Name": "/phoneblock", "NetworkSettings": { "Bridge": "", "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "HairpinMode": false, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "MacAddress": "", "Networks": { "host": { "Aliases": null, "DNSNames": null, "DriverOpts": null, "EndpointID": "c97b6d6c1a61e1eb1bbc2ce284c2bdf1824daa4bf40ebdb012008f0efa5d9eb0", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAMConfig": null, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "Links": null, "MacAddress": "", "NetworkID": "e1d10c8d71ef4fb2c5d30ac2c3b120f99b22174c544b77bb13fa407a0cf474f8" } }, "Ports": {}, "SandboxID": "36b6b8efffcda8838df26cca4cbca3ddcd71f72d3928e4d919a709af3f40fd0a", "SandboxKey": "/var/run/docker/netns/default", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null }, "Path": "java", "Platform": "linux", "Portainer": { "ResourceControl": { "Id": 140, "ResourceId": "2_phoneblock", "SubResourceIds": [], "Type": 6, "UserAccesses": [], "TeamAccesses": [], "Public": false, "AdministratorsOnly": true, "System": false } }, "ProcessLabel": "", "ResolvConfPath": "/var/lib/docker/containers/3ebde7ab740b1befaf5068ff53229013cf238511e3d35c9d8b8ef4a1814d0dc1/resolv.conf", "RestartCount": 0, "State": { "Dead": false, "Error": "", "ExitCode": 0, "FinishedAt": "0001-01-01T00:00:00Z", "OOMKilled": false, "Paused": false, "Pid": 392468, "Restarting": false, "Running": true, "StartedAt": "2024-11-22T08:44:58.892625382Z", "Status": "running" } }

ich hoffe das ist alles Passwörter und Benutzer habe ich mit ????? ersetzt!

hduelme commented 5 hours ago

Könnte sein das die Ports nicht durchgereicht werden. Was sagt docker ps?

Könntest du die Ports explizit eintragen und testen?

sig10680 commented 4 hours ago

@hduelme Könntest du die Ports explizit eintragen und testen? `ports:

Könnte sein das die Ports nicht durchgereicht werden. Was sagt docker ps? d2e7fa6b1448 phoneblock/answerbot:latest "java -jar /opt/phon…" About a minute ago Up About a minute phoneblock

Bringt irgendwie auch nix

hduelme commented 4 hours ago

@sig10680 Okay sollte ja auch übers Host-Netz-laufe. Ich hab es gerade bei mir Lokal probiert. Füge mal LOG_ALL_PACKETS=yes hinzu. Meine Fritz-Box verlangt als Realm fritz.box

phoneblock    | Via: SIP/2.0/UDP 192.168.2.19:55060;branch=...;received=192.168.2.32
phoneblock    | From: <sip:test1234@192.168.2.1>;tag=...
phoneblock    | To: <sip:test1234@192.168.2.1>;tag=...
phoneblock    | Call-ID: ...@192.168.2.19
phoneblock    | CSeq: 1 REGISTER
phoneblock    | WWW-Authenticate: Digest realm="fritz.box", nonce="..."
phoneblock    | User-Agent: FRITZ!OS
phoneblock    | Content-Length: 0

Damit funktioniert es bei mir. Ansonsten gerne die Ausgabe des Logs für die einzelnen Nachrichten schicken

geimist commented 4 hours ago

Irgendetwas scheint mit dem aktuellen Image noch nicht zu passen. Ich hatte es nicht gleich gemerkt, weil im Log keine Fehlermeldungen zu sehen sind und ein Testanruf auch Ansagen bringt. Allerdings keine Ansagen aus dem Pool "question". Auch werden keine (aktivierten) Aufnahmen abgelegt. Das Konfigfile habe ich testweise mit "-f none" auch deaktiviert. Ich gehe davon aus, dass der AB den Anrufer gar nicht hört (keine Reaktion auf den Anrufen / keine Aufnahme).

Zum Test bin ich jetzt mal wieder auf das 1. Image zurückgewechselt (inkl. angepasstem Composefile – ich hatte mir das Image zum Glück gesichert) und da funktioniert es wieder.

hduelme commented 4 hours ago

@geimist die Änderung im Neuen Docker-File ist, dass der Nutzer nicht mehr Root sondern phoneblock 999 ist. Wohin mountest du die Verzeichnisse? Und darf der Nutzer 999 darauf schreiben und lesen? Wenn du die Zeile:

user: 0:0

in deine Compose-File hinzufügst, läuft der wieder als Root

geimist commented 4 hours ago

Das Verzeichnis hat Schreibrechte für everyone (777). Dass der AB offensichtlich nichts hört, merkt man aber auch am Gespräch.

EDIT: Ich habe mal zum Test den Mount entfernt. Das Recordingsverzeichnis im Container bleibt auch da leer.

sig10680 commented 3 hours ago

@hduelme hier mein log und mit realm=fritz.box

`-----End-of-message-----

[2024-11-22 12:21:44] INFO: [org.mjsip.sip.provider.SipProvider]: Sent message to: 192.168.0.200:5060/udp (477 bytes).

-----Begin-of-message-----

REGISTER sip:192.168.0.200 SIP/2.0

Via: SIP/2.0/UDP 192.168.0.86:5060;branch=z9hG4bK754740c5

Route: <sip:192.168.0.200;lr>

Max-Forwards: 70

To: sip:xxxx@192.168.0.200

From: sip:xxxx@192.168.0.200;tag=585142730710

Call-ID: 588532645644@192.168.0.86

CSeq: 1 REGISTER

Contact: sip:xxxx@192.168.0.86

Expires: 3600

User-Agent: mjsip 1.9.0-SNAPSHOT

Content-Length: 0

-----End-of-message-----

[2024-11-22 12:21:44] INFO: [org.mjsip.ua.registration.RegistrationClient]: Registration of sip:xxxx@192.168.0.86 timed out.

[2024-11-22 12:21:44] INFO: [org.mjsip.ua.registration.RegistrationLogger]: Registration of 'sip:xxxx@192.168.0.86' failed: Timeout

[2024-11-22 12:21:44] INFO: [org.mjsip.ua.registration.RegistrationClient]: Waiting 60s for next registration of sip:xxxx@192.168.0.86.`

hduelme commented 3 hours ago

@sig10680 die Fritzbox antwortet dir nicht. Normalerweise sollte eine Bestätigung ankommen

phoneblock    | [2024-11-22 12:56:46] INFO: [org.mjsip.sip.provider.SipProvider]: Received message from: 192.168.2.1:5060/udp (357 bytes).
phoneblock    | -----Begin-of-message-----
phoneblock    | SIP/2.0 401 Unauthorized
phoneblock    | Via: SIP/2.0/UDP 192.168.2.32:55060;branch=...
phoneblock    | From: <sip:test1234@192.168.2.1>;tag=...
phoneblock    | To: <sip:test1234@192.168.2.1>;tag=3775650DC56F84B1
phoneblock    | Call-ID: ...@192.168.2.32
phoneblock    | CSeq: 1 REGISTER
phoneblock    | WWW-Authenticate: Digest realm="fritz.box", nonce=".."
phoneblock    | User-Agent: FRITZ!OS
phoneblock    | Content-Length: 0
phoneblock    | 

Woraufhin es mit Username + Passwort versucht wird. Wird auf dem Port zugehört? netstat -lntu

hduelme commented 3 hours ago

@geimist bei mir funktioniert es auch mit dem neuen Image. Wie sieht deine yaml aus?

sig10680 commented 3 hours ago

@hduelme Wird auf dem Port zugehört? netstat -lntu

Ja

geimist commented 2 hours ago

Ziemlich unverändert, meine ich:

version: '3.9'

services:
  phoneblock:
    image: phoneblock/answerbot:latest
    container_name: phoneblock
#  command: "-f none"
#  user: 0:0
    network_mode: host
    environment:
      # description: https://github.com/haumacher/phoneblock/blob/master/phoneblock-ab/.phoneblock.template
      - SIP_USER=phoneblock
      - SIP_PASSWD=xxx
      - PHONEBLOCK_USERNAME=xxx
      - PHONEBLOCK_PASSWORD=xxx
      - VIA_ADDR=auto-configuration
      - VIA_ADDR_V6=auto-configuration
      - HOST_PORT=50760
      - REGISTRAR=fritz.box
      - ROUTE=fritz.box;lr
      - REALM=fritz.box
      - MEDIA=audio 4080 RTP/AVP { 8 PCMA 8000 160 }
      - MIN_SILENCE_TIME=1500
      - PADDING_TIME=500
      - SILENCE_DB=-35
      - MEDIA_PORT=50100
      - PORT_COUNT=10
      - RECORDINGS=/opt/phoneblock/recordings
      - CONVERSATION=/opt/phoneblock/conversation
    volumes:
      - ./conversation:/opt/phoneblock/conversation
#      - ./recordings:/opt/phoneblock/recordings
    restart: on-failure:5