Skip to content

Commit 4fc1896

Browse files
committed
rename service
1 parent e21e139 commit 4fc1896

26 files changed

+363
-97
lines changed

k8s/README.md

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ k8s/
4242
- Kubernetes cluster (version 1.19+)
4343
- `kubectl` configured to access your cluster
4444
- Kustomize (built into kubectl v1.14+)
45-
- Docker image published to `ghcr.io/graphprotocol/service-quality-oracle`
45+
- Docker image published to `ghcr.io/graphprotocol/rewards-eligibility-oracle`
4646
- **Storage class configured** (see Storage Configuration below)
4747

4848
## Quick Start
@@ -74,7 +74,7 @@ vim config.secret.yaml
7474
./apply.sh
7575

7676
# Monitor
77-
kubectl logs -f deployment/service-quality-oracle -n service-quality-oracle
77+
kubectl logs -f deployment/rewards-eligibility-oracle -n rewards-eligibility-oracle
7878
```
7979

8080
### 3. Deploy to Mainnet
@@ -96,7 +96,7 @@ vim config.yaml
9696
./apply.sh
9797

9898
# Monitor
99-
kubectl logs -f deployment/service-quality-oracle -n service-quality-oracle
99+
kubectl logs -f deployment/rewards-eligibility-oracle -n rewards-eligibility-oracle
100100
```
101101

102102
## Environment Configuration
@@ -133,6 +133,7 @@ kubectl get storageclass
133133
```
134134

135135
**Common storage classes by platform:**
136+
136137
- **AWS EKS**: `gp2`, `gp3`, `ebs-csi`
137138
- **Google GKE**: `standard`, `ssd`
138139
- **Azure AKS**: `managed-premium`, `managed`
@@ -149,13 +150,13 @@ kubectl get storageclass
149150
### View Logs
150151

151152
```bash
152-
kubectl logs -f deployment/service-quality-oracle -n service-quality-oracle
153+
kubectl logs -f deployment/rewards-eligibility-oracle -n rewards-eligibility-oracle
153154
```
154155

155156
### Check Status
156157

157158
```bash
158-
kubectl get all -n service-quality-oracle
159+
kubectl get all -n rewards-eligibility-oracle
159160
```
160161

161162
### Delete Environment
@@ -177,10 +178,11 @@ kubectl delete -k .
177178

178179
The service uses **two persistent volumes** to maintain state across pod restarts:
179180

180-
- **`service-quality-oracle-data` (10GB)**: Circuit breaker state, last run tracking, BigQuery cache, CSV outputs
181-
- **`service-quality-oracle-logs` (5GB)**: Application logs
181+
- **`rewards-eligibility-oracle-data` (10GB)**: Circuit breaker state, last run tracking, BigQuery cache, CSV outputs
182+
- **`rewards-eligibility-oracle-logs` (5GB)**: Application logs
182183

183184
**Mount points:**
185+
184186
- `/app/data` → Critical state files (circuit breaker, cache, outputs)
185187
- `/app/logs` → Application logs
186188

@@ -190,17 +192,20 @@ The service uses **two persistent volumes** to maintain state across pod restart
190192
**Sensitive credentials**`Secret` (generated from `config.secret.yaml`)
191193

192194
This separation provides:
195+
193196
- ✅ Easy configuration updates without rebuilding images
194197
- ✅ Secure credential management with base64 encoding
195198
- ✅ Clear separation of concerns
196199

197200
### Resource Allocation
198201

199202
**Requests (guaranteed):**
203+
200204
- CPU: 250m (0.25 cores)
201205
- Memory: 512M
202206

203207
**Limits (maximum):**
208+
204209
- CPU: 1000m (1.0 core)
205210
- Memory: 1G
206211

@@ -217,7 +222,7 @@ With persistent volumes, the service maintains:
217222

218223
The deployment uses **file-based health checks** (same as docker-compose):
219224

220-
**Liveness probe:** Checks `/app/healthcheck` file modification time
225+
**Liveness probe:** Checks `/app/healthcheck` file modification time
221226
**Readiness probe:** Verifies `/app/healthcheck` file exists
222227

223228
## Troubleshooting
@@ -226,11 +231,11 @@ The deployment uses **file-based health checks** (same as docker-compose):
226231

227232
```bash
228233
# Check events
229-
kubectl describe pod -l app=service-quality-oracle
234+
kubectl describe pod -l app=rewards-eligibility-oracle
230235

