Compare commits

..

18 Commits

Author SHA1 Message Date
Paul Payne
fc6308b090 Revert supabase Kong to 3.4.2 (3.9.3 has ada library issue on arm64) 2026-10-30 18:21:17 +00:00
Paul Payne
07e20bee59 Fix discourse, moodle, supabase upgrades
- discourse 2026.10.0: skip assets:precompile in init container
  (assets are pre-built in 2026.x images, no git repo present)
  Re-enable slot 2026 as latest
- moodle: migrate from bitnamilegacy/moodle (EOL Aug 2025) to
  oksigenia/moodle:4.5 (drop-in replacement, same env vars/volumes,
  weekly rebuilds with PHP patches)
- supabase: bump all 7 components to self-hosted v0.8.3 tags
  (studio, gotrue, postgrest, realtime, storage-api, postgres-meta, kong)
2026-10-30 18:19:19 +00:00
Paul Payne
a393db8bac Fix jitsi ghcr.io registry, fix keila tz writable volume
- jitsi: stable tags moved to ghcr.io/jitsi/* (no longer on Docker Hub)
- keila: mount emptyDir at /opt/app/lib/tz-0.28.2/priv so the tz
  library can write timezone data (TZ_AUTOUPDATE env var doesn't work,
  it's Elixir app config not env-driven)
2026-10-27 15:44:48 +00:00
Paul Payne
d31ab762f8 Bump bookwyrm, jitsi, librebooking, decidim
- bookwyrm: 0.8.6 -> 0.9.3 (deployment + worker)
- jitsi: all components to stable-11248-2 (web, jicofo, jvb, prosody)
- librebooking: 5.1.0 -> 7.1.0
- decidim: 0.31.0 -> 0.31.6 (patch bump, custom image)
2026-10-27 15:42:24 +00:00
Paul Payne
4d3bb5cbd7 Bump open-webui to v0.12.4 (clean install, test-cloud PVC wiped) 2026-10-27 15:40:51 +00:00
Paul Payne
eb20b458a6 Fix immich init: create .immich marker files in upload subdirs
Immich v3 folder checks require both the directories and .immich
marker files to exist in each upload subdirectory.
2026-10-26 16:29:02 +00:00
Paul Payne
80c0d6b0ac Fix zulip 12.x env vars, try open-webui v0.10.0 intermediate upgrade
- zulip: rename legacy env vars per 12.x migration guide
  (DB_HOST -> SETTING_REMOTE_POSTGRES_HOST, etc.)
  Remove DISABLE_HTTPS/SSL_CERTIFICATE_GENERATION (HTTP is default in 12.x)
  Re-enable slot 12 as latest
- open-webui: try v0.10.0 as intermediate step from v0.9.5
  (v0.12.4 had duplicate column migration error jumping from v0.9.5)
2026-10-26 16:26:43 +00:00
Paul Payne
9c87c0cb1e Fix immich fsGroup, keila tz autoupdate, revert open-webui
- immich: add fsGroup: 1000 so init container can write to PVC
- keila: set TZ_AUTOUPDATE=disabled to prevent tz library crash
  on read-only /opt/app/lib path in v0.30.3
- open-webui: revert to v0.9.5 — v0.12.x migration crashes on
  existing DB (duplicate column name: info_json)
2026-10-26 16:20:23 +00:00
Paul Payne
400fc7bbb1 Fix immich v3 storage dirs, revert discourse and zulip to previous slots
- immich: add init container to create required upload subdirectories
  (thumbs, upload, backups, library, profile, encoded-video) for v3
- discourse: revert to slot 3 (v3.5.3) — 2026.x image changed internal
  build system, needs full template rewrite to work as plain container
- zulip: revert to slot 9 (v9.4) — 12.x renamed all env vars
  (DB_HOST -> SETTING_REMOTE_POSTGRES_HOST, etc.), needs template rewrite
2026-10-26 16:18:39 +00:00
Paul Payne
15edd0cfca Fix gitea 28 and openproject 17 deployment issues
- gitea: use rootless image tag (28.2.0-rootless) since deployment
  runs as non-root UID 1000; standard tag uses s6-overlay requiring root
- openproject: add secretKeyBase secret and SECRET_KEY_BASE env var
  to web, worker, and seeder; v17 enforces non-default SECRET_KEY_BASE
2026-10-26 16:16:34 +00:00
Paul Payne
337a8ecc83 Fix image tags that failed to pull on test-cloud
- discourse: 2026.10.0 -> 2026.10.0-latest (correct tag format)
- formbricks: Docker Hub 6.1.0 -> ghcr.io 4.6.0 (moved to GHCR)
- zulip: Docker Hub 12.3-0 -> ghcr.io 12.3-0 (12.x on GHCR)
- open-webui: v0.12.3 -> v0.12.4 (newer release)
2026-10-26 16:11:41 +00:00
Paul Payne
ca9bdf823b Fix discourse random.Hex and add memcached port config
- discourse: replace random.Hex with random.AlphaNum (both slots)
- memcached: add port default config (needed by openproject)
2026-10-23 14:23:56 +00:00
Paul Payne
9fd046c378 Bump remaining apps: major version slots and infrastructure
New version slots (major version jumps):
- gitea: 1.24.3 -> 28.2.0 (slot 1 -> 28)
- ghost: 5.130.6 -> 6.72.0 (slot 5 -> 6)
- formbricks: 3.6.0 -> 6.1.0 (slot 3 -> 6)
- mattermost: 10.8.1 -> 12.0.1 (slot 10 -> 12)
- zulip: 9.4 -> 12.3 (slot 9 -> 12)
- immich: 1.135.3 -> 3.3.5 (slot 1 -> 3)
- openproject: 16.1.1 -> 17.9.3 (slot 16 -> 17)
- listmonk: 5.0.3 -> 6.1.0 (slot 5 -> 6)
- discourse: 3.5.3 -> 2026.10.0 (slot 3 -> 2026, calver)

Same-slot large bumps:
- vllm: 0.9.2 -> 0.32.0
- longhorn: v1.8.1 -> v1.13.0

Infrastructure:
- cert-manager: v1.17.2 -> v1.21.2
- coredns: v1.12.0 -> v1.14.7
- externaldns: v0.13.4 -> v0.23.0
- metallb: v0.15.0 -> v0.16.1
- mysql: 9.1.0 -> 9.7.4
- node-feature-discovery: v0.17.3 -> v0.20.1
- nvidia-device-plugin: v0.17.1 -> v0.20.1
2026-10-23 14:18:48 +00:00
Paul Payne
e25b07126c Bump 33 apps to latest upstream versions
Patch/minor bumps:
- akaunting: 3.1.21 -> 3.2.3
- aptly: 1.6.2 -> 1.6.3
- baserow: 2.2.2 -> 2.4.1
- crowdsec: v1.7.8 -> v1.8.1
- docker-registry: 3.0.0 -> 3.1.2
- etherpad: 2.2.7 -> 2.6.1
- headlamp: v0.42.0 -> v0.46.0
- headscale: 0.29.1 -> 0.29.5
- indico: 3.3.12 -> 3.3.14
- karrot: v17.4.1 -> v17.4.2
- keila: 0.17.1 -> 0.30.3
- lemmy: 0.19.15 -> 0.19.19
- loomio: 3.0.24 -> 3.12.0
- mastodon: 4.5.3 -> 4.7.3
- mautic: 7.1.2 -> 7.2.1
- memcached: 1.6.32 -> 1.6.45
- mobilizon: 5.2.3 -> 5.2.4
- nocodb: 2026.04.1 -> 2026.09.1
- open-webui: 0.9.5 -> 0.12.3
- outline: 1.8.1 -> 1.11.0
- peertube: 8.2.1 -> 8.2.4
- pixelfed: 0.12.7 -> 0.15.1
- pretix: 2026.5.1 -> 2026.8.0
- synapse: v1.144.0 -> v1.163.0
- traefik: v3.4.1 -> v3.7.16
- typebot: 3.17.1 -> 3.19.1
- vaultwarden: 1.37.1 -> 1.37.4
- writefreely: 0.15.1 -> 0.17.2

Multi-file updates for apps with workers/sidekiq/streaming:
- mastodon (5 files), indico (3 files), karrot (4 files),
  lemmy (2 files), loomio (2 files), typebot (2 files),
  pixelfed (2 files), synapse (2 refs), pretix (2 refs),
  aptly (2 refs)
2026-10-23 14:02:09 +00:00
Paul Payne
9eaeeb9d7a Fix manifest versions: drop revision suffix on upstream bumps
Per ADDING-APPS.md, revision resets (no suffix) when upstream version changes.
2026-10-23 13:52:14 +00:00
Paul Payne
ef2c7ea8b3 Bump 5 PHP apps to upstream images patched for PHP2Shell (CVE-2026-109618, CVE-2026-109619)
- nextcloud: 34.0.0 -> 34.0.5 (PHP 8.5.12)
- mediawiki: 1.43.1 -> 1.43.11 (PHP 8.3.36)
- firefly-iii: 6.6.3 -> 6.7.7 (PHP 8.5.12)
- bookstack: 26.05.1 -> 26.09.2 (PHP patched)
- limesurvey: 6.17.5 -> 6.17.18 (PHP 8.4.27)
2026-10-23 13:47:15 +00:00
Paul Payne
a57d521257 Update vaultwarden to 1.37.1 for Bitwarden client 2026.7.0+ compatibility 2026-08-03 00:36:48 +00:00
Paul Payne
7d1cae481b Update CLI references from wild to wildcloud 2026-08-01 23:00:44 +00:00
223 changed files with 3831 additions and 156 deletions

View File

@@ -19,11 +19,11 @@ These sources will oftentimes not use the latest version. Check to make sure you
## App package development lifecycle
- when developing a new app, test on the `test-cloud` instance in the `/home/payne/repos/wild-cloud-dev/wild-cloud-redmond-data` wild data dir. Prefer the `wild` CLI for managing app lifecycle as it takes care of copying and compiling kustomize templates. Example commands:
- `wild instance use test-cloud`
- `wild app add <app>`
- `wild app deploy <app>`
- `wild app delete`
- when developing a new app, test on the `test-cloud` instance in the `/home/payne/repos/wild-cloud-dev/wild-cloud-redmond-data` wild data dir. Prefer the `wildcloud` CLI for managing app lifecycle as it takes care of copying and compiling kustomize templates. Example commands:
- `wildcloud instance use test-cloud`
- `wildcloud app add <app>`
- `wildcloud app deploy <app>`
- `wildcloud app delete`
- But you can always use `kubectl` directly. Just make sure you use the `test-cloud` `kubeconfig` and, when applying resources, use the `-k` flag so kustomize templates get copied.
- kubectl --kubeconfig=/home/payne/repos/wild-cloud-redmond-data/instances/test-cloud/kubeconfig get pods -n <app>
- While we test in `/home/payne/repos/wild-cloud-dev/wild-cloud-redmond-data/instances/test-cloud`, the final product (our app package) must be in `/home/payne/repos/wild-cloud-dev/wild-directory`. Always make sure that, in the end, whatever is in `wild-directory` can be deployed into `test-cloud`.

View File

@@ -31,29 +31,29 @@ The easiest way to manage apps is through the Wild Cloud web app:
### CLI
For terminal-based workflows, use the Wild CLI:
For terminal-based workflows, use the Wild Cloud CLI:
```bash
# List available apps
wild app list
wildcloud app list
# Add app to instance
wild app add <app-name>
wildcloud app add <app-name>
# Deploy app
wild app deploy <app-name>
wildcloud app deploy <app-name>
# List deployed apps
wild app list-deployed
wildcloud app list-deployed
# Get app status
wild app status <app-name>
wildcloud app status <app-name>
# Delete app
wild app delete <app-name>
wildcloud app delete <app-name>
```
The CLI connects to the Wild Central API (default: `http://localhost:5055`). You can override with `--daemon-url` or set `WILD_API_URI` environment variable.
The CLI connects to the Wild Cloud API (default: `http://localhost:5056`). You can override with `--daemon-url` or set `WILD_API_URI` environment variable.
### API

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: akaunting
image: akaunting/akaunting:3.1.21
image: akaunting/akaunting:3.2.3
ports:
- name: http
containerPort: 80

View File

@@ -1,4 +1,4 @@
version: 3.1.21-2
version: 3.2.3
requires:
- name: mysql
- name: smtp

View File

@@ -19,7 +19,7 @@ spec:
type: RuntimeDefault
initContainers:
- name: init-gpg
image: urpylka/aptly:1.6.2
image: urpylka/aptly:1.6.3
command:
- sh
- -c
@@ -61,7 +61,7 @@ spec:
mountPath: /opt/aptly
containers:
- name: aptly
image: urpylka/aptly:1.6.2
image: urpylka/aptly:1.6.3
ports:
- containerPort: 80
name: http

View File

@@ -1,4 +1,4 @@
version: 1.6.2-4
version: 1.6.3
defaultConfig:
namespace: aptly
domain: aptly.{{ .cloud.domain }}

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: baserow
image: baserow/baserow:2.2.2
image: baserow/baserow:2.4.1
ports:
- name: http
containerPort: 80

View File

@@ -1,4 +1,4 @@
version: 2.2.2-3
version: 2.4.1
requires:
- name: postgres
- name: redis

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: bookstack
image: lscr.io/linuxserver/bookstack:26.05.1
image: lscr.io/linuxserver/bookstack:26.09.2
ports:
- name: http
containerPort: 80

View File

@@ -1,4 +1,4 @@
version: 26.05.1-3
version: 26.09.2
requires:
- name: mysql
- name: smtp

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: celery-worker
image: ghcr.io/bookwyrm-social/bookwyrm:v0.8.6
image: ghcr.io/bookwyrm-social/bookwyrm:v0.9.3
command:
- celery
- -A

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: bookwyrm
image: ghcr.io/bookwyrm-social/bookwyrm:v0.8.6
image: ghcr.io/bookwyrm-social/bookwyrm:v0.9.3
command: ["/bin/sh", "-c", "python manage.py compile_themes && python manage.py collectstatic --noinput && python manage.py migrate && exec gunicorn bookwyrm.wsgi:application"]
ports:
- name: http

View File

@@ -1,4 +1,4 @@
version: 0.8.7-2
version: 0.9.3
requires:
- name: postgres
- name: redis

View File

@@ -1,4 +1,4 @@
version: v1.17.2-1
version: v1.21.2
requires:
- name: traefik
defaultConfig:

View File

@@ -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

View File

@@ -1,4 +1,4 @@
version: v1.12.0-1
version: v1.14.7
requires:
- name: metallb
defaultConfig:

View File

@@ -41,7 +41,7 @@ spec:
type: RuntimeDefault
containers:
- name: crowdsec
image: crowdsecurity/crowdsec:v1.7.8
image: crowdsecurity/crowdsec:v1.8.1
env:
- name: COLLECTIONS
value: "crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors crowdsecurity/iptables crowdsecurity/linux"

View File

@@ -1,4 +1,4 @@
version: v1.7.8-4
version: v1.8.1
requires:
- name: longhorn
- name: traefik

View File

@@ -23,7 +23,7 @@ spec:
fsGroupChangePolicy: Always
containers:
- name: decidim
image: payneio/decidim-sidekiq:0.31.0
image: payneio/decidim-sidekiq:0.31.6
imagePullPolicy: Always
command:
- /bin/bash
@@ -143,7 +143,7 @@ spec:
- name: decidim-data
mountPath: /code/public/uploads
- name: sidekiq
image: payneio/decidim-sidekiq:0.31.0
image: payneio/decidim-sidekiq:0.31.6
imagePullPolicy: Always
command:
- /bin/bash

View File

@@ -1,4 +1,4 @@
version: 0.31.0-4
version: 0.31.6
requires:
- name: postgres
- name: redis

View File

@@ -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"

View File

@@ -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

View File

@@ -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."

View File

@@ -0,0 +1,302 @@
---
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-latest
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
bundle exec rake db:migrate
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-latest
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-latest
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

View File

@@ -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

View File

@@ -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

View File

@@ -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.AlphaNum 64 }}'
- 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

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: "{{ .namespace }}"

View File

@@ -0,0 +1,13 @@
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: discourse-data
namespace: discourse
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .storage }}
storageClassName: longhorn

View File

@@ -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

View File

@@ -0,0 +1,8 @@
---
# Source: discourse/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: discourse
namespace: discourse
automountServiceAccountToken: false

View File

@@ -28,7 +28,7 @@ defaultConfig:
defaultSecrets:
- key: adminPassword
- key: secretKeyBase
default: '{{ random.Hex 32 }}'
default: '{{ random.AlphaNum 64 }}'
- key: smtpPassword
- key: dbPassword
- key: dbUrl

View File

@@ -25,7 +25,7 @@ spec:
seccompProfile:
type: RuntimeDefault
containers:
- image: registry:3.0.0
- image: registry:3.1.2
name: docker-registry
securityContext:
allowPrivilegeEscalation: false

View File

@@ -1,4 +1,4 @@
version: 3.0.0-2
version: 3.1.2
defaultConfig:
namespace: docker-registry
host: registry.{{ .cloud.internalDomain }}

View File

@@ -24,7 +24,7 @@ spec:
type: RuntimeDefault
containers:
- name: etherpad
image: etherpad/etherpad:2.2.7
image: etherpad/etherpad:2.6.1
ports:
- name: http
containerPort: 9001

View File

@@ -1,4 +1,4 @@
version: 2.2.7-2
version: 2.6.1
requires:
- name: postgres
defaultConfig:

View File

@@ -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

View File

@@ -1,4 +1,4 @@
version: v0.13.4-6
version: v0.23.0
deploymentName: external-dns
requires:
- name: cert-manager

View File

@@ -20,7 +20,7 @@ spec:
type: RuntimeDefault
containers:
- name: firefly-iii
image: fireflyiii/core:version-6.6.3
image: fireflyiii/core:version-6.7.7
ports:
- name: http
containerPort: 8080

View File

@@ -1,4 +1,4 @@
version: 6.6.3-2
version: 6.7.7
requires:
- name: postgres
defaultConfig:

View File

@@ -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"

View File

@@ -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

View File

@@ -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 <<EOF
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '${DB_USER}') THEN
CREATE USER ${DB_USER} WITH ENCRYPTED PASSWORD '${DB_PASSWORD}';
ELSE
ALTER USER ${DB_USER} WITH ENCRYPTED PASSWORD '${DB_PASSWORD}';
END IF;
END
\$\$;
SELECT 'CREATE DATABASE ${DB_NAME}' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DB_NAME}')\gexec
ALTER DATABASE ${DB_NAME} OWNER TO ${DB_USER};
GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} TO ${DB_USER};
EOF
PGPASSWORD=${POSTGRES_ADMIN_PASSWORD} psql -h ${DB_HOST} -U postgres -d ${DB_NAME} -c "GRANT ALL ON SCHEMA public TO ${DB_USER};"
PGPASSWORD=${POSTGRES_ADMIN_PASSWORD} psql -h ${DB_HOST} -U postgres -d ${DB_NAME} -c "CREATE EXTENSION IF NOT EXISTS vector;"
env:
- name: POSTGRES_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: formbricks-secrets
key: postgres.password
- name: DB_HOST
value: "{{ .db.host }}"
- name: DB_NAME
value: "{{ .db.name }}"
- name: DB_USER
value: "{{ .db.user }}"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: formbricks-secrets
key: dbPassword
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
restartPolicy: OnFailure

View File

@@ -0,0 +1,102 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: formbricks
namespace: {{ .namespace }}
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
component: web
template:
metadata:
labels:
component: web
spec:
securityContext:
runAsNonRoot: false
runAsUser: 0
seccompProfile:
type: RuntimeDefault
containers:
- name: formbricks
image: ghcr.io/formbricks/formbricks:4.6.0
ports:
- name: http
containerPort: 3000
protocol: TCP
env:
- name: NODE_OPTIONS
value: "--max-old-space-size=768"
- name: WEBAPP_URL
value: "https://{{ .domain }}"
- name: NEXTAUTH_URL
value: "https://{{ .domain }}"
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: formbricks-secrets
key: dbUrl
- name: NEXTAUTH_SECRET
valueFrom:
secretKeyRef:
name: formbricks-secrets
key: nextauthSecret
- name: ENCRYPTION_KEY
valueFrom:
secretKeyRef:
name: formbricks-secrets
key: encryptionKey
- name: CRON_SECRET
valueFrom:
secretKeyRef:
name: formbricks-secrets
key: cronSecret
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: formbricks-secrets
key: redis.password
- name: REDIS_URL
value: "redis://:$(REDIS_PASSWORD)@{{ .redis.host }}:6379"
- name: EMAIL_VERIFICATION_DISABLED
value: "1"
- name: PASSWORD_RESET_DISABLED
value: "1"
resources:
limits:
cpu: "1"
ephemeral-storage: 1Gi
memory: 1Gi
requests:
cpu: 50m
ephemeral-storage: 50Mi
memory: 256Mi
volumeMounts:
- name: formbricks-uploads
mountPath: /home/nextjs/apps/web/uploads
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 90
timeoutSeconds: 5
periodSeconds: 15
failureThreshold: 6
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 60
timeoutSeconds: 3
periodSeconds: 10
failureThreshold: 3
securityContext:
readOnlyRootFilesystem: false
volumes:
- name: formbricks-uploads
persistentVolumeClaim:
claimName: formbricks-uploads
restartPolicy: Always

View File

@@ -0,0 +1,18 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: formbricks
namespace: {{ .namespace }}
spec:
ingressClassName: traefik
rules:
- host: {{ .domain }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: formbricks
port:
number: 80

View File

@@ -0,0 +1,16 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: {{ .namespace }}
labels:
- includeSelectors: true
pairs:
app: formbricks
managedBy: kustomize
partOf: wild-cloud
resources:
- namespace.yaml
- deployment.yaml
- service.yaml
- ingress.yaml
- pvc.yaml
- db-init-job.yaml

View File

@@ -0,0 +1,26 @@
version: 4.6.0
requires:
- name: postgres
- name: redis
defaultConfig:
namespace: formbricks
domain: formbricks.{{ .cloud.domain }}
storage: 2Gi
db:
host: '{{ .apps.postgres.host }}'
port: '{{ .apps.postgres.port }}'
name: formbricks
user: formbricks
redis:
host: '{{ .apps.redis.host }}'
defaultSecrets:
- key: dbPassword
- key: dbUrl
default: postgresql://{{ .app.db.user }}:{{ .secrets.dbPassword }}@{{ .app.db.host
}}:{{ .app.db.port }}/{{ .app.db.name }}?sslmode=disable
- key: nextauthSecret
- key: encryptionKey
- key: cronSecret
requiredSecrets:
- postgres.password
- redis.password

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: {{ .namespace }}

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: formbricks-uploads
namespace: {{ .namespace }}
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .storage }}

View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: formbricks
namespace: {{ .namespace }}
spec:
selector:
component: web
ports:
- name: http
port: 80
targetPort: 3000
protocol: TCP

View File

@@ -3,4 +3,4 @@ is: ghost
description: Ghost is a powerful app for new-media creators to publish, share, and grow a business around their content.
category: social
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/ghost.png
latest: "5"
latest: "6"

View File

@@ -0,0 +1,33 @@
# Ghost
Ghost is a powerful app for new-media creators to publish, share, and grow a business around their content. It provides a clean writing experience with built-in membership and subscription features.
## Dependencies
- **MySQL** - Database for storing content and configuration
## Configuration
Key settings configured through your instance's `config.yaml`:
- **domain** - Where Ghost will be accessible (default: `ghost.{your-cloud-domain}`)
- **blogTitle** - Your blog's title (default: `My Blog`)
- **adminEmail** - Admin account email (defaults to your operator email)
- **storage** - Persistent volume size for content (default: `10Gi`)
- **SMTP** - Email delivery settings inherited from your Wild Cloud instance
## Access
After deployment, Ghost will be available at:
- `https://ghost.{your-cloud-domain}` - Public blog
- `https://ghost.{your-cloud-domain}/ghost` - Admin panel
## First-Time Setup
1. Add and deploy the app:
```bash
wild app add ghost
wild app deploy ghost
```
2. Navigate to the admin panel and create your first post

View File

@@ -0,0 +1,45 @@
apiVersion: batch/v1
kind: Job
metadata:
name: ghost-db-init
labels:
component: db-init
spec:
template:
metadata:
labels:
component: db-init
spec:
containers:
- name: db-init
image: mysql:9.1.0
command: ["/bin/bash", "-c"]
args:
- |
mysql -h ${DB_HOSTNAME} -P ${DB_PORT} -u root -p${MYSQL_ROOT_PASSWORD} <<EOF
CREATE DATABASE IF NOT EXISTS ${DB_DATABASE_NAME};
CREATE USER IF NOT EXISTS '${DB_USERNAME}'@'%' IDENTIFIED BY '${DB_PASSWORD}';
ALTER USER '${DB_USERNAME}'@'%' IDENTIFIED BY '${DB_PASSWORD}';
GRANT ALL PRIVILEGES ON ${DB_DATABASE_NAME}.* TO '${DB_USERNAME}'@'%';
FLUSH PRIVILEGES;
EOF
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: ghost-secrets
key: mysql.rootPassword
- name: DB_HOSTNAME
value: "{{ .db.host }}"
- name: DB_PORT
value: "{{ .db.port }}"
- name: DB_DATABASE_NAME
value: "{{ .db.name }}"
- name: DB_USERNAME
value: "{{ .db.user }}"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: ghost-secrets
key: dbPassword
restartPolicy: OnFailure

View File

@@ -0,0 +1,105 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: ghost
namespace: {{ .namespace }}
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
component: web
template:
metadata:
labels:
component: web
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: ghost
image: ghost:6.72.0-alpine
ports:
- name: http
containerPort: 2368
protocol: TCP
env:
- name: NODE_ENV
value: production
- name: url
value: "https://{{ .domain }}"
- name: database__client
value: mysql
- name: database__connection__host
value: "{{ .db.host }}"
- name: database__connection__port
value: "{{ .db.port }}"
- name: database__connection__database
value: "{{ .db.name }}"
- name: database__connection__user
value: "{{ .db.user }}"
- name: database__connection__password
valueFrom:
secretKeyRef:
name: ghost-secrets
key: dbPassword
- name: mail__transport
value: SMTP
- name: mail__options__host
value: "{{ .smtp.host }}"
- name: mail__options__port
value: "{{ .smtp.port }}"
- name: mail__options__auth__user
value: "{{ .smtp.user }}"
- name: mail__options__auth__pass
valueFrom:
secretKeyRef:
name: ghost-secrets
key: smtpPassword
- name: mail__from
value: "{{ .smtp.from }}"
resources:
limits:
cpu: 1000m
ephemeral-storage: 2Gi
memory: 512Mi
requests:
cpu: 50m
ephemeral-storage: 50Mi
memory: 256Mi
volumeMounts:
- name: ghost-data
mountPath: /var/lib/ghost/content
livenessProbe:
httpGet:
path: /ghost/api/admin/site/
port: 2368
initialDelaySeconds: 120
timeoutSeconds: 5
periodSeconds: 30
failureThreshold: 6
readinessProbe:
httpGet:
path: /ghost/api/admin/site/
port: 2368
initialDelaySeconds: 60
timeoutSeconds: 5
periodSeconds: 15
failureThreshold: 3
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: false
volumes:
- name: ghost-data
persistentVolumeClaim:
claimName: ghost-data
restartPolicy: Always

View File

@@ -0,0 +1,18 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ghost
namespace: ghost
spec:
ingressClassName: traefik
rules:
- host: {{ .domain }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ghost
port:
number: 80

View File

@@ -0,0 +1,16 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ghost
labels:
- includeSelectors: true
pairs:
app: ghost
managedBy: kustomize
partOf: wild-cloud
resources:
- namespace.yaml
- db-init-job.yaml
- deployment.yaml
- service.yaml
- ingress.yaml
- pvc.yaml

View File

@@ -0,0 +1,23 @@
version: 6.72.0
requires:
- name: mysql
- name: smtp
defaultConfig:
namespace: ghost
domain: ghost.{{ .cloud.domain }}
storage: 2Gi
db:
host: '{{ .apps.mysql.host }}'
port: '3306'
name: ghost
user: ghost
smtp:
host: '{{ .apps.smtp.host }}'
port: '{{ .apps.smtp.port }}'
from: '{{ .apps.smtp.from }}'
user: '{{ .apps.smtp.user }}'
defaultSecrets:
- key: dbPassword
- key: smtpPassword
requiredSecrets:
- mysql.rootPassword

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: "{{ .namespace }}"

11
ghost/versions/6/pvc.yaml Normal file
View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ghost-data
namespace: ghost
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .storage }}

View File

@@ -0,0 +1,14 @@
apiVersion: v1
kind: Service
metadata:
name: ghost
namespace: ghost
spec:
type: ClusterIP
ports:
- name: http
port: 80
protocol: TCP
targetPort: 2368
selector:
component: web

View File

@@ -3,4 +3,4 @@ is: gitea
description: Gitea is a painless self-hosted Git service written in Go
category: developer
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg
latest: "1"
latest: "28"

View File

@@ -0,0 +1,85 @@
# Gitea Configuration
This Gitea deployment uses a hybrid configuration approach combining environment variables with Gitea's self-managed configuration file.
## Configuration Architecture
### Environment Variables (gitea.env)
Non-secret configuration is stored in `gitea.env` and automatically loaded via kustomize's `configMapGenerator`. This includes:
- Server settings (domain, URLs, ports)
- Database connection details (except password)
- SMTP settings (except password)
- Service settings (registration, notifications)
- Repository and storage paths
### Kubernetes Secrets (gitea-secrets)
Sensitive configuration is stored in the `gitea-secrets` secret and managed by the wild-cloud deployment system:
- `adminPassword` - Gitea admin user password
- `secretKey` - Application secret key
- `jwtSecret` - JWT signing secret
- `dbPassword` - Database password
- `smtpPassword` - SMTP authentication password
Secrets are defined in `secrets.yaml` and listed in `manifest.yaml` under `defaultSecrets`. When deploying, the system automatically ensures all required secrets exist in the `gitea-secrets` secret before deployment.
### Persistent Configuration (app.ini)
Gitea manages its own `app.ini` file on persistent storage for:
- Generated security tokens
- Runtime configuration changes made via web UI
- Database migration state
- User-modified settings
## How It Works
1. **Startup**: Kustomize generates a ConfigMap from `gitea.env`
2. **Environment Loading**: Pod loads non-secret config from ConfigMap via `envFrom`
3. **Secret Loading**: Pod loads sensitive config from Kubernetes secrets via `env`
4. **Configuration Merge**: Gitea's environment-to-ini process merges environment variables into `app.ini`
5. **Persistence**: Gitea writes the merged configuration plus generated tokens to persistent storage
## Making Configuration Changes
### Non-Secret Settings
1. Edit `gitea.env` with your changes
2. Deploy the app via the web app, CLI, or API to apply changes
3. Pod will restart and pick up new configuration
### Secret Settings
1. Edit `secrets.yaml` with your secret values
2. Ensure the secret key is listed in `manifest.yaml` under `defaultSecrets`
3. Deploy the app via the web app, CLI, or API - this will automatically update the `gitea-secrets` secret and restart the pod
### Web UI Changes
Configuration changes made through Gitea's admin web interface are automatically persisted to the `app.ini` file on persistent storage and will survive pod restarts.
## Configuration Precedence
1. **Kubernetes Secrets** (highest priority)
2. **Environment Variables** (from gitea.env)
3. **Persistent app.ini** (lowest priority)
Environment variables override file settings, and secrets override everything.
## Troubleshooting
### Check Current Configuration
```bash
# View environment variables
kubectl describe pod -n gitea -l app=gitea | grep -A 20 "Environment"
# View current app.ini
kubectl exec -it deployment/gitea -n gitea -- cat /data/gitea/conf/app.ini
```
### Configuration Not Applied
- Verify the ConfigMap was generated: `kubectl get configmap -n gitea`
- Check pod restart: `kubectl get pods -n gitea`
- Review startup logs: `kubectl logs -n gitea -l app=gitea`
## External Dependencies
- **Database**: PostgreSQL instance in `postgres` namespace
- **Storage**: Longhorn distributed storage
- **Ingress**: Traefik with Let's Encrypt certificates
- **DNS**: External-DNS with Cloudflare integration

View File

@@ -0,0 +1,51 @@
apiVersion: batch/v1
kind: Job
metadata:
name: gitea-db-init
labels:
component: db-init
spec:
template:
metadata:
labels:
component: db-init
spec:
containers:
- name: db-init
image: postgres:17
command: ["/bin/bash", "-c"]
args:
- |
PGPASSWORD=${POSTGRES_ADMIN_PASSWORD} psql -h ${DB_HOSTNAME} -U postgres <<EOF
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '${DB_USERNAME}') THEN
CREATE USER ${DB_USERNAME} WITH ENCRYPTED PASSWORD '${DB_PASSWORD}';
ELSE
ALTER USER ${DB_USERNAME} WITH ENCRYPTED PASSWORD '${DB_PASSWORD}';
END IF;
END
\$\$;
SELECT 'CREATE DATABASE ${DB_DATABASE_NAME}' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DB_DATABASE_NAME}')\gexec
ALTER DATABASE ${DB_DATABASE_NAME} OWNER TO ${DB_USERNAME};
GRANT ALL PRIVILEGES ON DATABASE ${DB_DATABASE_NAME} TO ${DB_USERNAME};
EOF
env:
- name: POSTGRES_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secrets
key: password
- name: DB_HOSTNAME
value: "{{ .db.host }}"
- name: DB_DATABASE_NAME
value: "{{ .db.name }}"
- name: DB_USERNAME
value: "{{ .db.user }}"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: gitea-secrets
key: dbPassword
restartPolicy: OnFailure

View File

@@ -0,0 +1,99 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitea
namespace: gitea
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
component: web
template:
metadata:
labels:
app: gitea
component: web
managedBy: kustomize
partOf: wild-cloud
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
terminationGracePeriodSeconds: 60
containers:
- name: gitea
image: "gitea/gitea:28.2.0-rootless"
imagePullPolicy: IfNotPresent
envFrom:
- configMapRef:
name: gitea-env
env:
- name: GITEA_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: gitea-secrets
key: adminPassword
- name: GITEA__security__SECRET_KEY
valueFrom:
secretKeyRef:
name: gitea-secrets
key: secretKey
- name: GITEA__security__INTERNAL_TOKEN
valueFrom:
secretKeyRef:
name: gitea-secrets
key: jwtSecret
- name: GITEA__database__PASSWD
valueFrom:
secretKeyRef:
name: gitea-secrets
key: dbPassword
- name: GITEA__mailer__PASSWD
valueFrom:
secretKeyRef:
name: gitea-secrets
key: smtpPassword
ports:
- name: ssh
containerPort: 2222
- name: http
containerPort: 3000
livenessProbe:
failureThreshold: 10
initialDelaySeconds: 200
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: http
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: http
timeoutSeconds: 1
resources:
{}
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
readOnlyRootFilesystem: false
volumeMounts:
- name: temp
mountPath: /tmp
- name: data
mountPath: /data
volumes:
- name: temp
emptyDir: {}
- name: data
persistentVolumeClaim:
claimName: gitea-data

View File

@@ -0,0 +1,60 @@
SSH_LISTEN_PORT=2222
SSH_PORT=22
GITEA_WORK_DIR=/data
GITEA_TEMP=/tmp/gitea
TMPDIR=/tmp/gitea
GITEA_ADMIN_USERNAME={{ .adminUser }}
GITEA_ADMIN_PASSWORD_MODE=keepUpdated
# Core app settings
GITEA____APP_NAME={{ .appName }}
GITEA____RUN_MODE=prod
GITEA____RUN_USER=git
# Security settings
GITEA__security__INSTALL_LOCK=true
GITEA__security__PASSWORD_HASH_ALGO=pbkdf2
# Database settings (except password which comes from secret)
GITEA__database__DB_TYPE=postgres
GITEA__database__HOST={{ .db.host }}:{{ .db.port }}
GITEA__database__NAME={{ .db.name }}
GITEA__database__USER={{ .db.user }}
GITEA__database__SSL_MODE=disable
GITEA__database__LOG_SQL=false
# Server settings
GITEA__server__DOMAIN={{ .domain }}
GITEA__server__HTTP_PORT=3000
GITEA__server__ROOT_URL=https://{{ .domain }}/
GITEA__server__DISABLE_SSH=false
GITEA__server__SSH_DOMAIN={{ .domain }}
GITEA__server__SSH_PORT=22
GITEA__server__SSH_LISTEN_PORT=2222
GITEA__server__LFS_START_SERVER=true
GITEA__server__OFFLINE_MODE=true
# Service settings
GITEA__service__REGISTER_EMAIL_CONFIRM=true
GITEA__service__DISABLE_REGISTRATION=false
GITEA__service__ALLOW_ONLY_EXTERNAL_REGISTRATION=false
GITEA__service__ENABLE_NOTIFY_MAIL=true
GITEA__service__ENABLE_BASIC_AUTHENTICATION=false
GITEA__service__ENABLE_REVERSE_PROXY_AUTHENTICATION=false
GITEA__service__ENABLE_CAPTCHA=false
GITEA__service__REQUIRE_SIGNIN_VIEW=false
GITEA__service__DEFAULT_KEEP_EMAIL_PRIVATE=false
GITEA__service__DEFAULT_ALLOW_CREATE_ORGANIZATION=true
GITEA__service__DEFAULT_ENABLE_TIMETRACKING=true
GITEA__service__NO_REPLY_ADDRESS=noreply.localhost
# Webhook settings
GITEA__webhook__ALLOWED_HOST_LIST=*
# Mailer settings (enabled via env vars, password from secret)
GITEA__mailer__ENABLED=true
GITEA__mailer__SMTP_ADDR={{ .smtp.host }}
GITEA__mailer__SMTP_PORT={{ .smtp.port }}
GITEA__mailer__FROM={{ .smtp.from }}
GITEA__mailer__USER={{ .smtp.user }}

View File

@@ -0,0 +1,18 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gitea-public
namespace: gitea
spec:
ingressClassName: traefik
rules:
- host: "{{ .domain }}"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: gitea-http
port:
number: 3000

View File

@@ -0,0 +1,20 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: gitea
labels:
- includeSelectors: true
pairs:
app: gitea
managedBy: kustomize
partOf: wild-cloud
resources:
- namespace.yaml
- deployment.yaml
- service.yaml
- ingress.yaml
- pvc.yaml
- db-init-job.yaml
configMapGenerator:
- name: gitea-env
envs:
- gitea.env

View File

@@ -0,0 +1,29 @@
version: 28.2.0
requires:
- name: postgres
- name: smtp
defaultConfig:
namespace: gitea
appName: Gitea
domain: gitea.{{ .cloud.domain }}
storage: 2Gi
adminUser: admin
adminEmail: '{{ .operator.email }}'
db:
name: gitea
user: gitea
host: '{{ .apps.postgres.host }}'
port: '{{ .apps.postgres.port }}'
smtp:
host: '{{ .apps.smtp.host }}'
port: '{{ .apps.smtp.port }}'
user: '{{ .apps.smtp.user }}'
from: '{{ .apps.smtp.from }}'
defaultSecrets:
- key: adminPassword
- key: dbPassword
- key: secretKey
- key: jwtSecret
- key: smtpPassword
requiredSecrets:
- postgres.password

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: "{{ .namespace }}"

View File

@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitea-data
namespace: gitea
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: "{{ .storage }}"

View File

@@ -0,0 +1,28 @@
apiVersion: v1
kind: Service
metadata:
name: gitea-http
namespace: gitea
spec:
type: ClusterIP
ports:
- name: http
port: 3000
targetPort: 3000
selector:
component: web
---
apiVersion: v1
kind: Service
metadata:
name: gitea-ssh
namespace: gitea
spec:
type: LoadBalancer
ports:
- name: ssh
port: 22
targetPort: 2222
protocol: TCP
selector:
component: web

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: headlamp
image: ghcr.io/headlamp-k8s/headlamp:v0.42.0
image: ghcr.io/headlamp-k8s/headlamp:v0.46.0
args:
- "-in-cluster"
- "-plugins-dir=/headlamp/plugins"

View File

@@ -1,4 +1,4 @@
version: v0.42.0-1
version: v0.46.0
defaultConfig:
namespace: headlamp
internalDomain: '{{ .cloud.internalDomain }}'

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: headscale
image: headscale/headscale:v0.29.1
image: headscale/headscale:v0.29.5
args: ["serve"]
ports:
- name: http

View File

@@ -1,4 +1,4 @@
version: 0.29.1-2
version: 0.29.5
scripts:
- name: register-node
description: Register a Tailscale node using the auth ID shown in the Tailscale

View File

@@ -3,4 +3,4 @@ is: immich
description: Immich is a self-hosted photo and video backup solution that allows you to store, manage, and share your media files securely.
category: media
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg
latest: "1"
latest: "3"

View File

@@ -0,0 +1,41 @@
# Immich
Immich is a self-hosted photo and video backup solution that allows you to store, manage, and share your media files securely. It provides a mobile-first experience similar to Google Photos.
## Dependencies
- **PostgreSQL** - Database for storing metadata and search indexes
- **Redis** - Used for caching and background job queuing
## Components
Immich runs two services:
- **Server** - Main API and web server
- **Machine Learning** - Handles facial recognition and smart search
## Configuration
Key settings configured through your instance's `config.yaml`:
- **domain** - Where Immich will be accessible (default: `immich.{your-cloud-domain}`)
- **storage** - Persistent volume for photos and videos (default: `250Gi`)
- **cacheStorage** - Persistent volume for ML cache (default: `10Gi`)
- **timezone** - Server timezone (default: `UTC`)
## Access
After deployment, Immich will be available at:
- `https://immich.{your-cloud-domain}`
## First-Time Setup
1. Add and deploy the app:
```bash
wild app add immich
wild app deploy immich
```
2. Create your account through the web interface
3. Download the Immich mobile app and connect it to your server for automatic photo backup

View File

@@ -0,0 +1,68 @@
apiVersion: batch/v1
kind: Job
metadata:
name: immich-db-init
spec:
template:
spec:
containers:
- name: db-init
image: postgres:17
command: ["/bin/bash", "-c"]
args:
- |
PGPASSWORD=${POSTGRES_ADMIN_PASSWORD} psql -h ${DB_HOSTNAME} -U postgres <<EOF
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '${DB_USERNAME}') THEN
CREATE USER ${DB_USERNAME} WITH ENCRYPTED PASSWORD '${DB_PASSWORD}';
ELSE
ALTER USER ${DB_USERNAME} WITH ENCRYPTED PASSWORD '${DB_PASSWORD}';
END IF;
END
\$\$;
SELECT 'CREATE DATABASE ${DB_DATABASE_NAME}' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DB_DATABASE_NAME}')\gexec
ALTER DATABASE ${DB_DATABASE_NAME} OWNER TO ${DB_USERNAME};
GRANT ALL PRIVILEGES ON DATABASE ${DB_DATABASE_NAME} TO ${DB_USERNAME};
EOF
# Connect to the immich database and enable required extensions
PGPASSWORD=${POSTGRES_ADMIN_PASSWORD} psql -h ${DB_HOSTNAME} -U postgres -d ${DB_DATABASE_NAME} <<EOF
DO \$\$
BEGIN
-- Create vector extension if it doesn't exist
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'vector') THEN
CREATE EXTENSION vector;
END IF;
-- Create cube extension if it doesn't exist
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'cube') THEN
CREATE EXTENSION cube;
END IF;
-- Create earthdistance extension if it doesn't exist (depends on cube)
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'earthdistance') THEN
CREATE EXTENSION earthdistance;
END IF;
END
\$\$;
EOF
env:
- name: POSTGRES_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: immich-secrets
key: postgres.password
- name: DB_HOSTNAME
value: "{{ .db.host }}"
- name: DB_DATABASE_NAME
value: "{{ .db.name }}"
- name: DB_USERNAME
value: "{{ .db.user }}"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: immich-secrets
key: dbPassword
restartPolicy: OnFailure

View File

@@ -0,0 +1,45 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: immich-machine-learning
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: immich-machine-learning
template:
metadata:
labels:
app: immich-machine-learning
component: machine-learning
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
seccompProfile:
type: RuntimeDefault
containers:
- image: "ghcr.io/immich-app/immich-machine-learning:v3.3.5"
name: immich-machine-learning
ports:
- containerPort: 3003
protocol: TCP
env:
- name: TZ
value: "UTC"
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
readOnlyRootFilesystem: false
volumeMounts:
- mountPath: /cache
name: immich-cache
readOnly: false
volumes:
- name: immich-cache
persistentVolumeClaim:
claimName: immich-cache-pvc

View File

@@ -0,0 +1,81 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: immich-microservices
spec:
replicas: 1
selector:
matchLabels:
app: immich-microservices
strategy:
type: Recreate
template:
metadata:
labels:
app: immich-microservices
component: microservices
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
initContainers:
- name: init-dirs
image: "ghcr.io/immich-app/immich-server:v3.3.5"
command: ["sh", "-c", "for d in thumbs upload backups library profile encoded-video; do mkdir -p /usr/src/app/upload/$d && touch /usr/src/app/upload/$d/.immich; done"]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
readOnlyRootFilesystem: false
volumeMounts:
- mountPath: /usr/src/app/upload
name: immich-storage
containers:
- image: "ghcr.io/immich-app/immich-server:v3.3.5"
name: immich-microservices
env:
- name: REDIS_HOSTNAME
value: "{{ .redis.host }}"
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: immich-secrets
key: redis.password
- name: DB_HOSTNAME
value: "{{ .db.host }}"
- name: DB_USERNAME
value: "{{ .db.user }}"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: immich-secrets
key: dbPassword
- name: TZ
value: "UTC"
- name: IMMICH_WORKERS_EXCLUDE
value: api
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
readOnlyRootFilesystem: false
volumeMounts:
- mountPath: /usr/src/app/upload
name: immich-storage
readOnly: false
volumes:
- name: immich-storage
persistentVolumeClaim:
claimName: immich-pvc
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: immich
component: server
topologyKey: kubernetes.io/hostname

View File

@@ -0,0 +1,76 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: immich-server
spec:
replicas: 1
selector:
matchLabels:
app: immich-server
strategy:
type: Recreate
template:
metadata:
labels:
app: immich-server
component: server
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
initContainers:
- name: init-dirs
image: "ghcr.io/immich-app/immich-server:v3.3.5"
command: ["sh", "-c", "for d in thumbs upload backups library profile encoded-video; do mkdir -p /usr/src/app/upload/$d && touch /usr/src/app/upload/$d/.immich; done"]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
readOnlyRootFilesystem: false
volumeMounts:
- mountPath: /usr/src/app/upload
name: immich-storage
containers:
- image: "ghcr.io/immich-app/immich-server:v3.3.5"
name: immich-server
ports:
- containerPort: 2283
protocol: TCP
env:
- name: REDIS_HOSTNAME
value: "{{ .redis.host }}"
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: immich-secrets
key: redis.password
- name: DB_HOSTNAME
value: "{{ .db.host }}"
- name: DB_USERNAME
value: "{{ .db.user }}"
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: immich-secrets
key: dbPassword
- name: TZ
value: "UTC"
- name: IMMICH_WORKERS_EXCLUDE
value: microservices
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
readOnlyRootFilesystem: false
volumeMounts:
- mountPath: /usr/src/app/upload
name: immich-storage
readOnly: false
volumes:
- name: immich-storage
persistentVolumeClaim:
claimName: immich-pvc

View File

@@ -0,0 +1,18 @@
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: immich-public
spec:
ingressClassName: traefik
rules:
- host: "{{ .domain }}"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: immich-server
port:
number: 3001

View File

@@ -0,0 +1,18 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: immich
labels:
- includeSelectors: true
pairs:
app: immich
managedBy: kustomize
partOf: wild-cloud
resources:
- deployment-server.yaml
- deployment-machine-learning.yaml
- deployment-microservices.yaml
- ingress.yaml
- namespace.yaml
- pvc.yaml
- service.yaml
- db-init-job.yaml

View File

@@ -0,0 +1,20 @@
version: 3.3.5
requires:
- name: redis
- name: postgres
defaultConfig:
namespace: immich
storage: 5Gi
cacheStorage: 5Gi
domain: immich.{{ .cloud.domain }}
db:
host: '{{ .apps.postgres.host }}'
name: immich
user: immich
redis:
host: '{{ .apps.redis.host }}'
defaultSecrets:
- key: dbPassword
requiredSecrets:
- redis.password
- postgres.password

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: "{{ .namespace }}"

View File

@@ -0,0 +1,24 @@
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: immich-pvc
spec:
storageClassName: longhorn
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .storage }}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: immich-cache-pvc
spec:
storageClassName: longhorn
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .cacheStorage }}

View File

@@ -0,0 +1,33 @@
---
apiVersion: v1
kind: Service
metadata:
name: immich-server
namespace: immich
labels:
app: immich-server
spec:
ports:
- port: 3001
targetPort: 2283
selector:
app: immich
component: server
managedBy: kustomize
partOf: wild-cloud
---
apiVersion: v1
kind: Service
metadata:
name: immich-machine-learning
namespace: immich
labels:
app: immich-machine-learning
spec:
ports:
- port: 3003
selector:
app: immich
component: machine-learning
managedBy: kustomize
partOf: wild-cloud

View File

@@ -24,7 +24,7 @@ spec:
type: RuntimeDefault
initContainers:
- name: config-init
image: getindico/indico:3.3.12
image: getindico/indico:3.3.14
command: ["/bin/sh", "-c"]
args:
- |
@@ -61,7 +61,7 @@ spec:
mountPath: /opt/indico/etc
containers:
- name: worker
image: getindico/indico:3.3.12
image: getindico/indico:3.3.14
args: ["/opt/indico/run_celery.sh"]
securityContext:
allowPrivilegeEscalation: false
@@ -103,7 +103,7 @@ spec:
- name: indico-custom
mountPath: /opt/indico/custom
- name: beat
image: getindico/indico:3.3.12
image: getindico/indico:3.3.14
args: ["/opt/indico/run_celery.sh", "beat"]
securityContext:
allowPrivilegeEscalation: false

View File

@@ -24,7 +24,7 @@ spec:
type: RuntimeDefault
initContainers:
- name: config-init
image: getindico/indico:3.3.12
image: getindico/indico:3.3.14
command: ["/bin/sh", "-c"]
args:
- |
@@ -61,7 +61,7 @@ spec:
mountPath: /opt/indico/etc
containers:
- name: indico
image: getindico/indico:3.3.12
image: getindico/indico:3.3.14
args: ["/opt/indico/run_indico.sh"]
ports:
- name: http

View File

@@ -1,4 +1,4 @@
version: 3.3.12-2
version: 3.3.14
requires:
- name: postgres
- name: redis

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: jitsi-jicofo
image: jitsi/jicofo:jicofo-1.0-1184-1
image: ghcr.io/jitsi/jicofo:stable-11248-2
env:
- name: XMPP_DOMAIN
value: "{{ .xmppDomain }}"

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: jitsi-jvb
image: jitsi/jvb:jvb-2.3-296-g318c08ddc-1
image: ghcr.io/jitsi/jvb:stable-11248-2
ports:
- name: rtp-udp
containerPort: 10000

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: jitsi-prosody
image: jitsi/prosody:prosody-13.0.6
image: ghcr.io/jitsi/prosody:stable-11248-2
ports:
- name: xmpp-c2s
containerPort: 5222

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: jitsi-web
image: jitsi/web:web-1.0.9282-1
image: ghcr.io/jitsi/web:stable-11248-2
ports:
- name: http
containerPort: 80

View File

@@ -1,4 +1,4 @@
version: web-1.0.9282-3
version: stable-11248-2
defaultConfig:
namespace: jitsi
domain: jitsi.{{ .cloud.domain }}

View File

@@ -24,7 +24,7 @@ spec:
type: RuntimeDefault
initContainers:
- name: migrate
image: codeberg.org/karrot/karrot-backend:v17.4.1
image: codeberg.org/karrot/karrot-backend:v17.4.2
command: ["/entrypoint.sh", "migrate"]
env:
- name: MODE
@@ -76,7 +76,7 @@ spec:
mountPath: /app/uploads
containers:
- name: karrot-backend
image: codeberg.org/karrot/karrot-backend:v17.4.1
image: codeberg.org/karrot/karrot-backend:v17.4.2
command: ["/entrypoint.sh", "server"]
ports:
- name: http

View File

@@ -21,7 +21,7 @@ spec:
type: RuntimeDefault
containers:
- name: karrot-frontend
image: codeberg.org/karrot/karrot-frontend:v17.4.1
image: codeberg.org/karrot/karrot-frontend:v17.4.2
ports:
- name: http
containerPort: 8080

View File

@@ -22,7 +22,7 @@ spec:
type: RuntimeDefault
containers:
- name: karrot-worker
image: codeberg.org/karrot/karrot-backend:v17.4.1
image: codeberg.org/karrot/karrot-backend:v17.4.2
command: ["/entrypoint.sh", "worker"]
env:
- name: MODE

View File

@@ -1,4 +1,4 @@
version: v17.4.1-1
version: v17.4.2
requires:
- name: postgres
- name: smtp

View File

@@ -19,7 +19,7 @@ spec:
type: RuntimeDefault
containers:
- name: keila
image: "pentacent/keila:0.17.1"
image: "pentacent/keila:0.30.3"
ports:
- containerPort: 4000
env:
@@ -72,6 +72,8 @@ spec:
volumeMounts:
- name: uploads
mountPath: /var/lib/keila/uploads
- name: tz-data
mountPath: /opt/app/lib/tz-0.28.2/priv
securityContext:
allowPrivilegeEscalation: false
capabilities:
@@ -92,4 +94,6 @@ spec:
volumes:
- name: uploads
persistentVolumeClaim:
claimName: keila-uploads
claimName: keila-uploads
- name: tz-data
emptyDir: {}

Some files were not shown because too many files have changed in this diff Show More