PHP 7.4 wordt uitgefaseerd. Tijd om over te gaan naar PHP 8.

Ingediend door Dirk Hornstra op 19-jan-2023 21:42

Ik heb een tijd geleden gedeeld dat ik bij de machtigste beroepsgroep ter wereld hoor: developers!

Dat klinkt cool, je komt een probleem tegen en met code kun je een applicatie of website maken waarmee je dat oplost.
Maar daarnaast geldt ook:



ik hoor ook bij de beroepsgroep die nooit klaar is
 

Want soms gebruik je externe diensten, API's, van anderen. En die voegen nieuwe dingen toe (top!) of passen zaken aan waardoor jouw code ineens niet meer werkt (niet zo top!). En in dit geval draait het om PHP, als je zelf wel eens een Wordpress-website of andere website/blog online hebt gezet zal dat waarschijnlijk op basis van PHP zijn.

En in deze versie zitten nogal wat wijzigingen waardoor jouw code op meerdere plekken kapot gaat. Resultaat? Jouw website toont of foutmeldingen of alleen nog maar een witte pagina. En dat had ik kunnen weten, want op 4 november 2021 heb ik een online Meet-up van GroningenPHP gevolgd waarin al over versie 8.1 gesproken werd: link.

Nu ontving ik een e-mail van Strato dat ze binnenkort alleen nog betaalde ondersteuning bieden als je jouw site op versie 7.4 laat draaien. Dus ik had al even snel de versie op 8 gezet en 2 sites gecheckt: geen beeld meer. Dus gauw terug gezet naar versie 7.4. Tijdens die Meet-up sprak Ayesh al over het gebruik van Docker, phpdaily/php:8.1-dev

Eind december 2022/begin januari 2023 ben ik voor een project met het Bolt CMS in Docker gedoken en snap ik nu hoe ik het redelijk snel werkend kan krijgen: link.

Dus ook voor mijn projecten ga ik nu een MariaDB docker maken om mijn databases te restoren (10 stuks), haal ik al mijn bestanden via FTP binnen en ga ik de 10 "eigen sites" in een Docker container laten draaien. Strato adviseert versie 8.0 en die volg ik ook, want stiekem had ik al even versie 8.2 getest, maar dan krijg je al foutmeldingen vanuit je CMS zelf.

Wat zijn "de quick-tips" / de korte uitleg, zodat je niet het hele onderstaande verhaal hoeft te lezen?



Op PHP 7, update je CMS naar de meest recente versie. De meeste CMS-en zijn inmiddels wel PHP 8 "ready", dus dan komen daar geen foutmeldingen meer uit!

Hetzelfde geldt voor de plug-ins die je gebruikt. Werk die ook bij. En als die al expliciet aangeven PHP 8 niet te ondersteunen: schakel ze uit of verwijder ze.

Zelf heb ik een aantal Wordpress-sites: allemaal bijgewerkt: alleen een paar zaken in mijn eigen sjablonen die ik aan moest passen.

Drupal: 1 site, ik liep sowieso al achter, dus bijgewerkt naar de meest recente versie. Een "realname-plugin" wordt niet meer ondersteund, zelf gefixt in mijn eigen sjabloon.

OwnCloud: als ik iemand op Facebook feliciteer, dan doe ik daar vaak een plaatje bij. Staat in mijn ownCloud. Maar dat product ondersteunt (nog) geen PHP 8. Ik ga dus over naar het alternatief: nextCloud.

Cockpit: een headless CMS. Dus je eigen PHP code om zaken te tonen, het back-end deel werkt prima in PHP 8.

Soms krijg je vage foutmeldingen. Om te voorkomen dat je ergens geen schrijfrechten hebt o.i.d. geef "gewoon" alle rechten, de boel draait toch alleen in jouw container:
chmod 777 -R /var/www/html/jouw-map
DISCLAIMER: DON'T TRY THIS AT HOME / AT YOUR ONLINE OMGEVING

Mijn oud-collega Martijn de Boer kreeg spontaan uitslag toen hij het bovenstaande las. Het werkt misschien wel, maar je zet wel heel veel rechten open op deze manier. Dus als je een image binnen haalt die niet "helemaal fris is" en die geef je zo even wat extra rechten op je eigen disk, dat wil je niet. Check dus even het chmod commando, wat de minimale rechten zijn en pas die toe alleen op de mappen/bestanden die dit nodig hebben.