231236
# Common issues:
232237
# - Missing secrets
233-
# - PVC provisioning failures
238+
# - PVC provisioning failures
234239
# - Image pull errors
235240
```
236241

@@ -241,28 +246,28 @@ kubectl describe pod -l app=service-quality-oracle
241246
kubectl get pvc
242247

243248
# Check if volumes are mounted correctly
244-
kubectl exec -it deployment/service-quality-oracle -- ls -la /app/data
249+
kubectl exec -it deployment/rewards-eligibility-oracle -- ls -la /app/data
245250
```
246251

247252
### Debug Configuration
248253

249254
```bash
250255
# Check environment variables
251-
kubectl exec -it deployment/service-quality-oracle -- env | grep -E "(BIGQUERY|BLOCKCHAIN)"
256+
kubectl exec -it deployment/rewards-eligibility-oracle -- env | grep -E "(BIGQUERY|BLOCKCHAIN)"
252257

253258
# Verify secrets are mounted
254-
kubectl exec -it deployment/service-quality-oracle -- ls -la /etc/secrets
259+
kubectl exec -it deployment/rewards-eligibility-oracle -- ls -la /etc/secrets
255260
```
256261

257262
## Security
258263

259-
**Never commit actual secrets** - `config.secret.yaml` files contain placeholders only
260-
**Mainnet deployment safety checks** for production secrets
261-
**Non-root containers** with dropped capabilities
262-
**Service account** with minimal BigQuery permissions
263-
**Private key** stored in Kubernetes secrets (base64 encoded)
264-
**Resource limits** prevent resource exhaustion
265-
**Workload Identity** configured for secure GCP access
264+
**Never commit actual secrets** - `config.secret.yaml` files contain placeholders only
265+
**Mainnet deployment safety checks** for production secrets
266+
**Non-root containers** with dropped capabilities
267+
**Service account** with minimal BigQuery permissions
268+
**Private key** stored in Kubernetes secrets (base64 encoded)
269+
**Resource limits** prevent resource exhaustion
270+
**Workload Identity** configured for secure GCP access
266271
**SSD storage with retention** for data persistence
267272

268273
## Production Considerations

