- ingress: fix proxying /data to minio, use another ingress which proxies correct host to ensure presigned urls work - presigning: determine if signing endpoint url (minio) or access endpoint (cloud bucket) based on if access endpoint is provided, set bool on storage object - chart: fix indent on incorrect storageClassName configs - ingress: make 'ingress_class' configurable (set to 'public' for microk8s, default to 'nginx') - minio: use older minio image which supports legacy fs based setup (for now) - nginx service: add 'nginx_service_use_node_port' config setting: if true, will use NodePort for frontend, other will use default (ClusterIP) and only for the frontend / nginx - chart: remove changing service type for other services
This commit is contained in:
parent
afe536e568
commit
aabb0b2a92
@ -44,6 +44,7 @@ class S3Storage(BaseModel):
|
|||||||
secret_key: str
|
secret_key: str
|
||||||
access_endpoint_url: Optional[str]
|
access_endpoint_url: Optional[str]
|
||||||
region: Optional[str] = ""
|
region: Optional[str] = ""
|
||||||
|
use_access_for_presign: Optional[bool] = True
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
@ -93,6 +93,9 @@ class K8SManager(BaseCrawlManager, K8sAPI):
|
|||||||
access_key = self._secret_data(storage_secret, "STORE_ACCESS_KEY")
|
access_key = self._secret_data(storage_secret, "STORE_ACCESS_KEY")
|
||||||
secret_key = self._secret_data(storage_secret, "STORE_SECRET_KEY")
|
secret_key = self._secret_data(storage_secret, "STORE_SECRET_KEY")
|
||||||
region = self._secret_data(storage_secret, "STORE_REGION") or ""
|
region = self._secret_data(storage_secret, "STORE_REGION") or ""
|
||||||
|
use_access_for_presign = (
|
||||||
|
self._secret_data(storage_secret, "STORE_USE_ACCESS_FOR_PRESIGN") == "1"
|
||||||
|
)
|
||||||
|
|
||||||
self._default_storages[name] = S3Storage(
|
self._default_storages[name] = S3Storage(
|
||||||
access_key=access_key,
|
access_key=access_key,
|
||||||
@ -100,6 +103,7 @@ class K8SManager(BaseCrawlManager, K8sAPI):
|
|||||||
endpoint_url=endpoint_url,
|
endpoint_url=endpoint_url,
|
||||||
access_endpoint_url=access_endpoint_url,
|
access_endpoint_url=access_endpoint_url,
|
||||||
region=region,
|
region=region,
|
||||||
|
use_access_for_presign=use_access_for_presign,
|
||||||
)
|
)
|
||||||
|
|
||||||
return self._default_storages[name]
|
return self._default_storages[name]
|
||||||
|
@ -40,9 +40,9 @@ spec:
|
|||||||
requests:
|
requests:
|
||||||
storage: 1Gi
|
storage: 1Gi
|
||||||
|
|
||||||
{% if volume_storage_class %}
|
{% if volume_storage_class %}
|
||||||
storageClassName: {{ volume_storage_class }}
|
storageClassName: {{ volume_storage_class }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
@ -208,9 +208,9 @@ spec:
|
|||||||
requests:
|
requests:
|
||||||
storage: {{ requests_hd }}
|
storage: {{ requests_hd }}
|
||||||
|
|
||||||
{% if volume_storage_class %}
|
{% if volume_storage_class %}
|
||||||
storageClassName: {{ volume_storage_class }}
|
storageClassName: {{ volume_storage_class }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -4,7 +4,6 @@ Storage API
|
|||||||
from typing import Union
|
from typing import Union
|
||||||
from urllib.parse import urlsplit
|
from urllib.parse import urlsplit
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
import os
|
|
||||||
|
|
||||||
from fastapi import Depends, HTTPException
|
from fastapi import Depends, HTTPException
|
||||||
from aiobotocore.session import get_session
|
from aiobotocore.session import get_session
|
||||||
@ -13,10 +12,6 @@ from .archives import Archive, DefaultStorage, S3Storage
|
|||||||
from .users import User
|
from .users import User
|
||||||
|
|
||||||
|
|
||||||
# sign access endpoint
|
|
||||||
sign_access_endpoint = os.environ.get("SIGN_ACCESS_ENDPOINT")
|
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
def init_storages_api(archive_ops, crawl_manager, user_dep):
|
def init_storages_api(archive_ops, crawl_manager, user_dep):
|
||||||
"""API for updating storage for an archive"""
|
"""API for updating storage for an archive"""
|
||||||
@ -108,7 +103,11 @@ async def get_presigned_url(archive, crawlfile, crawl_manager, duration=3600):
|
|||||||
else:
|
else:
|
||||||
raise Exception("No Default Storage Found, Invalid Storage Type")
|
raise Exception("No Default Storage Found, Invalid Storage Type")
|
||||||
|
|
||||||
async with get_s3_client(s3storage, sign_access_endpoint) as (client, bucket, key):
|
async with get_s3_client(s3storage, s3storage.use_access_for_presign) as (
|
||||||
|
client,
|
||||||
|
bucket,
|
||||||
|
key,
|
||||||
|
):
|
||||||
key += crawlfile.filename
|
key += crawlfile.filename
|
||||||
|
|
||||||
presigned_url = await client.generate_presigned_url(
|
presigned_url = await client.generate_presigned_url(
|
||||||
@ -116,7 +115,7 @@ async def get_presigned_url(archive, crawlfile, crawl_manager, duration=3600):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
not sign_access_endpoint
|
not s3storage.use_access_for_presign
|
||||||
and s3storage.access_endpoint_url
|
and s3storage.access_endpoint_url
|
||||||
and s3storage.access_endpoint_url != s3storage.endpoint_url
|
and s3storage.access_endpoint_url != s3storage.endpoint_url
|
||||||
):
|
):
|
||||||
|
@ -103,12 +103,6 @@ spec:
|
|||||||
app: {{ .Values.name }}
|
app: {{ .Values.name }}
|
||||||
role: backend
|
role: backend
|
||||||
|
|
||||||
{{- if .Values.service }}
|
|
||||||
{{- if .Values.service.type }}
|
|
||||||
type: {{ .Values.service.type | quote }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- protocol: TCP
|
- protocol: TCP
|
||||||
port: 8000
|
port: 8000
|
||||||
|
@ -47,8 +47,6 @@ data:
|
|||||||
|
|
||||||
WEB_CONCURRENCY: "{{ .Values.backend_workers | default 4 }}"
|
WEB_CONCURRENCY: "{{ .Values.backend_workers | default 4 }}"
|
||||||
|
|
||||||
SIGN_ACCESS_ENDPOINT: "1"
|
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
|
@ -87,11 +87,9 @@ spec:
|
|||||||
app: {{ .Values.name }}
|
app: {{ .Values.name }}
|
||||||
role: frontend
|
role: frontend
|
||||||
|
|
||||||
{{- if .Values.service }}
|
{{- if .Values.nginx_service_use_node_port }}
|
||||||
{{- if .Values.service.type }}
|
type: NodePort
|
||||||
type: {{ .Values.service.type | quote }}
|
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- protocol: TCP
|
- protocol: TCP
|
||||||
|
@ -7,7 +7,7 @@ metadata:
|
|||||||
name: ingress-main
|
name: ingress-main
|
||||||
namespace: {{ .Release.Namespace }}
|
namespace: {{ .Release.Namespace }}
|
||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/ingress.class: "nginx"
|
kubernetes.io/ingress.class: {{ .Values.ingress_class | default "nginx" }}
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
nginx.ingress.kubernetes.io/rewrite-target: /$1
|
nginx.ingress.kubernetes.io/rewrite-target: /$1
|
||||||
nginx.ingress.kubernetes.io/enable-cors: "true"
|
nginx.ingress.kubernetes.io/enable-cors: "true"
|
||||||
@ -31,16 +31,6 @@ spec:
|
|||||||
- host: {{ .Values.ingress.host }}
|
- host: {{ .Values.ingress.host }}
|
||||||
http:
|
http:
|
||||||
paths:
|
paths:
|
||||||
{{- if .Values.minio_local }}
|
|
||||||
- path: /data/(.*)
|
|
||||||
pathType: Prefix
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: local-minio
|
|
||||||
port:
|
|
||||||
number: 9000
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
- path: /(api/.*)
|
- path: /(api/.*)
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
backend:
|
backend:
|
||||||
@ -65,7 +55,7 @@ metadata:
|
|||||||
name: ingress-authsign
|
name: ingress-authsign
|
||||||
namespace: {{ .Release.Namespace }}
|
namespace: {{ .Release.Namespace }}
|
||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/ingress.class: "nginx"
|
kubernetes.io/ingress.class: {{ .Values.ingress_class | default "nginx" }}
|
||||||
nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
nginx.ingress.kubernetes.io/ssl-redirect: "false"
|
||||||
nginx.ingress.kubernetes.io/rewrite-target: /$1
|
nginx.ingress.kubernetes.io/rewrite-target: /$1
|
||||||
nginx.ingress.kubernetes.io/upstream-vhost: "{{ .Values.signer.host }}"
|
nginx.ingress.kubernetes.io/upstream-vhost: "{{ .Values.signer.host }}"
|
||||||
@ -85,6 +75,35 @@ spec:
|
|||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
|
||||||
|
{{- if .Values.minio_local }}
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: ingress-minio
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: {{ .Values.ingress_class | default "nginx" }}
|
||||||
|
nginx.ingress.kubernetes.io/rewrite-target: /$1
|
||||||
|
nginx.ingress.kubernetes.io/upstream-vhost: "{{ .Values.minio_host }}"
|
||||||
|
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: {{ .Values.ingress.host }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /data/(.*)
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: local-minio
|
||||||
|
port:
|
||||||
|
number: 9000
|
||||||
|
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
{{ if .Values.ingress.tls }}
|
{{ if .Values.ingress.tls }}
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -106,7 +125,7 @@ spec:
|
|||||||
solvers:
|
solvers:
|
||||||
- http01:
|
- http01:
|
||||||
ingress:
|
ingress:
|
||||||
class: nginx
|
class: {{ .Values.ingress_class | default "nginx" }}
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
@ -53,8 +53,13 @@ spec:
|
|||||||
image: {{ .Values.minio_image }}
|
image: {{ .Values.minio_image }}
|
||||||
imagePullPolicy: {{ .Values.minio_pull_policy }}
|
imagePullPolicy: {{ .Values.minio_pull_policy }}
|
||||||
|
|
||||||
command: ['/bin/sh']
|
command:
|
||||||
args: ["mkdir", "-p", "/data/{{ .Values.minio_local_bucket_name }}" ]
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
mkdir -p /data/{{ .Values.minio_local_bucket_name }}
|
||||||
|
mkdir -p /data/.minio.sys
|
||||||
|
echo '{"version":"1","format":"fs","id":"btrix-data-fs","fs":{"version":"2"}}' > /data/.minio.sys/format.json
|
||||||
|
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: data-minio
|
- name: data-minio
|
||||||
@ -86,7 +91,6 @@ metadata:
|
|||||||
app: local-minio
|
app: local-minio
|
||||||
|
|
||||||
spec:
|
spec:
|
||||||
type: NodePort
|
|
||||||
selector:
|
selector:
|
||||||
app: local-minio
|
app: local-minio
|
||||||
|
|
||||||
|
@ -59,9 +59,9 @@ spec:
|
|||||||
requests:
|
requests:
|
||||||
storage: 2Gi
|
storage: 2Gi
|
||||||
|
|
||||||
{{- if .Values.volume_storage_class }}
|
{{- if .Values.volume_storage_class }}
|
||||||
storageClassName: {{ .Values.volume_storage_class }}
|
storageClassName: {{ .Values.volume_storage_class }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -42,17 +42,20 @@ stringData:
|
|||||||
STORE_SECRET_KEY: "{{ $storage.secret_key }}"
|
STORE_SECRET_KEY: "{{ $storage.secret_key }}"
|
||||||
|
|
||||||
{{- if $storage.bucket_name }}
|
{{- if $storage.bucket_name }}
|
||||||
STORE_ENDPOINT_URL: "{{ $storage.endpoint_url }}{{ $storage.bucket_name }}"
|
STORE_ENDPOINT_URL: "{{ $storage.endpoint_url }}{{ $storage.bucket_name }}/"
|
||||||
{{- else }}
|
{{- else }}
|
||||||
STORE_ENDPOINT_URL: "{{ $storage.endpoint_url }}"
|
STORE_ENDPOINT_URL: "{{ $storage.endpoint_url }}"
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
{{- if $storage.access_endpoint_url }}
|
{{- if $storage.access_endpoint_url }}
|
||||||
STORE_ACCESS_ENDPOINT_URL: "{{ $storage.access_endpoint_url }}"
|
STORE_ACCESS_ENDPOINT_URL: "{{ $storage.access_endpoint_url }}/"
|
||||||
|
STORE_USE_ACCESS_FOR_PRESIGN: "1"
|
||||||
{{- else if and $.Values.ingress.host $.Values.minio_local }}
|
{{- else if and $.Values.ingress.host $.Values.minio_local }}
|
||||||
STORE_ACCESS_ENDPOINT_URL: {{ $.Values.ingress.scheme | default "https" }}://{{ $.Values.ingress.host }}/data/{{ $storage.bucket_name }}/
|
STORE_ACCESS_ENDPOINT_URL: {{ $.Values.ingress.scheme | default "https" }}://{{ $.Values.ingress.host }}/data/{{ $storage.bucket_name }}/
|
||||||
|
STORE_USE_ACCESS_FOR_PRESIGN: "0"
|
||||||
{{- else }}
|
{{- else }}
|
||||||
STORE_ACCESS_ENDPOINT_URL: "{{ $storage.endpoint_url }}"
|
STORE_ACCESS_ENDPOINT_URL: "{{ $storage.endpoint_url }}"
|
||||||
|
STORE_USE_ACCESS_FOR_PRESIGN: "0"
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
STORE_REGION: "{{ $storage.region }}"
|
STORE_REGION: "{{ $storage.region }}"
|
||||||
|
@ -135,12 +135,6 @@ spec:
|
|||||||
selector:
|
selector:
|
||||||
app: auth-signer
|
app: auth-signer
|
||||||
|
|
||||||
{{- if .Values.service }}
|
|
||||||
{{- if .Values.service.type }}
|
|
||||||
type: {{ .Values.service.type | quote }}
|
|
||||||
{{- end }}
|
|
||||||
{{- end }}
|
|
||||||
|
|
||||||
clusterIP: None
|
clusterIP: None
|
||||||
ports:
|
ports:
|
||||||
- protocol: TCP
|
- protocol: TCP
|
||||||
|
@ -31,7 +31,7 @@ superuser:
|
|||||||
|
|
||||||
# API Image
|
# API Image
|
||||||
# =========================================
|
# =========================================
|
||||||
api_image: "docker.io/webrecorder/browsertrix-backend:dev"
|
api_image: "docker.io/webrecorder/browsertrix-backend:latest"
|
||||||
api_pull_policy: "Always"
|
api_pull_policy: "Always"
|
||||||
|
|
||||||
api_password_secret: "c9085f33ecce4347aa1d69339e16c499"
|
api_password_secret: "c9085f33ecce4347aa1d69339e16c499"
|
||||||
@ -50,7 +50,7 @@ job_memory: "70Mi"
|
|||||||
|
|
||||||
# Nginx Image
|
# Nginx Image
|
||||||
# =========================================
|
# =========================================
|
||||||
nginx_image: "docker.io/webrecorder/browsertrix-frontend:dev"
|
nginx_image: "docker.io/webrecorder/browsertrix-frontend:latest"
|
||||||
nginx_pull_policy: "Always"
|
nginx_pull_policy: "Always"
|
||||||
|
|
||||||
nginx_requests_cpu: "3m"
|
nginx_requests_cpu: "3m"
|
||||||
@ -59,6 +59,10 @@ nginx_limits_cpu: "10m"
|
|||||||
nginx_requests_memory: "12Mi"
|
nginx_requests_memory: "12Mi"
|
||||||
nginx_limits_memory: "12Mi"
|
nginx_limits_memory: "12Mi"
|
||||||
|
|
||||||
|
# if true, will use node port to make the service directly available
|
||||||
|
# for testing / local deployments only
|
||||||
|
nginx_service_use_node_port: false
|
||||||
|
|
||||||
|
|
||||||
# MongoDB Image
|
# MongoDB Image
|
||||||
# =========================================
|
# =========================================
|
||||||
@ -147,7 +151,7 @@ minio_local: true
|
|||||||
minio_scheme: "http"
|
minio_scheme: "http"
|
||||||
minio_host: "local-minio.default:9000"
|
minio_host: "local-minio.default:9000"
|
||||||
|
|
||||||
minio_image: minio/minio
|
minio_image: docker.io/minio/minio:RELEASE.2022-10-24T18-35-07Z
|
||||||
minio_mc_image: minio/mc
|
minio_mc_image: minio/mc
|
||||||
minio_pull_policy: "IfNotPresent"
|
minio_pull_policy: "IfNotPresent"
|
||||||
|
|
||||||
@ -193,6 +197,8 @@ ingress:
|
|||||||
scheme: "http"
|
scheme: "http"
|
||||||
tls: false
|
tls: false
|
||||||
|
|
||||||
|
ingress_class: nginx
|
||||||
|
|
||||||
|
|
||||||
# Signing Options
|
# Signing Options
|
||||||
# =========================================
|
# =========================================
|
||||||
@ -212,9 +218,8 @@ signer_requests_memory: "36Mi"
|
|||||||
signer_limits_memory: "96Mi"
|
signer_limits_memory: "96Mi"
|
||||||
|
|
||||||
|
|
||||||
# Optional: configure load balancing
|
# Optional: configure load balancing annotations
|
||||||
service:
|
# service:
|
||||||
type: ClusterIP
|
|
||||||
# annotations:
|
# annotations:
|
||||||
# service.beta.kubernetes.io/aws-load-balancer-internal: "true"
|
# service.beta.kubernetes.io/aws-load-balancer-internal: "true"
|
||||||
# helm.sh/resource-policy: keep
|
# helm.sh/resource-policy: keep
|
||||||
|
Loading…
Reference in New Issue
Block a user