About the new Content-Management-Framework "NowCMS"
Starting December 2015, I've began (after pondering my options thoroughly) to develop a new content-management system ("CMS"). Since September 2017, it is running on my website dellekom.de and since April 2019 here.
I'm completely aware that one should not "re-invent the wheel" - on the other hand I've found that all CMSes that I've encountered so far did not provide the features and capabilities that I need to run my company "Dellekom". As soon as old wheels do not run smoothly any more - and don't bring me from A to B - it does make sense to re-think the wheel - that is, if all "best practice" policies are kept in mind and security is a top priority - to make sure neither company nor customer data gets compromised or stolen.
The "return on investment" for me is already as good as accomplished as the previous version of my CMS served me very well as facturation tool to produce oder 24000 receipts between 2005 and 2019 - including mostly automated bank drafts.
What were the guidelines when developing NowCMS?
- Every company or even association has customers or members so we need a powerful member administration - providing a login function for the users.
- A navigation menu structure mirros the hierarchical structure of unlimited levels of folders and files that are used in every URL.
- On a first glance, it looks like the requirements of companies are diverse - when watching closely all need a crucial core of functions: Content protection, finely granulated access hierarchies, mailing capabilities, groups and "labels", internal communication, display and management of any kind of arbitrary tables, just to mention some.
- In addition, a CMS must remain extendable according to the demand of the customer.
- Functional enhancements and additions to the CMS should be configurable, that is: Only by "clicking around" in the CMS' administrational interface, it should be possible to add new columns for sepcific content like numbers, dates, times, text, paragrahps but also references to other tables. One shpuld avoid writing code for every single data field.
- NowCMS comes already with some basic tables and data objects: A ticket system, address- and bank account database, receipts and a widely configurable calendar. NowCMS users who don't need those functionalities can just delete tables or parts of the data fields.
- It is equally straightforward to add an additional data columns just by "clicking": less code is being needed and produced.
- Less code means a faster and cheaper audit process.
- We should avoid media gaps: Imagine a future customer contacts us via our contact form: We don't want to manually re-type her address date that got sent to us via mail to Excel and then back again in a different software that sends out email newletters. We want to have "all in one place".
- Many trivial talks like emailing a new user should be both automated and configurable.
- Automatic PDF generation for table content or single datasets shpuld be possible, no matter the complexity.
- Besides list and detail view of datasets, pagination, filtering and sorting must be supported for any table and content.
- Not everything is a static page: Versioning of articles (like in Wikipedia), blogs (succession of individually generated paragraphs) and forum threads should be possible, also keeping a copy of a "deleted" article - to provide legal proof if necessary.
- Multi language support was a must. NowCMS understands four languages (German, English, French and Italian) right from the start (however, translation can be improved by motherlanguage speakers).
- Autogeneration of tables of content or sitemaps
- Users should be able to edit their newsletter settings on their own - without logging in if possible.
- Unlimited groups: Every group may contain an unlimited number of users.
- There should not be fixed "roles" like "administrator", "editor", "author" for every company or association has their own specific needs: Resources like nodes (pages) can be assigned a group whose members are able to edit / see / perform any action on it if the current user has that group membership. Thus, very finely grained permissions are possible.
- Groups may be used just as "tags" - without any further meaning for the CMS. Thus, a new group of users can be created by adding / subtracting groups and / or single users. This si very helpful for sending newsletters.
- Content like images or files must be protected against "filename guessing".
- Deduplication: Each file is checked against other uploaded files if this is a duplicate.
- It should be possible to store several version of a file even if the filename remains the same.
- In order to be able to measure the number of downloads and / or make sure that only an autheticated and privileged users will receive a ceratin downloador resource, all files are passed through filter code.
- The public web folder or "web root" must only contain one small code file like index.php - rewrite rules make sure that easily readable paths are used - which make NowCMS search engine friendly.
- All files (except publicly accessible ones) are passed from a "backstore".
- URLs are corresponding to the hierarchical path structure of the navigation.
- Vresatile mailing / newsletter system: You may send a mailing to a group of users or a hand-selected list of users, or you create a new set of users by adding and subtracting groups or users from a current set of users. You may create a new group from your selection and / or send a mailing.
- Registered users are able to edit their own user data - eventually, a copy of overwritten datasets is maintained for eventual legal proof.
- The "backend" (admintrative surface of the CMS) must look and behave just as the publi-facing "frontend" - a user with more privileges just sees more detail,
- There are data fields that can be set only while creating a new datasset, others may be edited later but only by a specific group. Different groups of users might see only subsets of the data fields.
- A user should be able to manipulate as many as possible of his / her own data or contract ("sef service"), tickets, receipts etc..
- The CMS must be able to withstand all kinds of attacks: brute force password guessing, side channel attacks (timing when trying to log in), Denial of service and DDoS-attacks, spidering. It must be able to detect malicious users or bots before they may inflict damage. "Bad" behaviour will be addresse by keeping traces for longer while normal behaviour leeds to the logs being purged earlier.
- The CMS needs to be very fast (response time in less than 100 milliseconds) to be as resilient as possibe against DDoS attacks. Primary checking needs to be done without overloading the databse with queries.
- The CMS may offload storage away from teh databse into automatically generated PHP files, servign as data storage in memory.
-
- Alles ist eine Tabelle: Es muß einfach sein, zu bestehenden Tabellen (wie der Benutzertabelle) weitere Datenfelder hinzuzufügen.
- Es soll möglichst vermieden werden, für neue Funktionen neuen Code in Form von Erweiterungsmodulen hinzuzufügen: Ist eine Idee gut genug, wird sie vielen Nutzern interessant erscheinen, dann sollte die Funktion in den Kern von NowCMS aufgenommen werden..
- "Training on the job": Das CMS startet mit vielen vordefinierten Inhalts- und Datentypen. Der Integrator einer neuen Webseite modifiziert und löscht dann nach Belieben. Durch die Beispiele sollten kaum Blicke ins Handbuch nötig sein - überall sollte Hilfe in Form von "Tooltips" verfügbar sein.
- Komplexe Datenformate: Ein Nutzer kann mehrere Postadressen, mehre Bankverbidnungen und Kontakte haben können. Die Postadressen sollen durch Bemerkungen wie "Privat" "Geschäftlich", "Bisherige Adresse", "Rechungsadresse" voneinander unterschieden werden können, ähnlich die anderen Kontakte (Mobil, Fax, Privat Festnetz, Skype, Web, Email, WhatsApp usw..
- Neue Nutzer sollen sich selbst registrieren können - aus eine Frage im Kontaktformular kann gleich ein neuer Nutzeraccount angelegt werden.
- Nicht jede Firma ist ein "Shop", deshalb greifen viele Standard-Web-CMS nicht. Spezialisierte Dienstleistungen wie meine kleine Telefongesellschaft benötigen spezielle Softwaretools um Datenströme wie Verbindungsdaten zu verwalten. Die Fakturierung muß wiederkehrende Rechnungspositionen ebenso verwalten können wie automatisch PDFs erzeugen udn versenden.
- Zahlungsdaten (Lastschrift) können mit dem europäischen SEPA-XML-Format erzeugt und übertragen werden.
- Teile der Webseite dürfen nur für speziell Berechtigte zugänglich sein - ebenso darf geschützter Content nur nach Prüfung der Berechtigungen ausgeliefert werden und nicht durch Dateinamen raten möglich sein.
- Die Zugänglichkeit der einzelnen Seiten kann sehr genau an Gruppen gebunden sein Dies ist der wichtigste Mechanismus um Zugang und Berechtigung zu regeln.
- Das CMS implementiert eine Programmierschnittstelle (API) welche "RESTful " gestaltet ist oder sehr nahe dran. Auf diese Weise ist JSON / XML / CSV oder sogar ein OpenDocument -Export von Dateien einfach möglich.
- Das CMS muß sehr sicher sein, Hinzufügen von externen Code-Modulen sollte vermieden werden da die synchrone Weiterentwicklung durch Drittentwickler nicht sichergestellt ist.
- Funktion und Benutzerfreundlichkeit geht über Design-Flexibilität.
- Das CMS wird zusätzlich dadurch abgesichert daß Dateien in wichtigen Ordnern nicht verändert werden können - ebenso wichtige statische Konfigurationsvariablen und Texte.
- Durch das Auslagern von Texten und Konfigrationsvariablen in PHP-Dateien wird eine starke Beschleunigung erreicht.
- Das Installationsskript prüft stets das Vorliegen sämtlicher Vorbedingungen und versucht fehlende Einstellungen oder Daten zu "reparieren". Er lädt sogar aktuellen Code nach oder prüft ob Code modifiziert wurde.
- Während des Installationsprozeses wird Code über ein verschlüsseltes und abgesichertes Verfahren überprüft und ggfs. aktualisiert.
- Wir nutzen keine extern geladenen Skripte, auch werden Fonts lokal gespeichert. Dadurch kann auch mithilfe der "Security headers" ein Maximum a Sicherheit erreicht werden.
- Wir nutzen zwar eien JacaScript-Werkzeug für das Editieren von HTML, für Frontendbenutzer ist jedoch JavaScript nicht nötig. Auch im Backend kann ohne JavaScript problemlos gearbeitet werden.
- Die Suchfunktion ist stark kontextabhängig: Es werden nur Ergebnisse gezeigt die der angemeldete Besucher durch seine Berechtigungen zugängllich sind.
- Das CMS enthält von Anfang an Tabellen wie Postadressen, Bankkontakte, weitere Kontakte, Inventarliste, Kalender, ein Ticketsystem, Aufgabenliste, Kontaktformulardaten, Liste der Weiterletungen bei nicht gefundenen URLs, usw. - es ist für Integratoren einfach nicht benötigte Dinge zu löschen oder anzupassen.
- Ein globales CSS Datei wird automatisch aus allen Einzelteilen erzeugt.
Probleme die ich versuche zu vermeiden
- Ich habe mich über viele Jahre gut in die Programmiersprache PHP und Sicherheitsaspekte eingearbeitet aber keine Lust noch eine weitere Programmiersparche (JavaScript) zu lernen und zu beherrschen. Auch daher verzichte ich weitestgehend auf JavaScript und die dadurch unvermeidlichen Abhängigkeiten von der (Un-)Sicherheit anderer Projekte. Später hinzustoßende Entwickler werden mögicherweise JavaScript ergänzen, aber für sicherheitsrelevante Umgebungen muß es immer möglich sein das CMS gänzlich ohne JS zu verwenden.
- Da ich Abhängigkeiten (vor allem unnötige) für den Fluch der Softwareentwicklung halte, setze ich nur "gut abehangene" fremde Klassen ein. Im MOment sind die einzigen Abhängigkeiten: Eine Mailklasse, die PDO Datenbankabstraktion, eine PDF-Klasse, einen HTML-Editor (mit JavaScript).
- Sogar ohne "composer" und andere "moderne" Tools um Abhängigkeiten zu beherrschen ist der Installer in der Lage, den kompletten Code zu prüfen und ggfs. zu aktualsiieren.
- Ich denke es ist falsch zwischen einem "Backend" und einem "Frontend" zu unterscheiden. Man muß dann zwei Stile pflegen, hat doppelten Orientierunsgaufwand und verschiedenes Layout.
- Ich denke eine unendliche Vielfalt beim optischen Webdesign wird überbewertet. Durch NowCMS erstellte Webseiten werden immer dieselbe "langweilige" Navigation haben- später kann dort aufgesetzt werden.
Das neue CMS ist in PHP (7.x) geschrieben und nutzt Datenbanken wie MySQL und MariaDB, kann aber auch mit anderen SQL-Datenbanken betrieben werden.
NowCMS ist nicht Open Source (was die Zukuft bringt werden wir sehen), ich benutze es bereits für mehrere Kunden. Das Hauptziel von "NowCMS" ist es nicht, die bekannten anderen CMS zu ersetzen, es soll immer dann zum Einsatz kommen, wenn die bekannten CMS wegen der Komplexität der Datenflüsse oder der Vielzahl besonderer Datentabellen und Businss-Logik nicht mehr verwendet werden können.
Pate gestanden hat phpMyAdmin - eine in PHP geschriebene Software die Technikern ermöglicht, beliebige Datenbankaktionen durchzuführen. NowCMS soll wie phpMyAdmin ein "Kleid" um eine Datenbank mit beliebigen Tabellen sein, bei dem die Zugriffsrechte und Visualisierung ansprechend gestaltet ist, während beliebige Tabellen dargestellt und manipuliert werden können.
Typische Hausinstallation
LoRaWAN-Gateway in der Magdalena-Gerber-Straße
Hubschrauber landet im Stadtteil Vauban
Typische Hausinstallation, Schema