k8s/base/deployment.yaml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
apiVersion: apps/v1
22
kind: Deployment
33
metadata:
4-
name: service-quality-oracle
4+
name: rewards-eligibility-oracle
55
labels:
6-
app: service-quality-oracle
6+
app: rewards-eligibility-oracle
77
spec:
88
replicas: 1 # Single instance due to state management
99
selector:
1010
matchLabels:
11-
app: service-quality-oracle
11+
app: rewards-eligibility-oracle
1212
template:
1313
metadata:
1414
labels:
15-
app: service-quality-oracle
15+
app: rewards-eligibility-oracle
1616
annotations:
1717
prometheus.io/scrape: "true"
1818
prometheus.io/path: "/metrics"
@@ -21,52 +21,52 @@ spec:
2121
imagePullSecrets:
2222
- name: docker-registry
2323
containers:
24-
- name: service-quality-oracle
25-
image: ghcr.io/graphprotocol/service-quality-oracle:latest
24+
- name: rewards-eligibility-oracle
25+
image: ghcr.io/graphprotocol/rewards-eligibility-oracle:latest
2626
imagePullPolicy: IfNotPresent
2727
ports:
2828
- containerPort: 8000
2929
name: metrics
3030
envFrom:
3131
# Load all non-sensitive configuration from ConfigMap
3232
- configMapRef:
33-
name: service-quality-oracle-config
33+
name: rewards-eligibility-oracle-config
3434
env:
3535
# Secrets from Kubernetes Secret
3636
- name: GOOGLE_APPLICATION_CREDENTIALS
3737
valueFrom:
3838
secretKeyRef:
39-
name: service-quality-oracle-secrets
39+
name: rewards-eligibility-oracle-secrets
4040
key: google-credentials
4141
- name: BLOCKCHAIN_PRIVATE_KEY
4242
valueFrom:
4343
secretKeyRef:
44-
name: service-quality-oracle-secrets
44+
name: rewards-eligibility-oracle-secrets
4545
key: blockchain-private-key
4646
- name: ETHERSCAN_API_KEY
4747
valueFrom:
4848
secretKeyRef:
49-
name: service-quality-oracle-secrets
49+
name: rewards-eligibility-oracle-secrets
5050
key: etherscan-api-key
5151
- name: ARBITRUM_API_KEY
5252
valueFrom:
5353
secretKeyRef:
54-
name: service-quality-oracle-secrets
54+
name: rewards-eligibility-oracle-secrets
5555
key: arbitrum-api-key
5656
- name: STUDIO_API_KEY
5757
valueFrom:
5858
secretKeyRef:
59-
name: service-quality-oracle-secrets
59+
name: rewards-eligibility-oracle-secrets
6060
key: studio-api-key
6161
- name: STUDIO_DEPLOY_KEY
6262
valueFrom:
6363
secretKeyRef:
64-
name: service-quality-oracle-secrets
64+
name: rewards-eligibility-oracle-secrets
6565
key: studio-deploy-key
6666
- name: SLACK_WEBHOOK_URL
6767
valueFrom:
6868
secretKeyRef:
69-
name: service-quality-oracle-secrets
69+
name: rewards-eligibility-oracle-secrets
7070
key: slack-webhook-url
7171
volumeMounts:
7272
- name: data-volume
@@ -78,7 +78,7 @@ spec:
7878
memory: "512M" # Match docker-compose reservations
7979
cpu: "250m"
8080
limits:
81-
memory: "1G" # Match docker-compose limits
81+
memory: "1G" # Match docker-compose limits
8282
cpu: "1000m" # Match docker-compose '1.0' cpus
8383
# Use file-based healthcheck like docker-compose (not HTTP)
8484
livenessProbe:
@@ -94,7 +94,7 @@ spec:
9494
readinessProbe:
9595
exec:
9696
command:
97-
- python
97+
- python
9898
- -c
9999
- "import os; assert os.path.exists('/app/healthcheck'), 'Healthcheck file missing'"
100100
initialDelaySeconds: 10
@@ -111,9 +111,9 @@ spec:
111111
volumes:
112112
- name: data-volume
113113
persistentVolumeClaim:
114-
claimName: service-quality-oracle-data
114+
claimName: rewards-eligibility-oracle-data
115115
- name: logs-volume
116116
persistentVolumeClaim:
117-
claimName: service-quality-oracle-logs
118-
serviceAccountName: service-quality-oracle
117+
claimName: rewards-eligibility-oracle-logs
118+
serviceAccountName: rewards-eligibility-oracle
119119
restartPolicy: Always

k8s/base/namespace.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
apiVersion: v1
22
kind: Namespace
33
metadata:
4-
name: service-quality-oracle
4+
name: rewards-eligibility-oracle
55
labels:
6-
name: service-quality-oracle
6+
name: rewards-eligibility-oracle

k8s/base/podmonitor.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
apiVersion: monitoring.coreos.com/v1
22
kind: PodMonitor
33
metadata:
4-
name: service-quality-oracle
4+
name: rewards-eligibility-oracle
55
labels:
6-
app: service-quality-oracle
6+
app: rewards-eligibility-oracle
77
spec:
88
selector:
99
matchLabels:
10-
app: service-quality-oracle
10+
app: rewards-eligibility-oracle
1111
podMetricsEndpoints:
1212
- port: metrics
1313
path: /metrics

k8s/base/service.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
apiVersion: v1
22
kind: Service
33
metadata:
4-
name: service-quality-oracle
4+
name: rewards-eligibility-oracle
55
labels:
6-
app: service-quality-oracle
6+
app: rewards-eligibility-oracle
77
spec:
88
selector:
9-
app: service-quality-oracle
9+
app: rewards-eligibility-oracle
1010
ports:
1111
- name: metrics
1212
port: 8000