En nog een aanvulling, in het verhaal hieronder beschrijf ik hoe ik het uitgevoerd heb. Bestanden binnengehaald en dan naar de PHP 7 container. Daar updaten, dan terug kopiëren naar het host-systeem. En dat dan weer kopiëren naar de PHP8 container. Als daar nog foutjes waren, updaten en dat weer terug kopiëren naar het host-systeem. Dat is redelijk omslachtig. En het kan ook een stuk makkelijker! Mijn collega Robin hoorde mijn verhaal aan en zei: "maar kun je niet een map op het host-systeem delen", dan kun je vanuit de containers daarbij en hoef je niets te kopiëren. Even zoeken en inderdaad, bij de installatie van de containers kun je met de parameter -v opgeven dat een map op jouw computer (bijvoorbeeld c:\phppatches in de container beschikbaar moet zijn via /opt/windowssystem). De aangepaste strings hier even als voorbeeld zodat jij het wel meteen goed kunt doen ;)

docker run --detach --name 'project_php7' --network=JOUWNETWERKNAAM -p 80:80 -v c:/phppatches:/opt/windowssystem mattrayner/lamp:latest-1804-php7

docker run --detach --name 'project_php8' --network=JOUWNETWERKNAAM -p 80:80 -v c:/phppatches:/opt/windowssystem mattrayner/lamp:latest-1804-php8

Ik maak een container aan voor mySQL/mariaDB, een container voor PHP 7 om daar mijn CMS, plugins en templates in bij te werken en een container voor PHP 8 om daar nog eventuele fouten te fixen.

Stap 1: Maak een netwerk aan

Om de container van MariaDB en LAMPP te laten communiceren moet je een netwerk aanmaken wat gedeeld wordt.



docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 JOUWNETWERKNAAM
 

Stap 2: Maak een MariaDB container aan



docker run --detach -dp 3306:3306 --name JOUWCONTAINERNAAMVOORMARIADB --env MARIADB_USER=MARIAUSERNAME --env MARIADB_PASSWORD=MARIAPASSWORD --env MARIADB_ROOT_PASSWORD=MARIAROOTPASSWORD --network=JOUWNETWERKNAAM mariadb:latest
 

Stap 3: Maak twee LAMPP container aan (1 met PHP 7 en 1 met PHP 8)



docker run --detach --name 'project_php7' --network=JOUWNETWERKNAAM -p 80:80 mattrayner/lamp:latest-1804-php7

docker run --detach --name 'project_php8' --network=JOUWNETWERKNAAM -p 80:80 mattrayner/lamp:latest-1804-php8
 

 

Stap 4: Start je containers!

 

Eerst de MariaDB container starten. Daarna de lamp-php container (project_php7). Je zou de PHP-8 omgeving mogelijk "buiten" op poort 90 beschikbaar kunnen maken, maar omdat mogelijk linkjes dit niet vasthouden of je "interne" CMS boel gaat ompatchen en je normale site gewoon op poort 80 draait heb ik ervoor gekozen om óf de container met PHP 7 te laten draaien, óf de container met PHP 8.

Wil je even snel checken welke versie er nu draait, dat kun je door onderstaand statement in de terminal uit te voeren:



php -v
 


Stap 5: Phpmyadmin

Vraag het IP op van de container waarin je database draait:



docker inspect JOUWCONTAINERNAAMVOORMARIADB
 

Je ziet daar een ip-adres, in mijn geval 172.40.240.1

In de terminal van de PHP container zit je in de map /app/html/phpmyadmin/.
Pas hier config.inc.php aan:



$cfg['Servers'][$i]['host'] = 'localhost';

moet worden:
$cfg['Servers'][$i]['host'] = '172.40.240.1'; // jouw ip-adres dus invullen
 

Ik had eerder met een andere container gewerkt. Daarin stond de maximum grootte van de importbestanden op 2.048 kB (kleine 2 MB), maar één van mijn database-backups is veel groter.
Mocht jij ook tegen dat probleem aanlopen, dat kun je hier fixen:

/etc/php/[versie]/apache2/php.ini

Die ga je bewerken.
Als je een heel eind naar beneden scrollt kom je bij ;  File Uploads ;



upload_max_filesize = 2M
aangepast naar:
upload_max_filesize = 50M

en toegevoegd:
post_max_size = 50M
 

