downloads dos apps em plataforma.athleticmap.com/downloads (nginx + volume; arquivos copiados a mao com SHA256SUMS)

This commit is contained in:
ATM Platform
2026-10-06 15:38:17 +00:00
parent ca6b314919
commit af540614b4
+100
View File
@@ -0,0 +1,100 @@
# Downloads dos apps (06/10/2026): https://plataforma.athleticmap.com/downloads/<versao>/<arquivo>
# O portal (/portal dos tenants) aponta para ca. Os arquivos NAO estao no Git (dezenas de MB): moram no volume
# `downloads-app` e sao copiados a mao, com o SHA256SUMS conferido (ver pendencias/2026-10-06.md, "Downloads").
# Tudo sai como anexo, com nosniff; .apk com o tipo do Android, para o celular oferecer a instalacao.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: downloads-app
namespace: plataforma-prod
spec:
accessModes: [ReadWriteOnce]
resources: { requests: { storage: 2Gi } }
---
apiVersion: v1
kind: ConfigMap
metadata:
name: downloads-app-nginx
namespace: plataforma-prod
data:
default.conf: |
server {
listen 8080;
server_tokens off;
root /srv;
autoindex off;
types {
application/vnd.android.package-archive apk;
application/octet-stream exe msi dmg AppImage deb rpm;
text/plain txt;
}
default_type text/plain;
location = /saude { access_log off; return 200 "ok\n"; }
location /downloads/ {
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Disposition "attachment" always;
add_header Cache-Control "public, max-age=300" always;
try_files $uri =404;
}
location / { return 404; }
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: downloads-app
namespace: plataforma-prod
labels: { app: downloads-app }
spec:
replicas: 1
strategy: { type: Recreate }
selector: { matchLabels: { app: downloads-app } }
template:
metadata:
labels: { app: downloads-app }
spec:
containers:
- name: nginx
image: docker.io/library/nginx:alpine
imagePullPolicy: IfNotPresent
ports: [{ containerPort: 8080 }]
resources:
requests: { cpu: 10m, memory: 16Mi }
limits: { cpu: 200m, memory: 64Mi }
readinessProbe: { httpGet: { path: /saude, port: 8080 }, periodSeconds: 10 }
volumeMounts:
- { name: conf, mountPath: /etc/nginx/conf.d }
- { name: arquivos, mountPath: /srv/downloads }
volumes:
- name: conf
configMap: { name: downloads-app-nginx }
- name: arquivos
persistentVolumeClaim: { claimName: downloads-app }
---
apiVersion: v1
kind: Service
metadata:
name: downloads-app
namespace: plataforma-prod
spec:
selector: { app: downloads-app }
ports: [{ name: http, port: 80, targetPort: 8080 }]
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: plataforma-downloads
namespace: plataforma-prod
annotations:
traefik.ingress.kubernetes.io/router.middlewares: plataforma-prod-redirect-https@kubernetescrd
spec:
ingressClassName: traefik
tls:
- hosts: [plataforma.athleticmap.com]
secretName: plataforma-tls
rules:
- host: plataforma.athleticmap.com
http:
paths:
- { path: /downloads, pathType: Prefix, backend: { service: { name: downloads-app, port: { number: 80 } } } }