Sign inSign up

kubekanvas/strapi

By kubekanvas

Updated 9 months ago

A production-ready, hardened Docker image for Strapi CMS.

Image
Content management system
0

621

kubekanvas/strapi repository overview

Strapi CMS - Production Docker Image

Docker Image Size Docker Pulls

A production-ready, hardened Docker image for Strapi CMS - an open-source headless CMS built with Node.js.

Features

  • Multi-stage build for optimized image size
  • Security hardened with non-root user
  • Production-ready configuration
  • Minimal attack surface - only runtime dependencies
  • Based on Alpine Linux for smaller footprint
  • Strapi 5.30.1 with Node.js 22

Quick Start

Run with default SQLite database
docker run -d \
  -p 1337:1337 \
  -e NODE_ENV=production \
  --name strapi \
  kubekanvas/strapi:latest
Run with environment variables
docker run -d \
  -p 1337:1337 \
  -e NODE_ENV=production \
  -e ADMIN_JWT_SECRET=your-secret-here \
  -e API_TOKEN_SALT=your-salt-here \
  -e APP_KEYS=key1,key2 \
  --name strapi \
  kubekanvas/strapi:latest
Run with persistent data
docker run -d \
  -p 1337:1337 \
  -e NODE_ENV=production \
  -v strapi-data:/opt/app/.tmp \
  -v strapi-uploads:/opt/app/public/uploads \
  --name strapi \
  kubekanvas/strapi:latest

Environment Variables

Required for All Configurations
VariableDescriptionRequired
NODE_ENVEnvironment mode (production/development)No (default: production)
HOSTServer hostNo (default: 0.0.0.0)
PORTServer portNo (default: 1337)
ADMIN_JWT_SECRETJWT secret for admin panelYes
API_TOKEN_SALTSalt for API tokensYes
APP_KEYSApplication keys (comma-separated)Yes
TRANSFER_TOKEN_SALTSalt for transfer tokensYes
JWT_SECRETJWT secretYes
ENCRYPTION_KEYEncryption keyYes
Database Configuration
VariableDescriptionDefaultRequired
DATABASE_CLIENTDatabase type: sqlite, mysql, or postgressqliteNo
SQLite Configuration
VariableDescriptionDefault
DATABASE_FILENAMEDatabase file path.tmp/data.db
MySQL Configuration
VariableDescriptionDefaultRequired
DATABASE_HOSTMySQL hostlocalhostYes
DATABASE_PORTMySQL port3306No
DATABASE_NAMEDatabase namestrapiYes
DATABASE_USERNAMEDatabase userstrapiYes
DATABASE_PASSWORDDatabase password-Yes
DATABASE_SSLEnable SSLfalseNo
DATABASE_POOL_MINMin pool connections2No
DATABASE_POOL_MAXMax pool connections10No
PostgreSQL Configuration
VariableDescriptionDefaultRequired
DATABASE_HOSTPostgreSQL hostlocalhostYes
DATABASE_PORTPostgreSQL port5432No
DATABASE_NAMEDatabase namestrapiYes
DATABASE_USERNAMEDatabase userstrapiYes
DATABASE_PASSWORDDatabase password-Yes
DATABASE_URLFull connection string-No (alternative)
DATABASE_SCHEMADatabase schemapublicNo
DATABASE_SSLEnable SSLfalseNo
DATABASE_POOL_MINMin pool connections2No
DATABASE_POOL_MAXMax pool connections10No

Generate secure secrets using:

node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

Docker Compose Example

version: '3.8'

services:
  strapi:
    image: kubekanvas/strapi:latest
    container_name: strapi
    restart: unless-stopped
    environment:
      NODE_ENV: production
      ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
      API_TOKEN_SALT: ${API_TOKEN_SALT}
      APP_KEYS: ${APP_KEYS}
      TRANSFER_TOKEN_SALT: ${TRANSFER_TOKEN_SALT}
      JWT_SECRET: ${JWT_SECRET}
      ENCRYPTION_KEY: ${ENCRYPTION_KEY}
    ports:
      - "1337:1337"
    volumes:
      - strapi-data:/opt/app/.tmp
      - strapi-uploads:/opt/app/public/uploads
    healthcheck:
      test: ["CMD", "node", "-e", "require('http').get('http://localhost:1337/_health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"]
      interval: 30s
      timeout: 3s
      retries: 3
      start_period: 40s

volumes:
  strapi-data:
  strapi-uploads:

Accessing Strapi

After starting the container:

  1. Open your browser and navigate to http://localhost:1337/admin
  2. Create your first administrator account
  3. Start managing your content!

Health Check

The image includes a built-in health check that monitors the application status:

docker inspect --format='{{.State.Health.Status}}' strapi

Image Security Features

  • Non-root user (UID 1001)
  • Minimal runtime dependencies
  • No build tools in production image
  • Read-only filesystem compatible
  • Regular security updates via Alpine base

Volumes

  • /opt/app/.tmp - Temporary files and SQLite database
  • /opt/app/public/uploads - Uploaded media files

Support

For issues and questions:


If you want to deploy in Kubernetes please check complete instructions at following link

https://www.kubekanvas.io/blog/building-a-modern-blog-with-strapi-and-kubernetes-your-first-cms-in-the-cloud

Note: Remember to change default secrets in production!

Tag summary

Content type

Image

Digest

sha256:d5d1d2345

Size

336.7 MB

Last updated

9 months ago

docker pull kubekanvas/strapi