Bovenstaande opslaan en daarna een service apache2 restart om de nieuwe instellingen te laden.

Ik kan nu mijn databases, database-users aanmaken, de dumps importeren en heb ik het database-gedeelte klaar!

Stap 6: Apache configureren


Eerst naar de map /var/www/html
Hier maak ik submappen aan voor mijn sites.

Ik neem even mijn dirkhornstra.nl als voorbeeld.
Deze kopieer ik naar /var/www/html/www/httpdocs

Ik ga eerst in Windows in de command prompt naar de map waar mijn bestanden staan.
Dan een: docker ps
Hier zie je wat het ID van je container is.



docker cp * IDCONTAINER:/var/www/html/httpdocs
 

Hierna ga je naar /etc/apache2/ en bewerk je apache2.conf
De verwijzing naar /var/www bevat een AllowOverride None die pas je aan naar AllowOverride All (nodig om te zorgen dat je .htacces bestanden gaan werken).

Hierna ga je naar /etc/apache2/sites-available en bewerk je het bestand 000-default.conf



<VirtualHost *:80>
ServerName dirkhornstra.local
DocumentRoot "/var/www/html/httpdocs"
</VirtualHost>
 

En ja, je moet hierna je container weer herstarten: service apache2 restart

Met het bovenstaande zet je de configuratie goed in de container. Maar op je eigen pc (in mijn geval Windows), moet je zorgen dat de PC snapt dat dirkhornstra.local verwijst naar "localhost" of 127.0.0.1

Pas hiervoor c:\windows\system32\drivers\etc\hosts aan:



127.0.0.1    dirkhornstra.local
 

Zelf heb ik een batchbestand gemaakt. Deze staat in de hoofdmap op mijn pc, mijn eigen site staat in de submap "httpdocs". Voer dit uit: docker ps
Je ziet daar het container ID.
In mijn httpdocs.bat heb ik het volgende geplaatst:



cd httpdocs
docker cp . 87a80fa240cc:/var/www/html/httpdocs
cd ..
 

Zo krijg ik mijn bestanden binnen docker en kan ik op mijn Windows PC de wijzigingen doorvoeren. Volgens mijn  collega Robin kan ik ook een locatie op mijn harde schijf "delen" binnen de container. Hiermee kun je het heen en weer kopiëren van je pc naar de PHP 7 container, vanuit de PHP 7 container naar jouw pc en dan weer kopiëren naar de PHP 8 container omzeilen. Dat scheelt wel flink wat handelingen. Maar omdat ik met de updates al even wat tijd kwijt ben geraakt doe ik het "eerst maar zo".

Stap 7: Hier volgen de verschillende CMS-en waar ik mee werk:

DRUPAL: link

Deze site, mijn eigen Techblog. De belangrijkste dus. En zoals je kunt zien, inmiddels over naar versie 9+ en draaiend op PHP 8. It works!

Toen deze in mijn container stond eerst zoeken "waar de credentials voor de database ook alweer staan": /sites/default/settings.php

Gezocht op de huidige actuele versie 9.x.x (bij de x-en de juiste versie invullen):



composer require drupal/core-recommended:9.x.x drupal/core-composer-scaffold:9.x.x drupal/core-project-message:9.5.1 --update-with-all-dependencies
 

Hierna open je in je browser deze url: http://techblog.local/update.php

Hier krijg ik foutmeldingen. Waaronder dat je minimaal PHP 8 moet hebben. Aha! Niet cool, want in mijn PHP 8 container krijg ik allemaal fouten omdat die 8.9.11 zaken doet "die niet mogen".

$settings['config_sync_directory'] = '/var/www/html/techblog/sync';
In settings.php toegevoegd (1e foutmelding wegwerken).

http://techblog.local/admin/modules/uninstall
Modules deinstalleren.

Mijn thema is not correct.
/themes/mijnthema/dotk.info.yml

Mijn theme heet dotk, dus er moet een dotk.info.yml bestand komen.
Daar staat onderaan:



version: '8.4.2'
core: '8.x'
 

