diff --git a/docker-compose.yml b/docker-compose.yml index 4dec8c5b..b4897a38 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,7 +37,6 @@ services: ports: - "3000:3000" environment: - - REDIS_URI=redis://redis:6379 - BASE_URL=http://localhost:3000 - NODE_ENV=development - APOS_MONGODB_URI=mongodb://mongodb:27017/apostrophe @@ -61,7 +60,6 @@ services: depends_on: - mongodb - localstack - - redis restart: unless-stopped healthcheck: test: @@ -118,25 +116,6 @@ services: networks: - proxynet - # Redis for caching (optional, but recommended for production) - redis: - image: redis:7-alpine - container_name: apostrophe-redis - ports: - - "6379:6379" - volumes: - - redis_data:/data - command: redis-server --appendonly yes - restart: unless-stopped - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 3 - networks: - - proxynet - volumes: mongodb_data: - redis_data: localstack_data: diff --git a/website/app.js b/website/app.js index 90a860cb..0ff482f1 100644 --- a/website/app.js +++ b/website/app.js @@ -2,7 +2,29 @@ const apostrophe = require('apostrophe'); require('dotenv').config({ path: '../.env' }); const { getEnv } = require('./utils/env'); +/** + * Creates the Apostrophe CMS configuration object. + * Configures session (with optional Redis store), base URL, CORS, and all + * modules (express, template, widgets, pieces, etc.). + * + * @returns {object} Apostrophe configuration with shortName, baseUrl, and modules. + */ function createAposConfig() { + const redisUri = process.env.REDIS_URI; + + const sessionConfig = { + secret: getEnv('SESSION_SECRET'), + }; + + if (redisUri) { + sessionConfig.store = { + connect: require('connect-redis'), + options: { + url: redisUri, + }, + }; + } + return { shortName: 'apostrophe-site', baseUrl: process.env.BASE_URL || 'https://speedandfunction.com', @@ -13,16 +35,7 @@ function createAposConfig() { '@apostrophecms/security-headers': {}, '@apostrophecms/express': { options: { - session: { - // If using Redis (recommended for production) - secret: getEnv('SESSION_SECRET'), - store: { - connect: require('connect-redis'), - options: { - url: getEnv('REDIS_URI'), - }, - }, - }, + session: sessionConfig, csrf: { cookie: { key: '_csrf', diff --git a/website/app.test.js b/website/app.test.js index 54b9d58d..ac18a2c0 100644 --- a/website/app.test.js +++ b/website/app.test.js @@ -1,3 +1,6 @@ +/** + * Tests for website/app.js: createAposConfig and module exports. + */ const { createAposConfig } = require('./app'); const mockConnectRedis = jest.fn(); jest.mock('connect-redis', () => mockConnectRedis); @@ -58,6 +61,16 @@ describe('createAposConfig', () => { }); }); + test('uses in-memory session store when REDIS_URI is not set', () => { + delete process.env.REDIS_URI; + + const config = createAposConfig(); + + expect( + config.modules['@apostrophecms/express'].options.session.store, + ).toBeUndefined(); + }); + // Define module categories for verification - moved outside the test const moduleCategories = [ {