{"id":44483,"date":"2026-08-26T20:00:00","date_gmt":"2026-08-26T18:00:00","guid":{"rendered":"https:\/\/www.jungsi.de\/?p=44483"},"modified":"2026-08-28T15:10:24","modified_gmt":"2026-08-28T13:10:24","slug":"sammlungsdatenbank-open-source","status":"publish","type":"post","link":"https:\/\/www.jungsi.de\/en\/sammlungsdatenbank-open-source\/","title":{"rendered":"Vom Zettelkasten-Code zum Open-Source-Projekt: Wie die Sammlungsdatenbank auf GitHub gelandet ist"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Die Sammlungsdatenbank hat in den letzten Wochen einiges an neuen Feldern und einem Karten-Layout bekommen \u2013 das stand ja schon im <a href=\"\/en\/datenbank-changelog\/\">Changelog<\/a>. Was dort nicht draufsteht: Direkt danach habe ich mich an etwas v\u00f6llig anderes gewagt, das mich fast mehr Nerven gekostet hat als jedes einzelne Feature \u2013 ich habe den Code aufger\u00e4umt und auf GitHub ver\u00f6ffentlicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weil dabei ein paar Dinge passiert sind, die vermutlich nicht nur mir passieren k\u00f6nnen, dokumentiere ich den Weg dahin mal etwas ausf\u00fchrlicher.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Der Ausl\u00f6ser<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Die Idee kam eigentlich beil\u00e4ufig: Ich wollte im Blog-Changelog auf den tats\u00e4chlichen Code verweisen k\u00f6nnen, statt nur in Prosa zu beschreiben, was sich ge\u00e4ndert hat. Also: Repository anlegen, Code hochladen, fertig \u2013 dachte ich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was ich nicht bedacht hatte: Ein Projekt, das \u00fcber Jahre gewachsen ist und nie f\u00fcr fremde Augen gedacht war, hat so seine Leichen im Keller.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h5 class=\"wp-block-heading\">Was beim Aufr\u00e4umen alles zutage kam<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Bevor \u00fcberhaupt eine Zeile Code irgendwo hochgeladen wurde, ging es erstmal ans Durchforsten des Projektordners \u2013 Datei f\u00fcr Datei, mit der Frage: <em>Wof\u00fcr ist das eigentlich noch da?<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein paar Fundst\u00fccke:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ein Admin-Passwort, das schlicht \u201eadmin&#8220; lautete.<\/strong> Aus einer fr\u00fchen Entwicklungsphase \u00fcbrig geblieben, nie ge\u00e4ndert, weil es ja \u201enur f\u00fcr mich&#8220; war. Ist jetzt durch ein zuf\u00e4llig generiertes, gehashtes Passwort ersetzt.<\/li>\n\n\n\n<li><strong>Zwei alte Testskripte mit fest eincodierten API-Keys<\/strong> (u. a. f\u00fcr einen fr\u00fcheren WhatsApp-Versuch und einen Debug-Helfer). Beide Skripte nutze ich l\u00e4ngst nicht mehr \u2013 die betroffenen Zug\u00e4nge sind widerrufen bzw. waren ohnehin schon abgelaufen.<\/li>\n\n\n\n<li><strong>Diverse \u201enur kurz zum Testen&#8220;-Dateien<\/strong>, die Serverinterna offenlegten (Verzeichnisstruktur, PHP-Konfiguration) und dabei komplett ungesch\u00fctzt im Netz standen \u2013 teilweise seit Monaten.<\/li>\n\n\n\n<li><strong>Tote Datenbankspalten und Code-Pfade<\/strong>, die nichts mehr taten, au\u00dfer Verwirrung zu stiften.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nichts davon war akut gef\u00e4hrlich, solange niemand gezielt danach gesucht hat. Aber genau das ist ja der Punkt: Man wei\u00df es erst, wenn man wirklich jede Datei einzeln durchgeht und sich fragt, ob sie wirklich noch gebraucht wird. Diese Bestandsaufnahme hat am Ende deutlich l\u00e4nger gedauert als das eigentliche \u201eCode hochladen&#8220;.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"753\" src=\"https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/DB-mit-Kacheln-1024x753.webp\" alt=\"\" class=\"wp-image-44486\" srcset=\"https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/DB-mit-Kacheln-1024x753.webp 1024w, https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/DB-mit-Kacheln-300x221.webp 300w, https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/DB-mit-Kacheln-16x12.webp 16w, https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/DB-mit-Kacheln.webp 1121w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Datenbank-Editor  mit dem neuen Kacheldesign<\/figcaption><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Git f\u00fcr Einsteiger<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Ich hatte vorher nie mit Git gearbeitet \u2013 Versionskontrolle war f\u00fcr mich bisher: Datei umbenennen, \u201e_alt&#8220; dranh\u00e4ngen, weitermachen. (Ja, genau die Sorte Dateien, die ich oben gerade aufger\u00e4umt habe.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Umstieg auf echtes Git war holpriger, als ich gedacht h\u00e4tte \u2013 nicht wegen der Konzepte, sondern wegen der vielen kleinen Stolpersteine: zwei Befehle aus Versehen in eine Terminalzeile kopiert, ein Commit, der nie stattgefunden hat, weil Git meinen Namen nicht kannte, eine Repo-URL mit einem Bindestrich zu viel. Alles f\u00fcr sich genommen banal, aber in Summe ziemlich viel Trial-and-Error f\u00fcr jemanden, der zum ersten Mal <code>git push<\/code> tippt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was mir dabei geholfen hat: Claude Desktop bekam \u00fcber eine lokale Erweiterung direkten Lese-\/Schreibzugriff auf meinen Projektordner. Dadurch konnte ich \u00c4nderungen direkt am echten Code durchf\u00fchren lassen, statt Dateien st\u00e4ndig hoch- und runterzuladen \u2013 inklusive dem kompletten Sicherheits-Check aller Dateien, bei dem die oben genannten Fundst\u00fccke ans Licht kamen.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Vom privaten zum \u00f6ffentlichen Repository<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald ein <code>.gitignore<\/code> stand (Zugangsdaten, Logs, alte Testdateien \u2013 alles au\u00dfen vor), ging\u2019s an den eigentlichen Aufbau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ein <code>schema.sql<\/code> mit der reinen Datenbankstruktur, ohne echte Daten \u2013 f\u00fcr alle, die das Projekt f\u00fcr sich selbst aufsetzen wollen.<\/li>\n\n\n\n<li>Eine <code>config.example.php<\/code> als Vorlage, aus der man seine eigene Konfiguration ableiten kann.<\/li>\n\n\n\n<li>Eine README mit Setup-Anleitung, Feature-\u00dcbersicht und einem eigenen Abschnitt zu Sicherheitshinweisen \u2013 quasi die Essenz aus dem, was ich beim Aufr\u00e4umen gelernt habe.<\/li>\n\n\n\n<li>MIT-Lizenz, damit klar ist: Forken, Anpassen, Weiterverwenden ist ausdr\u00fccklich erw\u00fcnscht.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ganze lief zun\u00e4chst als <strong>privates<\/strong> Repository, damit ich in Ruhe alles nochmal durchsehen konnte, bevor es f\u00fcr jeden einsehbar wird. Erst nach einer letzten kompletten Kontrolle (Dateiliste einmal komplett durchgegangen, nochmal explizit nach Zugangsdaten gesucht) habe ich auf \u201ePublic&#8220; umgestellt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"621\" height=\"184\" src=\"https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/Git.webp\" alt=\"Git\" class=\"wp-image-44485\" srcset=\"https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/Git.webp 621w, https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/Git-300x89.webp 300w, https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/Git-18x5.webp 18w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/><figcaption class=\"wp-element-caption\">Git<\/figcaption><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Das Ergebnis<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Die Sammlungsdatenbank ist jetzt \u00f6ffentlich einsehbar:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udc49 <a href=\"https:\/\/github.com\/Jungsis-Corner\/sammlungsdatenbank\">github.com\/Jungsis-Corner\/sammlungsdatenbank<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Falls jemand von euch selbst mit einer Sammlung jongliert und Lust hat, sich den Code anzuschauen, zu forken oder eigene Anpassungen vorzunehmen: Nur zu. Ist klar auf meinen eigenen Anwendungsfall zugeschnitten (deutsche Oberfl\u00e4che, Retro-Computing-Felder), aber als Vorlage zum Anpassen sollte es taugen.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">My conclusion<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Der eigentliche Code-Umbau der letzten Wochen (Karten-Layout, neue Felder, Barcode-Scan etc.) war am Ende der einfachere Teil. Die Aufr\u00e4umarbeiten davor \u2013 jede Datei einzeln hinterfragen, alte Zug\u00e4nge widerrufen, verstehen, was ein Skript eigentlich tut, das man vor Jahren mal \u201enur kurz zum Testen&#8220; angelegt hat \u2013 haben mich mehr Zeit gekostet als gedacht. Aber genau das w\u00fcrde ich auch jedem empfehlen, der ein gewachsenes Projekt jemals ver\u00f6ffentlichen will: Lieber einmal zu gr\u00fcndlich durch jede Datei, als hinterher zu merken, dass irgendwo ein Zugangsdaten-Klartext oder ein \u201eadmin\/admin&#8220;-Passwort mit online gegangen ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>Die Sammlungsdatenbank hat in den letzten Wochen einiges an neuen Feldern und einem Karten-Layout bekommen \u2013 das stand ja schon im Changelog. Was dort nicht \u2026<\/p>","protected":false},"author":2,"featured_media":44484,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false,"_links_to":"","_links_to_target":""},"categories":[7],"tags":[2335,4832,4833],"class_list":["post-44483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technik","tag-datenbank","tag-github","tag-open-source"],"modified_by":"Jungsi","wp-worthy-pixel":{"ignored":false,"public":"03e8e72f14e6408bbf61e4a74625d691","server":"","url":"https:\/\/vg02.met.vgwort.de\/na\/03e8e72f14e6408bbf61e4a74625d691"},"wp-worthy-type":"normal","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.jungsi.de\/blog\/wp-content\/uploads\/BTB-Datanbank_GIT.jpg","_links":{"self":[{"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/posts\/44483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/comments?post=44483"}],"version-history":[{"count":1,"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/posts\/44483\/revisions"}],"predecessor-version":[{"id":44487,"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/posts\/44483\/revisions\/44487"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/media\/44484"}],"wp:attachment":[{"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/media?parent=44483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/categories?post=44483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jungsi.de\/en\/wp-json\/wp\/v2\/tags?post=44483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}