diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e416b5a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,26 @@ +services: + redis: + image: redis:alpine + command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"] + restart: unless-stopped + healthcheck: + test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] + interval: 5s + timeout: 3s + retries: 5 + + server: + build: . + ports: + - "5000:5000" + environment: + host: redis + port: 6379 + password: "${REDIS_PASSWORD}" + devMode: "true" + adminPasskey: "" + clienturl: "" + depends_on: + redis: + condition: service_healthy + restart: unless-stopped diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..b83fefc --- /dev/null +++ b/run.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Starting Poketab API with self-contained Redis..." + +if docker compose version &>/dev/null; then + COMPOSE_CMD="docker compose" +elif command -v docker-compose &>/dev/null; then + COMPOSE_CMD="docker-compose" +else + echo "Error: neither 'docker compose' nor 'docker-compose' is available." >&2 + exit 1 +fi + +if [ -z "${REDIS_PASSWORD:-}" ]; then + read -rsp "Enter Redis password: " REDIS_PASSWORD + echo +fi + +if [ -z "$REDIS_PASSWORD" ]; then + echo "Error: REDIS_PASSWORD cannot be empty." >&2 + exit 1 +fi + +export REDIS_PASSWORD + +$COMPOSE_CMD up --build diff --git a/server/libs/websockets.ts b/server/libs/websockets.ts index e5d2039..62dfcc0 100644 --- a/server/libs/websockets.ts +++ b/server/libs/websockets.ts @@ -8,7 +8,9 @@ import { redis, Key, User, _R_getAllUsersData, _R_exitUserFromSocket, _R_deleteC import { validatename, validateKey } from './utils.ts'; //get client url from .env file which will be set to CORS -const { clienturl, host, port, password } = Deno.env.toObject(); +const { clienturl, host, port, password, devMode } = Deno.env.toObject(); + +const allowAllOrigins = devMode === 'true'; const [pubClient, subClient] = await Promise.all([ createRedisClient({ @@ -28,9 +30,9 @@ pubClient.hset('server', 'status', 'online'); //initialize socket.io server export const io = new Server({ cors: { - origin: [clienturl], + origin: allowAllOrigins ? '*' : [clienturl], methods: ["GET", "POST"], - credentials: true + credentials: !allowAllOrigins, }, adapter: createRedisAdapter(pubClient, subClient), });