cluster

Infrastructure files for Nordgedanken and Midnightthoughts.
git clone git://archive.git.mtrnord.blog/MTRNord/cluster.git
Log | Files | Refs | README

commit 39c90581a241f261e09e995d3942ad1faa2981e4
parent bca9ad3b4b389935141e6c5a090ea988646723db
Author: MTRNord <MTRNord@users.noreply.github.com>
Date:   Fri, 17 Apr 2026 19:37:21 +0200

improve perf

Signed-off-by: MTRNord <MTRNord@users.noreply.github.com>

Diffstat:
Mapps/talos_cluster/image-policies/mediawiki.yaml | 24++++++++++++++++++++++++
Mapps/talos_cluster/mediawiki/Dockerfile | 4+++-
Mapps/talos_cluster/mediawiki/configmap.yaml | 20++++++++++++++------
Aapps/talos_cluster/mediawiki/cronjob.yaml | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mapps/talos_cluster/mediawiki/kustomization.yaml | 2++
Mapps/talos_cluster/mediawiki/php-custom.ini | 12++++++++++++
Aapps/talos_cluster/mediawiki/valkey.yaml | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 192 insertions(+), 7 deletions(-)

diff --git a/apps/talos_cluster/image-policies/mediawiki.yaml b/apps/talos_cluster/image-policies/mediawiki.yaml @@ -1,3 +1,27 @@ +# Valkey (shared cache) +apiVersion: image.toolkit.fluxcd.io/v1beta2 +kind: ImageRepository +metadata: + name: valkey + namespace: flux-system +spec: + image: docker.io/valkey/valkey + interval: 6h +--- +apiVersion: image.toolkit.fluxcd.io/v1beta2 +kind: ImagePolicy +metadata: + name: valkey + namespace: flux-system +spec: + imageRepositoryRef: + name: valkey + filterTags: + pattern: '^\d+-alpine$' + policy: + alphabetical: + order: desc +--- # Custom MediaWiki image (registry.midnightthoughts.space) apiVersion: image.toolkit.fluxcd.io/v1beta2 kind: ImageRepository diff --git a/apps/talos_cluster/mediawiki/Dockerfile b/apps/talos_cluster/mediawiki/Dockerfile @@ -9,7 +9,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ https://github.com/wikimedia/mediawiki-extensions-CodeMirror.git \ /var/www/html/extensions/CodeMirror \ && rm -rf /var/www/html/extensions/CodeMirror/.git \ + && pecl install apcu \ + && docker-php-ext-enable apcu \ && apt-get purge -y git && apt-get autoremove -y \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* /tmp/pear COPY php-custom.ini /usr/local/etc/php/conf.d/mediawiki-custom.ini diff --git a/apps/talos_cluster/mediawiki/configmap.yaml b/apps/talos_cluster/mediawiki/configmap.yaml @@ -53,13 +53,21 @@ data: 'password' => getenv('MW_SMTP_PASSWORD') ?: '', ]; - # Caching - $wgMainCacheType = CACHE_NONE; - $wgSessionCacheType = CACHE_DB; + # Caching — Valkey for shared object/session/parser cache, APCu for localisation + $wgObjectCaches['redis'] = [ + 'class' => 'RedisBagOStuff', + 'servers' => ['mediawiki-valkey.mediawiki.svc.cluster.local:6379'], + 'persistent' => true, + ]; + $wgMainCacheType = 'redis'; + $wgSessionCacheType = 'redis'; + $wgParserCacheType = 'redis'; + + # APCu for localisation cache (in-process, fastest for single-language wiki) + $wgLocalisationCacheConf = ['store' => 'accel']; - # Performance - $wgParserCacheType = CACHE_DB; - $wgJobRunRate = 1; + # Run jobs via CronJob, not on page requests + $wgJobRunRate = 0; # === Spam prevention === # Disable public account creation — admins create accounts manually diff --git a/apps/talos_cluster/mediawiki/cronjob.yaml b/apps/talos_cluster/mediawiki/cronjob.yaml @@ -0,0 +1,81 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: mediawiki-runJobs + namespace: mediawiki +spec: + schedule: "*/5 * * * *" + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 1 + failedJobsHistoryLimit: 3 + jobTemplate: + spec: + template: + spec: + restartPolicy: OnFailure + automountServiceAccountToken: false + securityContext: + runAsNonRoot: false + containers: + - name: runJobs + image: registry.midnightthoughts.space/mtrnord/mediawiki:1.45.3 # {"$imagepolicy": "flux-system:mediawiki"} + command: + - php + - ./maintenance/run.php + - runJobs + - --maxtime=240 + envFrom: + - secretRef: + name: mediawiki-cred + env: + - name: MW_DB_NAME + valueFrom: + secretKeyRef: + name: mediawiki-cred + key: db-name + - name: MW_DB_USER + valueFrom: + secretKeyRef: + name: mediawiki-cred + key: username + - name: MW_DB_PASSWORD + valueFrom: + secretKeyRef: + name: mediawiki-cred + key: password + - name: MW_SECRET_KEY + valueFrom: + secretKeyRef: + name: mediawiki-cred + key: wg-secret-key + - name: MW_UPGRADE_KEY + valueFrom: + secretKeyRef: + name: mediawiki-cred + key: wg-upgrade-key + - name: MW_SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: mediawiki-cred + key: smtp-password + volumeMounts: + - name: mediawiki-config + mountPath: /var/www/html/LocalSettings.php + subPath: LocalSettings.php + readOnly: true + - name: mediawiki-images + mountPath: /var/www/html/images + resources: + requests: + memory: "128Mi" + cpu: "50m" + limits: + memory: "256Mi" + cpu: "200m" + volumes: + - name: mediawiki-config + configMap: + name: mediawiki-config + - name: mediawiki-images + persistentVolumeClaim: + claimName: mediawiki-images diff --git a/apps/talos_cluster/mediawiki/kustomization.yaml b/apps/talos_cluster/mediawiki/kustomization.yaml @@ -7,5 +7,7 @@ resources: - configmap.yaml - pvc.yaml - mariadb.yaml + - valkey.yaml - deployment.yaml + - cronjob.yaml - route.yaml diff --git a/apps/talos_cluster/mediawiki/php-custom.ini b/apps/talos_cluster/mediawiki/php-custom.ini @@ -2,3 +2,15 @@ upload_max_filesize = 50M post_max_size = 50M memory_limit = 256M max_execution_time = 60 + +; OPcache +opcache.enable = 1 +opcache.memory_consumption = 128 +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 10000 +opcache.revalidate_freq = 60 +opcache.fast_shutdown = 1 + +; APCu +apc.enabled = 1 +apc.shm_size = 64M diff --git a/apps/talos_cluster/mediawiki/valkey.yaml b/apps/talos_cluster/mediawiki/valkey.yaml @@ -0,0 +1,56 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mediawiki-valkey + namespace: mediawiki +spec: + replicas: 1 + selector: + matchLabels: + app: mediawiki-valkey + template: + metadata: + labels: + app: mediawiki-valkey + spec: + automountServiceAccountToken: false + securityContext: + runAsUser: 999 + runAsGroup: 999 + fsGroup: 999 + containers: + - name: valkey + image: valkey/valkey:8-alpine # {"$imagepolicy": "flux-system:valkey"} + ports: + - containerPort: 6379 + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: false + capabilities: + drop: + - ALL + resources: + requests: + cpu: 10m + memory: 64Mi + limits: + cpu: 200m + memory: 128Mi + volumeMounts: + - name: data + mountPath: /data + volumes: + - name: data + emptyDir: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: mediawiki-valkey + namespace: mediawiki +spec: + selector: + app: mediawiki-valkey + ports: + - port: 6379 + targetPort: 6379