Fablab Server wieder zum Laufen bringen --------------------------------------- H. Hoegl, Juni 2025 Hinweis: Den Server gibt es nicht mehr, daher kann ich ohne Probleme die Passwoerter in diesem Text lassen. https://fablab.hs-augsburg.de Login: root, Pwd: !dontstopmenow1970! 141.82.49.249 141.82.49.247 Fujitsu Server mit Intel Xeon E3-1220 V3 @ 3.1GHz 8 GByte RAM CentOS 7.9.2009 (RedHat) nginx 1.20.1 nmcli (!) /root/anaconda-ks.cfg <-- Anaconda Kickstart Docker 24.0.4 MJPG Streamer 3:182 certbot 2.8.0 (/var/lib/snapd/snap/bin/certbot) Sourcecode: https://gitlab.com/hhoegl-tha/fablab-home-2018 $ tokei (im wesentlichen nur ca. 2700 Zeilen Java) =============================================================================== Language Files Lines Code Comments Blanks =============================================================================== CSS 16 838 668 67 103 FreeMarker 1 302 266 0 36 Java 45 3960 2707 723 530 JavaScript 28 19859 16997 1170 1692 Markdown 2 75 0 62 13 Python 1 36 32 0 4 Shell 2 24 12 2 10 SQL 1 2 2 0 0 SVG 3 5189 5186 3 0 XML 6 498 457 0 41 =============================================================================== Total 105 30783 26327 2027 2429 =============================================================================== Siehe readme/readme.md Der Server ist ueber eine zweite Netzwerkkarte mit dem Netzwerk aus RPis verbunden. An jedem RPi haengen bis zu zwei Kameras. Netzwerk Adressen 192.168.0.1/24. Es gab das Problem dass manche Pis problemlos zwei Streams dauerhaft liefern konnten, bei anderen fiel ein Stream nach ca. 1 Stunde aus. Nginx Konfiguration /etc/nginx/sites-available/fablab.hs-augsburg.de.conf Nginx leitet die Webseiten-Aufrufe auf ```/camera/stream...``` weiter an die Pis. JDK 1.8 Java/Spring Tomcat (/home/tomcat), tomcat85jre8 Docker Sourcecode: src/main/java/de/fablab/... Abhaengigkeiten der Java Software - Jackson (JSON, XML, CSV, ...) - JUnit - Spring Framework - jdbc - stereotype - beans - dao - http - ui - util - web - security - Apache Directory Server - MySQL - mysql-connector-java - Apache Tomcat - Apache Commons - Fileutils - Javax - Servlet - Annotation - Mail - SQL - Taglibs - Freemarker - template - slf4j (Simple Logging Facade for Java) - logger - loggerfactory - commons fileupload - Mockito Der Quelltext ist gegliedert in access/ administration/ inventory/ mail/ messages/ openinghours/ reservation/ user/ Resources: src/main/resources/log4j.xml Webapp (.jsp Seiten): src/main/webapp/ src/main/webapp/WEB-INF/ Das hat mit Tomcat zu tun: fablab-config.properties fablab-security.xml fablab-servlet.xml In fablab-config.properties sieht man wie der Zugriff auf MySQL ist: fablab.db.url=jdbc:mysql://fablab.hs-augsburg.de:3306/fablab_test fablab.db.user=fablab_test fablab.db.password=JTubb84v Features - User - RZ-ID - LDAP (rzname, fullname, email, roles) - Expiration date - Whitelist - Administration - Rollen: Fablab-User und Admin - Bildverzeichnisse fuer Drucker und Inventory - Email Benachrichtigung - Fuer dich wurde ein Zugang angelegt ... - AcquisitionMessage/ContactMessage - Schadensmeldung ... - Oeffnungszeit - Reservierung - Printer - Kamera, Kamerarotation, Kamerapfad - Printerstatus: AVAILABLE, INACTIVE, PRINTING - Prio: BACHELOR, PROJECT, PRIVATE, FABLAB - Inventory storageLocation, storagePlace, description1, description2, pictureName - Bilder (Drucker, Inventory) ~/fablab-homepage-server/home/tomcat/fablab/pictures/ - Kamera URL https://fablab.hs-augsburg.de/camera/ Streaming ueber https://github.com/jacksonliam/mjpg-streamer (auf RPi) Service Units auf RPi: --- [Unit] Description=MJPG Streamer /dev/video0 Service [Service] Environment="LD_LIBRARY_PATH=/usr/local/lib" ExecStart=/usr/local/bin/mjpg_streamer -o "output_http.so -p 8081" \ -i "input_uvc.so -r 1280x720 -f 30 -n -d /dev/v4l/by-path/platform-3f980000.usb-usb-0:1.5:1.0-video-index0" >> /var/log/mjpg_streg_streamer_upstart.log 2>&1 Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target --- Oft sieht man "DAO" im Code (Data Access Object) https://stackoverflow.com/questions/19154202/what-is-data-access-object-dao-in-java @RequestMapping (URL Pfade) message/acquisition/save message/damage/save message/damage/picture/save message/contact/save administration/messages administration/message/acquisition/delete administration/message/contact/delete administration/message/notification/subscribe administration/message/notification/unsubscribe administration/message/damage/delete /administration/whitelist/activate /administration/whitelist/deactivate /administration/user/access /administration/user/access/expiredate/set /administration/user/access/activate /administration/user/access/autocomplete /administration/user/access/create /administration/user/access/deactivate /adminstration/user/access/delete /administration/user/access/list/active /administration/user/access/list/inactive /administration/user/roles /administration/user/roles/edit /administration/user/roles/delete /administration/user/roles/save /administration/printer /administration/printer/edit /administration/printer/new /administration/printer/save /administration/printer/delete /openinghours/include /administration/openinghour /administration/openinghour/edit /administration/openinghour/save /administration/openinghour/delete /administration/slides /administration/slide/upload /administration/slide/delete /administration/inventory /administration/inventory/upload /administration/inventory/save /administration/inventory/download /administration/inventory/item/{number}/edit /administration/inventory/item/new /administration/inventory/item/{number}/save /administration/inventory/item/create /administration/inventory/item/{number}/delete / /application /login /loginfailed /contact /inventory /printer /printer/detail/{printerName} /schedule /schedule/reserve /reservation/delete /reservation/iseditable /reservation/list /reservation/user/autocomplete /reservation/sendmessage ---- 2025-06-02 Maven! https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html Loesche Java 11! sudo apt remove openjdk-11-jre-headless:amd64 Installiere Java 8 sudo apt install openjdk-8-jdk-headless sudo apt install maven 21:16 $ mvn --version Apache Maven 3.6.3 Maven home: /usr/share/maven Java version: 1.8.0_452, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "5.15.0-140-generic", arch: "amd64", family: "unix" (base) ✔ ~/fablab-homepage [master|✔] mvn --version mvn clean mvn package Erfolg! ---- MySQL installieren Anleitung: https://docs.vultr.com/how-to-install-mysql-on-debian-12 Jetzt erst mal mit Podman, siehe unten. ---- Tomcat installieren https://www.centron.de/en/tutorial/step-by-step-guide-install-tomcat-on-a-linux-system/ Versuche es mit Version 9, ist angeblich auch fuer Java8 geeignet: https://downloads.apache.org/tomcat/tomcat-9/v9.0.105/bin/ Download apache-tomcat-9.0.105.tar.gz sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat sudo tar xf fablab-homepage-server/apache-tomcat-9.0.105.tar.gz -C /opt/tomcat --strip-components=1 sudo chown -R tomcat: /opt/tomcat sudo sh -c 'chmod +x /opt/tomcat/bin/*.sh' $ sudo ls -l /opt/tomcat/bin/ Erstelle tomcat.serivce (/etc/systemd/system/tomcat.service) systemctl status tomcat.service systemctl start tomcat.service systemctl enable tomcat.service Tomcat laeuft: hhoegl@n100:~$ w3m http://141.82.48.189:8080 Deployment Tipps: https://www.codejava.net/servers/tomcat/how-to-deploy-a-java-web-application-on-tomcat Anscheinend target/fablab nach $CATALINA_HOME/webapps/ kopieren. Die Variable CATALINA_HOME ist in tomcat.service gesetzt auf /opt/tomcat/. cd target sudo rsync -zav --delete fablab /opt/tomcat/webapps/ systemctl restart tomcat.service http://localhost:8080/fablab Login Maske erscheint! Anmeldung ueber LDAP klappt jedoch nicht. TODO: Hier gibt es noch Properties die gesetzt werden muessen: fablab-homepage-server/home/tomcat/fablab/fablab-config-prod.properties /fablab-config-test.properties /pictures Klaeren: fablab.env wird auf test und prod gesetzt. Wo? fablab-homepage/src/main/webapp/WEB-INF/fablab-servlet.xml Kurzzeitig auf /tmp/fablab-config.properties gesetzt. Aha, das wird hier gemacht: home/bkp/tomcat/docker/fablab/docker-compose.yml Login klappt, jetzt haengt es an ODBC, Datenbank muss installiert werden. Spaeter an diesen Properties orientieren: ~/fablab-homepage-server/home/tomcat/fablab/fablab-config-[prod|test].properties Der Unterschied zwischen prod und test ist nur in der Datenbank: < fablab.db.url=jdbc:mysql://141.82.49.249/fablab < fablab.db.user=fablab < fablab.db.password=xMN3Sgdd --- > fablab.db.url=jdbc:mysql://141.82.49.249/fablab_test > fablab.db.user=fablab_test > fablab.db.password=JTubb84v --- 2025-06-03 Es gib einen Database "dump" in Datei fablab-homepage-server/home/tomcat/fablab.sql Da sieht man dass es folgende Datenbanken - fablab - fablab_test und Tabellen gibt: - printer - reservation - user_roles --- Logs des Servers der damals lief (2018, 2019, ...): fablab-homepage-server/home/tomcat/docker/fablab/logs/fablab-debug.log Tomcat Logdateien erleichtern die Fehlersuche: root@n100:/opt/tomcat/logs# ls catalina.2025-06-02.log host-manager.2025-06-02.log localhost.2025-06-04.log catalina.2025-06-03.log host-manager.2025-06-03.log localhost.2025-06-05.log catalina.2025-06-04.log host-manager.2025-06-04.log localhost_access_log.2025-06-02.txt catalina.2025-06-05.log host-manager.2025-06-05.log localhost_access_log.2025-06-03.txt catalina.out localhost.2025-06-02.log localhost_access_log.2025-06-04.txt fablab-debug.log localhost.2025-06-03.log localhost_access_log.2025-06-05.txt --- Es gibt Varianten fuer die mysql Konfiguration: fablab.db.url=jdbc:mysql://141.82.49.249/fablab fablab.db.user=fablab fablab.db.password=xMN3Sgdd fablab.db.url=jdbc:mysql://fablab.hs-augsburg.de:3306/fablab_test fablab.db.user=fablab_test fablab.db.password=JTubb84v Port 3306 is the standard TCP port used by MySQL for client connections. It's where MySQL servers listen for incoming requests from applications and utilities like mysql, mysqldump, and mysqlpump. Datenbank Server Version: 10.1.23-MariaDB-9+deb9u1 Versuch, MySQL als Podman Container zu starten: (Anleitung: https://infotechys.com/deploying-mysql-using-podman/) Version: Server version: 9.3.0 MySQL Community Server - GPL Podman Lit.: https://gantek.com/en/blog/podman - podman images # zeigt verfuegbare images - podman ps - podman pull docker.io/library/mysql:latest - podman run --name fablab-mysql -e MYSQL_ROOT_PASSWORD=foobar -d -p 3306:3306 mysql:latest - podman logs -t fablab-mysql - podman ps - podman stop fablab-mysql - podman ps --all # auch gestoppte Container tauchen hier auf - podman rm fablab-mysql - podman rm -f fablab-mysql # stop und rm in einem - mysql Programm im Container aufrufen Methode 1: podman exec -it fablab-mysql /bin/bash mysql -h localhost -p Methode 2: podman exec -it fablab-mysql mysql -u root -p Man muss das Root Passwort eingeben und landet dann auf dem Prompt: mysql> Mit 'quit' kommt man wieder heraus. Port 3306 sudo netstat -tulpn Zum Persistieren von Daten muss man noch die Option "-v /path/on/host:/var/lib/mysql" hinzufuegen. Fehlermeldung nach der Anmeldung in Firefox: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. mysql> CREATE DATABASE fablab_test; mysql> SHOW DATABASES; mysql> CREATE USER 'fablab_test' IDENTIFIED BY 'abc123'; // Dieser User kann nicht die Datenbank "fablab_test" anlegen. mysql> DROP USER 'fablab_test'; Besser so machen: // als root anmelden mysql> CREATE USER 'fablab_test'@'localhost' IDENTIFIED BY 'abc123'; mysql> CREATE DATABASE fablab_test; mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON fablab_test.* TO 'fablab_test'@ 'localhost'; Lit.: https://matomo.org/faq/how-to-install/faq_23484/ Kann sein dass die Tabellen zu Fuss angelegt werden muessen. --- Kameraweiterleitung in /etc/nginx/sites-available/fablab.hs-augsburg.de.conf auf dem Fablab Server: # stream0 ... stream12 ... location /camera/stream0/ { proxy_pass http://192.168.0.107:8081/; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } ... --- 2025-06-04 Auf Fujitsu Server: # mysql -u fablab -p (Passwort xMN3Sgdd vom Produktivsystem) Version 5.5.68-MariaDB // aus fablab-homepage-server/home/tomcat/fablab/fablab-config-prod.properties fablab.db.url=jdbc:mysql://141.82.49.249/fablab fablab.db.user=fablab fablab.db.password=xMN3Sgdd USE fablab; MariaDB [fablab]> SHOW TABLES; acquisition_message contact_message damage_message item opening_hours opening_time printer properties reservation user_enabled user_properties user_roles Jede Tabelle ist auf dem Server in /var/lib/mysql/fablab/ eine Datei .frm. rw-rw---- 8,7k hhoegl 6 Oct 2018 acquisition_message.frm .rw-rw---- 8,7k hhoegl 6 Oct 2018 contact_message.frm .rw-rw---- 13k hhoegl 21 Aug 2018 damage_message.frm .rw-rw---- 65 hhoegl 2 May 2018 db.opt .rw-rw---- 8,8k hhoegl 20 May 2019 item.frm .rw-rw---- 8,6k hhoegl 12 Dec 2018 opening_hours.frm .rw-rw---- 8,6k hhoegl 12 Dec 2018 opening_time.frm .rw-rw---- 8,8k hhoegl 6 Oct 2018 printer.frm .rw-rw---- 8,6k hhoegl 12 Dec 2018 properties.frm .rw-rw---- 13k hhoegl 6 Oct 2018 reservation.frm .rw-rw---- 8,7k hhoegl 18 Dec 2018 user_enabled.frm .rw-rw---- 8,6k hhoegl 3 Sep 2018 user_properties.frm .rw-rw---- 8,6k hhoegl 20 Sep 2018 user_roles.frm ---- Wieder auf n100: // In den Container auf bash gehen podman exec -it fablab-mysql /bin/bash bash-5.1# ls -l /var/lib/mysql/fablab_test/ total 0 Noch leer, Tabellen anlegen! Muss fuer jede Tabelle alle Spalten kennen, Beispiel: CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) ); Anzeigen der Spalten einer Tabelle mit mysql> describe ; Mit dem folgenden Kommando bekommt man die Ausgabe die man zum Erstellen einer neuen Tabelle mit CREATE TABLE verwenden kann (Buch von Dyer): SHOW CREATE TABLE
\G In MySQL beendet \G eine SQL-Anweisung, ähnlich wie das Semikolon (;). Es bewirkt jedoch, dass die Ergebnisse vertikal statt horizontal angezeigt werden, was die Lesbarkeit bei Tabellen mit vielen Spalten oder langen Werten verbessern kann. Sie können \G für jede Anweisung verwenden, nicht nur für SELECT-Anweisungen. Auf Server SQL Skript ausfuehren: # mysql -u fablab -p < test.sql > out.txt Mit -v Option wird Output verbose. Kommentare: // oder /* ... */ ---- Diese Exception tritt auf: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) https://help.salesforce.com/s/articleView?id=001123140&type=1 Vielleicht mal mit openjdk-11-jre-headless probieren. Klappt nicht! Gehe zurueck auf openjdk-8. Nun aeltere MySQL Version holen von 2019. podman pull docker.io/library/mysql:5.5.62 podman run --name fablab-mysql -e MYSQL_ROOT_PASSWORD=foobar -d -p 3306:3306 mysql:5.5.62 User: fablab, Pwd abc123 Datenbank: fablab Nun Zugriffsfehler, haengt mit MySQL im Container zusammen. Caused by: java.sql.SQLException: Access denied for user 'fablab'@'10.0.2.100' (using password: YES) podman inspect fablab-mysql podman inspect fablab-mysql | grep IPAddress # hat keine IP! Lege jetzt im Container neuen User an: podman exec -it fablab-mysql mysql -u root -p mysql> CREATE USER 'fablab'@'10.0.2.100' IDENTIFIED BY 'abc123'; mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON fablab.* TO 'fablab'@'10.0.2.100'; Das scheint zu klappen. Nun neue Fehlermeldung: Table 'fablab.user_roles' doesn't exist Es sieht so aus als ob man alle Tabellen zu Fuss anlegen muss. Podman ohne -v aufgerufen anonymous volumes, persist despite containers are removed (base) hhoegl@n100:~$ podman volume ls DRIVER VOLUME NAME local 57502853afb8affa3e18ac6ce7e73e047a8730d636a807152d7c800783dfd2c9 local 7e182b4ed4e3379fa0c8a78e1e898af438b33d44438aaa9ee07be9d54a97b1ce local f7feec041b5fa937bd508eaab72c93f85c01bafc6f3dabc02a9dff3aabb4c091 named volumes (am besten fuer Datenbank). Ueberlebt rm container und neustart. ... -v postgres_data:/var/lib/postgres ... bind mount (beliebiges Host Verzeichnis auf bel. Container Verz.): ... -v "/opt/postgres/server:/var/lib/postgres" ... --- Unterschied Datentyp text und varchar in MySQL: TEXT fixed max size of 65535 characters (you cannot limit the max size) takes 2 + c bytes of disk space, where c is the length of the stored string. cannot be (fully) part of an index. One would need to specify a prefix length. VARCHAR(M) variable max size of M characters M needs to be between 1 and 65535 takes 1 + c bytes (for M ≤ 255) or 2 + c (for 256 ≤ M ≤ 65535) bytes of disk space where c is the length of the stored string can be part of an index ---- Mountet die Dateien in container_mount/fablab/* unter /var/lib/mysql/fablab/ podman run --name fablab-mysql -v ./container_mount/fablab:/var/lib/mysql/fablab -e MYSQL_ROOT_PASSWORD=foobar -d -p 3306: 3306 mysql:5.5.62 Funktioniert aber nicht. MySQL weigert sich die Tabellendateien von dem alten Fablab Server zu akzeptieren. Man kann also die .frm Dateien nicht kopieren. Besser import/export zu verwenden, siehe unten. --- SQL Tipp: So kann man sich von einem beliebigen Rechner verbinden: mysql> ... 'fablab'@'%' ... Auf anderen User switchen geht nur mit: mysql> SYSTEM mysql -u user -p Database exportieren: mysqldump -u username -p database_name > data-dump.sql Zum Importieren muss man mit SQL zunaechst die neue Datenbank anlegen CREATE DATABASE new_database; Dann mysql -u username -p new_database < data-dump.sql Lit.: https://www.digitalocean.com/community/tutorials/how-to-import-and-export-databases-in-mysql-or-mariadb --- 2025-06-05 // In /tmp die Datei fablab-dump.sql kopiert $ podman run --name fablab-mysql -v /tmp:/tmp/mysql -e MYSQL_ROOT_PASSWORD=foobar -d -p 3306:3306 mysql:5.5.62 $ podman exec -it fablab-mysql mysql -u root -p # pwd 'foobar' Entweder 'fablab'@'localhost' oder 'fablab'@'%' mysql> CREATE USER 'fablab'@'localhost' IDENTIFIED BY 'abc123'; mysql> CREATE USER 'fablab'@'%' IDENTIFIED BY 'abc123'; mysql> CREATE DATABASE fablab; mysql> USE fablab; mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON fablab.* TO 'fablab'@'%'; mysql> quit $ podman exec -it fablab-mysql /bin/bash root@d39027040b75:/# // pwd 'abc123' root@d39027040b75:/# mysql -u fablab -p fablab < /tmp/mysql/fablab-dump.sql root@d39027040b75:~# mysql -u root -p # pwd 'foobar' root@d39027040b75:~# exit mysql> use fablab; mysql> show tables; mysql> describe user_roles; --------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+--------------+------+-----+---------+-------+ | rzName | varchar(100) | NO | PRI | NULL | | | role | varchar(100) | NO | PRI | NULL | | +--------+--------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> select * from user_roles; +----------+-------------+ | rzName | role | +----------+-------------+ | danielf | ROLE_FABLAB | | hafner | ROLE_ADMIN | | hafner | ROLE_FABLAB | | hhoegl | ROLE_FABLAB | | pd | ROLE_ADMIN | | pd | ROLE_FABLAB | | tschwarz | ROLE_ADMIN | | tschwarz | ROLE_FABLAB | +----------+-------------+ Der Server laeuft nun! 2025-06-05, 17:00 Noch ein kleines Problem: Server kann keine Emails verschicken, da der SMTP Server am RZ nun anders konfiguriert ist. smtp.hs-augsburg.de:587 failed Caused by: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first