From 471121aa0ff1a5841336c027f248ccb95839f4c4 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Mon, 23 Feb 2026 12:00:49 -0800 Subject: [PATCH 1/3] Add Caddyfile --- Caddyfile | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Caddyfile diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..d40ed5e --- /dev/null +++ b/Caddyfile @@ -0,0 +1,4 @@ +interchange-api.bchen.dev { + reverse_proxy app:4000 +} + From ecc9cdd747f503dad4e069290a23491d034f9f18 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Mon, 23 Feb 2026 12:01:28 -0800 Subject: [PATCH 2/3] Add Docker Compose file which uses Caddy --- docker-compose.prod.yml | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 docker-compose.prod.yml diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..b0a55f8 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,52 @@ +# self hosted server setup using Caddy + +x-common-environment: &common-server-environment + APNS_IS_PRODUCTION: ${APNS_IS_PRODUCTION} + APNS_BUNDLE_ID: ${APNS_BUNDLE_ID} + APNS_TEAM_ID: ${APNS_TEAM_ID} + APNS_KEY_ID: ${APNS_KEY_ID} + APNS_PRIVATE_KEY: ${APNS_PRIVATE_KEY} + PARKING_LOGGING_INTERVAL_MS: ${PARKING_LOGGING_INTERVAL_MS} + REDIS_URL: redis://redis:6379 + REDIS_USE_TLS: false + RATE_LIMITS_DISABLED: ${RATE_LIMITS_DISABLED} + RATE_LIMIT_WINDOW_MS: ${RATE_LIMIT_WINDOW_MS} + RATE_LIMIT_DELAY_AFTER_REQUESTS: ${RATE_LIMIT_DELAY_AFTER_REQUESTS} + RATE_LIMIT_DELAY_MULTIPLIER_MS: ${RATE_LIMIT_DELAY_MULTIPLIER_MS} + +services: + app: + build: . + command: npm run start + restart: unless-stopped + depends_on: + - redis + environment: + <<: *common-server-environment + NODE_ENV: production + + redis: + image: redis/redis-stack:7.2.0-v17 + container_name: redis-timeseries + restart: unless-stopped + volumes: + - redis_data:/data + - ./redis-stack.conf:/redis-stack.conf + command: redis-stack-server /redis-stack.conf + + caddy: + image: caddy:2-alpine + restart: unless-stopped + ports: + - "80:80" + - "443:443" + - "443:443/udp" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + - caddy_config:/config + +volumes: + redis_data: + caddy_data: + caddy_config: From b1420cfa7e359616ad2f047a63bb07e2405fb8c6 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Mon, 23 Feb 2026 12:06:10 -0800 Subject: [PATCH 3/3] Add REDIS_USE_TLS environment variable to configure TLS for Redis --- .env.example | 1 + docker-compose.prod.yml | 2 +- docker-compose.yml | 1 + src/helpers/createRedisClientForRepository.ts | 5 +++-- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index b111bba..ac8c748 100644 --- a/.env.example +++ b/.env.example @@ -21,3 +21,4 @@ RATE_LIMIT_DELAY_MULTIPLIER_MS= # Redis connection REDIS_URL= +REDIS_USE_TLS= diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index b0a55f8..8dc8e9a 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -8,7 +8,7 @@ x-common-environment: &common-server-environment APNS_PRIVATE_KEY: ${APNS_PRIVATE_KEY} PARKING_LOGGING_INTERVAL_MS: ${PARKING_LOGGING_INTERVAL_MS} REDIS_URL: redis://redis:6379 - REDIS_USE_TLS: false + REDIS_USE_TLS: 0 RATE_LIMITS_DISABLED: ${RATE_LIMITS_DISABLED} RATE_LIMIT_WINDOW_MS: ${RATE_LIMIT_WINDOW_MS} RATE_LIMIT_DELAY_AFTER_REQUESTS: ${RATE_LIMIT_DELAY_AFTER_REQUESTS} diff --git a/docker-compose.yml b/docker-compose.yml index 4748e8b..8a540ab 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,7 @@ x-common-environment: &common-server-environment APNS_PRIVATE_KEY: ${APNS_PRIVATE_KEY} PARKING_LOGGING_INTERVAL_MS: ${PARKING_LOGGING_INTERVAL_MS} REDIS_URL: redis://redis:6379 + REDIS_USE_TLS: 0 RATE_LIMITS_DISABLED: ${RATE_LIMITS_DISABLED} RATE_LIMIT_WINDOW_MS: ${RATE_LIMIT_WINDOW_MS} RATE_LIMIT_DELAY_AFTER_REQUESTS: ${RATE_LIMIT_DELAY_AFTER_REQUESTS} diff --git a/src/helpers/createRedisClientForRepository.ts b/src/helpers/createRedisClientForRepository.ts index 55312fd..73ad76e 100644 --- a/src/helpers/createRedisClientForRepository.ts +++ b/src/helpers/createRedisClientForRepository.ts @@ -5,10 +5,11 @@ export default function createRedisClientForRepository() { const client = createClient({ url: process.env.REDIS_URL, socket: { - tls: process.env.NODE_ENV === 'production', + tls: process.env.REDIS_USE_TLS === "1", rejectUnauthorized: false, reconnectStrategy: REDIS_RECONNECT_INTERVAL, - }, + } as object, }); return client as RedisClientType; } +