Version en core in commentaar gezet (# ervoor) en regel core_version_requirement: ^8.8 || ^9 toegevoegd.

Dan komt de melding/advies dat PHP "te oud" is. Advies is om PHP te updaten naar 8.1.6 of hoger.
Hier staan de benodigdheden: link.

Dus ik moet eerst over naar versie 9.0. Dan kunnen we die proberen te upgraden!
Dus in de PHP 7 container eerst mijn modules verwijderen die niet meer werken en dan updaten:
- module "token" uitschakelen
- module "realname" uitschakelen



composer require drupal/core-recommended:9.0 drupal/core-composer-scaffold:9.0 drupal/core-project-message:9.0 --update-with-all-dependencies
 

Bijgewerkt, dat werkt nog. Dit overgezet naar mijn PHP 8 container, maar daar sterft de boel weer af.
PHP Fatal error:  Declaration of Drupal\\Core\\Database\\Statement::fetchAll($mode = null, $column_index = null, $constructor_arguments = null) must be compatible with PDOStatement::fetchAll(int $mode = PDO::FETCH_DEFAULT, mixed ...$args) in /app/techblog/core/lib/Drupal/Core/Database/Statement.php on line 169

Eens kijken of ik via composer de boel te laten bijwerken naar de huidige actuele versie: 9.x.x of het dan wel weer werkt.



composer require drupal/core-recommended:9.5.1 drupal/core-composer-scaffold:9.x.x drupal/core-project-message:9.x.x --update-with-all-dependencies
 

In mijn browser openen http://techblog.local/update.php
Ik kan nu wel door, er zijn nog 26 updates: installeren.

Vervolgens in de admin naar dez eURL: http://techblog.local/admin/config/development/performance
Hier de cache legen. En dan heb ik een werkende site! Pfew!

 

WORDPRESS: link

Site 1:

Ik heb nog een oudere versie van NextGen Gallery. Misschien als ik die geupdate had, dat het al opgelost was. Maar goed, nu eerst de boel maar weer werkend zien te krijgen.

In dit geval gaat het om classes die een basis-class hebben. En die basis-class heeft een functie define met een aantal parameters:
function define($id='pope-module', $name='Pope Module', $description='', $version='', $uri='', $author='', $author_uri='', $context=FALSE)

In de afgeleide classes worden echter maar 1 of geen enkele van deze parameters gebruikt. En dan zegt PHP 8 nu: dat mag niet.
En terecht. Zo ook bij een function install die zonder parameters wordt aangeroepen, maar in de basis gedefinieerd is als function install($reset=false)

Na zaken te patchen kom ik niet echt verder.
Stap 1 is dus dat je de boel eerst in een PHP 7 container zet, daar alle updates doorvoert en die omgeving naar PHP 8 doorzet.

Aandachtspunten:



- heb je een .htaccess-bestand en dwing je daarin een HSTS af (dus HTTPS)? zet je uit, want dit lokale testen doe je op HTTP niveau.
- pas in je database in tabel *_options de waardes van siteurl en home aan, die verwijzen naar de live-site maar zullen (zoals in mijn voorbeeld) http://dirkhornstra.local worden.

Je past in de wp-config.php de DB_HOST, DB_USER en DB_PASSWORD aan om met je mySQL/mariaDB container te connecten.
Voor het gemak gebruik ik de root-user van MariaDB (boel draait toch alleen lokaal).
En zet dan ook meteen je debug aan, staat ook in dit bestand, dan zie je ook de waarschuwingen:
define('WP_DEBUG', true);
 


Go!

In mijn geval heb ik NextGEN Gallery by Photocrati voor afbeeldingen. Ik heb versie 2.1.0, meest actuele is 3.32. Deze eerst geupdate. Wordpress zelf checken, 6.1.1, volgens Wordpress zelf de "meest up-to-date" versie.

Nu moet ik die bestanden weer naar mijn Windows PC halen zodat ik dit weer naar de PHP 8 container kan sturen, op mijn windows pc maak ik een kopie van de map httpdocs en noem deze httpdocs-php8
httpdocsfromdocker.bat bevat de volgende inhoud:



cd httpdocs-php8
docker cp 87a80fa240cc:/var/www/html/httpdocs ./
cd ..
 

En dan nog een httpdocs_php8.bat om de bestanden van deze map naar de container met php 8 te kopiëren:



cd httpdocs-php8
docker cp . 83f686b6717d:/var/www/html/httpdocs
cd ..
 


Vervolgens opstarten en openen. Daar crasht hij.

Too few arguments to function WP_Widget::__construct(), 0 passed in /app/httpdocs/wp-includes/class-wp-widget-factory.php on line 62 and at least 2 expected

Even dit toevoegen voor de $this->widgets[ $widget ] = new $widget();



var_dump($widget);
echo strval($widget);
var_dump($this->widgets);
 

Dan pas zie ik dat het om onderstaande widget gaat:

rst_about_widget

Zonder die laatste var_dump leek het een andere widget te zijn. Dat is vet verwarrend! Maar goed... dat het iets in Wordpress zelf zou zijn leek me al onwaarschijnlijk.

Het zit dus in het thema wat ik gebruik! Dus update je plugins, maar check ook je templates.

In mijn templates gezocht op alle extends WP_Widget
En daar deze in toegevoegd:

function __construct()
{
// ... hier de code die binnen de "oude" construct staat
}

Dat lost het voor mij op.
Onderaan in de pagina staat nog een "The control/function named "metabox" is not found in rs".

Ik kan niet exact zien waar die metaboxen aangemaakt worden, maar ik zet dat stuk tekst in commentaar. Hierdoor geen meldingen meer op de site of in het admin-deel.

Site 2:

De volgende site is mijn online CV.

Een aantal fouten in mijn template. Ik heb "oude syntax" gebruikt zoals:



<?php if (false) : ?>
.. uitgeschakelde HTML
<?php endif; ?>
 

Omgezet naar <?php if (false) { ?> ...<?php } ?>
Later blijkt er ook nog ergens een <? te staan en geen <?php waardoor mogelijk de fout ontstaan is.

Al ik in mijn wp-config.php de instelling define('WP_DEBUG', true); instel, dan zie ik meldingen over functies die "deprecated" zijn (dus binnenkort vervallen).
Lijkt erop dat mijn versie van Wordpress redelijk verouderd is: Wordpress dus updaten, dit was nog versie 5.0.18 -> huidige is 6.1.1

Die meldingen zijn na de update weg, ik krijg nog 2 zaken die in het template zitten:
- een "undefined offset" in een array;
Dit was een eigen fout (niet PHP gerelateerd). Een lijst loopt van 0 tot aantal elementen-1. Niet tot aantal elementen ;)
- de each() functie is deprecated
In mijn code stond een while (list($k,$v) = each($blogPosts)) omgebouwd naar een foreach($blogPosts as $v)
- vroeger kon je een tijd-object aanmaken met mktime(). Nu moet je verplicht 1 parameter mee geven (mktime(0)). Maar als je dat niet doet: code sterft af.

