# Digihulp Bibliotheek

Een eenvoudige, Nederlandstalige webapp voor vier (of meer) vrijwilligers die bezoekers helpen met computers, smartphones, itsme, e-mail en administratie.

De applicatie is **open source (MIT-licentie)** en gebruikt **PHP 8.2+ en SQLite**; de meegeleverde instructies zijn afgestemd op **Ubuntu 26.04 + PHP 8.5.4 + Apache2** en `https://bib.geuens.net`.

## Wat kun je ermee?

- Aanmelden met gebruikersnaam en wachtwoord.
- Een vraag en later eventueel de oplossing noteren, zonder bezoekersnaam.
- Automatisch registreren van de aanmaakdatum en het tijdstip (tijdzone Europa/Brussel).
- Alle vragen en antwoorden doorzoeken, met categorieën en losse tags (`itsme`, `Android`, ...).
- Alle ingelogde vrijwilligers zien alle vragen en oplossingen; ze kunnen ze ook aanvullen.
- Iedere geholpen bezoeker apart tellen met een grote `+1`-knop; incorrecte klik terugdraaien.
- Overzicht van bezoekers vandaag, dit jaar, per week, per maand en per jaar.
- Beheerder kan vrijwilligers aanmaken, accounts deactiveren en wachtwoorden opnieuw instellen.
- Eenvoudig donderdagrooster (één verantwoordelijke per donderdag).
- Veiligheid: password_hash, CSRF-beveiliging, SQL-parameters, inlogpoginglimiet, sessiecookies enkel via HTTPS, database buiten webroot.
- Geen externe JavaScript-bibliotheken, trackers of CDN's.

**Belangrijk:** De bezoekerteller staat los van de vragen. Tel een persoon eenmaal, ook als je voor die persoon meerdere vragen opslaat. De teller slaat uitsluitend datum, +/-1 en de ingelogde vrijwilliger op, geen identiteit van de bezoeker.

## Installeren op Ubuntu 26.04

De site `bib.geuens.net` heeft al HTTPS via Let's Encrypt. **Behoud de bestaande VirtualHost, SSL-certificaatpaden, PHP-handler en eventuele andere configuratie.** Je past enkel de `DocumentRoot` van deze site aan. Maak voor de zekerheid vooraf een back-up.

### 1. Installeer benodigde modules

```bash
sudo apt update
sudo apt install php8.5-sqlite3 php8.5-mbstring unzip
php -m | grep -Ei 'pdo_sqlite|mbstring'
```

Controleer welke PHP-versie Apache gebruikt. Als dat PHP-FPM 8.5 is:

```bash
sudo systemctl reload php8.5-fpm
```

Bij Apache mod_php is alleen Apache herladen voldoende (zie hieronder).

### 2. Kopieer de bestanden

Upload `bib-digihulp.zip` via SCP/SFTP naar `/tmp/` op je VPS en voer uit:

```bash
cd /tmp
unzip bib-digihulp.zip
sudo mkdir -p /var/www/bib-geuens
sudo cp -a /tmp/bib-digihulp/. /var/www/bib-geuens/

sudo chown -R root:www-data /var/www/bib-geuens
sudo find /var/www/bib-geuens -type d -exec chmod 750 {} \;
sudo find /var/www/bib-geuens -type f -exec chmod 640 {} \;
sudo chown -R www-data:www-data /var/www/bib-geuens/storage
sudo chmod 700 /var/www/bib-geuens/storage
```

Als je Apache/PHP-FPM onder een andere gebruiker dan `www-data` draait, pas de groep/eigenaar aan.

### 3. Maak het eerste beheerdersaccount aan

`setup.php` maakt alle tabellen aan en creëert slechts **één eerste beheerdersaccount**. Je kiest zelf het wachtwoord. Het wachtwoord verschijnt niet op het scherm, belandt niet in de shellgeschiedenis en staat niet in de commandoargumenten.

```bash
cd /var/www/bib-geuens
read -r -s -p 'Wachtwoord voor beheerder (min. 12 tekens): ' BIB_PASS; echo
printf '%s\n' "$BIB_PASS" | sudo -u www-data php bin/setup.php erwin "Erwin"
unset BIB_PASS
```

Je kunt `erwin` en `Erwin` in het bovenstaande commando vervangen door een andere gebruikersnaam en weergavenaam. De wachtwoordprompt komt van Bash, terwijl het PHP-script het wachtwoord uit een pipe leest. Herhalen na succesvolle installatie maakt **geen** nieuwe beheerder aan.

Als je een melding krijgt dat `mbstring` of `pdo_sqlite` ontbreekt, controleer of het **CLI-PHP** ook versie 8.5 gebruikt: `php -v`.

### 4. Maak de juiste Apache-webmap actief

**Let op: wijzig enkel de VirtualHost voor bib.geuens.net**, niet die van andere websites. Zoek die op met:

```bash
sudo apache2ctl -S
sudo grep -R -n 'bib.geuens.net' /etc/apache2/sites-available/
```

Open het juiste Apache-configuratiebestand, bijvoorbeeld met `sudo nano /etc/apache2/sites-available/bib.geuens.net-le-ssl.conf`. Gebruik de **bestaande** `<VirtualHost *:443>` en wijzig de `DocumentRoot` daar naar:

```apache
DocumentRoot /var/www/bib-geuens/public
<Directory /var/www/bib-geuens/public>
    Options -Indexes
    AllowOverride None
    Require all granted
    DirectoryIndex index.php
</Directory>
```