k8s/base/serviceaccount.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
apiVersion: v1
22
kind: ServiceAccount
33
metadata:
4-
name: service-quality-oracle
4+
name: rewards-eligibility-oracle
55
labels:
6-
app: service-quality-oracle
6+
app: rewards-eligibility-oracle
77
annotations:
8-
iam.gke.io/gcp-service-account: service-quality[email protected]
8+
iam.gke.io/gcp-service-account: rewards-eligibility[email protected]
99
automountServiceAccountToken: false

k8s/base/servicemonitor.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
apiVersion: monitoring.coreos.com/v1
22
kind: ServiceMonitor
33
metadata:
4-
name: service-quality-oracle
4+
name: rewards-eligibility-oracle
55
labels:
6-
app: service-quality-oracle
6+
app: rewards-eligibility-oracle
77
spec:
88
selector:
99
matchLabels:
10-
app: service-quality-oracle
10+
app: rewards-eligibility-oracle
1111
endpoints:
1212
- port: metrics
1313
path: /metrics

k8s/configmap.yaml

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
apiVersion: v1
2+
kind: ConfigMap
3+
metadata:
4+
name: rewards-eligibility-oracle-config
5+
labels:
6+
app: rewards-eligibility-oracle
7+
data:
8+
# BigQuery Configuration
9+
BIGQUERY_LOCATION_ID: "US"
10+
BIGQUERY_PROJECT_ID: "graph-mainnet"
11+
BIGQUERY_DATASET_ID: "internal_metrics"
12+
BIGQUERY_TABLE_ID: "metrics_indexer_attempts"
13+
BIGQUERY_CURATION_TABLE_ID: "metrics_curator_signals"
14+
BIGQUERY_CURATOR_MAINNET_TABLE_ID: "curator_name_signal_dimensions_daily"
15+
BIGQUERY_CURATOR_ARBITRUM_TABLE_ID: "curator_name_signal_dimensions_arbitrum_daily"
16+
BIGQUERY_SUBGRAPH_LOOKUP_TABLE_ID: "subgraph_version_id_lookup"
17+
BIGQUERY_ANALYSIS_PERIOD_DAYS: "28"
18+
19+
# Blockchain Configuration (Arbitrum Sepolia)
20+
BLOCKCHAIN_CONTRACT_ADDRESS: "0x6d5550698F930210c3f50efe744bF51C55D791f6"
21+
BLOCKCHAIN_FUNCTION_NAME: "allowIndexers"
22+
BLOCKCHAIN_CHAIN_ID: "421614"
23+
BLOCK_EXPLORER_URL: "https://sepolia.arbiscan.io"
24+
TX_TIMEOUT_SECONDS: "30"
25+
26+
# RPC Provider URLs (Arbitrum Sepolia)
27+
BLOCKCHAIN_RPC_URL_1: "https://arbitrum-sepolia.drpc.org"
28+
BLOCKCHAIN_RPC_URL_2: "https://sepolia-rollup.arbitrum.io/rpc"
29+
BLOCKCHAIN_RPC_URL_3: "https://api.zan.top/arb-sepolia"
30+
BLOCKCHAIN_RPC_URL_4: "https://arbitrum-sepolia.gateway.tenderly.co"
31+
32+
# Scheduling Configuration
33+
SCHEDULED_RUN_TIME: "10:00"
34+
35+
# Subgraph URLs
36+
SUBGRAPH_URL_PRE_PRODUCTION: "https://api.studio.thegraph.com/query/110664/issuance-eligibility-oracle/v0.1.4"
37+
SUBGRAPH_URL_PRODUCTION: "https://gateway.thegraph.com/api/subgraphs/id/"
38+
39+
# Processing Configuration
40+
BATCH_SIZE: "125"
41+
MAX_AGE_BEFORE_DELETION: "120"
42+
43+
# Caching Configuration
44+
CACHE_MAX_AGE_MINUTES: "30"
45+
FORCE_BIGQUERY_REFRESH: "false"
46+
47+
# Eligibility Criteria
48+
MIN_ONLINE_DAYS: "5"
49+
MIN_SUBGRAPHS: "10"
50+
MAX_LATENCY_MS: "5000"
51+
MAX_BLOCKS_BEHIND: "50000"
52+
MIN_CURATION_SIGNAL: "500"
53+
54+
# Runtime Configuration
55+
RUN_ON_STARTUP: "true"

0 commit comments

Comments
 (0)