Site 3:

Voor een  buurtgenoot een tijd geleden zijn site bijgewerkt. Op mijn eigen server toen een opzetje gemaakt.
En daarna niets meer mee gedaan (want de boel draait). Daar staat dus nog wordpress 4.7.3 op: eerst bijwerken.
Bij deze krijg ik een melding dat het uitpakken mislukt.
Dan maar even binnen mijn container alle rechten geven op deze map:
chmod 777 -R /var/www/html/map
Daarna lukt het wel -> dit is dus niet de aangeraden methode om dit te doen, check de bovenstaande samenvatting!

Volgende foutmeldingen komen weer uit het thema, each en problemen met elseif/endif.
Die laatste fix ik door de syntax van if .. : ... endif; te vervangen met {.. en ..}. Door de haakjes-controle in Visual Studio Code kun je valideren of je niets vergeten bent.
Maar ook hier blijkt weer ergens een <? in de code geslopen te zijn, in plaats van de <?php

Site 4:

De vierde site is weer een eigen site, hier houd ik een deel van mijn boekhouding in bij. De bonnetjes die ik bij het tanken krijg.
Ook hier weer, versie 4.9.22 dus wordpress updaten.
Hier krijg ik nog zo'n melding dat ik via FTP de huidige versie moet downloaden en installeren, maar dat hoeft niet.
In de wp-config.php moet je even deze regel toevoegen en de update kan "live" doorgevoerd worden:



/* no FTP download, direct update/upgrade */
define('FS_METHOD', 'direct');
 

En ook hier weer even in de terminal de chmod 777 -R mapnaam uitvoeren.
Update succesvol, volgende fouten komen door mijn template, dus nu ook snel gefixt. -> dit is dus niet de aangeraden methode om dit te doen, check de bovenstaande samenvatting!

Site 5:

