Onderhoud
Dagelijks onderhoud voor een zelf gehoste rtCloud-instantie: upgraden, back-uppen, herstellen en veelvoorkomende problemen oplossen.
Veelgebruikte opdrachten
Gebruik deze opdrachten regelmatig om uw rtCloud-containers te beheren. Voer ze uit vanuit de map met docker-compose.production.yml.
# Controleer de status en gezondheid van alle containers
docker compose -f docker-compose.production.yml ps
# Bekijk live logboeken (alle services)
docker compose -f docker-compose.production.yml logs -f
# Bekijk logboeken alleen voor de app
docker compose -f docker-compose.production.yml logs -f rtcloud
# Herstart een enkele container
docker compose -f docker-compose.production.yml restart rtcloud
# Stop alle services
docker compose -f docker-compose.production.yml down
# Start alle services
docker compose -f docker-compose.production.yml up -d
# Open een shell binnen de app-container
docker compose -f docker-compose.production.yml exec rtcloud bash
Upgraden
rtCloud-updates worden verspreid als nieuwe Docker-image-tags. Upgraden haalt de nieuwste image op en maakt de app-container opnieuw aan. Databasemigraties worden automatisch uitgevoerd bij het opstarten.
1. Haal de nieuwste image op:
docker compose -f docker-compose.production.yml pull
2. Maak de app-container opnieuw aan:
docker compose -f docker-compose.production.yml up -d
Docker vervangt alleen de containers waarvan de image is gewijzigd. De MySQL-container en alle benoemde volumes zijn niet beïnvloed.
Een versie vastzetten
Om te upgraden naar een specifieke versie in plaats van latest, werkt u RTCLOUD_IMAGE bij in .env:
RTCLOUD_IMAGE=rtawebteam/rta-smartsurvey:1.2.3
Voer dan docker compose pull en up -d uit zoals hierboven.
Downgraden
Downgraden wordt over het algemeen niet aanbevolen, omdat databasemigraties niet ongedaan gemaakt kunnen worden. Als een downgrade noodzakelijk is, herstel dan vanuit een database-back-up die is gemaakt vóór de upgrade.
Back-up en herstel
Back-up van de database
Voer deze opdracht uit om de applicatiedatabase te exporteren naar een SQL-bestand:
docker compose -f docker-compose.production.yml exec mysql \
mysqldump -u root -p"$(grep MYSQL_ROOT_PASSWORD .env | cut -d= -f2)" smartsurvey \
> backup-$(date +%Y%m%d-%H%M%S).sql
Het back-upbestand wordt geschreven naar uw huidige map op de host.
Database herstellen
docker compose -f docker-compose.production.yml exec -T mysql \
mysql -u root -p"$(grep MYSQL_ROOT_PASSWORD .env | cut -d= -f2)" smartsurvey \
< backup-20240101-120000.sql
Back-up van geüploade bestanden
Enquête-inzendingen bevatten vaak geüploade bestanden (foto’s, audio, documenten) die zijn opgeslagen in benoemde Docker-volumes. Maak er afzonderlijk van de database een back-up van:
# Back-up uploads
docker run --rm \
-v rtcloud_uploads:/data \
-v "$(pwd):/backup" \
alpine tar czf /backup/uploads-$(date +%Y%m%d).tar.gz -C /data .
# Back-up audio-opnames
docker run --rm \
-v rtcloud_audios:/data \
-v "$(pwd):/backup" \
alpine tar czf /backup/audios-$(date +%Y%m%d).tar.gz -C /data .
Vervang rtcloud_uploads en rtcloud_audios door uw werkelijke volumenamen (voorafgegaan door COMPOSE_PROJECT_NAME) als u de standaard heeft gewijzigd.
Geüploade bestanden herstellen
docker run --rm \
-v rtcloud_uploads:/data \
-v "$(pwd):/backup" \
alpine tar xzf /backup/uploads-20240101.tar.gz -C /data
Geautomatiseerde dagelijkse back-ups
Voeg een cron-taak toe op de host om back-ups automatisch uit te voeren. Bewerk de root-crontab met crontab -e:
# Dagelijkse database-back-up om 2:00 uur, bewaar 30 dagen geschiedenis
0 2 * * * cd /opt/rtcloud && docker compose -f docker-compose.production.yml exec -T mysql \
mysqldump -u root -p"$(grep MYSQL_ROOT_PASSWORD .env | cut -d= -f2)" smartsurvey \
> /backups/db-$(date +\%Y\%m\%d).sql && \
find /backups -name "db-*.sql" -mtime +30 -delete
Probleemoplossing
App-container start niet
Controleer de containerlogboeken op foutmeldingen:
docker compose -f docker-compose.production.yml logs rtcloud
Veelvoorkomende oorzaken:
- Ontbrekende of ongeldige omgevingsvariabelen in
.env - MySQL nog niet gereed (wacht 60 seconden en controleer opnieuw)
- Poortconflict — een ander proces gebruikt al
APP_PORT
MySQL niet gezond
docker compose -f docker-compose.production.yml logs mysql
Veelvoorkomende oorzaken:
MYSQL_ROOT_PASSWORDniet ingesteld in.env- Beschadigd gegevensvolume (zeldzaam — controleer schijfruimte met
df -h)
MySQL kan 30–60 seconden nodig hebben om te initialiseren bij de allereerste start. Wacht en controleer opnieuw voordat u aanneemt dat er een probleem is.
Poort al in gebruik
Wijzig APP_PORT of SHINY_PORT in .env naar een vrije poort en maak dan de containers opnieuw aan:
docker compose -f docker-compose.production.yml up -d --force-recreate
Om te vinden wat een poort op de host gebruikt:
lsof -i :8080
400 CSRF-token kon niet worden geverifieerd
Deze fout treedt op in lokale of reverse-proxy-omgevingen waar de verzoekoorsprong niet overeenkomt met de verwachte host. Schakel CSRF-validatie uit voor alleen lokale ontwikkeling:
CSRF_VALIDATION_ENABLED=false
Start dan de app opnieuw:
docker compose -f docker-compose.production.yml up -d --force-recreate rtcloud
Schakel CSRF-validatie niet uit in productie. Als deze fout optreedt in productie, zorg er dan voor dat uw reverse proxy de juiste
Host- enX-Forwarded-For-headers doorstuurt.
Beheerderswachtwoord vergeten
Reset het beheerderswachtwoord rechtstreeks in de database. Verbind met de MySQL-container en werk de wachtwoord-hash bij:
Stap 1 — Genereer de nieuwe wachtwoord-hash. Vervang nieuwwachtwoord door uw gewenste wachtwoord:
docker compose -f docker-compose.production.yml exec rtcloud php -r "
\$salt = trim(shell_exec(\"mysql -h mysql -u root -p\\\"\${MYSQL_ROOT_PASSWORD}\\\" \${MYSQL_DATABASE} -se \\\"SELECT salt FROM ss_user WHERE username='admin';\\\"\"));
echo md5(\$salt . 'nieuwwachtwoord') . PHP_EOL;
"
Stap 2 — Werk de hash bij in de database:
docker compose -f docker-compose.production.yml exec mysql \
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" smartsurvey \
-e "UPDATE ss_user SET password='<hash_van_stap_1>' WHERE username='admin';"
Container blijft herstarten
Controleer of de gezondheidscontrole mislukt:
docker compose -f docker-compose.production.yml ps
docker inspect rtcloud-app --format '{{json .State.Health}}'
De gezondheidscontrole van de app roept het /health-eindpunt aan. Als dit herhaaldelijk mislukt, controleer dan de applicatielogboeken op opstartfouten.
Schijfruimte vol
Identificeer wat ruimte verbruikt:
# Controleer schijfgebruik van host
df -h
# Controleer Docker-schijfgebruik (images, containers, volumes)
docker system df
# Verwijder ongebruikte images en gestopte containers (veilig om uit te voeren)
docker system prune
Gebruik niet docker system prune --volumes want dit verwijdert applicatiegegevens.
Gezondheidscontroles
Elke service heeft een automatische gezondheidscontrole. De containerstatus weerspiegelt het resultaat:
| Container | Controlemethode | Startperiode | Interval |
|---|---|---|---|
rtcloud-app | HTTP GET /health | 90 seconden | 30 seconden |
rtcloud-mysql | mysqladmin ping | 30 seconden | 10 seconden |
rtcloud-keycloak | HTTP GET :9000/health/live | 120 seconden | 30 seconden |
Containers met een mislukte gezondheidscontrole worden automatisch herstart volgens de RESTART_POLICY-instelling (standaard: unless-stopped).