Sign inSign up

kubekanvas/strapi

By kubekanvas

•Updated 10 months ago

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

Image
Content management system
0

643

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

10 months ago

docker pull kubekanvas/strapi