In 2014 een projectje voor een collega. Zo te zien nooit bijgewerkt, dus daar ga ik niets meer aan doen.
Want die Wordpress-versie is zo oud, dat deze al op eigen includes kapot gaat, zal nog gebaseerd zijn op een oudere PHP versie.

Site 6:

Nog een projectje voor een collega. Het scrapen van prijzen van tennisrackets op verschillende sites. Ik weet niet of die module van mij nog gebruikt wordt, maar zijn site staat nog steeds online en ook de Facebookpagina is actief. Dus mocht je een tennisser zijn en geïnteresseerd in rackets: https://www.prostocktennis.com/

Oké, ook hier ga ik niets aan doen, want ik krijg hier zelfs een "Het lijkt erop dat je PHP-installatie geen MySQL-extensie heeft en die is noodzakelijk om WordPress te kunnen gebruiken."
Deze versie van wordpress is dus ook heel oud. Tijd om de plugins eruit te halen en ergens anders te gaan testen e.d., maar dat zien we dan wel weer!

 

OWNCLOUD: link
 

Owncloud is een handige web-applicatie om wat spullen in te uploaden. Foto's, documenten, zodat je dat later makkelijk even online kunt raadplegen. Maar... PHP 8 wordt niet ondersteund en dan krijg je dus dit:

Bij opstarten een wit scherm met de melding:

This version of ownCloud is not compatible with PHP 8.0
Maar eens even gaan zoeken of dat wel in de planning zit: link.

Resumé: nu wordt versie 8 nog niet ondersteund. Als ik de knop omzet kan ik er dus niet meer mee werken.
Op die pagina zegt iemand dat hij/zij nu gaat overstappen naar nextCloud omdat die wel php 8 ondersteunt.
Link daarvoor is https://nextcloud.com/install/
Onderstaande in mijn Docker Container gezet en gedraaid: https://download.nextcloud.com/server/installer/setup-nextcloud.php

Je moet wel een lege database gebruiken, want nextCloud gebruikt ook het oc_ voorvoegsel. En met een bestaande ownCloud installatie krijg je een fout over dat een veld te klein is. Hierna de mappen/bestanden uit data kopiëren naar data/mijnnaam/files
Je ziet het dan nog niet in ownCloud terug, maar als je daar een nieuwe map aan maakt met dezelfde naam, dan krijg je de melding dat ie al bestaat, maar wordt het wel zichtbaar en heb je het gefixt.

 

COPPERMINE GALLERY: link

Deze web-applicatie heeft een wat verouderde interface, maar is handig om online je albums met foto's te beheren en te delen.
Ik heb hier zelf sjablonen voor gemaakt zodat het "aan de voorkant" er in ieder geval wat meer bij de tijd uit ziet.

Kort samengevat, download versie 1.6, installeer deze en zet je data vervolgens over. Je kunt niet in-place een update doen.
In mijn eigen template die ik gemaakt heb voerde ik deze actie uit, dat liet het in mijn php 8 container afsterven.
Na het in commentaar zetten werkte alles weer:
mysql_free_result($result);

 

MEDIAWIKI: link

Site 1:

Bezig met een soort online butler en kijken of ik data/kennis in een soort wiki kan opslaan. Dit is nog iets waar ik later wat mee ga doen. De site toont in ieder geval geen foutmeldingen.

 

COCKPIT: link

Site 1:

Support, overzicht van alle dingen die ik nog moet en wil doen en daar een tijdlijn/deadline aan koppelen. Werkt nog prima.

Site 2:

Todo, overzicht van mijn komende uitstapjes (concerten, theater) en een wekelijkse actielijst. Werkt ook nog prima.

 

BOLT: link

Site 1:

Ik stuurde mijn mailtjes van LinkedIn door naar een mailbox. Daar werden de vacatures eruit gefilterd. Dit was voor mij bedoeld om inzichtelijk te krijgen welke vaardigheden/technieken/tools relevant zijn, zodat ik mij daarin kan verdiepen. Maar zo te zien is dat eind 2021 gestopt. Ik krijg een foutmelding, maar goed, eerst mijn albums en "nextCloud-omgevingen" weer aan de praat krijgen.

 

CODIAD: link
 

Site 1:

Een online IDE. Ik wilde hiermee een soort design-bibliotheek mee opzetten, ontwerpen voor bepaalde type sites e.d. Het inlogscherm toont nog zonder foutmeldingen, moet ik nog verder uitzoeken.