diff --git a/infra/helm-charts/external-node/.helmignore b/infra/helm-charts/external-node/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/infra/helm-charts/external-node/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/infra/helm-charts/external-node/Chart.yaml b/infra/helm-charts/external-node/Chart.yaml
new file mode 100644
index 0000000..443b369
--- /dev/null
+++ b/infra/helm-charts/external-node/Chart.yaml
@@ -0,0 +1,24 @@
+apiVersion: v2
+name: external-node
+description: A Helm chart for Kubernetes
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+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.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
+# follow Semantic Versioning. They should reflect the version the application is using.
+# It is recommended to use it with quotes.
+appVersion: "1.16.0"
diff --git a/infra/helm-charts/external-node/README.md b/infra/helm-charts/external-node/README.md
new file mode 100644
index 0000000..76a5297
--- /dev/null
+++ b/infra/helm-charts/external-node/README.md
@@ -0,0 +1,19 @@
+# How
+
+To install the helm chart(deploy all the manifests):
+
+```sh
+helm install external-node . --values values.yaml
+```
+
+If there are some changes, you can use `upgrade`. Helm will change only what it needs:
+
+```sh
+helm upgrade external-node . --values values.yaml --debug
+```
+
+If you want to delete the installed helm chart use `delete`:
+
+```sh
+helm delete external-node
+```
diff --git a/infra/helm-charts/external-node/templates/backendconfig.yaml b/infra/helm-charts/external-node/templates/backendconfig.yaml
new file mode 100644
index 0000000..72687c6
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/backendconfig.yaml
@@ -0,0 +1,13 @@
+{{- range .Values.nodename }}
+apiVersion: cloud.google.com/v1
+kind: BackendConfig
+metadata:
+ name: {{.}}-hc-config
+spec:
+ healthCheck:
+ checkIntervalSec: 15
+ port: 3071
+ type: HTTP
+ requestPath: /health
+---
+{{- end }}
diff --git a/infra/helm-charts/external-node/templates/defaultbackend-ingress-grafana.yaml b/infra/helm-charts/external-node/templates/defaultbackend-ingress-grafana.yaml
new file mode 100644
index 0000000..2d0ef20
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/defaultbackend-ingress-grafana.yaml
@@ -0,0 +1,61 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: html
+data:
+ index.html: |
+
+
+
+
+ Error Grafana
+
+
+ Error
+
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: default-backend-ingress-grafana
+spec:
+ selector:
+ matchLabels:
+ app: default-backend-ingress-grafana
+ template:
+ metadata:
+ labels:
+ app: default-backend-ingress-grafana
+
+ spec:
+ containers:
+ - name: default-backend-ingress-grafana
+ image: nginx:latest
+ resources:
+ limits:
+ memory: "128Mi"
+ cpu: "500m"
+ volumeMounts:
+ - name: html-volume
+ mountPath: /usr/share/nginx/html/index.html
+ subPath: index.html
+ ports:
+ - containerPort: 80
+ volumes:
+ - name: html-volume
+ configMap:
+ name: html
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: default-backend-ingress-grafana-service
+spec:
+ type: NodePort
+ selector:
+ app: default-backend-ingress-grafana
+ ports:
+ - port: 80
+ targetPort: 80
+ protocol: TCP
diff --git a/infra/helm-charts/external-node/templates/deployment.yaml b/infra/helm-charts/external-node/templates/deployment.yaml
new file mode 100644
index 0000000..34ee761
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/deployment.yaml
@@ -0,0 +1,91 @@
+{{- range .Values.nodename }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{.}}
+ namespace: {{$.Values.namespace}}
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: {{.}}
+ template:
+ metadata:
+ labels:
+ app: {{.}}
+ spec:
+ {{- $fullUrl := printf "%s/%s" $.Values.deployment.env.DATABASE_URL . -}}
+ {{- $parsedUrl := (urlParse $fullUrl) -}}
+ {{- $parsedHost := (regexSplit ":" $parsedUrl.host -1) -}}
+ {{- $parsedCredentials := (regexSplit ":" $parsedUrl.userinfo -1) -}}
+
+ {{- if eq $parsedUrl.scheme "postgres" }}
+ {{- else }}
+ {{- fail (printf "Invalid: %s" $fullUrl) }}
+ {{- end }}
+
+ initContainers:
+ - name: {{.}}-drop-db
+ image: postgres:14
+ env:
+ - name: PGUSER
+ value: {{index $parsedCredentials 0}}
+ - name: PGPASSWORD
+ value: {{index $parsedCredentials 1}}
+ - name: POSTGRES_DB
+ value: {{$parsedUrl.path | trimAll "/"}}
+ - name: PGHOST
+ value: {{index $parsedHost 0}}
+ - name: PGPORT
+ value: "{{index $parsedHost 1}}"
+ - name: MAIN_DB
+ value: {{$parsedUrl.scheme}}
+ command: ["sh", "-c", "psql -d $MAIN_DB -c \"DROP DATABASE IF EXISTS \\\"$POSTGRES_DB\\\";\" "]
+
+ containers:
+ - name: {{.}}
+ image: matterlabs/external-node:v24.7.0-alpha-linux-amd64
+ ports:
+ - containerPort: 3050
+ - containerPort: 3051
+ - containerPort: 3071
+ - containerPort: 3312
+ readinessProbe:
+ httpGet:
+ path: /health
+ port: 3071
+ env:
+ - name: EN_HTTP_PORT
+ value: "3050"
+ - name: EN_WS_PORT
+ value: "3051"
+ - name: EN_HEALTHCHECK_PORT
+ value: "3071"
+ - name: EN_PROMETHEUS_PORT
+ value: "3312"
+ - name: DATABASE_URL
+ value: "{{$.Values.deployment.env.DATABASE_URL}}/{{.}}"
+ - name: DATABASE_POOL_SIZE
+ value: "10"
+ - name: EN_ETH_CLIENT_URL
+ value: {{$.Values.deployment.env.EN_ETH_CLIENT_URL}}
+ - name: EN_MAIN_NODE_URL
+ value: {{$.Values.deployment.env.EN_MAIN_NODE_URL}}
+ - name: EN_L1_CHAIN_ID
+ value: "{{$.Values.deployment.env.EN_L1_CHAIN_ID}}"
+ - name: EN_L2_CHAIN_ID
+ value: "{{$.Values.deployment.env.EN_L2_CHAIN_ID}}"
+ - name: EN_STATE_CACHE_PATH
+ value: "./db/ext-node/state_keeper"
+ - name: EN_MERKLE_TREE_PATH
+ value: "./db/ext-node/lightweight"
+ - name: EN_SNAPSHOTS_RECOVERY_ENABLED
+ value: "true"
+ - name: EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL
+ value: {{$.Values.deployment.env.EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL}}
+ - name: EN_SNAPSHOTS_OBJECT_STORE_MODE
+ value: "GCSAnonymousReadOnly"
+ - name: RUST_LOG
+ value: "warn,zksync=info,zksync_core::metadata_calculator=debug,zksync_state=debug,zksync_utils=debug,zksync_web3_decl::client=error"
+---
+{{- end }}
diff --git a/infra/helm-charts/external-node/templates/grafana.yaml b/infra/helm-charts/external-node/templates/grafana.yaml
new file mode 100644
index 0000000..78b10ce
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/grafana.yaml
@@ -0,0 +1,555 @@
+{{- range .Values.nodename }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{.}}-config
+ namespace: {{$.Values.namespace}}
+data:
+ prometheus.yaml: |
+ global:
+ scrape_interval: 3s
+ scrape_configs:
+ - job_name: '{{.}}'
+ static_configs:
+ - targets: ['{{.}}-service:3312']
+ grafana-provisioning-datasources-prometheus.yaml: |
+ apiVersion: 1
+ datasources:
+ - name: Prometheus
+ type: prometheus
+ access: proxy
+ orgId: 1
+ url: http://{{.}}-prometheus:9090 # Name of the prometheus' service
+ isDefault: true
+ editable: true
+ grafana-provisioning-dashboards-default.yaml: |
+ apiVersion: 1
+ providers:
+ - name: 'Default'
+ orgId: 1
+ folder: ''
+ type: file
+ disableDeletion: false
+ updateIntervalSeconds: 10
+ options:
+ path: /etc/grafana/provisioning/dashboards
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{.}}-grafana-deployment
+ namespace: {{$.Values.namespace}}
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: {{.}}-grafana
+ template:
+ metadata:
+ labels:
+ app: {{.}}-grafana
+ spec:
+ containers:
+ - name: {{.}}-grafana
+ image: grafana/grafana:11.0.0
+ ports:
+ - containerPort: 3000
+ env:
+ - name: GF_SECURITY_ADMIN_USER
+ value: admin
+ - name: GF_SECURITY_ADMIN_PASSWORD
+ value: admin
+ - name: GF_USERS_ALLOW_SIGN_UP
+ value: 'false'
+ - name: GF_SERVER_DOMAIN
+ value: '{{$.Values.terraform.grafana.dns}}'
+ - name: GF_SERVER_ROOT_URL
+ value: "%(protocol)s://%(domain)s/{{.}}/"
+ - name: GF_SERVER_SERVE_FROM_SUB_PATH
+ value: 'true'
+ volumeMounts:
+ - name: dashboard-volume
+ mountPath: /etc/grafana/provisioning/dashboards/General.json
+ subPath: General.json
+ - name: config-volume
+ mountPath: /etc/grafana/provisioning/datasources/prometheus.yaml
+ subPath: grafana-provisioning-datasources-prometheus.yaml
+ - name: config-volume
+ mountPath: /etc/grafana/provisioning/dashboards/default.yaml
+ subPath: grafana-provisioning-dashboards-default.yaml
+ readinessProbe:
+ httpGet:
+ port: 3000
+ path: /api/health
+ - name: {{.}}-prometheus
+ image: prom/prometheus:v2.52.0
+ args:
+ - '--config.file=/etc/prometheus/prometheus.yml'
+ - '--storage.tsdb.path=/prometheus'
+ - '--web.console.libraries=/etc/prometheus/console_libraries'
+ - '--web.console.templates=/etc/prometheus/consoles'
+ - '--storage.tsdb.retention.time=200h'
+ - '--web.enable-lifecycle'
+ ports:
+ - containerPort: 9090
+ volumeMounts:
+ - name: config-volume
+ mountPath: /etc/prometheus/prometheus.yml
+ subPath: prometheus.yaml
+ - name: {{.}}-pushgateway
+ image: prom/pushgateway:v1.9.0
+ ports:
+ - containerPort: 9091
+ - name: {{.}}-nodeexporter
+ image: prom/node-exporter:v1.8.1
+ args:
+ - '--path.procfs=/host/proc'
+ - '--path.rootfs=/rootfs'
+ - '--path.sysfs=/host/sys'
+ - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
+ ports:
+ - containerPort: 9100
+ volumeMounts:
+ - name: host-volume
+ mountPath: /rootfs
+ readOnly: true
+ - name: host-volume
+ mountPath: /host/sys
+ subPath: sys
+ readOnly: true
+ - name: host-volume
+ mountPath: /host/proc
+ subPath: proc
+ readOnly: true
+ volumes:
+ - name: config-volume
+ configMap:
+ name: {{.}}-config
+ - name: dashboard-volume
+ configMap:
+ name: {{.}}-config-dashboard
+ - name: host-volume
+ hostPath:
+ path: /
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{.}}-config-dashboard
+ namespace: {{$.Values.namespace}}
+data:
+ General.json: |
+ {
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "target": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ },
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "graphTooltip": 0,
+ "id": 1,
+ "links": [],
+ "liveNow": false,
+ "panels": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 0
+ },
+ "id": 6,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "center",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.6",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "exemplar": true,
+ "expr": "sum by (stage) (rate(server_processed_txs{stage=~\"mempool_added\"}[$__rate_interval]))",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "TPS",
+ "transformations": [],
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineStyle": {
+ "fill": "solid"
+ },
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 0
+ },
+ "id": 5,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "exemplar": true,
+ "expr": "sum by (stage) (external_node_fetcher_l1_batch)",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "Last processed batch by status",
+ "transformations": [],
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 33,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineStyle": {
+ "fill": "solid"
+ },
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 9
+ },
+ "id": 4,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "exemplar": true,
+ "expr": "sum by (stage) (external_node_sync_lag)",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "Sync lag (blocks)",
+ "transformations": [],
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 30,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "bytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 9
+ },
+ "id": 2,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "exemplar": true,
+ "expr": "sum by (job) (rocksdb_total_sst_size)",
+ "interval": "",
+ "legendFormat": "RocksDB",
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "exemplar": true,
+ "expr": "sum by (job) (postgres_table_total_size_bytes)",
+ "hide": false,
+ "interval": "",
+ "legendFormat": "PostgresSQL",
+ "refId": "B"
+ }
+ ],
+ "title": "Total disk space usage",
+ "type": "timeseries"
+ }
+ ],
+ "refresh": "5s",
+ "schemaVersion": 37,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-5m",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "",
+ "title": "External Node",
+ "uid": "0",
+ "version": 1,
+ "weekStart": ""
+ }
+---
+{{- end }}
diff --git a/infra/helm-charts/external-node/templates/ingress-grafana.yaml b/infra/helm-charts/external-node/templates/ingress-grafana.yaml
new file mode 100644
index 0000000..bff56de
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/ingress-grafana.yaml
@@ -0,0 +1,34 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: external-node-grafana
+ namespace: {{.Values.namespace}}
+ annotations:
+ kubernetes.io/ingress.global-static-ip-name: {{.Values.terraform.grafana.ip}}
+ cert-manager.io/issuer: http01-issuer
+ acme.cert-manager.io/http01-edit-in-place: "true"
+ labels:
+ app: external-node-grafana
+spec:
+ defaultBackend:
+ service:
+ name: default-backend-ingress-grafana-service
+ port:
+ number: 80
+ rules:
+ - host: {{.Values.terraform.grafana.dns}}
+ http:
+ paths:
+ {{- range .Values.nodename }}
+ - pathType: Prefix
+ path: "/{{.}}"
+ backend:
+ service:
+ name: {{.}}-grafana
+ port:
+ number: 3000
+ {{- end }}
+ tls:
+ - hosts:
+ - {{.Values.terraform.grafana.dns}}
+ secretName: external-node-grafana-ingress-cert
diff --git a/infra/helm-charts/external-node/templates/ingress.yaml b/infra/helm-charts/external-node/templates/ingress.yaml
new file mode 100644
index 0000000..f5aab0a
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/ingress.yaml
@@ -0,0 +1,28 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: external-node
+ namespace: {{.Values.namespace}}
+ annotations:
+ kubernetes.io/ingress.global-static-ip-name: {{.Values.terraform.rpc.ip}}
+ cert-manager.io/issuer: http01-issuer
+ acme.cert-manager.io/http01-edit-in-place: "true"
+ labels:
+ app: external-node
+spec:
+ rules:
+ - host: {{.Values.terraform.rpc.dns}}
+ http:
+ paths:
+ {{- range .Values.nodename }}
+ - pathType: ImplementationSpecific
+ backend:
+ service:
+ name: {{.}}-service
+ port:
+ number: 3050
+ {{- end }}
+ tls:
+ - hosts:
+ - {{.Values.terraform.rpc.dns}}
+ secretName: external-node-ingress-cert
diff --git a/infra/helm-charts/external-node/templates/service-grafana.yaml b/infra/helm-charts/external-node/templates/service-grafana.yaml
new file mode 100644
index 0000000..40e1551
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/service-grafana.yaml
@@ -0,0 +1,62 @@
+{{- range .Values.nodename }}
+apiVersion: v1
+kind: ServiceList
+items:
+ - metadata:
+ name: {{.}}-grafana
+ namespace: {{$.Values.namespace}}
+ labels:
+ app: {{.}}-grafana
+ spec:
+ type: NodePort
+ ports:
+ - name: {{.}}-grafana
+ port: 3000
+ targetPort: 3000
+ protocol: TCP
+ selector:
+ app: {{.}}-grafana
+ - metadata:
+ name: {{.}}-prometheus
+ namespace: {{$.Values.namespace}}
+ labels:
+ app: {{.}}-prometheus
+ spec:
+ type: NodePort
+ ports:
+ - name: {{.}}-prometheus
+ port: 9090
+ targetPort: 9090
+ protocol: TCP
+ selector:
+ app: {{.}}-grafana
+ - metadata:
+ name: {{.}}-pushgateway
+ namespace: {{$.Values.namespace}}
+ labels:
+ app: {{.}}-prometheus
+ spec:
+ type: NodePort
+ ports:
+ - name: {{.}}-pushgateway
+ port: 9091
+ targetPort: 9091
+ protocol: TCP
+ selector:
+ app: {{.}}-grafana
+ - metadata:
+ name: {{.}}-nodeexporter
+ namespace: {{$.Values.namespace}}
+ labels:
+ app: {{.}}-prometheus
+ spec:
+ type: NodePort
+ ports:
+ - name: {{.}}-nodeexporter
+ port: 9100
+ targetPort: 9100
+ protocol: TCP
+ selector:
+ app: {{.}}-grafana
+---
+{{- end }}
diff --git a/infra/helm-charts/external-node/templates/service.yaml b/infra/helm-charts/external-node/templates/service.yaml
new file mode 100644
index 0000000..88a25da
--- /dev/null
+++ b/infra/helm-charts/external-node/templates/service.yaml
@@ -0,0 +1,29 @@
+{{- range .Values.nodename }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{.}}-service
+ namespace: {{$.Values.namespace}}
+ annotations:
+ cloud.google.com/backend-config: '{"default": "{{.}}-hc-config"}'
+ labels:
+ app: {{.}}
+spec:
+ type: NodePort
+ ports:
+ - port: 3050
+ name: {{.}}-http
+ targetPort: 3050
+ protocol: TCP
+ - port: 3071
+ name: {{.}}-healthcheck
+ targetPort: 3071
+ protocol: TCP
+ - port: 3312
+ name: {{.}}-prometheus
+ targetPort: 3312
+ protocol: TCP
+ selector:
+ app: {{.}}
+---
+{{- end }}
diff --git a/infra/helm-charts/external-node/values.yaml b/infra/helm-charts/external-node/values.yaml
new file mode 100644
index 0000000..78df321
--- /dev/null
+++ b/infra/helm-charts/external-node/values.yaml
@@ -0,0 +1,20 @@
+nodename:
+ - en01
+ - en02
+ - en03
+namespace: default
+deployment:
+ env:
+ EN_ETH_CLIENT_URL: https://ethereum-sepolia-rpc.publicnode.com
+ EN_L1_CHAIN_ID: "11155111"
+ EN_MAIN_NODE_URL: https://k8s.rpc.sepolia.zk-stack.lambdaclass.com
+ EN_L2_CHAIN_ID: "270"
+ DATABASE_URL: postgres://lambda:ferret_red_ant_crazy_emerald@10.56.112.6:5432
+ EN_SNAPSHOTS_OBJECT_STORE_BUCKET_BASE_URL: "snapshots-object-store-dev"
+terraform:
+ grafana:
+ ip: en01-grafana-ip
+ dns: k8s.en01.grafana.sepolia.zk-stack.lambdaclass.com
+ rpc:
+ ip: external-node-ip
+ dns: k8s.en01.rpc.sepolia.zk-stack.lambdaclass.com