Beiträge von Floppy012

    Dazu müsste man jetzt mal die Tabellenstruktur sehen. Kannst diesbezüglich mal das Schema hier posten.


    Beheben kann man sowas indem man prüft ob eine Tabelle die entsprechende Spalte besitzt. Wobei das bad practice ist. SQL Tabellen-Strukturen sollten statisch aufgebaut sein und nicht durch code dynamisch verändert werden.

    Ist leider schon sehr lange her, dass ich in dem Bereich was gemacht habe. Aber ich vermute mal, dass der Client da (aus welchem Grund auch immer) kein Packet an den Server schickt. Du könntest mal direkt auf Packet-Ebene schauen ob wirklich kein Packet durchgeht.

    Code
    [02:13:17] [Server thread/WARN]: java.sql.SQLException: Column 'Bow' not found.

    Englisch: "Column 'Bow' not found."

    Deutsch: "Spalte 'Bow' nicht gefunden."


    Erklärung: Irgendwo (SQLStats.java:2125) versuchst du irgendwas mit einer Spalte "Bow" in einer Tabelle zu machen, in der diese Spalte nicht existiert.


    --------

    Kleiner Tipp am Rande


    Die Art wie du an deine Plugin Instanz kommst ist nicht gerade Effizient (Performance- und Codetechnisch)


    Main.getPlugin(Main.class)... Ruft intern den PluginManager (oder Loader) auf und ruft dann dort aus einer HashMap die Instanz deines Plugins ab und castet es dann noch.


    Du könntest in deiner Plugin-MainClass eine private static variable einbauen in der du die Instanz deines Plugins abspeicherst. Dann könntest du dafür einen statischen getter schreiben, der dir dann den Umweg erspart.


    Beispiel


    So könnte dann z.B. aus MyExamplePlugin.getPlugin(MyExamplePlugin.class)... das folgende werden: MyExamplePlugin.getInstance().... Ist von der Performance her besser und sieht sauberer aus.


    Zusätzlich hast du in beiden deiner Beispiele die UUID eines Spielers als String referenziert. Du solltest als Parametertyp UUID verwenden. Somit ist sichergestellt, dass es sich auch wirklich um UUIDs handelt.


    Worst case Szenario wäre, dass der "uuid" parameter user-input ist und du somit anfällig für SQL-Injections wärst um dem Abhilfe zu leisten, solltest du bei direkten Queries deine Parameter vorher selber escapen oder PreparedStatements verwenden (denk auch dran, dass PreparedStatements pro Connection nur ein einziges Mal "prepared" werden müssen. Also nicht vor jeder request)

    Wie der Fehler sagt, kann die Klasse de.melone.lobby.cmd.CMD_build nicht gefunden werden. Du könntest mal in der JAR schauen ob die .class datei auch an der vorgesehenen Stelle ist.

    Der Sinn erschließt sich mir noch nicht so ganz. Wenn man sich durchs Dashboard klickt, dann wird doch in 99% der Fälle sowieso eine Anfrage ans Backend geschickt um an Daten zu kommen. Wenn dann der JWT ungültig ist, dann schmeißt du den User einfach vom Backend aus raus und fertig. Den JWT einfach in die Cookies packen und dann wird der sowieso bei jeder Request mitgeschickt.

    Ah ok. Startest du die Workspaces denn selber oder übernimmt das ein Programm? Wenn du die Container alle selber startest, dann könntest du da ja den Tomcat Port mappen. Somit müsstest du die Configs nur einmal anlegen.


    Zu Openresty: Openresty ist keine direkte Erweiterung für NGINX. Eher ein Bundle. Das kannst du anstelle von NGINX installieren und bietet dir LUA Scripting support. Damit kannst du dann direkt das Verhalten des Webservers beeinflussen. Hat mir schon bei so einigen Sonderwünschen geholfen.

    Wenn du möchtest, dass externe DNS Anfragen zu dir intern umgeroutet werden, dann brauchst du dafür einen eigenen Nameserver den du dann bei deinen Domains hinterlegen musst. Das ganze aufzusetzen ist eine Sache für sich und helfen wird das soweit auch nicht, weil DNS lediglich zur Auflösung des Domainnamens in eine IP dient. Bedeutet konkret, dass du selbst dann nur auf deine externe IP umleiten kannst.


    Wenn du auf deinen Reverse-Proxy verzichten möchtest, dann kannst du eine Port Range auf deinen PC freigeben oder das Gerät komplett als Exposed Host freischalten. Jedoch sollte man hier mit äußerster Vorsicht vorgehen und wenn man nicht 100% weiß was man macht, die Finger davon lassen.


    Ohne weitere Informationen wirds wohl schwer sein, dir da großartig weiterzuhelfen. Du hast geschrieben, dass du hunderte Container starten willst. Das lässt sich also nicht so einfach mit Configs lösen. Die wohl einfachste Lösung hierfür wäre Openresty und dann mit Lua anhand der Subdomain den Port ausmachen.


    Ansonsten müsstest du halt schauen, dass du eine eigene Lösung dafür entwirfst.

    Was ich dir als erstes ans Herz legen würde ist, dass du auf jeden Fall Multithreading nutzt. Damit verteilst du den Workload auf mehrere Threads, die ihn dann gleichzeitig abarbeiten können. Ist jedoch Hardware abhängig wie viele Threads da dann sinn machen.


    Dann würde ich dir auf jeden Fall noch Nmap ans Herz legen. Das ist ein Tool, welches für genau deine Zwecke genutzt wird und in der Netzwerk-Admin Szene weit verbreitet ist (zwar nicht immer direkt erkennbar aber doch meist irgendwo im Hintergrund). Das interessante für dich könnte hier die Doku sein. Die geben gute Informationen wie sie die Anforderungen bewältigen. In deinem Fall erstmal Host Discovery (um rauszufinden, welche Geräte überhaupt online sind): https://nmap.org/man/de/man-host-discovery.html


    Dann haben sie ebenfalls eine gute Doku über ihre Port-Scanning Methoden: https://nmap.org/man/de/man-port-scanning-techniques.html


    Ein Blick auf die englischen Versionen der Dokumentationen bringt eventuell nochmal zusätzliche Informationen.

    Die Werte brauchst du nicht in die Skriptdatei eintragen kannst du auch mit Befehlszeilenargumenten machen. $1 ist der erste Parameter, $2 der Zweite usw.


    Bash
    #!/bin/bash
    Branch=$1
    GitUrl=$2
    GitName=$3


    Der Befehl wäre dann ./script.sh <branch> <gitUrl> <gitName>

    Mach noch nen Shebang am Anfang rein (#!/bin/bash). Zusätzlich kannst du die goals bei Maven kombinieren (in deinem Fall mvn clean package).


    Die Sache ist jetzt noch, dass dein Skript keine Fehlererkennung hat und so wie es aktuell aufgebaut ist, wird es bei einem Fehler einfach weiter arbeiten. Das fängt z.B. damit an, dass du klonst und direkt danach den Branch wechseln willst. Was aber nicht funktionieren wird, da du erst nach checkout und pull in das Verzeichnis der Repo wechselst. Letzteres löst sich jedoch durch den Tipp von DevTek .


    Was die Fehlererkennung betrifft. Sowas ist wichtig. Sonst könnte dein Script ungewollte Dinge auslösen. Sagen wir git clone schlägt fehl, weil keine Internetverbindung vorhanden ist. Dadurch würde Checkout, Pull und ChangeDir fehlschalgen. Kritisch ist hier das ChangeDir weil du ja weiter unten Änderungen am Dateisystem mit einem relativen Pfad vornimmst. Da das erste ChangeDir fehlgeschlagen ist, wird das "build" Verzeichnis in dem Parent-Verzeichnis von der working directory des Skripts erstellt. Beim erstellen eines Verzeichnisses ist das nicht großartig schlimm. Wenn es jedoch irgendwann mal ums Löschen geht, dann kann sowas ganz viel Ärger einbringen.


    Ein weiterer Tipp wäre, dass du bei mkdir den -p switch mit reinpackst. Das sorgt dafür, dass wenn das Verzeichnis bereits existiert, kein Fehler ausgegeben wird (https://explainshell.com/explain?cmd=mkdir+-p+tempdir).


    Nun zu der Fehlererkennung: Das exit $? am Ende deines Scripts gibt lediglich den Exit-Code von mv als exit code deines Scriptes aus.



    Das ist jetzt mal eben so hier zusammengeschrieben und nicht getestet. Was ich ebenfalls noch machen würde ist, die ganzen Exit-Code checks in eine eigene Funktion zu schieben, da es doch schon viel doppelter code ist.

    Also wenn es nur um "git clone", "git pull" und "mvn clean package" geht, dann kannst du dafür easy ein Shell Script basteln. Was die Verarbeitung der Ausgabe angeht, kommt es darauf an was du wissen willst. Wenn du nur wissen willst ob es fehlgeschlagen ist oder nicht, dann kannst du dafür den Exit Code nutzen ($?). Ist der Code != 0 gab's ein Problem.


    Edit: Den Exit code kannst du dann auch bei git nutzen um festzustellen ob irgendwas fehlgeschlagen ist.

    Kann man beim Bungeecord auch die Plugins nehmen von spigot oder eher nicht?

    Bestimmte Plugins können das. Das sind dann aber meist Plugins aus dem Utilities-Bereich (Commands, usw.). Die Plugins müssen sowas aber auf jeden Fall unterstützen. Du kannst also nicht jedes X Beliebige Plugin in dein BungeeCord laden.