Voeg bovenstaande regels **binnen** de bestaande `<VirtualHost *:443>` toe (of pas eventuele bestaande Directory-regels voor deze map aan). Laat `SSLCertificateFile`, `SSLCertificateKeyFile`, `ServerName`, PHP-FPM-handler en eventuele Certbot-verwijzingen staan. Als je een VirtualHost voor HTTP poort 80 hebt die bezoekers **niet** al doorstuurt naar HTTPS, stel daar eerst een HTTPS-redirect in. Verwijder of overschrijf de bestaande configuratie niet.

De applicatiebestanden buiten `/public` (`/app`, `/bin`, `/storage`) mogen **nooit** rechtstreeks via Apache bereikbaar zijn. Een `DocumentRoot` naar `/var/www/bib-geuens` in plaats van `/public` is onveilig.

Controleer en herlaad:

```bash
sudo apache2ctl configtest
sudo systemctl reload apache2
```

Bezoek vervolgens **https://bib.geuens.net/**, meld je aan met het zojuist aangemaakte account en maak de drie andere vrijwilligers aan via **Gebruikers**.

### 5. De twee logo’s toevoegen

De hoofding heeft plaats voor **beide logo’s**. Kopieer de twee oorspronkelijke afbeeldingsbestanden naar de map `public/assets`:

- Eerste (gemeentelijke) logo: `logo-gemeente.png`
- Tweede logo: `logo-tweede.png`

Je kunt in plaats van `.png` ook `.jpg`, `.jpeg` of `.webp` gebruiken **als dat de werkelijke indeling van je bronbestand is**. Verander alleen de bestandsnaam, niet de bestandsextensie naar een ander formaat. De website zoekt automatisch naar elk van deze vier extensies. Gebruik geen `.svg` in deze eenvoudige versie.

De afbeeldingen uit het gesprek konden **niet als originele bestanden** in dit ZIP-pakket worden opgenomen. Je hoeft geen code aan te passen: zodra je beide bestanden uploadt, verschijnen ze bovenaan de site, naast de titel.

Voorbeeld als de twee bronbestanden vanaf je eigen pc op de server geplaatst zijn:

```bash
sudo chown root:www-data /var/www/bib-geuens/public/assets/logo-gemeente.* /var/www/bib-geuens/public/assets/logo-tweede.*
sudo chmod 640 /var/www/bib-geuens/public/assets/logo-gemeente.* /var/www/bib-geuens/public/assets/logo-tweede.*
```

Voer deze commando’s alleen uit als de overeenkomstige bestanden bestaan, anders meldt de shell dat het bestand niet gevonden werd. Ververs de webpagina om de logo’s te zien.

### 6. Back-ups plannen

Maak een consistente back-up met de meegeleverde CLI-tool (SQLite `VACUUM INTO`):

```bash
sudo -u www-data php /var/www/bib-geuens/bin/backup.php
```

Je vindt de beveiligde back-up in `/var/www/bib-geuens/storage/backups`. Maak vervolgens buiten de server nog een afzonderlijke beveiligde kopie; alleen een back-up op dezelfde VPS beschermt niet tegen serveruitval.

Voor een dagelijkse back-up kun je met `sudo crontab -u www-data -e` bijvoorbeeld toevoegen:

```cron
15 2 * * * /usr/bin/php /var/www/bib-geuens/bin/backup.php >/dev/null 2>&1
```

Die cronregel draait dan als `www-data`. Plan daarnaast het veilig opruimen en extern bewaren van oude back-ups.

### 7. Veiligheidscontrole

- Controleer dat `https://bib.geuens.net/` een login toont.
- Probeer een rechtstreeks pad als `https://bib.geuens.net/storage/bibliotheek.sqlite` te openen: dit moet **404** opleveren.
- Test de login, voer een vraag met tag `itsme` in en vind die via zoeken terug.
- Tel een bezoeker, controleer **Statistieken**, en trek daarna de testbezoeker af.
- Maak een testvrijwilliger aan en controleer dat deze niet bij **Gebruikers** kan.
- Voeg een donderdagochtenddienst toe, controleer dat de vrijwilliger die ziet.
- Test een back-up en bewaar één kopie op een andere locatie.

## Structuur

```text
bib-digihulp/
├── app/core.php          serverfuncties en SQLite-koppeling
├── bin/setup.php         initiële installatie: uitsluitend via terminal
├── bin/backup.php        consistente SQLite-back-up: uitsluitend via terminal
├── public/index.php      complete website, alleen deze map publiek
├── public/assets/style.css
├── public/robots.txt
├── storage/              SQLite-data en back-ups; NIET publiek
└── LICENSE               MIT
```

## Privacy en gebruik

Geen bezoekersnaam opslaan betekent **niet automatisch dat de AVG/GDPR niet meer van toepassing is**: medewerkersaccounts en eventueel IP-adressen in serverlogs zijn persoonsgegevens; bezoekers kunnen ook persoonsgegevens in vrije tekst noteren. Gebruik alleen de minimale noodzakelijke informatie, stel een bewaartermijn en inzagerechten vast, en hou de server en PHP up-to-date. Vermijd zeker wachtwoorden, rijksregisternummers, geboortedata, identificatiecodes en medische gegevens in vragen.

## Opmerkingen

- Enkel de beheerders kunnen andere accounts toevoegen, wachtwoorden resetten, historische bezoekertellingen aanpassen en de donderdagdienst wijzigen.
- Alle vrijwilligers kunnen vragen en oplossingen lezen en bijwerken. Er is eenvoudige conflictcontrole zodat een gelijktijdige wijziging niet zonder waarschuwing een andere wijziging overschrijft.
- Dit project heeft geen e-mailserver nodig.
- Als je SQLite niet wilt gebruiken, kan de opslaglaag later naar MySQL worden overgezet, maar dit pakket ondersteunt bewust alleen SQLite.
- Een wijzigingsgeschiedenis van vragen is niet aanwezig: zorg voor dagelijkse back-ups.

