diff --git a/deploy/handy.yaml b/deploy/handy.yaml index 43b67cc..46982f3 100644 --- a/deploy/handy.yaml +++ b/deploy/handy.yaml @@ -25,6 +25,8 @@ spec: env: - name: NODE_ENV value: production + - name: REDIS_URL + value: redis://happy-redis:6379 envFrom: - secretRef: name: handy-secrets diff --git a/deploy/happy-redis.yaml b/deploy/happy-redis.yaml new file mode 100644 index 0000000..37f7b1b --- /dev/null +++ b/deploy/happy-redis.yaml @@ -0,0 +1,75 @@ +apiVersion: v1 +kind: Service +metadata: + name: happy-redis + labels: + app: happy-redis +spec: + ports: + - port: 6379 + name: redis + selector: + app: happy-redis +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: happy-redis-config +data: + redis.conf: | + dir /data + appendonly yes + appendfsync everysec + save 900 1 + save 300 10 + save 60 10000 + maxmemory-policy noeviction +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: happy-redis +spec: + serviceName: happy-redis + replicas: 1 + selector: + matchLabels: + app: happy-redis + template: + metadata: + labels: + app: happy-redis + spec: + containers: + - name: redis + image: redis:7-alpine + command: + - redis-server + - "/etc/redis/redis.conf" + ports: + - containerPort: 6379 + name: redis + volumeMounts: + - name: redis-data + mountPath: /data + - name: redis-config + mountPath: /etc/redis + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + volumes: + - name: redis-config + configMap: + name: happy-redis-config + volumeClaimTemplates: + - metadata: + name: redis-data + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/package.json b/package.json index 9a55944..d1e277d 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@fastify/bearer-auth": "^10.1.1", "@fastify/cors": "^10.0.1", "@prisma/client": "^6.11.1", + "@socket.io/redis-streams-adapter": "^0.2.2", "@types/jsonwebtoken": "^9.0.10", "axios": "^1.6.8", "chalk": "4.1.2", @@ -39,13 +40,14 @@ "elevenlabs": "^1.54.0", "fastify": "^5.2.0", "fastify-type-provider-zod": "^4.0.2", - "ioredis": "^5.4.1", + "ioredis": "^5.6.1", "jsonwebtoken": "^9.0.2", "pino-pretty": "^13.0.0", "prisma": "^6.11.1", "prisma-json-types-generator": "^3.5.1", "privacy-kit": "^0.0.23", "socket.io": "^4.8.1", + "socket.io-adapter": "^2.5.5", "tmp": "^0.2.3", "tsx": "^4.19.2", "tweetnacl": "^1.0.3", @@ -55,4 +57,4 @@ "zod": "^3.24.2", "zod-to-json-schema": "^3.24.3" } -} \ No newline at end of file +} diff --git a/sources/main.ts b/sources/main.ts index 0d15dd2..0f129a6 100644 --- a/sources/main.ts +++ b/sources/main.ts @@ -3,14 +3,19 @@ import { log } from "@/utils/log"; import { awaitShutdown } from "@/utils/shutdown"; import { db } from './storage/db'; import { startTimeout } from "./app/timeout"; +import { redis } from "./services/redis"; async function main() { + // Storage + await db.$connect(); + await redis.connect(); + await redis.ping(); + // // Start // - await db.$connect(); const { app, io } = await startApi(); startTimeout(); diff --git a/sources/services/redis.ts b/sources/services/redis.ts new file mode 100644 index 0000000..6661768 --- /dev/null +++ b/sources/services/redis.ts @@ -0,0 +1,3 @@ +import { Redis } from 'ioredis'; + +export const redis = new Redis(); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d6ce53c..73a25ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -352,6 +352,11 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@msgpack/msgpack@~2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.8.0.tgz#4210deb771ee3912964f14a15ddfb5ff877e70b9" + integrity sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ== + "@noble/curves@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.5.0.tgz#7a9b9b507065d516e6dce275a1e31db8d2a100dd" @@ -671,6 +676,14 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== +"@socket.io/redis-streams-adapter@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@socket.io/redis-streams-adapter/-/redis-streams-adapter-0.2.2.tgz#149a46c546be0bd080b7a9dedb993ec75f0c1827" + integrity sha512-BMPa6oGC0wFgpMXoGksbJ75zMBwk+79pxjHc2YusdoK+X0BxN4fTsqEBuFV7yeXi9ekbi87rwlsT61+WZGVW9g== + dependencies: + "@msgpack/msgpack" "~2.8.0" + debug "~4.3.1" + "@stablelib/base64@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@stablelib/base64/-/base64-2.0.1.tgz#f1546ab26896b3490d1ab531373c0dc39e12cee1" @@ -1624,10 +1637,10 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ioredis@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.4.1.tgz#1c56b70b759f01465913887375ed809134296f40" - integrity sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA== +ioredis@^5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.6.1.tgz#1ed7dc9131081e77342503425afceaf7357ae599" + integrity sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA== dependencies: "@ioredis/commands" "^1.1.1" cluster-key-slot "^1.1.0" @@ -2254,7 +2267,7 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -socket.io-adapter@~2.5.2: +socket.io-adapter@^2.5.5, socket.io-adapter@~2.5.2: version "2.5.5" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==