Compare commits
13 Commits
ef2c7ea8b3
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a393db8bac | ||
|
|
d31ab762f8 | ||
|
|
4d3bb5cbd7 | ||
|
|
eb20b458a6 | ||
|
|
80c0d6b0ac | ||
|
|
9c87c0cb1e | ||
|
|
400fc7bbb1 | ||
|
|
15edd0cfca | ||
|
|
337a8ecc83 | ||
|
|
ca9bdf823b | ||
|
|
9fd046c378 | ||
|
|
e25b07126c | ||
|
|
9eaeeb9d7a |
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: akaunting
|
- name: akaunting
|
||||||
image: akaunting/akaunting:3.1.21
|
image: akaunting/akaunting:3.2.3
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: 80
|
containerPort: 80
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 3.1.21-2
|
version: 3.2.3
|
||||||
requires:
|
requires:
|
||||||
- name: mysql
|
- name: mysql
|
||||||
- name: smtp
|
- name: smtp
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: init-gpg
|
- name: init-gpg
|
||||||
image: urpylka/aptly:1.6.2
|
image: urpylka/aptly:1.6.3
|
||||||
command:
|
command:
|
||||||
- sh
|
- sh
|
||||||
- -c
|
- -c
|
||||||
@@ -61,7 +61,7 @@ spec:
|
|||||||
mountPath: /opt/aptly
|
mountPath: /opt/aptly
|
||||||
containers:
|
containers:
|
||||||
- name: aptly
|
- name: aptly
|
||||||
image: urpylka/aptly:1.6.2
|
image: urpylka/aptly:1.6.3
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 80
|
- containerPort: 80
|
||||||
name: http
|
name: http
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 1.6.2-4
|
version: 1.6.3
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
namespace: aptly
|
namespace: aptly
|
||||||
domain: aptly.{{ .cloud.domain }}
|
domain: aptly.{{ .cloud.domain }}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: baserow
|
- name: baserow
|
||||||
image: baserow/baserow:2.2.2
|
image: baserow/baserow:2.4.1
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: 80
|
containerPort: 80
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 2.2.2-3
|
version: 2.4.1
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
- name: redis
|
- name: redis
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 26.09.2-1
|
version: 26.09.2
|
||||||
requires:
|
requires:
|
||||||
- name: mysql
|
- name: mysql
|
||||||
- name: smtp
|
- name: smtp
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: celery-worker
|
- name: celery-worker
|
||||||
image: ghcr.io/bookwyrm-social/bookwyrm:v0.8.6
|
image: ghcr.io/bookwyrm-social/bookwyrm:v0.9.3
|
||||||
command:
|
command:
|
||||||
- celery
|
- celery
|
||||||
- -A
|
- -A
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: bookwyrm
|
- 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"]
|
command: ["/bin/sh", "-c", "python manage.py compile_themes && python manage.py collectstatic --noinput && python manage.py migrate && exec gunicorn bookwyrm.wsgi:application"]
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 0.8.7-2
|
version: 0.9.3
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
- name: redis
|
- name: redis
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: v1.17.2-1
|
version: v1.21.2
|
||||||
requires:
|
requires:
|
||||||
- name: traefik
|
- name: traefik
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
|
|||||||
@@ -12981,7 +12981,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: cert-manager-cainjector
|
- 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
|
imagePullPolicy: IfNotPresent
|
||||||
args:
|
args:
|
||||||
- --v=2
|
- --v=2
|
||||||
@@ -13044,7 +13044,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: cert-manager-controller
|
- 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
|
imagePullPolicy: IfNotPresent
|
||||||
args:
|
args:
|
||||||
- --v=2
|
- --v=2
|
||||||
@@ -13126,7 +13126,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: cert-manager-webhook
|
- 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
|
imagePullPolicy: IfNotPresent
|
||||||
args:
|
args:
|
||||||
- --v=2
|
- --v=2
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: v1.12.0-1
|
version: v1.14.7
|
||||||
requires:
|
requires:
|
||||||
- name: metallb
|
- name: metallb
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: crowdsec
|
- name: crowdsec
|
||||||
image: crowdsecurity/crowdsec:v1.7.8
|
image: crowdsecurity/crowdsec:v1.8.1
|
||||||
env:
|
env:
|
||||||
- name: COLLECTIONS
|
- name: COLLECTIONS
|
||||||
value: "crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors crowdsecurity/iptables crowdsecurity/linux"
|
value: "crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors crowdsecurity/iptables crowdsecurity/linux"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: v1.7.8-4
|
version: v1.8.1
|
||||||
requires:
|
requires:
|
||||||
- name: longhorn
|
- name: longhorn
|
||||||
- name: traefik
|
- name: traefik
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ spec:
|
|||||||
fsGroupChangePolicy: Always
|
fsGroupChangePolicy: Always
|
||||||
containers:
|
containers:
|
||||||
- name: decidim
|
- name: decidim
|
||||||
image: payneio/decidim-sidekiq:0.31.0
|
image: payneio/decidim-sidekiq:0.31.6
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
command:
|
command:
|
||||||
- /bin/bash
|
- /bin/bash
|
||||||
@@ -143,7 +143,7 @@ spec:
|
|||||||
- name: decidim-data
|
- name: decidim-data
|
||||||
mountPath: /code/public/uploads
|
mountPath: /code/public/uploads
|
||||||
- name: sidekiq
|
- name: sidekiq
|
||||||
image: payneio/decidim-sidekiq:0.31.0
|
image: payneio/decidim-sidekiq:0.31.6
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
command:
|
command:
|
||||||
- /bin/bash
|
- /bin/bash
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 0.31.0-4
|
version: 0.31.6
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
- name: redis
|
- name: redis
|
||||||
|
|||||||
35
discourse/versions/2026/README.md
Normal file
35
discourse/versions/2026/README.md
Normal 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
|
||||||
78
discourse/versions/2026/db-init-job.yaml
Normal file
78
discourse/versions/2026/db-init-job.yaml
Normal 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."
|
||||||
304
discourse/versions/2026/deployment.yaml
Normal file
304
discourse/versions/2026/deployment.yaml
Normal file
@@ -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-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
|
||||||
|
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-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
|
||||||
20
discourse/versions/2026/ingress.yaml
Normal file
20
discourse/versions/2026/ingress.yaml
Normal 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
|
||||||
17
discourse/versions/2026/kustomization.yaml
Normal file
17
discourse/versions/2026/kustomization.yaml
Normal 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
|
||||||
39
discourse/versions/2026/manifest.yaml
Normal file
39
discourse/versions/2026/manifest.yaml
Normal 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
|
||||||
4
discourse/versions/2026/namespace.yaml
Normal file
4
discourse/versions/2026/namespace.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: "{{ .namespace }}"
|
||||||
13
discourse/versions/2026/pvc.yaml
Normal file
13
discourse/versions/2026/pvc.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: discourse-data
|
||||||
|
namespace: discourse
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .storage }}
|
||||||
|
storageClassName: longhorn
|
||||||
18
discourse/versions/2026/service.yaml
Normal file
18
discourse/versions/2026/service.yaml
Normal 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
|
||||||
8
discourse/versions/2026/serviceaccount.yaml
Normal file
8
discourse/versions/2026/serviceaccount.yaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
# Source: discourse/templates/serviceaccount.yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: discourse
|
||||||
|
namespace: discourse
|
||||||
|
automountServiceAccountToken: false
|
||||||
@@ -28,7 +28,7 @@ defaultConfig:
|
|||||||
defaultSecrets:
|
defaultSecrets:
|
||||||
- key: adminPassword
|
- key: adminPassword
|
||||||
- key: secretKeyBase
|
- key: secretKeyBase
|
||||||
default: '{{ random.Hex 32 }}'
|
default: '{{ random.AlphaNum 64 }}'
|
||||||
- key: smtpPassword
|
- key: smtpPassword
|
||||||
- key: dbPassword
|
- key: dbPassword
|
||||||
- key: dbUrl
|
- key: dbUrl
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ spec:
|
|||||||
seccompProfile:
|
seccompProfile:
|
||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- image: registry:3.0.0
|
- image: registry:3.1.2
|
||||||
name: docker-registry
|
name: docker-registry
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 3.0.0-2
|
version: 3.1.2
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
namespace: docker-registry
|
namespace: docker-registry
|
||||||
host: registry.{{ .cloud.internalDomain }}
|
host: registry.{{ .cloud.internalDomain }}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: etherpad
|
- name: etherpad
|
||||||
image: etherpad/etherpad:2.2.7
|
image: etherpad/etherpad:2.6.1
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: 9001
|
containerPort: 9001
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 2.2.7-2
|
version: 2.6.1
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- 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:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: v0.13.4-6
|
version: v0.23.0
|
||||||
deploymentName: external-dns
|
deploymentName: external-dns
|
||||||
requires:
|
requires:
|
||||||
- name: cert-manager
|
- name: cert-manager
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 6.7.7-1
|
version: 6.7.7
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
|
|||||||
@@ -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.
|
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
|
category: business
|
||||||
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/formbricks.svg
|
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/formbricks.svg
|
||||||
latest: "3"
|
latest: "6"
|
||||||
|
|||||||
36
formbricks/versions/6/README.md
Normal file
36
formbricks/versions/6/README.md
Normal 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
|
||||||
61
formbricks/versions/6/db-init-job.yaml
Normal file
61
formbricks/versions/6/db-init-job.yaml
Normal 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
|
||||||
102
formbricks/versions/6/deployment.yaml
Normal file
102
formbricks/versions/6/deployment.yaml
Normal 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
|
||||||
18
formbricks/versions/6/ingress.yaml
Normal file
18
formbricks/versions/6/ingress.yaml
Normal 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
|
||||||
16
formbricks/versions/6/kustomization.yaml
Normal file
16
formbricks/versions/6/kustomization.yaml
Normal 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
|
||||||
26
formbricks/versions/6/manifest.yaml
Normal file
26
formbricks/versions/6/manifest.yaml
Normal 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
|
||||||
4
formbricks/versions/6/namespace.yaml
Normal file
4
formbricks/versions/6/namespace.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: {{ .namespace }}
|
||||||
11
formbricks/versions/6/pvc.yaml
Normal file
11
formbricks/versions/6/pvc.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: formbricks-uploads
|
||||||
|
namespace: {{ .namespace }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .storage }}
|
||||||
13
formbricks/versions/6/service.yaml
Normal file
13
formbricks/versions/6/service.yaml
Normal 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
|
||||||
@@ -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.
|
description: Ghost is a powerful app for new-media creators to publish, share, and grow a business around their content.
|
||||||
category: social
|
category: social
|
||||||
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/ghost.png
|
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/ghost.png
|
||||||
latest: "5"
|
latest: "6"
|
||||||
|
|||||||
33
ghost/versions/6/README.md
Normal file
33
ghost/versions/6/README.md
Normal 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
|
||||||
45
ghost/versions/6/db-init-job.yaml
Normal file
45
ghost/versions/6/db-init-job.yaml
Normal 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
|
||||||
105
ghost/versions/6/deployment.yaml
Normal file
105
ghost/versions/6/deployment.yaml
Normal 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
|
||||||
18
ghost/versions/6/ingress.yaml
Normal file
18
ghost/versions/6/ingress.yaml
Normal 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
|
||||||
16
ghost/versions/6/kustomization.yaml
Normal file
16
ghost/versions/6/kustomization.yaml
Normal 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
|
||||||
23
ghost/versions/6/manifest.yaml
Normal file
23
ghost/versions/6/manifest.yaml
Normal 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
|
||||||
4
ghost/versions/6/namespace.yaml
Normal file
4
ghost/versions/6/namespace.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: "{{ .namespace }}"
|
||||||
11
ghost/versions/6/pvc.yaml
Normal file
11
ghost/versions/6/pvc.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: ghost-data
|
||||||
|
namespace: ghost
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .storage }}
|
||||||
14
ghost/versions/6/service.yaml
Normal file
14
ghost/versions/6/service.yaml
Normal 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
|
||||||
@@ -3,4 +3,4 @@ is: gitea
|
|||||||
description: Gitea is a painless self-hosted Git service written in Go
|
description: Gitea is a painless self-hosted Git service written in Go
|
||||||
category: developer
|
category: developer
|
||||||
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg
|
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/gitea.svg
|
||||||
latest: "1"
|
latest: "28"
|
||||||
|
|||||||
85
gitea/versions/28/README.md
Normal file
85
gitea/versions/28/README.md
Normal 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
|
||||||
51
gitea/versions/28/db-init-job.yaml
Normal file
51
gitea/versions/28/db-init-job.yaml
Normal 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
|
||||||
99
gitea/versions/28/deployment.yaml
Normal file
99
gitea/versions/28/deployment.yaml
Normal 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
|
||||||
60
gitea/versions/28/gitea.env
Normal file
60
gitea/versions/28/gitea.env
Normal 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 }}
|
||||||
|
|
||||||
18
gitea/versions/28/ingress.yaml
Normal file
18
gitea/versions/28/ingress.yaml
Normal 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
|
||||||
20
gitea/versions/28/kustomization.yaml
Normal file
20
gitea/versions/28/kustomization.yaml
Normal 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
|
||||||
29
gitea/versions/28/manifest.yaml
Normal file
29
gitea/versions/28/manifest.yaml
Normal 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
|
||||||
4
gitea/versions/28/namespace.yaml
Normal file
4
gitea/versions/28/namespace.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: "{{ .namespace }}"
|
||||||
12
gitea/versions/28/pvc.yaml
Normal file
12
gitea/versions/28/pvc.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: gitea-data
|
||||||
|
namespace: gitea
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
storageClassName: longhorn
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: "{{ .storage }}"
|
||||||
28
gitea/versions/28/service.yaml
Normal file
28
gitea/versions/28/service.yaml
Normal 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
|
||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: headlamp
|
- name: headlamp
|
||||||
image: ghcr.io/headlamp-k8s/headlamp:v0.42.0
|
image: ghcr.io/headlamp-k8s/headlamp:v0.46.0
|
||||||
args:
|
args:
|
||||||
- "-in-cluster"
|
- "-in-cluster"
|
||||||
- "-plugins-dir=/headlamp/plugins"
|
- "-plugins-dir=/headlamp/plugins"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: v0.42.0-1
|
version: v0.46.0
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
namespace: headlamp
|
namespace: headlamp
|
||||||
internalDomain: '{{ .cloud.internalDomain }}'
|
internalDomain: '{{ .cloud.internalDomain }}'
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: headscale
|
- name: headscale
|
||||||
image: headscale/headscale:v0.29.1
|
image: headscale/headscale:v0.29.5
|
||||||
args: ["serve"]
|
args: ["serve"]
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 0.29.1-2
|
version: 0.29.5
|
||||||
scripts:
|
scripts:
|
||||||
- name: register-node
|
- name: register-node
|
||||||
description: Register a Tailscale node using the auth ID shown in the Tailscale
|
description: Register a Tailscale node using the auth ID shown in the Tailscale
|
||||||
|
|||||||
@@ -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.
|
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
|
category: media
|
||||||
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg
|
icon: https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/immich.svg
|
||||||
latest: "1"
|
latest: "3"
|
||||||
|
|||||||
41
immich/versions/3/README.md
Normal file
41
immich/versions/3/README.md
Normal 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
|
||||||
68
immich/versions/3/db-init-job.yaml
Normal file
68
immich/versions/3/db-init-job.yaml
Normal 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
|
||||||
45
immich/versions/3/deployment-machine-learning.yaml
Normal file
45
immich/versions/3/deployment-machine-learning.yaml
Normal 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
|
||||||
81
immich/versions/3/deployment-microservices.yaml
Normal file
81
immich/versions/3/deployment-microservices.yaml
Normal 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
|
||||||
76
immich/versions/3/deployment-server.yaml
Normal file
76
immich/versions/3/deployment-server.yaml
Normal 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
|
||||||
18
immich/versions/3/ingress.yaml
Normal file
18
immich/versions/3/ingress.yaml
Normal 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
|
||||||
18
immich/versions/3/kustomization.yaml
Normal file
18
immich/versions/3/kustomization.yaml
Normal 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
|
||||||
20
immich/versions/3/manifest.yaml
Normal file
20
immich/versions/3/manifest.yaml
Normal 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
|
||||||
4
immich/versions/3/namespace.yaml
Normal file
4
immich/versions/3/namespace.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: "{{ .namespace }}"
|
||||||
24
immich/versions/3/pvc.yaml
Normal file
24
immich/versions/3/pvc.yaml
Normal 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 }}
|
||||||
33
immich/versions/3/service.yaml
Normal file
33
immich/versions/3/service.yaml
Normal 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
|
||||||
@@ -24,7 +24,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: config-init
|
- name: config-init
|
||||||
image: getindico/indico:3.3.12
|
image: getindico/indico:3.3.14
|
||||||
command: ["/bin/sh", "-c"]
|
command: ["/bin/sh", "-c"]
|
||||||
args:
|
args:
|
||||||
- |
|
- |
|
||||||
@@ -61,7 +61,7 @@ spec:
|
|||||||
mountPath: /opt/indico/etc
|
mountPath: /opt/indico/etc
|
||||||
containers:
|
containers:
|
||||||
- name: worker
|
- name: worker
|
||||||
image: getindico/indico:3.3.12
|
image: getindico/indico:3.3.14
|
||||||
args: ["/opt/indico/run_celery.sh"]
|
args: ["/opt/indico/run_celery.sh"]
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
@@ -103,7 +103,7 @@ spec:
|
|||||||
- name: indico-custom
|
- name: indico-custom
|
||||||
mountPath: /opt/indico/custom
|
mountPath: /opt/indico/custom
|
||||||
- name: beat
|
- name: beat
|
||||||
image: getindico/indico:3.3.12
|
image: getindico/indico:3.3.14
|
||||||
args: ["/opt/indico/run_celery.sh", "beat"]
|
args: ["/opt/indico/run_celery.sh", "beat"]
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: config-init
|
- name: config-init
|
||||||
image: getindico/indico:3.3.12
|
image: getindico/indico:3.3.14
|
||||||
command: ["/bin/sh", "-c"]
|
command: ["/bin/sh", "-c"]
|
||||||
args:
|
args:
|
||||||
- |
|
- |
|
||||||
@@ -61,7 +61,7 @@ spec:
|
|||||||
mountPath: /opt/indico/etc
|
mountPath: /opt/indico/etc
|
||||||
containers:
|
containers:
|
||||||
- name: indico
|
- name: indico
|
||||||
image: getindico/indico:3.3.12
|
image: getindico/indico:3.3.14
|
||||||
args: ["/opt/indico/run_indico.sh"]
|
args: ["/opt/indico/run_indico.sh"]
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 3.3.12-2
|
version: 3.3.14
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
- name: redis
|
- name: redis
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: jitsi-jicofo
|
- name: jitsi-jicofo
|
||||||
image: jitsi/jicofo:jicofo-1.0-1184-1
|
image: ghcr.io/jitsi/jicofo:stable-11248-2
|
||||||
env:
|
env:
|
||||||
- name: XMPP_DOMAIN
|
- name: XMPP_DOMAIN
|
||||||
value: "{{ .xmppDomain }}"
|
value: "{{ .xmppDomain }}"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: jitsi-jvb
|
- name: jitsi-jvb
|
||||||
image: jitsi/jvb:jvb-2.3-296-g318c08ddc-1
|
image: ghcr.io/jitsi/jvb:stable-11248-2
|
||||||
ports:
|
ports:
|
||||||
- name: rtp-udp
|
- name: rtp-udp
|
||||||
containerPort: 10000
|
containerPort: 10000
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: jitsi-prosody
|
- name: jitsi-prosody
|
||||||
image: jitsi/prosody:prosody-13.0.6
|
image: ghcr.io/jitsi/prosody:stable-11248-2
|
||||||
ports:
|
ports:
|
||||||
- name: xmpp-c2s
|
- name: xmpp-c2s
|
||||||
containerPort: 5222
|
containerPort: 5222
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: jitsi-web
|
- name: jitsi-web
|
||||||
image: jitsi/web:web-1.0.9282-1
|
image: ghcr.io/jitsi/web:stable-11248-2
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: 80
|
containerPort: 80
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: web-1.0.9282-3
|
version: stable-11248-2
|
||||||
defaultConfig:
|
defaultConfig:
|
||||||
namespace: jitsi
|
namespace: jitsi
|
||||||
domain: jitsi.{{ .cloud.domain }}
|
domain: jitsi.{{ .cloud.domain }}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: migrate
|
- name: migrate
|
||||||
image: codeberg.org/karrot/karrot-backend:v17.4.1
|
image: codeberg.org/karrot/karrot-backend:v17.4.2
|
||||||
command: ["/entrypoint.sh", "migrate"]
|
command: ["/entrypoint.sh", "migrate"]
|
||||||
env:
|
env:
|
||||||
- name: MODE
|
- name: MODE
|
||||||
@@ -76,7 +76,7 @@ spec:
|
|||||||
mountPath: /app/uploads
|
mountPath: /app/uploads
|
||||||
containers:
|
containers:
|
||||||
- name: karrot-backend
|
- 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"]
|
command: ["/entrypoint.sh", "server"]
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: karrot-frontend
|
- name: karrot-frontend
|
||||||
image: codeberg.org/karrot/karrot-frontend:v17.4.1
|
image: codeberg.org/karrot/karrot-frontend:v17.4.2
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: 8080
|
containerPort: 8080
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: karrot-worker
|
- 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"]
|
command: ["/entrypoint.sh", "worker"]
|
||||||
env:
|
env:
|
||||||
- name: MODE
|
- name: MODE
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: v17.4.1-1
|
version: v17.4.2
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
- name: smtp
|
- name: smtp
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: keila
|
- name: keila
|
||||||
image: "pentacent/keila:0.17.1"
|
image: "pentacent/keila:0.30.3"
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 4000
|
- containerPort: 4000
|
||||||
env:
|
env:
|
||||||
@@ -72,6 +72,8 @@ spec:
|
|||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: uploads
|
- name: uploads
|
||||||
mountPath: /var/lib/keila/uploads
|
mountPath: /var/lib/keila/uploads
|
||||||
|
- name: tz-data
|
||||||
|
mountPath: /opt/app/lib/tz-0.28.2/priv
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
capabilities:
|
capabilities:
|
||||||
@@ -93,3 +95,5 @@ spec:
|
|||||||
- name: uploads
|
- name: uploads
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: keila-uploads
|
claimName: keila-uploads
|
||||||
|
- name: tz-data
|
||||||
|
emptyDir: {}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 0.17.1-5
|
version: 0.30.3
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
- name: smtp
|
- name: smtp
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ spec:
|
|||||||
mountPath: /config
|
mountPath: /config
|
||||||
containers:
|
containers:
|
||||||
- name: backend
|
- name: backend
|
||||||
image: dessalines/lemmy:0.19.15
|
image: dessalines/lemmy:0.19.19
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
capabilities:
|
capabilities:
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: ui
|
- name: ui
|
||||||
image: dessalines/lemmy-ui:0.19.15
|
image: dessalines/lemmy-ui:0.19.19
|
||||||
securityContext:
|
securityContext:
|
||||||
allowPrivilegeEscalation: false
|
allowPrivilegeEscalation: false
|
||||||
capabilities:
|
capabilities:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version: 0.19.15-4
|
version: 0.19.19
|
||||||
requires:
|
requires:
|
||||||
- name: postgres
|
- name: postgres
|
||||||
- name: smtp
|
- name: smtp
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ spec:
|
|||||||
type: RuntimeDefault
|
type: RuntimeDefault
|
||||||
containers:
|
containers:
|
||||||
- name: librebooking
|
- name: librebooking
|
||||||
image: librebooking/librebooking:5.1.0
|
image: librebooking/librebooking:7.1.0
|
||||||
ports:
|
ports:
|
||||||
- name: http
|
- name: http
|
||||||
containerPort: 8080
|
containerPort: 8080
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user