Initial commit: MetaVox loadtest playbook

Ansible playbook voor het opzetten van een MetaVox loadtest omgeving:
- 50 teamfolders met 10.000 bestanden elk (500K totaal)
- 100 metadata velddefinities (10 teamfolder + 90 file-level)
- 3-niveau mappenstructuur (10 hoofdmappen x 3 submappen)
- ~43M metadata records via directe MySQL inserts
- Geoptimaliseerde database indexes (7 redundante indexes gedropt)

Gebruikt directe filesystem writes en MySQL inserts i.p.v. WebDAV/API
voor maximale performance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-16 16:55:30 +01:00
commit a1eda430c8
12 changed files with 1677 additions and 0 deletions

192
group_vars/all.yml Normal file
View File

@@ -0,0 +1,192 @@
# =============================================================================
# Nextcloud Server Configuratie
# =============================================================================
nextcloud_url: "https://seedmv.researchdrivede.src.surf-hosted.nl"
nextcloud_admin_user: "admin"
nextcloud_admin_password: "secureadminpass"
nextcloud_db_name: "nextcloud"
nextcloud_data_dir: "/var/www/nextcloud/data"
groupfolders_dir: "{{ nextcloud_data_dir }}/__groupfolders"
# =============================================================================
# Groep die toegang krijgt tot de teamfolders
# =============================================================================
loadtest_group: "loadtest-group"
create_group: true
# =============================================================================
# Team Folders Configuratie
# =============================================================================
num_teamfolders: 50
teamfolder_prefix: "LoadTest-TF"
teamfolder_permissions: 31
# =============================================================================
# Mappenstructuur per teamfolder
# =============================================================================
# 10 hoofdmappen x 3 submappen = 30 leaf folders per teamfolder
folder_structure:
Financieel: ["Facturen", "Contracten", "Begrotingen"]
HR: ["Personeelsdossiers", "Sollicitaties", "Verlof"]
IT: ["Projecten", "Infrastructuur", "Security"]
Juridisch: ["Contracten", "Compliance", "Dossiers"]
Marketing: ["Campagnes", "Materiaal", "Analyses"]
Operations: ["Logistiek", "Inkoop", "Planning"]
Management: ["Notulen", "Strategie", "Rapportages"]
Onderzoek: ["Publicaties", "Data", "Experimenten"]
Communicatie: ["Intern", "Extern", "Persberichten"]
Archief: ["2023", "2024", "2025"]
# =============================================================================
# MetaVox Metadata Velden Configuratie
# =============================================================================
# 10 Teamfolder-velden (metadata die op teamfolder-niveau wordt ingesteld)
teamfolder_metadata_fields:
- { name: "tf_department", type: "text", description: "Afdeling" }
- { name: "tf_project_code", type: "text", description: "Projectcode" }
- { name: "tf_classification", type: "dropdown", description: "Classificatie", options: "Openbaar,Intern,Vertrouwelijk,Geheim" }
- { name: "tf_owner", type: "text", description: "Eigenaar" }
- { name: "tf_status", type: "dropdown", description: "Status", options: "Actief,Archief,Concept,Afgesloten" }
- { name: "tf_start_date", type: "date", description: "Startdatum" }
- { name: "tf_end_date", type: "date", description: "Einddatum" }
- { name: "tf_budget_code", type: "text", description: "Budgetcode" }
- { name: "tf_is_confidential", type: "checkbox", description: "Vertrouwelijk" }
- { name: "tf_location", type: "text", description: "Locatie" }
# 90 File-metadata-velden (metadata die per bestand wordt ingesteld)
file_metadata_fields:
# Text velden (30 stuks)
- { name: "doc_title", type: "text", description: "Documenttitel" }
- { name: "doc_author", type: "text", description: "Auteur" }
- { name: "doc_subject", type: "text", description: "Onderwerp" }
- { name: "doc_keywords", type: "text", description: "Trefwoorden" }
- { name: "doc_source", type: "text", description: "Bron" }
- { name: "doc_language", type: "text", description: "Taal" }
- { name: "doc_version", type: "text", description: "Versie" }
- { name: "doc_reference", type: "text", description: "Referentie" }
- { name: "doc_creator", type: "text", description: "Maker" }
- { name: "doc_contributor", type: "text", description: "Bijdrager" }
- { name: "doc_publisher", type: "text", description: "Uitgever" }
- { name: "doc_rights", type: "text", description: "Rechten" }
- { name: "doc_identifier", type: "text", description: "Identifier" }
- { name: "doc_relation", type: "text", description: "Relatie" }
- { name: "doc_coverage", type: "text", description: "Dekking" }
- { name: "doc_abstract", type: "text", description: "Samenvatting" }
- { name: "doc_notes", type: "text", description: "Notities" }
- { name: "doc_contact", type: "text", description: "Contactpersoon" }
- { name: "doc_email", type: "text", description: "E-mailadres" }
- { name: "doc_phone", type: "text", description: "Telefoonnummer" }
- { name: "doc_address", type: "text", description: "Adres" }
- { name: "doc_city", type: "text", description: "Stad" }
- { name: "doc_country", type: "text", description: "Land" }
- { name: "doc_postal_code", type: "text", description: "Postcode" }
- { name: "doc_organization", type: "text", description: "Organisatie" }
- { name: "doc_unit", type: "text", description: "Afdeling" }
- { name: "doc_role", type: "text", description: "Rol" }
- { name: "doc_case_number", type: "text", description: "Zaaknummer" }
- { name: "doc_invoice_number", type: "text", description: "Factuurnummer" }
- { name: "doc_contract_number", type: "text", description: "Contractnummer" }
# Dropdown velden (20 stuks)
- { name: "doc_type", type: "dropdown", description: "Documenttype", options: "Brief,Rapport,Notitie,Factuur,Contract,Offerte,Notulen,Beleidsstuk,Memo,Overig" }
- { name: "doc_status", type: "dropdown", description: "Documentstatus", options: "Concept,Review,Goedgekeurd,Definitief,Verlopen,Ingetrokken" }
- { name: "doc_priority", type: "dropdown", description: "Prioriteit", options: "Laag,Normaal,Hoog,Urgent,Kritiek" }
- { name: "doc_category", type: "dropdown", description: "Categorie", options: "Financieel,Juridisch,HR,IT,Marketing,Operations,R&D,Strategie,Compliance" }
- { name: "doc_sensitivity", type: "dropdown", description: "Gevoeligheid", options: "Openbaar,Intern,Vertrouwelijk,Strikt vertrouwelijk" }
- { name: "doc_retention", type: "dropdown", description: "Bewaartermijn", options: "1 jaar,3 jaar,5 jaar,7 jaar,10 jaar,Permanent" }
- { name: "doc_format", type: "dropdown", description: "Formaat", options: "PDF,Word,Excel,PowerPoint,Afbeelding,E-mail,Overig" }
- { name: "doc_review_status", type: "dropdown", description: "Reviewstatus", options: "Niet gereviewed,In review,Goedgekeurd,Afgekeurd" }
- { name: "doc_approval_level", type: "dropdown", description: "Goedkeuringsniveau", options: "Team,Management,Directie,Bestuur" }
- { name: "doc_lifecycle", type: "dropdown", description: "Levenscyclus", options: "Creatie,Gebruik,Archivering,Vernietiging" }
- { name: "doc_audience", type: "dropdown", description: "Doelgroep", options: "Intern,Extern,Bestuur,Partners,Klanten,Leveranciers" }
- { name: "doc_region", type: "dropdown", description: "Regio", options: "Noord,Oost,Zuid,West,Centraal,Internationaal" }
- { name: "doc_quarter", type: "dropdown", description: "Kwartaal", options: "Q1,Q2,Q3,Q4" }
- { name: "doc_fiscal_year", type: "dropdown", description: "Boekjaar", options: "2023,2024,2025,2026,2027" }
- { name: "doc_department", type: "dropdown", description: "Afdeling", options: "Finance,HR,IT,Legal,Marketing,Operations,R&D,Sales,Support" }
- { name: "doc_workflow_state", type: "dropdown", description: "Workflowstatus", options: "Nieuw,In behandeling,Wachtend,Afgerond,Geannuleerd" }
- { name: "doc_archive_reason", type: "dropdown", description: "Archiveringsreden", options: "Bewaartermijn,Afgesloten project,Wettelijke verplichting,Verzoek" }
- { name: "doc_access_level", type: "dropdown", description: "Toegangsniveau", options: "Iedereen,Team,Management,Beperkt" }
- { name: "doc_origin", type: "dropdown", description: "Herkomst", options: "Intern,Extern,Partner,Overheid,Klant" }
- { name: "doc_media_type", type: "dropdown", description: "Mediatype", options: "Tekst,Afbeelding,Audio,Video,Mixed" }
# Date velden (20 stuks)
- { name: "doc_created_date", type: "date", description: "Aanmaakdatum" }
- { name: "doc_modified_date", type: "date", description: "Wijzigingsdatum" }
- { name: "doc_published_date", type: "date", description: "Publicatiedatum" }
- { name: "doc_expiry_date", type: "date", description: "Verloopdatum" }
- { name: "doc_review_date", type: "date", description: "Reviewdatum" }
- { name: "doc_approval_date", type: "date", description: "Goedkeuringsdatum" }
- { name: "doc_archive_date", type: "date", description: "Archiveringsdatum" }
- { name: "doc_effective_date", type: "date", description: "Ingangsdatum" }
- { name: "doc_received_date", type: "date", description: "Ontvangstdatum" }
- { name: "doc_sent_date", type: "date", description: "Verzenddatum" }
- { name: "doc_signed_date", type: "date", description: "Tekendatum" }
- { name: "doc_deadline", type: "date", description: "Deadline" }
- { name: "doc_meeting_date", type: "date", description: "Vergaderdatum" }
- { name: "doc_start_date", type: "date", description: "Startdatum" }
- { name: "doc_end_date", type: "date", description: "Einddatum" }
- { name: "doc_invoice_date", type: "date", description: "Factuurdatum" }
- { name: "doc_payment_date", type: "date", description: "Betaaldatum" }
- { name: "doc_due_date", type: "date", description: "Vervaldatum" }
- { name: "doc_birth_date", type: "date", description: "Geboortedatum" }
- { name: "doc_registration_date", type: "date", description: "Registratiedatum" }
# Checkbox velden (20 stuks)
- { name: "doc_is_template", type: "checkbox", description: "Is template" }
- { name: "doc_is_signed", type: "checkbox", description: "Is getekend" }
- { name: "doc_is_approved", type: "checkbox", description: "Is goedgekeurd" }
- { name: "doc_is_archived", type: "checkbox", description: "Is gearchiveerd" }
- { name: "doc_is_public", type: "checkbox", description: "Is openbaar" }
- { name: "doc_is_confidential", type: "checkbox", description: "Is vertrouwelijk" }
- { name: "doc_is_final", type: "checkbox", description: "Is definitief" }
- { name: "doc_is_draft", type: "checkbox", description: "Is concept" }
- { name: "doc_needs_review", type: "checkbox", description: "Review nodig" }
- { name: "doc_needs_approval", type: "checkbox", description: "Goedkeuring nodig" }
- { name: "doc_has_attachments", type: "checkbox", description: "Heeft bijlagen" }
- { name: "doc_is_scanned", type: "checkbox", description: "Is gescand" }
- { name: "doc_is_ocr", type: "checkbox", description: "OCR verwerkt" }
- { name: "doc_is_encrypted", type: "checkbox", description: "Is versleuteld" }
- { name: "doc_is_compressed", type: "checkbox", description: "Is gecomprimeerd" }
- { name: "doc_is_original", type: "checkbox", description: "Is origineel" }
- { name: "doc_is_copy", type: "checkbox", description: "Is kopie" }
- { name: "doc_requires_action", type: "checkbox", description: "Actie vereist" }
- { name: "doc_is_billable", type: "checkbox", description: "Is factureerbaar" }
- { name: "doc_is_completed", type: "checkbox", description: "Is afgerond" }
# =============================================================================
# Dummy Bestanden Configuratie
# =============================================================================
files_per_teamfolder: 10000
dummy_file_content: "Dit is een dummy bestand voor MetaVox load testing. Aangemaakt door Ansible."
dummy_file_extension: "txt"
dummy_file_prefix: "loadtest-doc"
# =============================================================================
# Performance Configuratie
# =============================================================================
sql_batch_size: 2000
http_timeout: 300
max_retries: 3
# =============================================================================
# Database Index Optimalisatie
# =============================================================================
# Bij grote hoeveelheden metadata records moeten overbodige indexes
# op oc_metavox_file_gf_meta gedropt worden voor performance en diskruimte.
#
# BEHOUDEN (4 indexes):
# - PRIMARY
# - mf_file_gf_meta_unique (file_id, groupfolder_id, field_name)
# - idx_file_gf_gf_lookup (groupfolder_id, field_name, field_value)
# - idx_gf_file_meta_filter (field_name, field_value, groupfolder_id)
#
# DROPPEN (7 redundante indexes):
drop_indexes:
- "idx_file_gf_composite"
- "mf_file_gf_meta_file"
- "mf_file_gf_meta_gf"
- "mf_file_gf_meta_field"
- "idx_gf_file_meta_file_id"
- "idx_gf_file_meta_timestamps"
- "idx_file_gf_updated"