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
|
||||
containers:
|
||||
- name: akaunting
|
||||
image: akaunting/akaunting:3.1.21
|
||||
image: akaunting/akaunting:3.2.3
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 80
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 3.1.21-2
|
||||
version: 3.2.3
|
||||
requires:
|
||||
- name: mysql
|
||||
- name: smtp
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 1.6.2-4
|
||||
version: 1.6.3
|
||||
defaultConfig:
|
||||
namespace: aptly
|
||||
domain: aptly.{{ .cloud.domain }}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 2.2.2-3
|
||||
version: 2.4.1
|
||||
requires:
|
||||
- name: postgres
|
||||
- name: redis
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 26.09.2-1
|
||||
version: 26.09.2
|
||||
requires:
|
||||
- name: mysql
|
||||
- name: smtp
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 0.8.7-2
|
||||
version: 0.9.3
|
||||
requires:
|
||||
- name: postgres
|
||||
- name: redis
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: v1.17.2-1
|
||||
version: v1.21.2
|
||||
requires:
|
||||
- name: traefik
|
||||
defaultConfig:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: v1.12.0-1
|
||||
version: v1.14.7
|
||||
requires:
|
||||
- name: metallb
|
||||
defaultConfig:
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: v1.7.8-4
|
||||
version: v1.8.1
|
||||
requires:
|
||||
- name: longhorn
|
||||
- name: traefik
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 0.31.0-4
|
||||
version: 0.31.6
|
||||
requires:
|
||||
- name: postgres
|
||||
- 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:
|
||||
- key: adminPassword
|
||||
- key: secretKeyBase
|
||||
default: '{{ random.Hex 32 }}'
|
||||
default: '{{ random.AlphaNum 64 }}'
|
||||
- key: smtpPassword
|
||||
- key: dbPassword
|
||||
- key: dbUrl
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 3.0.0-2
|
||||
version: 3.1.2
|
||||
defaultConfig:
|
||||
namespace: docker-registry
|
||||
host: registry.{{ .cloud.internalDomain }}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 2.2.7-2
|
||||
version: 2.6.1
|
||||
requires:
|
||||
- name: postgres
|
||||
defaultConfig:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: v0.13.4-6
|
||||
version: v0.23.0
|
||||
deploymentName: external-dns
|
||||
requires:
|
||||
- name: cert-manager
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 6.7.7-1
|
||||
version: 6.7.7
|
||||
requires:
|
||||
- name: postgres
|
||||
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.
|
||||
category: business
|
||||
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.
|
||||
category: social
|
||||
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
|
||||
category: developer
|
||||
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
|
||||
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"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: v0.42.0-1
|
||||
version: v0.46.0
|
||||
defaultConfig:
|
||||
namespace: headlamp
|
||||
internalDomain: '{{ .cloud.internalDomain }}'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 3.3.12-2
|
||||
version: 3.3.14
|
||||
requires:
|
||||
- name: postgres
|
||||
- name: redis
|
||||
|
||||
@@ -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 }}"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: web-1.0.9282-3
|
||||
version: stable-11248-2
|
||||
defaultConfig:
|
||||
namespace: jitsi
|
||||
domain: jitsi.{{ .cloud.domain }}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: v17.4.1-1
|
||||
version: v17.4.2
|
||||
requires:
|
||||
- name: postgres
|
||||
- name: smtp
|
||||
|
||||
@@ -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: {}
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 0.17.1-5
|
||||
version: 0.30.3
|
||||
requires:
|
||||
- name: postgres
|
||||
- name: smtp
|
||||
|
||||
@@ -65,7 +65,7 @@ spec:
|
||||
mountPath: /config
|
||||
containers:
|
||||
- name: backend
|
||||
image: dessalines/lemmy:0.19.15
|
||||
image: dessalines/lemmy:0.19.19
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
|
||||
@@ -21,7 +21,7 @@ spec:
|
||||
type: RuntimeDefault
|
||||
containers:
|
||||
- name: ui
|
||||
image: dessalines/lemmy-ui:0.19.15
|
||||
image: dessalines/lemmy-ui:0.19.19
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: 0.19.15-4
|
||||
version: 0.19.19
|
||||
requires:
|
||||
- name: postgres
|
||||
- name: smtp
|
||||
|
||||
@@ -24,7 +24,7 @@ spec:
|
||||
type: RuntimeDefault
|
||||
containers:
|
||||
- name: librebooking
|
||||
image: librebooking/librebooking:5.1.0
|
||||
image: librebooking/librebooking:7.1.0
|
||||
ports:
|
||||
- name: http
|
||||
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