feat: Migrate to spdy.io infrastructure

- Namespace: dispensary-scraper → cannaiq
- Registry: code.cannabrands.app → git.spdy.io
- Database: External PostgreSQL at 10.100.6.50
- MinIO: Internal at 10.100.9.80:9000
- CI: ci.spdy.io

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Kelly
2025-12-15 06:40:48 -07:00
parent 0979c9c37a
commit a8360c7260
14 changed files with 64 additions and 55 deletions

View File

@@ -3,7 +3,7 @@ steps:
# PR VALIDATION: Parallel type checks (PRs only)
# ===========================================
typecheck-backend:
image: code.cannabrands.app/creationshop/node:20
image: git.spdy.io/creationshop/node:20
commands:
- cd backend
- npm ci --prefer-offline
@@ -13,7 +13,7 @@ steps:
event: pull_request
typecheck-cannaiq:
image: code.cannabrands.app/creationshop/node:20
image: git.spdy.io/creationshop/node:20
commands:
- cd cannaiq
- npm ci --prefer-offline
@@ -23,7 +23,7 @@ steps:
event: pull_request
typecheck-findadispo:
image: code.cannabrands.app/creationshop/node:20
image: git.spdy.io/creationshop/node:20
commands:
- cd findadispo/frontend
- npm ci --prefer-offline
@@ -33,7 +33,7 @@ steps:
event: pull_request
typecheck-findagram:
image: code.cannabrands.app/creationshop/node:20
image: git.spdy.io/creationshop/node:20
commands:
- cd findagram/frontend
- npm ci --prefer-offline
@@ -58,7 +58,7 @@ steps:
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d '{"Do":"merge"}' \
"https://code.cannabrands.app/api/v1/repos/Creationshop/dispensary-scraper/pulls/${CI_COMMIT_PULL_REQUEST}/merge"
"https://git.spdy.io/api/v1/repos/Creationshop/cannaiq/pulls/${CI_COMMIT_PULL_REQUEST}/merge"
depends_on:
- typecheck-backend
- typecheck-cannaiq
@@ -74,8 +74,8 @@ steps:
docker-backend:
image: plugins/docker
settings:
registry: code.cannabrands.app
repo: code.cannabrands.app/creationshop/dispensary-scraper
registry: git.spdy.io
repo: git.spdy.io/creationshop/cannaiq
tags:
- latest
- sha-${CI_COMMIT_SHA:0:8}
@@ -98,8 +98,8 @@ steps:
docker-cannaiq:
image: plugins/docker
settings:
registry: code.cannabrands.app
repo: code.cannabrands.app/creationshop/cannaiq-frontend
registry: git.spdy.io
repo: git.spdy.io/creationshop/cannaiq-frontend
tags:
- latest
- sha-${CI_COMMIT_SHA:0:8}
@@ -117,8 +117,8 @@ steps:
docker-findadispo:
image: plugins/docker
settings:
registry: code.cannabrands.app
repo: code.cannabrands.app/creationshop/findadispo-frontend
registry: git.spdy.io
repo: git.spdy.io/creationshop/findadispo-frontend
tags:
- latest
- sha-${CI_COMMIT_SHA:0:8}
@@ -136,8 +136,8 @@ steps:
docker-findagram:
image: plugins/docker
settings:
registry: code.cannabrands.app
repo: code.cannabrands.app/creationshop/findagram-frontend
registry: git.spdy.io
repo: git.spdy.io/creationshop/findagram-frontend
tags:
- latest
- sha-${CI_COMMIT_SHA:0:8}
@@ -165,17 +165,17 @@ steps:
- echo "$KUBECONFIG_CONTENT" | tr -d '[:space:]' | base64 -d > ~/.kube/config
- chmod 600 ~/.kube/config
# Deploy backend first
- kubectl set image deployment/scraper scraper=code.cannabrands.app/creationshop/dispensary-scraper:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper
- kubectl rollout status deployment/scraper -n dispensary-scraper --timeout=300s
- kubectl set image deployment/scraper scraper=git.spdy.io/creationshop/cannaiq:sha-${CI_COMMIT_SHA:0:8} -n cannaiq
- kubectl rollout status deployment/scraper -n cannaiq --timeout=300s
# Note: Migrations run automatically at startup via auto-migrate
# Deploy remaining services
# Resilience: ensure workers are scaled up if at 0
- REPLICAS=$(kubectl get deployment scraper-worker -n dispensary-scraper -o jsonpath='{.spec.replicas}'); if [ "$REPLICAS" = "0" ]; then echo "Scaling workers from 0 to 5"; kubectl scale deployment/scraper-worker --replicas=5 -n dispensary-scraper; fi
- kubectl set image deployment/scraper-worker worker=code.cannabrands.app/creationshop/dispensary-scraper:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper
- kubectl set image deployment/cannaiq-frontend cannaiq-frontend=code.cannabrands.app/creationshop/cannaiq-frontend:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper
- kubectl set image deployment/findadispo-frontend findadispo-frontend=code.cannabrands.app/creationshop/findadispo-frontend:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper
- kubectl set image deployment/findagram-frontend findagram-frontend=code.cannabrands.app/creationshop/findagram-frontend:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper
- kubectl rollout status deployment/cannaiq-frontend -n dispensary-scraper --timeout=120s
- REPLICAS=$(kubectl get deployment scraper-worker -n cannaiq -o jsonpath='{.spec.replicas}'); if [ "$REPLICAS" = "0" ]; then echo "Scaling workers from 0 to 5"; kubectl scale deployment/scraper-worker --replicas=5 -n cannaiq; fi
- kubectl set image deployment/scraper-worker worker=git.spdy.io/creationshop/cannaiq:sha-${CI_COMMIT_SHA:0:8} -n cannaiq
- kubectl set image deployment/cannaiq-frontend cannaiq-frontend=git.spdy.io/creationshop/cannaiq-frontend:sha-${CI_COMMIT_SHA:0:8} -n cannaiq
- kubectl set image deployment/findadispo-frontend findadispo-frontend=git.spdy.io/creationshop/findadispo-frontend:sha-${CI_COMMIT_SHA:0:8} -n cannaiq
- kubectl set image deployment/findagram-frontend findagram-frontend=git.spdy.io/creationshop/findagram-frontend:sha-${CI_COMMIT_SHA:0:8} -n cannaiq
- kubectl rollout status deployment/cannaiq-frontend -n cannaiq --timeout=120s
depends_on:
- docker-backend
- docker-cannaiq

View File

@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: cannaiq-frontend
namespace: dispensary-scraper
namespace: cannaiq
spec:
replicas: 1
selector:
@@ -17,7 +17,7 @@ spec:
- name: regcred
containers:
- name: cannaiq-frontend
image: code.cannabrands.app/creationshop/cannaiq-frontend:latest
image: git.spdy.io/creationshop/cannaiq-frontend:latest
ports:
- containerPort: 80
resources:
@@ -32,7 +32,7 @@ apiVersion: v1
kind: Service
metadata:
name: cannaiq-frontend
namespace: dispensary-scraper
namespace: cannaiq
spec:
selector:
app: cannaiq-frontend

View File

@@ -2,10 +2,15 @@ apiVersion: v1
kind: ConfigMap
metadata:
name: scraper-config
namespace: dispensary-scraper
namespace: cannaiq
data:
NODE_ENV: "production"
PORT: "3010"
LOG_LEVEL: "info"
REDIS_HOST: "redis"
REDIS_PORT: "6379"
MINIO_ENDPOINT: "10.100.9.80"
MINIO_PORT: "9000"
MINIO_BUCKET: "cannaiq"
MINIO_USE_SSL: "false"
MINIO_PUBLIC_ENDPOINT: "https://cdn.spdy.io"

View File

@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: findadispo-frontend
namespace: dispensary-scraper
namespace: cannaiq
spec:
replicas: 1
selector:
@@ -17,7 +17,7 @@ spec:
- name: regcred
containers:
- name: findadispo-frontend
image: code.cannabrands.app/creationshop/findadispo-frontend:v1.0.0
image: git.spdy.io/creationshop/findadispo-frontend:v1.0.0
ports:
- containerPort: 80
resources:
@@ -32,7 +32,7 @@ apiVersion: v1
kind: Service
metadata:
name: findadispo-frontend
namespace: dispensary-scraper
namespace: cannaiq
spec:
selector:
app: findadispo-frontend

View File

@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: findagram-frontend
namespace: dispensary-scraper
namespace: cannaiq
spec:
replicas: 1
selector:
@@ -17,7 +17,7 @@ spec:
- name: regcred
containers:
- name: findagram-frontend
image: code.cannabrands.app/creationshop/findagram-frontend:v1.0.0
image: git.spdy.io/creationshop/findagram-frontend:v1.0.0
ports:
- containerPort: 80
resources:
@@ -32,7 +32,7 @@ apiVersion: v1
kind: Service
metadata:
name: findagram-frontend
namespace: dispensary-scraper
namespace: cannaiq
spec:
selector:
app: findagram-frontend

View File

@@ -2,7 +2,7 @@ apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: scraper-ingress
namespace: dispensary-scraper
namespace: cannaiq
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod

View File

@@ -1,6 +1,6 @@
apiVersion: v1
kind: Namespace
metadata:
name: dispensary-scraper
name: cannaiq
labels:
app: dispensary-scraper
app: cannaiq

View File

@@ -2,7 +2,7 @@ apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
namespace: dispensary-scraper
namespace: cannaiq
spec:
accessModes:
- ReadWriteOnce
@@ -14,7 +14,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
namespace: dispensary-scraper
namespace: cannaiq
spec:
replicas: 1
selector:
@@ -67,7 +67,7 @@ apiVersion: v1
kind: Service
metadata:
name: postgres
namespace: dispensary-scraper
namespace: cannaiq
spec:
selector:
app: postgres

View File

@@ -2,7 +2,7 @@ apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-data
namespace: dispensary-scraper
namespace: cannaiq
spec:
accessModes:
- ReadWriteOnce
@@ -14,7 +14,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: dispensary-scraper
namespace: cannaiq
spec:
replicas: 1
selector:
@@ -57,7 +57,7 @@ apiVersion: v1
kind: Service
metadata:
name: redis
namespace: dispensary-scraper
namespace: cannaiq
spec:
selector:
app: redis

View File

@@ -4,13 +4,13 @@ apiVersion: v1
kind: ServiceAccount
metadata:
name: scraper-sa
namespace: dispensary-scraper
namespace: cannaiq
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: worker-scaler
namespace: dispensary-scraper
namespace: cannaiq
rules:
# Allow reading deployment and statefulset status
- apiGroups: ["apps"]
@@ -25,11 +25,11 @@ apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: scraper-worker-scaler
namespace: dispensary-scraper
namespace: cannaiq
subjects:
- kind: ServiceAccount
name: scraper-sa
namespace: dispensary-scraper
namespace: cannaiq
roleRef:
kind: Role
name: worker-scaler

View File

@@ -10,7 +10,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: scraper-worker
namespace: dispensary-scraper
namespace: cannaiq
spec:
# MAX 8 PODS - See CLAUDE.md rule #6
# Each pod runs up to MAX_CONCURRENT_TASKS browsers (~400MB each)
@@ -28,7 +28,7 @@ spec:
- name: regcred
containers:
- name: worker
image: code.cannabrands.app/creationshop/dispensary-scraper:latest
image: git.spdy.io/creationshop/cannaiq:latest
command: ["node"]
args: ["dist/tasks/task-worker.js"]
envFrom:

View File

@@ -2,7 +2,7 @@ apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: scraper-images-pvc
namespace: dispensary-scraper
namespace: cannaiq
spec:
accessModes:
- ReadWriteOnce
@@ -14,7 +14,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: scraper
namespace: dispensary-scraper
namespace: cannaiq
spec:
replicas: 1
selector:
@@ -30,7 +30,7 @@ spec:
- name: regcred
containers:
- name: scraper
image: code.cannabrands.app/creationshop/dispensary-scraper:latest
image: git.spdy.io/creationshop/cannaiq:latest
ports:
- containerPort: 3010
envFrom:

View File

@@ -2,11 +2,15 @@ apiVersion: v1
kind: Secret
metadata:
name: scraper-secrets
namespace: dispensary-scraper
namespace: cannaiq
type: Opaque
stringData:
POSTGRES_USER: "scraper"
POSTGRES_PASSWORD: "Kx9$mVnQ2wLpZ4fT8jRbY7cH"
POSTGRES_DB: "dispensary_scraper"
DATABASE_URL: "postgresql://scraper:Kx9$mVnQ2wLpZ4fT8jRbY7cH@postgres:5432/dispensary_scraper"
POSTGRES_USER: "cannaiq"
POSTGRES_PASSWORD: "SpDyCannaIQ2024"
POSTGRES_DB: "cannaiq"
DATABASE_URL: "postgresql://cannaiq:SpDyCannaIQ2024@10.100.6.50:5432/cannaiq"
JWT_SECRET: "aW7vN3xKpM9qLsT2fB5jDc8hR4wY6zXe"
MINIO_ACCESS_KEY: "cannaiq-app"
MINIO_SECRET_KEY: "62a37268f2fe4163ef46fe1c29ad93f817b415fc"
EVOMI_USER: "kl8"
EVOMI_PASS: "ogh9U1Xe7Gzxzozo4rmP"

View File

@@ -2,7 +2,7 @@ apiVersion: v1
kind: Service
metadata:
name: scraper
namespace: dispensary-scraper
namespace: cannaiq
spec:
selector:
app: scraper