|
1 | 1 | # wordpress-hardened
|
2 | 2 |
|
3 |
| -  |
| 3 | +[](https://artifacthub.io/packages/search?repo=wordpress-hardened) |
4 | 4 |
|
5 | 5 | Hardened version of official WordPress container, with special support for Kubernetes.
|
6 | 6 |
|
7 |
| -**Features:** |
8 |
| -- Scheduled updates via wp-cli |
9 |
| -- **NGINX instead of Apache** |
10 |
| -- Supports [NGINX-PROXY](https://github.com/nginx-proxy/nginx-proxy) (VIRTUAL_HOST environment variable) |
11 |
| -- Hardened settings for WordPress: limiting access to code execution from wp-content directory, basic auth on wp-login.php |
12 |
| -- Basic Auth enabled by default to protect wp-login against bots (default user: `riotkit`, password: `riotkit`), can be changed using environment variables |
13 |
| -- Non-root container |
14 |
| -- Free from Supervisord, using lightweight [multirun](https://github.com/nicolas-van/multirun) instead |
15 |
| -- Runtime NGINX and PHP configuration to adjust things like `memory_limit`, `error_reporting` or `post_max_size` |
16 |
| -- Pre-configuration of admin account, website name and list of installed plugins |
17 |
| -- Possible to upgrade Wordpress together with docker container |
18 |
| -- Built-in primitive rules to block common exploits targeting PHP |
19 |
| - |
20 |
| -**Kubernetes-only features:** |
21 |
| -- Helm installer |
22 |
| -- Integration with [Backup Repository](https://github.com/riotkit-org/backup-repository) (for Kubernetes-native backups) |
23 |
| -- Integration with [Volume Syncing Controller](https://github.com/riotkit-org/volume-syncing-controller) (for WordPress volume synchronization between Pod and cloud filesystem) |
24 |
| -- Web Application Firewall and OWASP CRS support (experimental) |
25 |
| - |
26 |
| -[Check full documentation](https://github.com/riotkit-org/wordpress-hardened) |
27 |
| ------------------------- |
28 |
| - |
29 |
| -## Values |
30 |
| - |
31 |
| -| Key | Type | Default | Description | |
32 |
| -|-----|------|---------|-------------| |
33 |
| -| backups.collectionId | string | `""` | Server side collection id (a backup slot/directory) | |
34 |
| -| backups.email | string | `"example@example.org"` | Used for GPG encryption. Recommended: Set the same as in user account in Backup Repository | |
35 |
| -| backups.enabled | bool | `false` | | |
36 |
| -| backups.schedule | string | `"16 1 * * *"` | Crontab-like syntax, will be used in a `kind: CronJob` object | |
37 |
| -| backups.secrets.gpgKeys | object | `{"createIfNotExists":true,"secretName":"backups-gpg"}` | GPG key pair - public & private key used for backup encryption. Will generate automatically if not present (make sure to back up created `kind: Secret`) | |
38 |
| -| backups.secrets.loginToken | object | `{"secretKey":"backup-login-token","secretName":""}` | Login token is a JWT token generated by logging in to Backup Repository (see: https://github.com/riotkit-org/backup-repository/blob/767707ada71781a59b583f3e35f22618cf7c1e44/docs/api/users/README.md#post-apistableauthlogin) | |
39 |
| -| backups.templateName | string | `"wordpress-mariadb-10.10"` | Use MariaDB template version matching your server's version for best compatibility | |
40 |
| -| backups.templateType | string | `"internal"` | | |
41 |
| -| backups.url | string | `"https://my-backup-repository-instance.org"` | Backup Repository instance URL | |
42 |
| -| chownInitContainer | object | `{"enabled":true,"image":"busybox:1.36.0-musl"}` | Use PRIVILEGED init container to correct permissions of your volumes | |
43 |
| -| db.administrativeJobs | object | `{}` | | |
44 |
| -| db.host | string | `"mariadb.db.svc.cluster.local"` | | |
45 |
| -| db.name | string | `"riotkit"` | | |
46 |
| -| db.password.secretKey | string | `"password"` | | |
47 |
| -| db.password.secretName | string | `"db-credentials"` | | |
48 |
| -| db.port | int | `3306` | | |
49 |
| -| db.user | string | `"riotkit"` | | |
50 |
| -| env | object | `{}` | | |
51 |
| -| extraConfigMaps | list | `[]` | | |
52 |
| -| health.allowedSubnets | string | `"10.0.0.0/8"` | | |
53 |
| -| health.liveness.attributes.failureThreshold | int | `2` | | |
54 |
| -| health.liveness.attributes.periodSeconds | int | `60` | | |
55 |
| -| health.liveness.enabled | bool | `true` | | |
56 |
| -| health.readiness.attributes.failureThreshold | int | `2` | | |
57 |
| -| health.readiness.attributes.periodSeconds | int | `60` | | |
58 |
| -| health.readiness.enabled | bool | `true` | | |
59 |
| -| image.repository | string | `"ghcr.io/riotkit-org/wordpress-hardened"` | | |
60 |
| -| image.tag | string | `""` | | |
61 |
| -| ingresses[0].annotations."cert-manager.io/cluster-issuer" | string | `"letsencrypt-staging"` | | |
62 |
| -| ingresses[0].className | string | `"nginx"` | | |
63 |
| -| ingresses[0].hosts[0].paths[0].path | string | `"/"` | | |
64 |
| -| ingresses[0].hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | | |
65 |
| -| ingresses[0].tls[0].hosts | list | `[]` | | |
66 |
| -| permissions | object | `{"gid":65161,"uid":65161}` | If .Values.podSecurityContext is not specified, then this section will set securityContext. Those values also applies to the chown init container | |
67 |
| -| podDisruptionBudget.enabled | bool | `false` | | |
68 |
| -| podDisruptionBudget.spec.maxUnavailable | int | `0` | | |
69 |
| -| podDisruptionBudget.spec.minAvailable | int | `1` | | |
70 |
| -| podLabels | object | `{}` | | |
71 |
| -| podSecurityContext | object | `{}` | | |
72 |
| -| pv.extraVolumeMounts | list | `[]` | | |
73 |
| -| pv.extraVolumes | list | `[]` | | |
74 |
| -| pv.wp | object | `{"claimName":"wp","create":true,"enabled":true,"size":"256Mi"}` | Disable whole root directory volume to have WordPress version managed by the container. Enable it to use updater from the web - in this case the image version would only matter for PHP, NGINX versions, but the WordPress version would be bumped by WordPress by his own | |
75 |
| -| pv.wp_content.claimName | string | `"wp-content"` | | |
76 |
| -| pv.wp_content.create | bool | `true` | | |
77 |
| -| pv.wp_content.enabled | bool | `true` | | |
78 |
| -| pv.wp_content.size | string | `"1Gi"` | | |
79 |
| -| replicas | int | `1` | | |
80 |
| -| resources.limits.cpu | int | `1` | | |
81 |
| -| resources.limits.memory | string | `"128Mi"` | | |
82 |
| -| resources.requests.cpu | int | `0` | | |
83 |
| -| resources.requests.memory | string | `"16Mi"` | | |
84 |
| -| revisionHistoryLimit | int | `1` | | |
85 |
| -| rollingUpdate.enabled | bool | `true` | | |
86 |
| -| rollingUpdate.spec.maxSurge | int | `1` | | |
87 |
| -| rollingUpdate.spec.maxUnavailable | int | `0` | | |
88 |
| -| secrets | object | `{"apiVersion":"bitnami.com/v1alpha1","content":"encryptedData:\n ...\n","create":false,"enabled":false,"kind":"SealedSecret","name":"wordpress-secrets"}` | Allows to embed `kind: Secret`, `kind: SealedSecret`, `kind: ExternalSecret` or any other secret. Use it for example with Bitnami's Sealed Secret | |
89 |
| -| service.port | int | `8080` | | |
90 |
| -| service.type | string | `"ClusterIP"` | | |
91 |
| -| terminationGracePeriodSeconds | int | `20` | | |
92 |
| -| volumeSyncing.automaticEncryption.enabled | bool | `true` | | |
93 |
| -| volumeSyncing.automaticEncryption.secretName | string | `"sync-encryption"` | | |
94 |
| -| volumeSyncing.enabled | bool | `false` | | |
95 |
| -| volumeSyncing.env.REMOTE_ACL | string | `"private"` | | |
96 |
| -| volumeSyncing.env.REMOTE_ENDPOINT | string | `"http://minio.storage.svc.cluster.local:9000"` | | |
97 |
| -| volumeSyncing.env.REMOTE_PROVIDER | string | `"Minio"` | | |
98 |
| -| volumeSyncing.env.REMOTE_TYPE | string | `"s3"` | Remote storage configuration | |
99 |
| -| volumeSyncing.secret.name | string | `""` | | |
100 |
| -| volumeSyncing.syncOptions.allowedDirections.fromRemote | bool | `true` | | |
101 |
| -| volumeSyncing.syncOptions.allowedDirections.toRemote | bool | `true` | | |
102 |
| -| volumeSyncing.syncOptions.cleanUp.forceLocal | bool | `false` | | |
103 |
| -| volumeSyncing.syncOptions.cleanUp.forceRemote | bool | `false` | | |
104 |
| -| volumeSyncing.syncOptions.cleanUp.local | bool | `false` | | |
105 |
| -| volumeSyncing.syncOptions.cleanUp.remote | bool | `true` | | |
106 |
| -| volumeSyncing.syncOptions.restoreRemoteOnFirstRun | bool | `false` | | |
107 |
| -| volumeSyncing.syncOptions.schedule | string | `"@every 8h"` | | |
108 |
| -| waf.directives | string | `"#SecDefaultAction \"phase:4,allow,log\"\n#SecAction \"id:1,pass,log\"\n#SecAuditLog /dev/stdout\n#SecDebugLog /dev/stdout\n#SecDebugLogLevel 5\n"` | | |
109 |
| -| waf.enabled | bool | `false` | | |
110 |
| -| waf.env.ENABLE_CORAZA_WAF | bool | `false` | | |
111 |
| -| waf.env.ENABLE_CRS | bool | `true` | | |
112 |
| -| waf.env.ENABLE_RATE_LIMITER | bool | `true` | | |
113 |
| -| waf.env.ENABLE_RULE_WORDPRESS | bool | `true` | | |
114 |
| -| waf.env.RATE_LIMIT_EVENTS | string | `"30"` | | |
115 |
| -| waf.env.RATE_LIMIT_WINDOW | string | `"5s"` | | |
116 |
| -| waf.health.liveness.attributes.failureThreshold | int | `2` | | |
117 |
| -| waf.health.liveness.attributes.periodSeconds | int | `60` | | |
118 |
| -| waf.health.liveness.enabled | bool | `true` | | |
119 |
| -| waf.image.repository | string | `"ghcr.io/riotkit-org/waf-proxy"` | | |
120 |
| -| waf.image.tag | string | `"snapshot"` | | |
121 |
| -| wordpress.autoUpdate | bool | `true` | Should the WordPress automatically update itself periodically? NOTICE! Use with .pv.wp.enabled = true | |
122 |
| -| wordpress.domain | string | `"example.org"` | Ingress domain name | |
123 |
| -| wordpress.https | string | `"on"` | HTTP/HTTPS | |
124 |
| -| wordpress.publicPort | string | `"443"` | Ingress port | |
| 7 | +```bash |
| 8 | +helm install my-wordpress-hardened oci://ghcr.io/riotkit-org/charts/wordpress-hardened --version |
0 commit comments