diff options
| author | Paul Buetow <paul@buetow.org> | 2026-01-31 19:50:29 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-01-31 19:50:29 +0200 |
| commit | dc62ca6ab585f38d4d8e2ace98199d4887719821 (patch) | |
| tree | 9c1ab576ac01852a20fc87053d88aa95b79d5250 | |
| parent | 37a776605bab8cdf0afbe4951de438cbafa61b46 (diff) | |
cleanup
| -rw-r--r-- | f3s/argocd-apps/services/jellyfin.yaml | 28 | ||||
| -rw-r--r-- | f3s/argocd-apps/services/minvid.yaml | 28 | ||||
| -rw-r--r-- | f3s/jellyfin/Justfile | 38 | ||||
| -rw-r--r-- | f3s/jellyfin/README.md | 86 | ||||
| -rw-r--r-- | f3s/jellyfin/SUMMARY.md | 135 | ||||
| -rw-r--r-- | f3s/jellyfin/helm-chart/Chart.yaml | 5 | ||||
| -rw-r--r-- | f3s/jellyfin/helm-chart/templates/.gitignore | 2 | ||||
| -rw-r--r-- | f3s/jellyfin/helm-chart/templates/configmap.yaml | 46 | ||||
| -rw-r--r-- | f3s/jellyfin/helm-chart/templates/deployment.yaml | 68 | ||||
| -rw-r--r-- | f3s/jellyfin/helm-chart/templates/ingress.yaml | 3 | ||||
| -rw-r--r-- | f3s/jellyfin/helm-chart/templates/persistent-volume.yaml | 86 | ||||
| -rw-r--r-- | f3s/jellyfin/values.yaml | 52 | ||||
| -rw-r--r-- | f3s/minvid/Justfile | 38 | ||||
| -rw-r--r-- | f3s/minvid/docker-image/Dockerfile | 48 | ||||
| -rw-r--r-- | f3s/minvid/docker-image/Justfile | 7 | ||||
| -rw-r--r-- | f3s/minvid/docker-image/entrypoint.sh | 14 | ||||
| -rw-r--r-- | f3s/minvid/helm-chart/Chart.yaml | 5 | ||||
| -rw-r--r-- | f3s/minvid/helm-chart/templates/deployment.yaml | 44 | ||||
| -rw-r--r-- | f3s/minvid/helm-chart/templates/ingress.yaml | 21 | ||||
| -rw-r--r-- | f3s/minvid/helm-chart/templates/persistent-volumes.yaml | 27 |
20 files changed, 0 insertions, 781 deletions
diff --git a/f3s/argocd-apps/services/jellyfin.yaml b/f3s/argocd-apps/services/jellyfin.yaml deleted file mode 100644 index f24974e..0000000 --- a/f3s/argocd-apps/services/jellyfin.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: jellyfin - namespace: cicd - finalizers: - - resources-finalizer.argocd.argoproj.io -spec: - project: default - source: - repoURL: http://git-server.cicd.svc.cluster.local/conf.git - targetRevision: master - path: f3s/jellyfin/helm-chart - destination: - server: https://kubernetes.default.svc - namespace: services - syncPolicy: - automated: - prune: true - selfHeal: true - syncOptions: - - CreateNamespace=false - retry: - limit: 3 - backoff: - duration: 5s - factor: 2 - maxDuration: 1m diff --git a/f3s/argocd-apps/services/minvid.yaml b/f3s/argocd-apps/services/minvid.yaml deleted file mode 100644 index 1e7d431..0000000 --- a/f3s/argocd-apps/services/minvid.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: minvid - namespace: cicd - finalizers: - - resources-finalizer.argocd.argoproj.io -spec: - project: default - source: - repoURL: http://git-server.cicd.svc.cluster.local/conf.git - targetRevision: master - path: f3s/minvid/helm-chart - destination: - server: https://kubernetes.default.svc - namespace: services - syncPolicy: - automated: - prune: true - selfHeal: true - syncOptions: - - CreateNamespace=false - retry: - limit: 3 - backoff: - duration: 5s - factor: 2 - maxDuration: 1m diff --git a/f3s/jellyfin/Justfile b/f3s/jellyfin/Justfile deleted file mode 100644 index 46848de..0000000 --- a/f3s/jellyfin/Justfile +++ /dev/null @@ -1,38 +0,0 @@ -NAMESPACE := "services" -APP_NAME := "jellyfin" - -status: - @echo "=== Pods ===" - @kubectl get pods -n {{NAMESPACE}} | grep jellyfin - @echo "" - @echo "=== Services ===" - @kubectl get svc -n {{NAMESPACE}} | grep jellyfin - @echo "" - @echo "=== Ingress ===" - @kubectl get ingress -n {{NAMESPACE}} jellyfin-ingress - @echo "" - @echo "=== PVCs ===" - @kubectl get pvc -n {{NAMESPACE}} | grep jellyfin - @echo "" - @echo "=== ArgoCD Status ===" - @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo "" - -logs lines="100": - kubectl logs -n {{NAMESPACE}} -l app=jellyfin-server --tail={{lines}} -f - -port-forward port="8096": - @echo "Forwarding jellyfin to localhost:{{port}}" - kubectl port-forward -n {{NAMESPACE}} svc/jellyfin-server {{port}}:8096 - -sync: - @echo "Triggering ArgoCD sync..." - @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite - @sleep 2 - @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo "" - -argocd-status: - argocd app get {{APP_NAME}} --core - -restart: - @echo "Restarting jellyfin server..." - kubectl rollout restart -n {{NAMESPACE}} deployment/jellyfin-server diff --git a/f3s/jellyfin/README.md b/f3s/jellyfin/README.md deleted file mode 100644 index ba08965..0000000 --- a/f3s/jellyfin/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Jellyfin Kubernetes Deployment - -This directory contains the Kubernetes configuration for deploying [Jellyfin](https://jellyfin.org/) - a free software media system that puts you in control of your media and data. - -## Architecture - -Jellyfin is a single-component deployment consisting of: -- **Server**: Main media server with web interface and API - -## Prerequisites - -1. **Create storage directory on the NFS server**: - ```bash - for host in f0 f1 f2; do - ssh paul@$host "doas mkdir -p /data/nfs/k3svolumes/jellyfin" - ssh paul@$host "doas chown -R 911:911 /data/nfs/k3svolumes/jellyfin/" - done - ``` - -## Deployment - -1. **Install the custom resources** (PVs, PVCs, ingress): - ```bash - just install-resources - ``` - -2. **Install Jellyfin using Helm** (or ArgoCD): - ```bash - just sync - ``` - -3. **Check deployment status**: - ```bash - just status - ``` - - Wait for all pods to be in `Running` state (may take a few minutes for image pulls). - -## Access - -Once deployed, Jellyfin will be available at: **https://jellyfin.f3s.buetow.org** - -Default setup instructions: -1. Navigate to the URL above -2. Complete the setup wizard on first access -3. Configure libraries and preferences - -## Storage - -Persistent storage is configured with: -- **Data**: Main configuration and metadata at `/data/nfs/k3svolumes/jellyfin` -- **Media**: Mount your media directories from other NFS sources as needed - -## Maintenance - -### Restart Jellyfin -```bash -just restart -``` - -### View logs -```bash -just logs -``` - -### Port forward for local access -```bash -just port-forward -``` - -### Uninstall (keeps data) -```bash -kubectl delete application jellyfin -n cicd -``` - -## Troubleshooting - -### Check pod logs -```bash -kubectl logs -n services -l app=jellyfin-server --tail=100 -``` - -### Verify persistent volumes -```bash -kubectl get pv,pvc -n services | grep jellyfin -``` diff --git a/f3s/jellyfin/SUMMARY.md b/f3s/jellyfin/SUMMARY.md deleted file mode 100644 index a3ac82a..0000000 --- a/f3s/jellyfin/SUMMARY.md +++ /dev/null @@ -1,135 +0,0 @@ -# Jellyfin Deployment Summary - -## Objective -Deploy Jellyfin 10.11.6 (latest stable) with proper reverse proxy configuration through relayd and Traefik, accessible at `https://jellyfin.f3s.buetow.org` and alternate ports 8096/8920 for Android app compatibility. - -## Configuration Implemented - -### 1. Kubernetes Resources -- **Deployment**: Jellyfin server using `jellyfin/jellyfin:latest` image -- **Service**: NodePort service exposing ports 30096 and 30920 for direct internal access -- **PersistentVolumes/Claims**: Three volumes for config, libraries, and data -- **Pod Resources**: 100m CPU request, 256Mi RAM request; 2000m CPU limit, 2Gi RAM limit - -### 2. Reverse Proxy Configuration (relayd) - -#### Frontend Setup -- **TLS Termination**: Relayd listens on ports 443 (IPv4/IPv6) with Let's Encrypt certificates -- **Header Forwarding**: - - `X-Forwarded-For: $REMOTE_ADDR` (client IP) - - `X-Forwarded-Proto: https` (protocol indication) -- **Multiple Ports**: Added separate relay rules for ports 8096 and 8920 to support Android app discovery attempts - -#### Routing Rules -- **Port 443**: Routes to Jellyfin NodePort 30096 via `f3s_jellyfin` backend table -- **Ports 8096/8920**: Dual IPv4/IPv6 relays also forward to NodePort 30096 -- **Host Routing**: Explicit match for `jellyfin.f3s.buetow.org` hostname - -### 3. Jellyfin Network Configuration -- **RequireHttps**: false (TLS handled by relayd) -- **EnableHttps**: false (no self-signed certs) -- **PublicPort**: 443 (external port users connect to) -- **KnownProxies**: - - 10.0.0.0/8 (Kubernetes cluster CIDR) - - 192.168.0.0/16 (relayd/frontend subnet) -- **EnablePublishedServerUriByRequest**: false - -### 4. Certificate Chain -- **Full Chain**: Relayd presents complete certificate chain (leaf + R12 intermediate) -- **Validation**: Confirmed with `openssl s_client` showing 2 certificates -- **Auto-renewal**: Let's Encrypt certificates on relayd - -## Issues Encountered & Solutions - -### Issue 1: Database Migration Failures -- **Problem**: Upgrading from 10.8.13 → 10.11.6 directly caused database corruption -- **Solution**: Requires upgrade path 10.8.13 → 10.10.7 → 10.11.6 -- **Status**: Settled on `jellyfin:latest` (10.11.6) with clean database - -### Issue 2: ConfigMap Read-Only Mount -- **Problem**: Network.xml mounted as read-only ConfigMap; newer Jellyfin versions need to write during migration -- **Solution**: Removed ConfigMap mount, let Jellyfin manage network.xml from PVC -- **Result**: Cleaner configuration, Jellyfin can self-manage settings - -### Issue 3: Android App "Unsupported version or product" Error -- **Root Cause**: - - Missing full certificate chain from relayd → Android app SSL validation failure - - App attempting alternate ports (8096, 8920) that weren't exposed -- **Solution**: - - Added relayd relays for ports 8096 and 8920 - - Ensured full cert chain is presented - - App should now connect to any of the three ports - -### Issue 4: NFS Storage Read-Only (CURRENT BLOCKER) -- **Problem**: `/data/nfs/k3svolumes/jellyfin/*` directories mounted read-only -- **Error**: `chown` and pod writes fail with "Read-only file system" -- **Status**: PVCs remain Pending; pods cannot start -- **Resolution Required**: NFS mount needs to be remounted as read-write on f0/f1/f2 hosts - -## Current Deployment Status - -✅ **Complete** -- Kubernetes manifests fully configured -- ArgoCD Application re-enabled with proper git URL -- Relayd configuration updated and deployed -- Certificate chain verified -- All networking rules in place - -❌ **Blocked** -- PersistentVolumes cannot bind to PVCs (read-only NFS) -- Jellyfin pod remains in Pending state -- Cannot proceed with testing until NFS is writable - -## Next Steps - -1. **Fix NFS Mount** (blocking issue) - ```bash - # On f0, f1, f2 - remount /data with write permissions - doas mount -uw /data - # Or check NFS export configuration - ``` - -2. **Deploy & Test** - - Once NFS is writable, pods will automatically start via ArgoCD - - Test connectivity: `curl https://jellyfin.f3s.buetow.org/System/Info/Public` - - Test Android app with manual URL entry - -3. **Configure Jellyfin** (post-deployment) - - Run setup wizard - - Add media libraries - - Configure transcoding if needed - - Verify Android app can connect - -## Key Files - -- **Deployment**: `jellyfin/helm-chart/templates/deployment.yaml` -- **Persistent Storage**: `jellyfin/helm-chart/templates/persistent-volume.yaml` -- **Relayd Config**: `/home/paul/git/conf/frontends/etc/relayd.conf.tpl` (lines ~15-130) -- **ArgoCD App**: Created via kubectl in services namespace - -## Testing Commands - -```bash -# Check pod status -kubectl get pods -n services -l app=jellyfin-server - -# View logs -kubectl logs -n services -l app=jellyfin-server - -# Test API endpoint -curl https://jellyfin.f3s.buetow.org/System/Info/Public - -# Verify certificate chain -echo | openssl s_client -servername jellyfin.f3s.buetow.org -connect jellyfin.f3s.buetow.org:443 | grep "BEGIN CERTIFICATE" | wc -l -# Should output: 2 - -# Check PVC binding -kubectl get pvc -n services | grep jellyfin -``` - -## Notes - -- Latest version (10.11.6) requires database >= 10.9.11 -- Android app compatibility improved in 10.10.7+ -- Relayd provides full TLS termination, reducing complexity vs. Traefik double-proxy -- NodePort approach bypasses Traefik, avoiding header forwarding issues diff --git a/f3s/jellyfin/helm-chart/Chart.yaml b/f3s/jellyfin/helm-chart/Chart.yaml deleted file mode 100644 index 07982e5..0000000 --- a/f3s/jellyfin/helm-chart/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: jellyfin-resources -description: Custom resources for Jellyfin deployment (PVs, PVCs, Ingress) -version: 0.1.0 -appVersion: "10.11.6" diff --git a/f3s/jellyfin/helm-chart/templates/.gitignore b/f3s/jellyfin/helm-chart/templates/.gitignore deleted file mode 100644 index 8eeb559..0000000 --- a/f3s/jellyfin/helm-chart/templates/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Secrets should not be committed -*-secret.yaml diff --git a/f3s/jellyfin/helm-chart/templates/configmap.yaml b/f3s/jellyfin/helm-chart/templates/configmap.yaml deleted file mode 100644 index 5ce6fe4..0000000 --- a/f3s/jellyfin/helm-chart/templates/configmap.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: jellyfin-network-config - namespace: services -data: - network.xml: | - <?xml version="1.0" encoding="utf-8"?> - <NetworkConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <RequireHttps>false</RequireHttps> - <CertificatePath /> - <CertificatePassword /> - <BaseUrl /> - <PublicHttpsPort>443</PublicHttpsPort> - <HttpServerPortNumber>8096</HttpServerPortNumber> - <HttpsPortNumber>8920</HttpsPortNumber> - <EnableHttps>false</EnableHttps> - <PublicPort>443</PublicPort> - <UPnPCreateHttpPortMap>false</UPnPCreateHttpPortMap> - <UDPPortRange /> - <EnableIPV6>false</EnableIPV6> - <EnableIPV4>true</EnableIPV4> - <EnableSSDPTracing>false</EnableSSDPTracing> - <SSDPTracingFilter /> - <UDPSendCount>2</UDPSendCount> - <UDPSendDelay>100</UDPSendDelay> - <IgnoreVirtualInterfaces>true</IgnoreVirtualInterfaces> - <VirtualInterfaceNames>vEthernet*</VirtualInterfaceNames> - <GatewayMonitorPeriod>60</GatewayMonitorPeriod> - <TrustAllIP6Interfaces>false</TrustAllIP6Interfaces> - <HDHomerunPortRange /> - <PublishedServerUriBySubnet /> - <AutoDiscoveryTracing>false</AutoDiscoveryTracing> - <AutoDiscovery>true</AutoDiscovery> - <RemoteIPFilter /> - <IsRemoteIPFilterBlacklist>false</IsRemoteIPFilterBlacklist> - <EnableUPnP>false</EnableUPnP> - <EnableRemoteAccess>true</EnableRemoteAccess> - <LocalNetworkSubnets /> - <LocalNetworkAddresses /> - <KnownProxies> - <ProxyAddress>10.0.0.0/8</ProxyAddress> - <ProxyAddress>192.168.0.0/16</ProxyAddress> - </KnownProxies> - <EnablePublishedServerUriByRequest>false</EnablePublishedServerUriByRequest> - </NetworkConfiguration> diff --git a/f3s/jellyfin/helm-chart/templates/deployment.yaml b/f3s/jellyfin/helm-chart/templates/deployment.yaml deleted file mode 100644 index 0289dfe..0000000 --- a/f3s/jellyfin/helm-chart/templates/deployment.yaml +++ /dev/null @@ -1,68 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: jellyfin-server - namespace: services -spec: - replicas: 1 - selector: - matchLabels: - app: jellyfin-server - template: - metadata: - labels: - app: jellyfin-server - spec: - containers: - - name: jellyfin - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - ports: - - containerPort: 8096 - name: http - resources: - requests: - cpu: 500m - memory: 512Mi - limits: - cpu: 4000m - memory: 4Gi - volumeMounts: - - name: jellyfin-config - mountPath: /config - - name: jellyfin-libraries - mountPath: /media/libraries - - name: jellyfin-data - mountPath: /data - volumes: - - name: jellyfin-config - persistentVolumeClaim: - claimName: jellyfin-config-pvc - - name: jellyfin-libraries - persistentVolumeClaim: - claimName: jellyfin-libraries-pvc - - name: jellyfin-data - persistentVolumeClaim: - claimName: jellyfin-data-pvc ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: jellyfin-server - name: jellyfin-server - namespace: services -spec: - type: NodePort - ports: - - name: http - port: 8096 - protocol: TCP - targetPort: 8096 - nodePort: 30096 - - name: https - port: 8920 - protocol: TCP - targetPort: 8096 - nodePort: 30920 - selector: - app: jellyfin-server diff --git a/f3s/jellyfin/helm-chart/templates/ingress.yaml b/f3s/jellyfin/helm-chart/templates/ingress.yaml deleted file mode 100644 index ed01eca..0000000 --- a/f3s/jellyfin/helm-chart/templates/ingress.yaml +++ /dev/null @@ -1,3 +0,0 @@ -# Jellyfin is exposed via NodePorts 30096 and 30920 -# relayd on frontend proxies directly to these ports, bypassing Traefik -# This avoids double reverse-proxy complexity and certificate chain issues diff --git a/f3s/jellyfin/helm-chart/templates/persistent-volume.yaml b/f3s/jellyfin/helm-chart/templates/persistent-volume.yaml deleted file mode 100644 index f32783e..0000000 --- a/f3s/jellyfin/helm-chart/templates/persistent-volume.yaml +++ /dev/null @@ -1,86 +0,0 @@ -# Jellyfin PersistentVolume - Configuration and metadata storage -apiVersion: v1 -kind: PersistentVolume -metadata: - name: jellyfin-config-pv -spec: - capacity: - storage: 50Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - hostPath: - path: /data/nfs/k3svolumes/jellyfin/config - type: Directory ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: jellyfin-config-pvc - namespace: services -spec: - storageClassName: "" - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 50Gi ---- -# Jellyfin PersistentVolume - Libraries storage -apiVersion: v1 -kind: PersistentVolume -metadata: - name: jellyfin-libraries-pv -spec: - capacity: - storage: 500Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - hostPath: - path: /data/nfs/k3svolumes/jellyfin/libraries - type: Directory ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: jellyfin-libraries-pvc - namespace: services -spec: - storageClassName: "" - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 500Gi ---- -# Jellyfin PersistentVolume - Data storage -apiVersion: v1 -kind: PersistentVolume -metadata: - name: jellyfin-data-pv -spec: - capacity: - storage: 100Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - hostPath: - path: /data/nfs/k3svolumes/jellyfin/data - type: Directory ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: jellyfin-data-pvc - namespace: services -spec: - storageClassName: "" - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 100Gi diff --git a/f3s/jellyfin/values.yaml b/f3s/jellyfin/values.yaml deleted file mode 100644 index abcfc26..0000000 --- a/f3s/jellyfin/values.yaml +++ /dev/null @@ -1,52 +0,0 @@ -# Jellyfin Helm Chart Configuration -# Deploy to services namespace with persistent storage - -# Image configuration -image: - repository: jellyfin/jellyfin - tag: "10.11.6" - pullPolicy: IfNotPresent - -# Persistence -persistence: - config: - enabled: true - type: pvc - existingClaim: jellyfin-pvc - mountPath: /config - size: 50Gi - -# Service configuration -service: - type: ClusterIP - port: 8096 - -# Ingress configuration -ingress: - enabled: true - ingressClassName: traefik - annotations: - traefik.ingress.kubernetes.io/router.entrypoints: web - hosts: - - host: jellyfin.f3s.buetow.org - paths: - - path: / - pathType: Prefix - -# Resources -resources: - requests: - cpu: 500m - memory: 512Mi - limits: - cpu: 4000m - memory: 4Gi - -# Node selector (if needed) -nodeSelector: {} - -# Tolerations (if needed) -tolerations: [] - -# Affinity rules (if needed) -affinity: {} diff --git a/f3s/minvid/Justfile b/f3s/minvid/Justfile deleted file mode 100644 index 6d19d3f..0000000 --- a/f3s/minvid/Justfile +++ /dev/null @@ -1,38 +0,0 @@ -NAMESPACE := "services" -APP_NAME := "minvid" - -status: - @echo "=== Pods ===" - @kubectl get pods -n {{NAMESPACE}} | grep minvid - @echo "" - @echo "=== Service ===" - @kubectl get svc -n {{NAMESPACE}} minvid-service - @echo "" - @echo "=== Ingress ===" - @kubectl get ingress -n {{NAMESPACE}} minvid-ingress - @echo "" - @echo "=== PVCs ===" - @kubectl get pvc -n {{NAMESPACE}} | grep minvid - @echo "" - @echo "=== ArgoCD Status ===" - @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' 2>/dev/null && echo "" - -logs lines="100": - kubectl logs -n {{NAMESPACE}} -l app=minvid --tail={{lines}} -f - -port-forward port="8000": - @echo "Forwarding minvid to localhost:{{port}}" - kubectl port-forward -n {{NAMESPACE}} svc/minvid-service {{port}}:80 - -sync: - @echo "Triggering ArgoCD sync..." - @kubectl annotate application {{APP_NAME}} -n cicd argocd.argoproj.io/refresh=normal --overwrite - @sleep 2 - @kubectl get application {{APP_NAME}} -n cicd -o jsonpath='Sync: {.status.sync.status}, Health: {.status.health.status}' && echo "" - -argocd-status: - argocd app get {{APP_NAME}} --core - -restart: - @echo "Restarting minvid..." - kubectl rollout restart -n {{NAMESPACE}} deployment/minvid diff --git a/f3s/minvid/docker-image/Dockerfile b/f3s/minvid/docker-image/Dockerfile deleted file mode 100644 index f453435..0000000 --- a/f3s/minvid/docker-image/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -# Build frontend -FROM node:20-alpine AS frontend-builder -WORKDIR /build -RUN apk add --no-cache git -RUN git clone https://github.com/Ludvigaman/MinVid.git . -WORKDIR /build/MinVid -RUN npm install && npm run build - -# Build API -FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS api-builder -WORKDIR /build -RUN apk add --no-cache git -RUN git clone https://github.com/Ludvigaman/MinVid.git . -WORKDIR /build/MinVid-API -RUN dotnet publish -c Release -o /app/publish - -# Final image -FROM mcr.microsoft.com/dotnet/aspnet:9.0-alpine - -ENV PUID=1000 -ENV PGID=1000 - -RUN apk add --no-cache bash su-exec ffmpeg - -WORKDIR /app - -# Copy API -COPY --from=api-builder /app/publish . - -# Copy frontend dist -COPY --from=frontend-builder /build/MinVid/dist ./wwwroot - -EXPOSE 80 - -ENV ASPNETCORE_URLS=http://+:80 - -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -ENTRYPOINT ["/entrypoint.sh"] -CMD ["dotnet", "MinVid.dll"] - -HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ - CMD wget -qO- http://127.0.0.1:80/health || exit 0 - -VOLUME /app/data - -LABEL maintainer="MinVid Contributors" diff --git a/f3s/minvid/docker-image/Justfile b/f3s/minvid/docker-image/Justfile deleted file mode 100644 index 12fa1cb..0000000 --- a/f3s/minvid/docker-image/Justfile +++ /dev/null @@ -1,7 +0,0 @@ -all: - docker build -t minvid:latest . - -f3s: - docker build -t minvid:latest . - docker tag minvid:latest r0.lan.buetow.org:30001/minvid:latest - docker push r0.lan.buetow.org:30001/minvid:latest diff --git a/f3s/minvid/docker-image/entrypoint.sh b/f3s/minvid/docker-image/entrypoint.sh deleted file mode 100644 index 7865234..0000000 --- a/f3s/minvid/docker-image/entrypoint.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -# Create user and group if they don't exist -if ! id -u minvid &>/dev/null; then - addgroup -g ${PGID} minvid - adduser -D -u ${PUID} -G minvid minvid -fi - -# Ensure data directory exists and has correct permissions -mkdir -p /app/data -chown -R minvid:minvid /app/data - -# Execute the main command as minvid user -exec su-exec minvid "$@" diff --git a/f3s/minvid/helm-chart/Chart.yaml b/f3s/minvid/helm-chart/Chart.yaml deleted file mode 100644 index 994b2f4..0000000 --- a/f3s/minvid/helm-chart/Chart.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v2 -name: minvid -description: A Helm chart for deploying MinVid. -version: 0.1.0 -appVersion: "latest" diff --git a/f3s/minvid/helm-chart/templates/deployment.yaml b/f3s/minvid/helm-chart/templates/deployment.yaml deleted file mode 100644 index 6d04977..0000000 --- a/f3s/minvid/helm-chart/templates/deployment.yaml +++ /dev/null @@ -1,44 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: minvid - namespace: services -spec: - replicas: 1 - selector: - matchLabels: - app: minvid - template: - metadata: - labels: - app: minvid - spec: - containers: - - name: minvid - image: registry.lan.buetow.org:30001/minvid:latest - imagePullPolicy: Always - ports: - - containerPort: 80 - volumeMounts: - - name: minvid-data - mountPath: /app/data - volumes: - - name: minvid-data - persistentVolumeClaim: - claimName: minvid-data-pvc ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: minvid - name: minvid-service - namespace: services -spec: - ports: - - name: web - port: 80 - protocol: TCP - targetPort: 80 - selector: - app: minvid diff --git a/f3s/minvid/helm-chart/templates/ingress.yaml b/f3s/minvid/helm-chart/templates/ingress.yaml deleted file mode 100644 index 5c06880..0000000 --- a/f3s/minvid/helm-chart/templates/ingress.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: minvid-ingress - namespace: services - annotations: - spec.ingressClassName: traefik - traefik.ingress.kubernetes.io/router.entrypoints: web - traefik.ingress.kubernetes.io/router.middlewares: services-forwarded-headers@kubernetescrd -spec: - rules: - - host: minvid.f3s.buetow.org - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: minvid-service - port: - number: 80 diff --git a/f3s/minvid/helm-chart/templates/persistent-volumes.yaml b/f3s/minvid/helm-chart/templates/persistent-volumes.yaml deleted file mode 100644 index a6b40a0..0000000 --- a/f3s/minvid/helm-chart/templates/persistent-volumes.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: PersistentVolume -metadata: - name: minvid-data-pv -spec: - capacity: - storage: 1Ti - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - hostPath: - path: /data/nfs/k3svolumes/minvid/data - type: Directory ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: minvid-data-pvc - namespace: services -spec: - storageClassName: "" - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 1Ti |
