Skip to content

Restic UI - Webinterface for backup tool restic [MongoDB]

Verschoben Restic UI (MongoDB)
  • Ich hatte ja im Jahr 2024 Euch mein Tool vorgestellt.

    Re: Vorstellung Restic UI Flask

    Seitdem hat sich eine Menge getan. Die Welt bleibt ja auch nicht stehen, so muss man halt auch Entscheidungen treffen. Eine dieser Entscheidungen betraf das Backend, Redis ist raus geflogen und nun nutze ich MongoDB. Auch nicht mein absoluter Traum von Open Source, aber man kann halt nicht alles haben. Es sollte schon eine NoSQL Datenbank sein.

    Außerdem hat MongoDB ein schönes UI für den Desktop, hört auf den Namen MongoDB Compass. Sehr gut zum Programmieren geeignet, da ich ja doch ständig irgendwo was ändere 🙂

    So sieht das UI zu Weihnachten 2024 aus.

    7d384c16-8358-4348-b907-bb9278052d7d-grafik.png

    Was gibt es Neues?

    Als Erstes habe ich eine kleine Übersicht eingeführt. Diese ist jetzt um zwei Elemente erweitert.

    • S3
    • Last Update

    Und die Felder Source und Repository haben die Positionen getauscht. ( Logik, Quelle -> Ziel gefiel mir besser) Außerdem ist Repository jetzt so aufgebaut, das es auch für REST und S3 Backups den Zielpfad anzeigt.

    Und dann sind wir schon bei der wichtigsten Neuerung, den S3 Backups. Da Hetzner, das jetzt endlich für alle verfügbar gemacht hat, habe ich das natürlich direkt ausprobiert. Aber womit fülle ich das? Meine ersten Test hatte ich auf der Konsole gemacht, da fiel mir doch ein, das Restic das nativ unterstützt 🙂

    Somit musste ich das nur in mein kleines Tool einfügen. Ein paar Tage später funktionierte das dann so wie es sollte und ich konnte mein erstes Backup erfolgreich anlegen. Juhu.

    Damit hat das Tool jetzt drei Backup Möglichkeiten

    • Lokales Backup
    • REST Backup (REST Server von Restic)
    • S3

    Außerdem hatte ich , als ersten Versuch, ein Login / Logout hinzugefügt. Man muss sich also erst einloggen, bevor man auf die Daten der Backups zugreifen kann. Das funktioniert, ist aber noch nicht final. z.B. fehlt noch das erste Anlegen eines Nutzers komplett.

    Add Backup

    Viel Arbeit habe ich hier reingesteckt.

    23370c88-df37-4b5e-97ff-a836c1d92f42-grafik.png

    Man bekommt auch nur die Felder angezeigt, die zu dem entsprechenden Backup auch Sinn machen.

    Edit Backup

    Ebenso beim Editieren eines Backups.

    66071882-6713-402c-b57b-95df6f01418b-grafik.png

    Login / Logout

    79cbc903-e18a-413d-8384-23310f311651-grafik.png

    Hier kann man den User und das Passwort ändern. Das gefällt mir aber noch nicht, habe ich da eigentlich nur schnell rein gecodet zum Testen. Mal sehen, man muss ja auch 2025 noch Aufgaben haben 😉

    ca93d891-40a4-4147-aa14-4964e473d8da-grafik.png

    S3 Praktisches Beispiel

    Init

    Das angelegte S3 Test Projekt muss initialisiert werden. Im Menü kann auch nur diese Funktion ausgewählt werden. In der Übersicht kann man auch erkennen, das Init nicht gesetzt ist.

    63a89be4-127c-4e9e-9ce0-2de59e9966e8-grafik.png

    Wenn ich nun auf Init klicke, taucht nach kurzer Zeit folgendes Fenster auf. Es enthält die Original Ausgabe des Restic Tools.

    15e0e755-2ff8-4e38-8584-80365bcfd5ea-grafik.png

    Backup

    Nach dem Klick auf Backup und kurzer oder längerer Wartezeit, erscheint folgendes Fenster.

    9c06976e-4887-4a5d-b33d-d1484884fe00-grafik.png

    Alle anderen Funktionen arbeiten auf ähnliche Art und Weise. Ich will ja heir nicht langweilen.

    Zum Schluss noch, wie es auf Hetzner aussieht.

    Hetzner

    Den Inhalt des Ordners kann man sich bei Hetzner ansehen.

    6cbf7a9a-b703-4e58-b86a-802014fc8df7-grafik.png

    Und das Tolle an Restic ist, alle Daten sind AES256 verschlüsselt. Ein ordentliches Passwort vorausgesetzt, sollte verhindern, das andere Menschen die versehentlich in den Besitz der Dateien kommen irgendwas damit anfangen können 🙂

    So sieht das dann in der Praxis aus.

    2c85a3ab-6ed1-44df-97a0-3df9334a0f93-grafik.png

    Video

    Ausblick

    Aktuell ist das gitlab Repository auf Privat gestellt. Ob sich das ändert, weiß ich aktuell noch nicht. Bin immer noch an meiner Code Qualität am Arbeiten usw.

    Sollte aber jemand echtes Interesse an dem Projekt haben, werden wir dafür auch eine Lösung finden.

    Da ich das Projekt auch produktiv nutze, werde ich jetzt wohl alles auf S3 verlagern.

  • FrankMF FrankM verschob dieses Thema von Restic UI am
  • Ich habe den Sonntag mal genutzt um ein wenig was einzubauen. Einmal habe ich mit datatables.net die Tabelle etwas funktionaler gestaltet.

    00a95363-1f41-4bbf-884a-34f21aea81e4-grafik.png

    Man kann nun suchen, sortieren und wenn man mehr als 10 Datenpunkte hat, hat die Tabelle auch Pagination. Ein nettes Projekt, macht einiges einfacher 👍

    Das nächste, ich hatte es im Video ja kurz erwähnt, mir fehlte ja noch die Restore Funktion von Restic. Ok, ist jetzt auch drin.

    Da die Benutzerverwaltung mittlerweile komplett eingebaut ist, werde ich demnächst meine Test Datenbanken und alles was damit zu tuen hat, aus dem Code entfernen. Brauch ich jetzt nicht mehr. Habe jetzt zwei Benutzer, einen Produktiven und einen zum Testen.

    Langfristig steht auch noch eine zweite Sprache auf dem Zettel. Aber, dafür muss ich Lust haben, das Thema juckt nicht so richtig 😉

  • Update 1.32.1 released

    Vaultwarden
    1
    0 Stimmen
    1 Beiträge
    111 Aufrufe
    Niemand hat geantwortet
  • Manjaro Btrfs Snapshot auswählen

    Linux
    1
    2
    0 Stimmen
    1 Beiträge
    354 Aufrufe
    Niemand hat geantwortet
  • Redis - Datenbank Zugriff mit Python

    Redis
    3
    1
    0 Stimmen
    3 Beiträge
    185 Aufrufe
    FrankMF
    Ich bin mit der Lernkurve noch nicht so richtig zufrieden. Eine Frage die sich mir stellte, geht das einfacher? Der Ursprung meiner Datenbank Struktur liegt in einem anderen Projekt, wo ich versucht habe Daten permanent in einem File zu speichern. Dazu hatte ich damals JSON genommen. Deswegen auch diese Zeilen self.project = str(db_client.json().get('settings', '$..project')[0]) or self.project Gut, ich hatte dann mal ChatGPT gefragt, wie macht man das so 'normalerweise'? es kam eine Klasse heraus, die ich dann intensiv ausprobiert habe, ein wenig umgebaut usw. So lange, bis ich der Meinung war, ok ich habe es verstanden. Jetzt nutzte der Code auch mehr Redis Funktionen, wie self.client.hset('settings', name, json.dumps(data)) Es waren jetzt folgende Funktionen drin hset hexists hdel hget Dokumentation -> https://redis.io/commands/hset/ Beim Durchlesen des Codes hatte ich jetzt mehr das Gefühl, so muss das sein In RedisInsight sieht das dann jetzt so aus. [image: 1695479582374-393195f7-1017-4285-8fca-734ee6b4bff7-grafik.png] Klasse class PortfolioSettings: def __init__(self, host='172.17.0.2', port=6379, db=0): if args.test_mode == 1: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=TEST[0]) else: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=LIVE[0]) def set_settings(self, name, data): """Init settings if db don't exist""" if not self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def edit_setting(self, name, data): """Edit an entry in settings""" if self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def delete_setting(self, name): """Delete an entry in settings""" return self.client.hdel('settings', name) def get_setting(self, name): """Get an entry in settings""" setting = self.client.hget('settings', name) return json.loads(setting) if setting else None def get_all_settings(self): """Get all entries in settings""" settings = self.client.hgetall('settings') return {k.decode(): json.loads(v) for k, v in settings.items()} Und hier die Initialisierung settings_data = PortfolioSettings() ##################### # Will only be executed if DB is not available! ##################### if not settings_data.get_all_settings(): # Settings initialisieren print("INIT") settings_data.set_settings("project", "Portfolio") settings_data.set_settings("version", "0.0.3") settings_data.set_settings("theme", "dark") settings_data.set_settings("url_list", ["https://www.onvista.de/aktien/Deutsche-Telekom-Aktie-DE0005557508"]) settings_data.set_settings("exchange_list", ['DKB','Smartbroker','BUX']) Teile der Klasse sind [KI-generiert] Ich war zufrieden und habe die Klasse dann in mein Projekt übernommen und den Code überall entsprechend angepasst.
  • Semaphore - Die API

    Verschoben Ansible
    2
    0 Stimmen
    2 Beiträge
    212 Aufrufe
    FrankMF
    Ich hasse schlecht lesbaren Code, scheint man sich bei Python so anzugewöhnen. Habe da nochmal was mit der langen Zeile getestet. stages: - deploy deploy: stage: deploy script: # $SEMAPHORE_API_TOKEN is stored in gitlab Settings/ CI/CD / Variables - >- curl -v XPOST -H 'Content-Type: application/json' -H 'Accept: application/json' -H "Authorization: Bearer $SEMAPHORE_API_TOKEN " -d '{"template_id": 2}' https://<DOMAIN>/api/project/2/tasks only: - master # Specify the branch to trigger the pipeline (adjust as needed) Hier noch was Dr. ChatGPT dazu schreibt [image: 1692643209159-631de9d4-b04d-4043-bfff-c5f2d1b6eea7-grafik.png] Erledigt - läuft Und verstanden habe ich es auch.
  • ROCKPro64 - Kamils neuer 0.10.x Release

    ROCKPro64
    1
    1
    0 Stimmen
    1 Beiträge
    240 Aufrufe
    Niemand hat geantwortet
  • Redis oder MongoDB?

    Verschoben Redis
    1
    0 Stimmen
    1 Beiträge
    495 Aufrufe
    Niemand hat geantwortet
  • NVMe Firmware - Daten werden benötigt

    Linux
    1
    0 Stimmen
    1 Beiträge
    717 Aufrufe
    Niemand hat geantwortet
  • NodeBB auf dem Raspberry3 B+ installieren

    RaspberryPi
    1
    0 Stimmen
    1 Beiträge
    856 Aufrufe
    Niemand hat geantwortet