AG & Dev

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

12 мая 2026 г.

Другие статьи

Аутентификация в Keystatic CMS
Настройка аутентификации в Keystatic CMS (Local mode) в проекте Next.js
Валидация и обработка формы на сервере
Валидация и обработка формы на сервере при помощи React-хука useActionState
Глобальное состояние в React
Глобальное состояние в React без подключения сторонних библиотек
Яндекс Карты в проекте Next.js
Подключение Яндекс Карты (API 3) к проекту Next.js (App Router)
Подключение к Headless CMS из Next.js
Пример подключения к Headless CMS (Wordpress) из приложения Next.js посредством REST API
Устранение FOUC в Next.js
Устранение FOUC-эффекта при использовании тёмной темы сайта в Next.js
Подключение Payload CMS к проекту Next.js
Как подключить Payload CMS к существующему проекту Next.js
Все статьи

Технологический стек

AG & Dev

Разработка быстрых и надёжных веб-сайтов на базе самых современных технологий

Профиль на GitHub

Инструменты

React
Next.js
Tailwind

Платформы

Node.js
Docker
Nginx

CMS

Directus
Keystone
Keystatic

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

Dockerfile
FROM node:lts-slim
 
WORKDIR /app
 
COPY package*.json ./
 
RUN apt-get update && 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
import { config } from "@keystone-6/core";
import { statelessSessions } from "@keystone-6/core/session";
import { createAuth } from "@keystone-6/auth";
 
//...
 
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 --build -d