101 lines
3.1 KiB
YAML
101 lines
3.1 KiB
YAML
# Downloads dos apps (06/10/2026): https://plataforma.athleticmap.com/downloads/<arquivo> (nome com a versao, ex. AthleticMap-pais-1.0.3.apk)
|
|
# 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 } } } }
|