diff --git a/charts/cert-spammer/Chart.yaml b/charts/cert-spammer/Chart.yaml index c38e7c5..804e765 100644 --- a/charts/cert-spammer/Chart.yaml +++ b/charts/cert-spammer/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.9 +version: 0.2.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/charts/cert-spammer/templates/00-cert-spammer-deployment.yaml b/charts/cert-spammer/templates/00-cert-spammer-deployment.yaml index 7421da5..6b83ff5 100644 --- a/charts/cert-spammer/templates/00-cert-spammer-deployment.yaml +++ b/charts/cert-spammer/templates/00-cert-spammer-deployment.yaml @@ -1,3 +1,8 @@ +{{- $name := $.Values.env.TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH | required "$.Values.env.TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH is required." -}} +{{- $name := $.Values.env.TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES | required "$.Values.env.TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES is required." -}} +{{- $name := $.Values.env.TOPOS_RUN_ID | required "$.Values.env.TOPOS_RUN_ID is required." -}} +{{- $name := $.Values.env.TOPOS_RUN_NUMBER | required "$.Values.env.TOPOS_RUN_NUMBER is required." -}} + apiVersion: v1 kind: Pod metadata: @@ -7,44 +12,22 @@ metadata: spec: restartPolicy: Never containers: - - name: spam + - name: topos image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag }}" - args: ["network", "spam", "--target-nodes-path", "/tmp/shared/peer_nodes.json"] - imagePullPolicy: Always - volumeMounts: - - mountPath: /tmp/shared - name: shared + command: ["topos"] + args: ["regtest", "spam", "--benchmark", "--target-hosts", "{{ $.Values.validator.target }}", "--number", "{{ $.Values.validator.replicas }}"] env: - - name: RUST_LOG - value: info - - - name: TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH - value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH }}" - - name: TOPOS_NETWORK_SPAMMER_BATCH_INTERVAL - value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_BATCH_INTERVAL }}" - {{ if $.Values.env.TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES }} - - name: TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES - value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES }}" - {{ end }} - - name: TOPOS_NETWORK_SPAMMER_NUMBER_OF_SUBNETS - value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_NUMBER_OF_SUBNETS }}" - - - name: OTLP_BATCH_SCHEDULED_DELAY - value: "{{ $.Values.env.OTLP_BATCH_SCHEDULED_DELAY }}" - - name: OTLP_BATCH_MAX_CONCURRENT_EXPORTS - value: "{{ $.Values.env.OTLP_BATCH_MAX_CONCURRENT_EXPORTS }}" - - name: OTLP_BATCH_MAX_EXPORTER_BATCH_SIZE - value: "{{ $.Values.env.OTLP_BATCH_MAX_EXPORTER_BATCH_SIZE }}" - - name: OTLP_BATCH_EXPORT_TIMEOUT - value: "{{ $.Values.env.OTLP_BATCH_EXPORT_TIMEOUT }}" - - name: OTLP_BATCH_MAX_QUEUE_SIZE - value: "{{ $.Values.env.OTLP_BATCH_MAX_QUEUE_SIZE }}" - - name: OTEL_EXPORTER_OTLP_COMPRESSION - value: "{{ $.Values.env.OTEL_EXPORTER_OTLP_COMPRESSION }}" - - name: OTEL_EXPORTER_OTLP_TIMEOUT - value: "{{ $.Values.env.OTEL_EXPORTER_OTLP_TIMEOUT }}" - - volumes: - - name: shared - persistentVolumeClaim: - claimName: shared + - name: RUST_LOG + value: info + - name: TOPOS_NETWORK_SPAMMER_BATCH_INTERVAL + value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_BATCH_INTERVAL }}" + - name: TOPOS_NETWORK_SPAMMER_NUMBER_OF_SUBNETS + value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_NUMBER_OF_SUBNETS }}" + - name: TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH + value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH }}" + - name: TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES + value: "{{ $.Values.env.TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES }}" + - name: TOPOS_RUN_ID + value: "{{ $.Values.env.TOPOS_RUN_ID }}" + - name: TOPOS_RUN_NUMBER + value: "{{ $.Values.env.TOPOS_RUN_NUMBER }}" diff --git a/charts/cert-spammer/values.yaml b/charts/cert-spammer/values.yaml index dba4c8a..45414b3 100644 --- a/charts/cert-spammer/values.yaml +++ b/charts/cert-spammer/values.yaml @@ -2,18 +2,17 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. image: - repository: ghcr.io/topos-network/topos - tag: main-network + repository: nobody + tag: main + +validator: + target: nobody + replicas: 1 env: - TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH: "1" - TOPOS_NETWORK_SPAMMER_BATCH_INTERVAL: "4000" + TOPOS_NETWORK_SPAMMER_BATCH_INTERVAL: "1000" TOPOS_NETWORK_SPAMMER_NUMBER_OF_SUBNETS: "1" - - OTLP_BATCH_SCHEDULED_DELAY: "1500" - OTLP_BATCH_MAX_CONCURRENT_EXPORTS: "1000" - OTLP_BATCH_MAX_EXPORTER_BATCH_SIZE: "10000" - OTLP_BATCH_EXPORT_TIMEOUT: "100000" - OTLP_BATCH_MAX_QUEUE_SIZE: "10000" - OTEL_EXPORTER_OTLP_COMPRESSION: "gzip" - OTEL_EXPORTER_OTLP_TIMEOUT: "60" + TOPOS_NETWORK_SPAMMER_CERT_PER_BATCH: + TOPOS_NETWORK_SPAMMER_NUMBER_OF_BATCHES: + TOPOS_RUN_ID: + TOPOS_RUN_NUMBER: diff --git a/charts/tce-all-in-one/Chart.yaml b/charts/tce-all-in-one/Chart.yaml index 407cefc..a0e41c9 100644 --- a/charts/tce-all-in-one/Chart.yaml +++ b/charts/tce-all-in-one/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.2.9 +version: 0.3.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/charts/tce-all-in-one/templates/00-tce-services.yaml b/charts/tce-all-in-one/templates/00-tce-services.yaml deleted file mode 100644 index 82f575c..0000000 --- a/charts/tce-all-in-one/templates/00-tce-services.yaml +++ /dev/null @@ -1,52 +0,0 @@ -{{- range $index, $e := until (int $.Values.replicas) }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ $.Values.mode }}-{{ $index }} - labels: - app: {{ $.Values.mode }}-{{ $index }} -spec: - type: ClusterIP - ports: - - port: {{ $.Values.ports.p2p }} - targetPort: p2p - protocol: TCP - name: p2p - - port: {{ $.Values.ports.http }} - targetPort: http - protocol: TCP - name: http - - port: {{ $.Values.ports.graphql }} - targetPort: graphql - protocol: TCP - name: graphql - selector: - app: {{ $.Values.mode }}-{{ $index }} - sessionAffinity: ClientIP -{{- end }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ $.Values.mode }} - labels: - app: {{ $.Values.mode }} -spec: - type: ClusterIP - ports: - - port: {{ $.Values.ports.p2p }} - targetPort: p2p - protocol: TCP - name: p2p - - port: {{ $.Values.ports.http }} - targetPort: http - protocol: TCP - name: http - - port: {{ $.Values.ports.graphql }} - targetPort: graphql - protocol: TCP - name: graphql - selector: - node: {{ $.Values.mode }} - sessionAffinity: ClientIP diff --git a/charts/tce-all-in-one/templates/01-tce-deployments.yaml b/charts/tce-all-in-one/templates/01-tce-deployments.yaml deleted file mode 100644 index 8481b0f..0000000 --- a/charts/tce-all-in-one/templates/01-tce-deployments.yaml +++ /dev/null @@ -1,136 +0,0 @@ -{{- range $index, $e := until (int $.Values.replicas) }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ $.Values.mode }}-{{ $index }} - labels: - app: {{ $.Values.mode }}-{{ $index }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - app: {{ $.Values.mode }}-{{ $index }} - template: - metadata: - labels: - app: {{ $.Values.mode }}-{{ $index }} - node: {{ $.Values.mode }} - spec: - hostname: {{ $.Values.mode }}-{{ $index }} - {{ if $.Values.singleTCENodePerK8sNode }} - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: node - operator: In - values: - - {{ $.Values.mode }} - topologyKey: "kubernetes.io/hostname" - {{ end }} - containers: - - name: {{ $.Values.mode }} - image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag }}" - imagePullPolicy: Always - livenessProbe: - exec: - command: - - /bin/bash - - -c - - topos tce push-peer-list --node http://localhost:1340 --format json /tmp/shared/peer_ids.json && topos tce status --node http://localhost:1340 - initialDelaySeconds: 15 - periodSeconds: 15 - failureThreshold: 10 - startupProbe: - {{ if eq $.Values.mode "boot" }} - exec: - command: - - /bin/bash - - -c - - topos tce push-peer-list --node http://localhost:1340 --format json /tmp/shared/peer_ids.json - {{ else }} - exec: - command: - - /bin/bash - - -c - - topos tce push-peer-list --node http://localhost:1340 --format json /tmp/shared/peer_ids.json && topos tce status --node http://localhost:1340 - {{ end }} - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 10 - failureThreshold: 30 - successThreshold: 1 - args: ["{{ $.Values.mode }}", "tce", "run"] - ports: - - name: p2p - containerPort: {{ $.Values.ports.p2p }} - protocol: TCP - - name: http - containerPort: {{ $.Values.ports.http }} - protocol: TCP - - name: graphql - containerPort: {{ $.Values.ports.graphql }} - protocol: TCP - volumeMounts: - - mountPath: /tmp/shared - name: shared - env: - - name: TCE_LOCAL_KS - value: "{{ $.Values.env.TCE_LOCAL_KS }}" - - name: LOCAL_TEST_NET - value: "{{ $.Values.env.LOCAL_TEST_NET }}" - - name: TOOLCHAIN_VERSION - value: "{{ $.Values.env.TOOLCHAIN_VERSION }}" - - name: RUST_LOG - value: "{{ $.Values.env.RUST_LOG }}" - - name: RUST_BACKTRACE - value: "{{ $.Values.env.RUST_BACKTRACE }}" - - name: TCE_DB_PATH - value: "{{ $.Values.env.TCE_DB_PATH }}" - - name: TCE_API_ADDR - value: "{{ $.Values.env.TCE_API_ADDR }}" - - name: TCE_GRAPHQL_API_ADDR - value: "{{ $.Values.env.TCE_GRAPHQL_API_ADDR }}" - - name: TCE_METRICS_API_ADDR - value: "{{ $.Values.env.TCE_METRICS_API_ADDR }}" - - name: TOPOS_OTLP_SERVICE_NAME - value: "{{ $.Values.env.TOPOS_OTLP_SERVICE_NAME }}" - - name: TOPOS_OTLP_AGENT - value: "{{ $.Values.env.TOPOS_OTLP_AGENT }}" - - name: TCE_ECHO_SAMPLE_SIZE - value: "{{ $.Values.env.TCE_ECHO_SAMPLE_SIZE }}" - - name: TCE_READY_SAMPLE_SIZE - value: "{{ $.Values.env.TCE_READY_SAMPLE_SIZE }}" - - name: TCE_DELIVERY_SAMPLE_SIZE - value: "{{ $.Values.env.TCE_DELIVERY_SAMPLE_SIZE }}" - - name: TCE_ECHO_THRESHOLD - value: "{{ $.Values.env.TCE_ECHO_THRESHOLD }}" - - name: TCE_READY_THRESHOLD - value: "{{ $.Values.env.TCE_READY_THRESHOLD }}" - - name: TCE_DELIVERY_THRESHOLD - value: "{{ $.Values.env.TCE_DELIVERY_THRESHOLD }}" - - name: TOPOS_OTLP_TAGS - value: "{{ $.Values.env.TOPOS_OTLP_TAGS }}" - - name: OTLP_BATCH_SCHEDULED_DELAY - value: "{{ $.Values.env.OTLP_BATCH_SCHEDULED_DELAY }}" - - name: OTLP_BATCH_MAX_CONCURRENT_EXPORTS - value: "{{ $.Values.env.OTLP_BATCH_MAX_CONCURRENT_EXPORTS }}" - - name: OTLP_BATCH_MAX_EXPORTER_BATCH_SIZE - value: "{{ $.Values.env.OTLP_BATCH_MAX_EXPORTER_BATCH_SIZE }}" - - name: OTLP_BATCH_EXPORT_TIMEOUT - value: "{{ $.Values.env.OTLP_BATCH_EXPORT_TIMEOUT }}" - - name: OTLP_BATCH_MAX_QUEUE_SIZE - value: "{{ $.Values.env.OTLP_BATCH_MAX_QUEUE_SIZE }}" - - name: OTEL_EXPORTER_OTLP_COMPRESSION - value: "{{ $.Values.env.OTEL_EXPORTER_OTLP_COMPRESSION }}" - - name: OTEL_EXPORTER_OTLP_TIMEOUT - value: "{{ $.Values.env.OTEL_EXPORTER_OTLP_TIMEOUT }}" - volumes: - - name: shared - persistentVolumeClaim: - claimName: shared ---- -{{- end }} diff --git a/charts/tce-all-in-one/templates/01-tce-statefulset.yaml b/charts/tce-all-in-one/templates/01-tce-statefulset.yaml new file mode 100644 index 0000000..6b6f538 --- /dev/null +++ b/charts/tce-all-in-one/templates/01-tce-statefulset.yaml @@ -0,0 +1,132 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + eks.amazonaws.com/role-arn: {{ $.Values.service_account.role }} + name: {{ $.Values.service_account.name }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $.Values.role }} +spec: + selector: + app: {{ $.Values.role }} + ports: + - name: grpc + port: {{ $.Values.ports.grpc }} + protocol: TCP + - name: p2p + port: {{ $.Values.ports.p2p }} + protocol: TCP + - name: graphql + port: {{ $.Values.ports.graphql }} + protocol: TCP + - name: metrics + port: {{ $.Values.ports.metrics }} + protocol: TCP + clusterIP: None +--- +{{- $name := $.Values.env.TOPOS_RUN_ID | required "$.Values.env.TOPOS_RUN_ID is required." -}} +{{- $name := $.Values.env.TOPOS_RUN_NUMBER | required "$.Values.env.TOPOS_RUN_NUMBER is required." -}} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ $.Values.role }} + labels: + app: {{ $.Values.role }} + stack: tce +spec: + serviceName: {{ $.Values.role }} + podManagementPolicy: "Parallel" + replicas: {{ $.Values.replicas }} + selector: + matchLabels: + app: {{ $.Values.role }} + stack: tce + template: + metadata: + labels: + app: {{ $.Values.role }} + stack: tce + annotations: + prometheus.io/port: "{{ $.Values.ports.metrics }}" + prometheus.io/scrape: "true" + spec: + serviceAccountName: {{ $.Values.service_account.name }} + containers: + - name: {{ $.Values.role }} + image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag }}" + command: ["topos"] + args: ["node", "up", "--name", "$(HOSTNAME)", "--no-edge-process"] + volumeMounts: + - mountPath: /data/ + name: data + env: + - name: RUST_LOG + value: {{ $.Values.env.RUST_LOG }} + - name: TOPOS_HOME + value: {{ $.Values.env.TOPOS_HOME }} + - name: TOPOS_RUN_ID + value: "{{ $.Values.env.TOPOS_RUN_ID }}" + - name: TOPOS_RUN_NUMBER + value: "{{ $.Values.env.TOPOS_RUN_NUMBER }}" + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + ports: + - name: grpc + containerPort: {{ $.Values.ports.grpc }} + protocol: TCP + - name: p2p + containerPort: {{ $.Values.ports.p2p }} + protocol: TCP + - name: graphql + containerPort: {{ $.Values.ports.graphql }} + protocol: TCP + - name: metrics + containerPort: {{ $.Values.ports.metrics }} + protocol: TCP + initContainers: + - name: init + image: amazon/aws-cli:latest + command: ["/bin/sh","-c"] + args: ["aws s3 cp {{ $.Values.s3.genesis_file }} /data/subnet/topos/genesis.json; aws s3 cp --recursive {{ $.Values.s3.config_dir }}/${HOSTNAME} /data/node/${HOSTNAME}"] + volumeMounts: + - mountPath: /data/ + name: data + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: workload + operator: In + values: + - topos + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: stack + operator: In + values: + - tce + topologyKey: "kubernetes.io/hostname" + tolerations: + - key: "workload" + operator: "Equal" + value: "topos" + effect: "NoExecute" + persistentVolumeClaimRetentionPolicy: + whenDeleted: Delete + volumeClaimTemplates: + - metadata: + name: data + spec: + accessModes: [ "ReadWriteOncePod" ] + storageClassName: "gp2" + resources: + requests: + storage: 1Gi diff --git a/charts/tce-all-in-one/templates/03-lets-encrypt-issuers.yaml b/charts/tce-all-in-one/templates/03-lets-encrypt-issuers.yaml deleted file mode 100644 index d6390da..0000000 --- a/charts/tce-all-in-one/templates/03-lets-encrypt-issuers.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{ if .Values.ingress }} -{{ $issuer := lookup "cert-manager.io/v1" "Issuer" .Release.Namespace "letsencrypt-staging" }} -{{ if not $issuer }} -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: letsencrypt-staging -spec: - acme: - server: https://acme-staging-v02.api.letsencrypt.org/directory - email: {{ $.Values.acme.email }} - privateKeySecretRef: - name: letsencrypt-staging - solvers: - - http01: - ingress: - class: nginx -{{ end }} ---- -{{ $issuer := lookup "cert-manager.io/v1" "Issuer" .Release.Namespace "letsencrypt-production" }} -{{ if not $issuer }} -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: letsencrypt-production -spec: - acme: - server: https://acme-v02.api.letsencrypt.org/directory - email: {{ $.Values.acme.email }} - privateKeySecretRef: - name: letsencrypt-production - solvers: - - http01: - ingress: - class: nginx -{{ end }} -{{ end }} diff --git a/charts/tce-all-in-one/templates/04-tce-ingress.yaml b/charts/tce-all-in-one/templates/04-tce-ingress.yaml deleted file mode 100644 index f839232..0000000 --- a/charts/tce-all-in-one/templates/04-tce-ingress.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{ if .Values.ingress }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: {{ $.Values.mode }} - annotations: - kubernetes.io/ingress.class: "nginx" - cert-manager.io/issuer: "letsencrypt-{{ .Values.acme.environment }}" - nginx.ingress.kubernetes.io/backend-protocol: "GRPC" -spec: - tls: - - hosts: - - {{ .Values.host }} - secretName: "{{ .Values.host }}-secret-tls" - rules: - - host: {{ .Values.host }} - http: - paths: - - backend: - service: - name: {{ $.Values.mode }} - port: - number: 1340 - path: / - pathType: Prefix -{{ end }} diff --git a/charts/tce-all-in-one/values.yaml b/charts/tce-all-in-one/values.yaml index 56653bc..acaab65 100644 --- a/charts/tce-all-in-one/values.yaml +++ b/charts/tce-all-in-one/values.yaml @@ -2,58 +2,30 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. -replicas: 5 -# mode can be (boot | peer) -mode: boot +replicas: 1 +# mode can be (fullnode | validator) +role: fullnode -# deploy a single TCE node per K8s node -singleTCENodePerK8sNode: true +s3: + genesis_file: nobody + config_dir: nobody -host: nowhere.com -# create ingress (true | false) -ingress: false - -acme: - email: nobody@nowhere.com - # acme issuer type (staging | production) - environment: staging +service_account: + name: nobody + role: nobody ports: - http: 1340 + grpc: 1340 p2p: 9090 - graphql: 4000 + graphql: 4030 + metrics: 3000 image: repository: nobody tag: main -credentials: - username: nobody - password: secret - env: - RUST_LOG: warn,topos=warn - TCE_DB_PATH: /tmp/default-db - TCE_API_ADDR: 0.0.0.0:1340 - TCE_GRAPHQL_API_ADDR: 0.0.0.0:4000 - TCE_METRICS_API_ADDR: 0.0.0.0:3000 - TOPOS_OTLP_AGENT: tce-node - TOPOS_OTLP_SERVICE_NAME: https://telemetry.nowhere.com - TCE_ECHO_SAMPLE_SIZE: "6" - TCE_READY_SAMPLE_SIZE: "6" - TCE_DELIVERY_SAMPLE_SIZE: "6" - TCE_ECHO_THRESHOLD: "2" - TCE_READY_THRESHOLD: "2" - TCE_DELIVERY_THRESHOLD: "2" - LOCAL_TEST_NET: "true" - TCE_LOCAL_KS: "1" - RUST_BACKTRACE: full - TOOLCHAIN_VERSION: stable - TOPOS_OTLP_TAGS: key1=value1,key2=value2 - OTLP_BATCH_SCHEDULED_DELAY: "1500" - OTLP_BATCH_MAX_CONCURRENT_EXPORTS: "1000" - OTLP_BATCH_MAX_EXPORTER_BATCH_SIZE: "10000" - OTLP_BATCH_EXPORT_TIMEOUT: "100000" - OTLP_BATCH_MAX_QUEUE_SIZE: "10000" - OTEL_EXPORTER_OTLP_COMPRESSION: "gzip" - OTEL_EXPORTER_OTLP_TIMEOUT: "60" + TOPOS_HOME: /data + RUST_LOG: info,topos=debug,topos::edge=error + TOPOS_RUN_ID: + TOPOS_RUN_NUMBER: