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

View File

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

View File

@@ -2,10 +2,15 @@ apiVersion: v1
kind: ConfigMap kind: ConfigMap
metadata: metadata:
name: scraper-config name: scraper-config
namespace: dispensary-scraper namespace: cannaiq
data: data:
NODE_ENV: "production" NODE_ENV: "production"
PORT: "3010" PORT: "3010"
LOG_LEVEL: "info" LOG_LEVEL: "info"
REDIS_HOST: "redis" REDIS_HOST: "redis"
REDIS_PORT: "6379" 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 kind: Deployment
metadata: metadata:
name: findadispo-frontend name: findadispo-frontend
namespace: dispensary-scraper namespace: cannaiq
spec: spec:
replicas: 1 replicas: 1
selector: selector:
@@ -17,7 +17,7 @@ spec:
- name: regcred - name: regcred
containers: containers:
- name: findadispo-frontend - name: findadispo-frontend
image: code.cannabrands.app/creationshop/findadispo-frontend:v1.0.0 image: git.spdy.io/creationshop/findadispo-frontend:v1.0.0
ports: ports:
- containerPort: 80 - containerPort: 80
resources: resources:
@@ -32,7 +32,7 @@ apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: findadispo-frontend name: findadispo-frontend
namespace: dispensary-scraper namespace: cannaiq
spec: spec:
selector: selector:
app: findadispo-frontend app: findadispo-frontend

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,11 +2,15 @@ apiVersion: v1
kind: Secret kind: Secret
metadata: metadata:
name: scraper-secrets name: scraper-secrets
namespace: dispensary-scraper namespace: cannaiq
type: Opaque type: Opaque
stringData: stringData:
POSTGRES_USER: "scraper" POSTGRES_USER: "cannaiq"
POSTGRES_PASSWORD: "Kx9$mVnQ2wLpZ4fT8jRbY7cH" POSTGRES_PASSWORD: "SpDyCannaIQ2024"
POSTGRES_DB: "dispensary_scraper" POSTGRES_DB: "cannaiq"
DATABASE_URL: "postgresql://scraper:Kx9$mVnQ2wLpZ4fT8jRbY7cH@postgres:5432/dispensary_scraper" DATABASE_URL: "postgresql://cannaiq:SpDyCannaIQ2024@10.100.6.50:5432/cannaiq"
JWT_SECRET: "aW7vN3xKpM9qLsT2fB5jDc8hR4wY6zXe" 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 kind: Service
metadata: metadata:
name: scraper name: scraper
namespace: dispensary-scraper namespace: cannaiq
spec: spec:
selector: selector:
app: scraper app: scraper