How to Self-Host October CMS with Docker Compose

What Is October CMS?

October CMS is a self-hosted content management system built on the Laravel PHP framework. It targets developers who want Laravel’s power with a clean CMS layer on top — backend admin panel, drag-and-drop page builder, plugin marketplace, and a content scaffolding system called Tailor. Think of it as the middle ground between raw Laravel and WordPress: cleaner architecture than WordPress, more batteries-included than a bare framework. Official site.

Licensing note: October CMS uses a proprietary EULA, not an open-source license. The first year is free; ongoing updates and Marketplace access require a paid license. If you need a fully open-source CMS, consider Ghost, WordPress, or Wagtail.

Prerequisites

  • A Linux server (Ubuntu 22.04+ recommended)
  • Docker and Docker Compose installed (guide)
  • 1 GB of free disk space
  • 1 GB of RAM minimum (2 GB recommended)
  • PHP 8.2+ and Composer (for initial project creation)
  • A domain name (optional, for remote access)

Docker Compose Configuration

First, create the October CMS project using Composer:

composer create-project october/october ~/october-cms
cd ~/october-cms

Create a Dockerfile in the project root:

FROM php:8.3-apache

RUN apt-get update && apt-get install -y \
    libpng-dev libjpeg-dev libfreetype6-dev \
    libzip-dev libxml2-dev unzip git \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install pdo_mysql gd zip simplexml mbstring opcache \
    && a2enmod rewrite \
    && rm -rf /var/lib/apt/lists/*

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html
COPY . .

RUN composer install --no-dev --optimize-autoloader \
    && chown -R www-data:www-data /var/www/html/storage \
    && chown -R www-data:www-data /var/www/html/themes

EXPOSE 80

Create docker-compose.yml:

services:
  app:
    build: .
    container_name: october-cms
    ports:
      - "8080:80"
    volumes:
      - october_storage:/var/www/html/storage
      - october_plugins:/var/www/html/plugins
      - october_themes:/var/www/html/themes
    environment:
      - APP_ENV=production
      - APP_DEBUG=false
      - APP_URL=http://localhost:8080
      - APP_KEY=base64:generate-this-with-artisan
      - DB_CONNECTION=mysql
      - DB_HOST=october-db
      - DB_PORT=3306
      - DB_DATABASE=october
      - DB_USERNAME=october
      - DB_PASSWORD=changeme
      - CACHE_STORE=redis
      - SESSION_DRIVER=redis
      - REDIS_HOST=october-redis
    depends_on:
      october-db:
        condition: service_healthy
      october-redis:
        condition: service_healthy
    restart: unless-stopped

  october-db:
    image: mariadb:10.11
    container_name: october-db
    volumes:
      - october_dbdata:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=changeme-root
      - MYSQL_DATABASE=october
      - MYSQL_USER=october
      - MYSQL_PASSWORD=changeme
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  october-redis:
    image: redis:7-alpine
    container_name: october-redis
    volumes:
      - october_redis:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

volumes:
  october_storage:
  october_plugins:
  october_themes:
  october_dbdata:
  october_redis:

Generate an application key and run migrations:

docker compose build
docker compose up -d
docker compose exec app php artisan key:generate
docker compose exec app php artisan october:migrate

Initial Setup

  1. Open http://your-server-ip:8080/admin in your browser
  2. Create the admin account during the first-run setup wizard
  3. Configure your site name, timezone, and default locale
  4. Install plugins from the Marketplace through the backend admin panel
  5. Choose and activate a frontend theme

Configuration

SettingEnvironment VariableDescription
DatabaseDB_CONNECTIONmysql, pgsql, or sqlite
CacheCACHE_STOREfile, redis, database, or memcached
SessionsSESSION_DRIVERfile, redis, database, or cookie
Admin URLBACKEND_URIAdmin panel path (default: /admin)
Debug modeAPP_DEBUGSet false in production
Site URLAPP_URLFull URL including protocol

Tailor Content Scaffolding

Tailor lets you define custom content types without writing code. Create blueprint YAML files in app/blueprints/:

handle: Blog\Post
type: entry
name: Blog Post
fields:
  title:
    label: Title
    type: text
  content:
    label: Content
    type: richeditor
  featured_image:
    label: Featured Image
    type: mediafinder
    mode: image

Reverse Proxy

Example Nginx Proxy Manager configuration:

  • Scheme: http
  • Forward Hostname: october-cms
  • Forward Port: 80

See Reverse Proxy Setup for full configuration guides.

Backup

Back up these volumes:

  • october_dbdata — MariaDB database with all content, users, and settings
  • october_storage — uploaded media, cache, logs
  • october_plugins — installed plugins
  • october_themes — installed themes

See Backup Strategy for automated approaches.

Troubleshooting

White Screen / 500 Error After Deployment

Symptom: Blank page or server error on first visit. Fix: Check permissions on the storage/ directory — it must be writable by the web server: docker compose exec app chown -R www-data:www-data storage. Also verify APP_KEY is set — run php artisan key:generate if needed.

Plugin Installation Fails

Symptom: Marketplace plugins won’t install from the admin panel. Fix: Ensure the container has outbound internet access. Check that the plugins/ directory is writable. For air-gapped environments, install plugins via Composer: composer require author/plugin-name.

Database Migration Errors

Symptom: october:migrate fails with table errors. Fix: Ensure the database is fully initialized before running migrations. Check the health of october-db with docker compose ps. For fresh installs, drop and recreate: docker compose exec app php artisan october:migrate --seed.

Resource Requirements

  • RAM: ~200 MB idle, ~500 MB under load
  • CPU: Low-Medium — Laravel applications are CPU-efficient
  • Disk: ~100 MB for core application, plus media uploads

Verdict

October CMS is a polished Laravel-based CMS with a clean architecture and a mature plugin ecosystem. The Tailor content scaffolding system is genuinely useful for building custom content types without plugins. The main drawback is licensing — it’s not open source, and ongoing updates require a paid license after the first year. For a fully open-source Laravel-based CMS, Wagtail (Django, not Laravel) or Ghost are better choices. For PHP specifically, WordPress has a vastly larger ecosystem, while October CMS offers a much cleaner codebase. Choose October CMS if you’re a Laravel developer who wants a familiar framework with CMS capabilities built in.

Frequently Asked Questions

Is October CMS free?

The first year is free with full functionality. After that, ongoing updates and Marketplace access require a paid license. The core framework code is available on GitHub, but October CMS is not open-source in the traditional sense — it uses a proprietary EULA. If you need a fully open-source PHP CMS, WordPress or Ghost are better choices.

How does October CMS compare to WordPress?

October CMS is built on Laravel and targets developers who want a clean, modern PHP architecture. WordPress has a vastly larger plugin ecosystem (60,000+ vs hundreds) and community. October CMS offers better code organization, a proper MVC architecture, and the Tailor content scaffolding system. Choose October CMS if you’re a Laravel developer building a custom site. Choose WordPress if you need maximum plugin availability and community support.

What is Tailor in October CMS?

Tailor is October CMS’s content scaffolding system. You define custom content types (blog posts, portfolios, products) using YAML blueprint files — no plugins or database migrations needed. It generates the backend admin UI, database tables, and API endpoints automatically. This replaces what would typically require a custom plugin or an Advanced Custom Fields-style addon in WordPress.

Can October CMS run on shared hosting?

October CMS requires PHP 8.2+, Composer, and a database. While it can technically run on shared hosting with PHP and MySQL, the Docker Compose setup described here is recommended for reliability and reproducibility. Shared hosting limitations (no SSH, no Composer, PHP version constraints) make deployment and updates difficult. A $5/month VPS is a better choice.

How do I update October CMS in Docker?

Rebuild the Docker image with the latest code. Run docker compose exec app composer update to pull the latest packages, then docker compose exec app php artisan october:migrate to apply any database changes. Always back up your database and storage volumes before updating. Breaking changes between major versions are documented in the official changelog.

Does October CMS support multi-language sites?

Yes. The Translate plugin from the official Marketplace adds full multi-language support — content translation, locale detection, and language switcher components. Tailor blueprints can also define translatable fields. Language packs for the admin panel are available for 25+ languages.

Comments