diff --git a/cert-manager/versions/v1/manifest.yaml b/cert-manager/versions/v1/manifest.yaml index 732e2bd..a1d11e0 100644 --- a/cert-manager/versions/v1/manifest.yaml +++ b/cert-manager/versions/v1/manifest.yaml @@ -1,4 +1,4 @@ -version: v1.17.2-1 +version: v1.21.2 requires: - name: traefik defaultConfig: diff --git a/cert-manager/versions/v1/upstream/cert-manager.yaml b/cert-manager/versions/v1/upstream/cert-manager.yaml index 9eef0c9..2b48514 100644 --- a/cert-manager/versions/v1/upstream/cert-manager.yaml +++ b/cert-manager/versions/v1/upstream/cert-manager.yaml @@ -12981,7 +12981,7 @@ spec: type: RuntimeDefault containers: - name: cert-manager-cainjector - image: "quay.io/jetstack/cert-manager-cainjector:v1.17.2" + image: "quay.io/jetstack/cert-manager-cainjector:v1.21.2" imagePullPolicy: IfNotPresent args: - --v=2 @@ -13044,7 +13044,7 @@ spec: type: RuntimeDefault containers: - name: cert-manager-controller - image: "quay.io/jetstack/cert-manager-controller:v1.17.2" + image: "quay.io/jetstack/cert-manager-controller:v1.21.2" imagePullPolicy: IfNotPresent args: - --v=2 @@ -13126,7 +13126,7 @@ spec: type: RuntimeDefault containers: - name: cert-manager-webhook - image: "quay.io/jetstack/cert-manager-webhook:v1.17.2" + image: "quay.io/jetstack/cert-manager-webhook:v1.21.2" imagePullPolicy: IfNotPresent args: - --v=2 diff --git a/coredns/versions/v1/manifest.yaml b/coredns/versions/v1/manifest.yaml index c0217ec..b7b8c75 100644 --- a/coredns/versions/v1/manifest.yaml +++ b/coredns/versions/v1/manifest.yaml @@ -1,4 +1,4 @@ -version: v1.12.0-1 +version: v1.14.7 requires: - name: metallb defaultConfig: diff --git a/discourse/app.yaml b/discourse/app.yaml index d4e1597..d15799c 100644 --- a/discourse/app.yaml +++ b/discourse/app.yaml @@ -3,4 +3,4 @@ is: discourse description: Discourse is a modern, open-source discussion platform designed for online communities and forums. category: community icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/discourse.svg -latest: "3" +latest: "2026" diff --git a/discourse/versions/2026/README.md b/discourse/versions/2026/README.md new file mode 100644 index 0000000..18fcfb4 --- /dev/null +++ b/discourse/versions/2026/README.md @@ -0,0 +1,35 @@ +# Discourse + +Discourse is a modern, open-source discussion platform designed for online communities and forums. + +## Dependencies + +- **PostgreSQL** - Database for storing application data +- **Redis** - Used for caching and background jobs + +## Configuration + +Key settings configured through your instance's `config.yaml`: + +- **domain** - Where Discourse will be accessible (default: `discourse.{your-cloud-domain}`) +- **adminEmail** - Admin account email (defaults to your operator email) +- **adminUsername** - Admin account username (default: `admin`) +- **siteName** - Your community name (default: `Community`) +- **SMTP** - Email delivery settings inherited from your Wild Cloud instance + +## Access + +After deployment, Discourse will be available at: +- `https://discourse.{your-cloud-domain}` + +## First-Time Setup + +1. Add and deploy the app: + ```bash + wild app add discourse + wild app deploy discourse + ``` + +2. Log in with the admin credentials configured during setup + +3. Complete the setup wizard to configure your community diff --git a/discourse/versions/2026/db-init-job.yaml b/discourse/versions/2026/db-init-job.yaml new file mode 100644 index 0000000..cde54f7 --- /dev/null +++ b/discourse/versions/2026/db-init-job.yaml @@ -0,0 +1,78 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: discourse-db-init + namespace: discourse +spec: + template: + metadata: + labels: + component: db-init + spec: + securityContext: + runAsNonRoot: true + runAsUser: 999 + runAsGroup: 999 + seccompProfile: + type: RuntimeDefault + restartPolicy: OnFailure + containers: + - name: db-init + image: postgres:16-alpine + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + env: + - name: PGHOST + value: "{{ .db.host }}" + - name: PGPORT + value: "5432" + - name: PGUSER + value: postgres + - name: PGPASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: postgres.password + - name: DISCOURSE_DB_USER + value: "{{ .db.user }}" + - name: DISCOURSE_DB_NAME + value: "{{ .db.name }}" + - name: DISCOURSE_DB_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: dbPassword + command: + - /bin/sh + - -c + - | + echo "Initializing Discourse database..." + + # Create database if it doesn't exist + if ! psql -lqt | cut -d \| -f 1 | grep -qw "$DISCOURSE_DB_NAME"; then + echo "Creating database $DISCOURSE_DB_NAME..." + createdb "$DISCOURSE_DB_NAME" + else + echo "Database $DISCOURSE_DB_NAME already exists." + fi + + # Create user if it doesn't exist and grant permissions + psql -d "$DISCOURSE_DB_NAME" -c " + DO \$\$ + BEGIN + IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$DISCOURSE_DB_USER') THEN + CREATE USER $DISCOURSE_DB_USER WITH PASSWORD '$DISCOURSE_DB_PASSWORD'; + END IF; + END + \$\$; + ALTER USER $DISCOURSE_DB_USER WITH PASSWORD '$DISCOURSE_DB_PASSWORD'; + GRANT ALL PRIVILEGES ON DATABASE $DISCOURSE_DB_NAME TO $DISCOURSE_DB_USER; + GRANT ALL ON SCHEMA public TO $DISCOURSE_DB_USER; + GRANT USAGE ON SCHEMA public TO $DISCOURSE_DB_USER; + " + + echo "Database initialization completed." \ No newline at end of file diff --git a/discourse/versions/2026/deployment.yaml b/discourse/versions/2026/deployment.yaml new file mode 100644 index 0000000..993f0a3 --- /dev/null +++ b/discourse/versions/2026/deployment.yaml @@ -0,0 +1,304 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: discourse + namespace: discourse +spec: + replicas: 1 + selector: + matchLabels: + component: web + strategy: + type: Recreate + template: + metadata: + labels: + component: web + spec: + automountServiceAccountToken: false + serviceAccountName: discourse + securityContext: + fsGroup: 1000 + fsGroupChangePolicy: Always + initContainers: + - name: discourse-migrate + image: discourse/discourse:2026.10.0 + imagePullPolicy: "IfNotPresent" + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + add: + - CHOWN + - FOWNER + - SETGID + - SETUID + - DAC_OVERRIDE + privileged: false + readOnlyRootFilesystem: false + runAsNonRoot: false + runAsUser: 0 + seccompProfile: + type: RuntimeDefault + command: + - /bin/bash + - -c + - | + set -e + cd /var/www/discourse + export HOME=/root + git config --global --add safe.directory /var/www/discourse + bundle exec rake db:migrate + bundle exec rake assets:precompile + env: + - name: RAILS_ENV + value: "production" + - name: DISCOURSE_DB_HOST + value: {{ .db.host }} + - name: DISCOURSE_DB_PORT + value: "{{ .db.port }}" + - name: DISCOURSE_DB_NAME + value: {{ .db.name }} + - name: DISCOURSE_DB_USERNAME + value: {{ .db.user }} + - name: DISCOURSE_DB_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: dbPassword + - name: DISCOURSE_REDIS_HOST + value: {{ .redis.host }} + - name: DISCOURSE_REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: redis.password + - name: DISCOURSE_HOSTNAME + value: {{ .domain }} + - name: DISCOURSE_SECRET_KEY_BASE + valueFrom: + secretKeyRef: + name: discourse-secrets + key: secretKeyBase + volumeMounts: + - name: discourse-data + mountPath: /shared + containers: + - name: discourse + image: discourse/discourse:2026.10.0 + imagePullPolicy: "IfNotPresent" + command: + - /sbin/boot + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + add: + - CHOWN + - FOWNER + - SETGID + - SETUID + - DAC_OVERRIDE + privileged: false + readOnlyRootFilesystem: false + runAsNonRoot: false + runAsUser: 0 + seccompProfile: + type: RuntimeDefault + env: + - name: RAILS_ENV + value: "production" + # Discourse database configuration + - name: DISCOURSE_DB_HOST + value: {{ .db.host }} + - name: DISCOURSE_DB_PORT + value: "{{ .db.port }}" + - name: DISCOURSE_DB_NAME + value: {{ .db.name }} + - name: DISCOURSE_DB_USERNAME + value: {{ .db.user }} + - name: DISCOURSE_DB_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: dbPassword + # Redis configuration + - name: DISCOURSE_REDIS_HOST + value: {{ .redis.host }} + - name: DISCOURSE_REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: redis.password + # Site configuration + - name: DISCOURSE_HOSTNAME + value: {{ .domain }} + - name: DISCOURSE_DEVELOPER_EMAILS + value: {{ .adminEmail }} + - name: DISCOURSE_SECRET_KEY_BASE + valueFrom: + secretKeyRef: + name: discourse-secrets + key: secretKeyBase + # SMTP configuration + - name: DISCOURSE_SMTP_ADDRESS + value: {{ .smtp.host }} + - name: DISCOURSE_SMTP_PORT + value: "{{ .smtp.port }}" + - name: DISCOURSE_SMTP_USER_NAME + value: {{ .smtp.user }} + - name: DISCOURSE_SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: smtpPassword + - name: DISCOURSE_SMTP_ENABLE_START_TLS + value: "{{ .smtp.startTls }}" + ports: + - name: http + containerPort: 80 + protocol: TCP + livenessProbe: + httpGet: + path: /srv/status + port: http + initialDelaySeconds: 500 + periodSeconds: 30 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + readinessProbe: + httpGet: + path: /srv/status + port: http + initialDelaySeconds: 360 + periodSeconds: 30 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + resources: + limits: + cpu: 2000m + ephemeral-storage: 10Gi + memory: 8Gi + requests: + cpu: 50m + ephemeral-storage: 50Mi + memory: 512Mi + volumeMounts: + - name: discourse-data + mountPath: /shared + - name: sidekiq + image: discourse/discourse:2026.10.0 + imagePullPolicy: "IfNotPresent" + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + add: + - CHOWN + - FOWNER + - SETGID + - SETUID + - DAC_OVERRIDE + privileged: false + readOnlyRootFilesystem: false + runAsNonRoot: false + runAsUser: 0 + seccompProfile: + type: RuntimeDefault + command: + - /bin/bash + - -c + - "cd /var/www/discourse && export HOME=/root && exec bundle exec sidekiq" + env: + - name: RAILS_ENV + value: "production" + # Discourse database configuration + - name: DISCOURSE_DB_HOST + value: {{ .db.host }} + - name: DISCOURSE_DB_PORT + value: "{{ .db.port }}" + - name: DISCOURSE_DB_NAME + value: {{ .db.name }} + - name: DISCOURSE_DB_USERNAME + value: {{ .db.user }} + - name: DISCOURSE_DB_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: dbPassword + # Redis configuration + - name: DISCOURSE_REDIS_HOST + value: {{ .redis.host }} + - name: DISCOURSE_REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: redis.password + # Site configuration + - name: DISCOURSE_HOSTNAME + value: {{ .domain }} + - name: DISCOURSE_DEVELOPER_EMAILS + value: {{ .adminEmail }} + - name: DISCOURSE_SECRET_KEY_BASE + valueFrom: + secretKeyRef: + name: discourse-secrets + key: secretKeyBase + # SMTP configuration + - name: DISCOURSE_SMTP_ADDRESS + value: {{ .smtp.host }} + - name: DISCOURSE_SMTP_PORT + value: "{{ .smtp.port }}" + - name: DISCOURSE_SMTP_USER_NAME + value: {{ .smtp.user }} + - name: DISCOURSE_SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: discourse-secrets + key: smtpPassword + - name: DISCOURSE_SMTP_ENABLE_START_TLS + value: "{{ .smtp.startTls }}" + livenessProbe: + exec: + command: + - /bin/bash + - -c + - "pgrep -f sidekiq" + initialDelaySeconds: 500 + periodSeconds: 30 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + readinessProbe: + exec: + command: + - /bin/bash + - -c + - "pgrep -f sidekiq" + initialDelaySeconds: 180 + periodSeconds: 30 + timeoutSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + resources: + limits: + cpu: 1000m + ephemeral-storage: 2Gi + memory: 1Gi + requests: + cpu: 50m + ephemeral-storage: 50Mi + memory: 512Mi + volumeMounts: + - name: discourse-data + mountPath: /shared + volumes: + - name: discourse-data + persistentVolumeClaim: + claimName: discourse-data diff --git a/discourse/versions/2026/ingress.yaml b/discourse/versions/2026/ingress.yaml new file mode 100644 index 0000000..49b8961 --- /dev/null +++ b/discourse/versions/2026/ingress.yaml @@ -0,0 +1,20 @@ +--- +# Source: discourse/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: discourse + namespace: "{{ .namespace }}" +spec: + ingressClassName: traefik + rules: + - host: "{{ .domain }}" + http: + paths: + - path: / + pathType: ImplementationSpecific + backend: + service: + name: discourse + port: + name: http diff --git a/discourse/versions/2026/kustomization.yaml b/discourse/versions/2026/kustomization.yaml new file mode 100644 index 0000000..c33d2e2 --- /dev/null +++ b/discourse/versions/2026/kustomization.yaml @@ -0,0 +1,17 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: discourse +labels: + - includeSelectors: true + pairs: + app: discourse + managedBy: kustomize + partOf: wild-cloud +resources: + - namespace.yaml + - serviceaccount.yaml + - pvc.yaml + - deployment.yaml + - service.yaml + - ingress.yaml + - db-init-job.yaml diff --git a/discourse/versions/2026/manifest.yaml b/discourse/versions/2026/manifest.yaml new file mode 100644 index 0000000..b313757 --- /dev/null +++ b/discourse/versions/2026/manifest.yaml @@ -0,0 +1,39 @@ +version: 2026.10.0 +requires: +- name: postgres +- name: redis +- name: smtp +defaultConfig: + namespace: discourse + storage: 2Gi + adminEmail: '{{ .operator.email }}' + adminUsername: admin + siteName: Community + domain: discourse.{{ .cloud.domain }} + db: + host: '{{ .apps.postgres.host }}' + port: '{{ .apps.postgres.port }}' + name: discourse + user: discourse + redis: + host: '{{ .apps.redis.host }}' + smtp: + enabled: false + host: '{{ .apps.smtp.host }}' + port: '{{ .apps.smtp.port }}' + user: '{{ .apps.smtp.user }}' + from: '{{ .apps.smtp.from }}' + tls: '{{ .apps.smtp.tls }}' + startTls: '{{ .apps.smtp.startTls }}' +defaultSecrets: +- key: adminPassword +- key: secretKeyBase + default: '{{ random.Hex 32 }}' +- key: smtpPassword +- key: dbPassword +- key: dbUrl + default: postgres://{{ .app.db.user }}:{{ .secrets.dbPassword }}@{{ .app.db.host + }}:{{ .app.db.port }}/{{ .app.db.name }}?sslmode=disable +requiredSecrets: +- postgres.password +- redis.password diff --git a/discourse/versions/2026/namespace.yaml b/discourse/versions/2026/namespace.yaml new file mode 100644 index 0000000..b7816b8 --- /dev/null +++ b/discourse/versions/2026/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: "{{ .namespace }}" diff --git a/discourse/versions/2026/pvc.yaml b/discourse/versions/2026/pvc.yaml new file mode 100644 index 0000000..e3908a4 --- /dev/null +++ b/discourse/versions/2026/pvc.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: discourse-data + namespace: discourse +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .storage }} + storageClassName: longhorn diff --git a/discourse/versions/2026/service.yaml b/discourse/versions/2026/service.yaml new file mode 100644 index 0000000..5b8be2f --- /dev/null +++ b/discourse/versions/2026/service.yaml @@ -0,0 +1,18 @@ +--- +# Source: discourse/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: discourse + namespace: discourse +spec: + type: ClusterIP + sessionAffinity: None + ports: + - name: http + port: 80 + protocol: TCP + targetPort: http + nodePort: null + selector: + component: web diff --git a/discourse/versions/2026/serviceaccount.yaml b/discourse/versions/2026/serviceaccount.yaml new file mode 100644 index 0000000..86b8e63 --- /dev/null +++ b/discourse/versions/2026/serviceaccount.yaml @@ -0,0 +1,8 @@ +--- +# Source: discourse/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: discourse + namespace: discourse +automountServiceAccountToken: false diff --git a/externaldns/versions/v0/externaldns-cloudflare.yaml b/externaldns/versions/v0/externaldns-cloudflare.yaml index 312bc93..921e5a2 100644 --- a/externaldns/versions/v0/externaldns-cloudflare.yaml +++ b/externaldns/versions/v0/externaldns-cloudflare.yaml @@ -22,7 +22,7 @@ spec: type: RuntimeDefault containers: - name: external-dns - image: registry.k8s.io/external-dns/external-dns:v0.13.4 + image: registry.k8s.io/external-dns/external-dns:v0.23.0 args: - --source=service - --source=ingress diff --git a/externaldns/versions/v0/manifest.yaml b/externaldns/versions/v0/manifest.yaml index 7448330..126ecdf 100644 --- a/externaldns/versions/v0/manifest.yaml +++ b/externaldns/versions/v0/manifest.yaml @@ -1,4 +1,4 @@ -version: v0.13.4-6 +version: v0.23.0 deploymentName: external-dns requires: - name: cert-manager diff --git a/formbricks/app.yaml b/formbricks/app.yaml index 13616ca..06907c6 100644 --- a/formbricks/app.yaml +++ b/formbricks/app.yaml @@ -3,4 +3,4 @@ is: formbricks description: Formbricks is an open-source survey and form platform for collecting and analyzing user feedback. A self-hosted alternative to Typeform and SurveyMonkey. category: business icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/formbricks.svg -latest: "3" +latest: "6" diff --git a/formbricks/versions/6/README.md b/formbricks/versions/6/README.md new file mode 100644 index 0000000..d38cd02 --- /dev/null +++ b/formbricks/versions/6/README.md @@ -0,0 +1,36 @@ +# Formbricks + +Formbricks is an open-source survey and feedback platform for building in-app microsurveys, NPS scores, and user research forms. + +## Dependencies + +- **PostgreSQL** - Database for storing surveys and responses +- **Redis** - Used for caching and background jobs + +## Configuration + +Key settings in `config.yaml`: + +- **domain** - Where Formbricks will be accessible +- **storage** - Persistent volume size (default: `2Gi`) +- **db.name** - Database name (default: `formbricks`) + +## First-Time Setup + +1. Add and deploy the app: + ```bash + wild app add formbricks + wild app deploy formbricks + ``` + +2. Visit the app URL and sign up to create your admin account. + +3. The first user to sign up becomes the organization owner. + +4. Create your first survey from the dashboard and embed it in your apps using the provided JavaScript snippet. + +## Notes + +- Formbricks can be embedded in web apps or used as a standalone survey link +- The `nextauthSecret` and `encryptionKey` are auto-generated in `secrets.yaml` +- The `cronSecret` secures the internal cron endpoint used for scheduled tasks diff --git a/formbricks/versions/6/db-init-job.yaml b/formbricks/versions/6/db-init-job.yaml new file mode 100644 index 0000000..aeba824 --- /dev/null +++ b/formbricks/versions/6/db-init-job.yaml @@ -0,0 +1,61 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: formbricks-db-init + namespace: {{ .namespace }} +spec: + template: + spec: + securityContext: + runAsNonRoot: true + runAsUser: 999 + runAsGroup: 999 + seccompProfile: + type: RuntimeDefault + containers: + - name: db-init + image: postgres:17 + command: ["/bin/bash", "-c"] + args: + - | + PGPASSWORD=${POSTGRES_ADMIN_PASSWORD} psql -h ${DB_HOST} -U postgres <