Dockerfile и compose.yaml для развёртывания Keystone CMS 6

12 мая 2026 г.

Рабочие и проверенные в деле Dockerfile и compose.yaml для развёртывания в производственной среде Keystone CMS (версия 6) в связке с базой данных PostgreSQL:

Dockerfile
FROM node:lts-slim
 
WORKDIR /app
 
COPY package*.json ./
 
RUN apt-get update && apt-get upgrade -y && apt-get install -y openssl
RUN npm ci --no-audit --no-fund;
 
COPY ./keystone.ts ./keystone.ts
# если в проекте есть другие исходники –
# их тоже нужно скопировать в контейнер
 
ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
 
RUN npm run build
 
EXPOSE 3000
 
CMD ["npm", "start"]
compose.yaml
services:
  app:
    build: .
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://dbuser:dbpass@db:5432/dbname
      - SESSION_SECRET=geDqqNAg4C6qUJ3Sg0POYOC3r7oWvMeILgVyqpJaGg4=
    depends_on:
      - db
 
  db:
    image: postgres:latest
    restart: unless-stopped
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: dbuser
      POSTGRES_PASSWORD: dbpass
      POSTGRES_DB: dbname
    volumes:
      - ./postgres_data:/var/lib/postgresql/data

В корне проекта необходимо создать папку postgres_data для данных PostgreSQL и включить её в .gitignore.

Уникальный SESSION_SECRET можно сгенерировать командой в терминале:

terminal
openssl rand -base64 32

При этом, настройка сессии и настройка подключения базы данных в файле keystone.ts будут выглядеть примерно так:

keystone.ts
//...
 
const session = statelessSessions({
  maxAge: 60 * 60 * 24 * 30,
  secret: process.env.SESSION_SECRET,
});
 
//...
 
export default withAuth(
  config({
    db: {
      provider: "postgresql",
      url: process.env.DATABASE_URL,
    },
    lists,
    session,
  }),
);

Для сборки проекта нужно выполнить команду:

terminal
docker compose up -d