Skip to content

Introduction

Pimcore is an open-source, enterprise-grade software platform that combines Product Information Management (PIM), Master Data Management (MDM), Digital Asset Management (DAM), and a Digital Experience Platform (DXP/CMS) into a single unified system.

You can learn more about its core features on the Pimcore Official Website.

Core Capabilities:

  • PIM / MDM: Centralizes and cleans up all business and product data (like specs, prices, and supplier info) to act as a single source of truth.
  • DAM: Manages digital media files like images, videos, and documents, linking them directly to product data.
  • DXP / CMS: Manages website content, portals, and personalized digital experiences.
  • Commerce: Provides frameworks to build B2B or B2C digital commerce solutions.

Key Technical Facts:

  • Framework Nature: It is not a rigid, click-and-go tool like WordPress or Shopify; it is a flexible developer platform built on PHP and the Symfony framework.
  • API-Driven: It supports headless architecture via REST and GraphQL APIs for easy integration into existing enterprise IT landscapes.

Installation

Install: Using Docker

1) Directory layout

/opt/pimcore/
├── docker-compose.yml
├── db_data/      # MariaDB database files
└── app/          # Pimcore source code, uploads, assets, and caches

2) Create the target directory:

mkdir -p /opt/pimcore && cd /opt/pimcore

3) Create docker-compose.yml:

Where restart: unless-stopped ensures restart when the host is rebooted.

services:
  db:
    image: mariadb:10.11
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: secretpassword
      MYSQL_DATABASE: pimcore
      MYSQL_USER: pimcore
      MYSQL_PASSWORD: pimcorepassword
    volumes:
      - ./db_data:/var/lib/mysql

  app:
    image: pimcore/pimcore:php8.3-latest
    restart: unless-stopped
    environment:
      PIMCORE_DB_HOST: db
      PIMCORE_DB_NAME: pimcore
      PIMCORE_DB_USER: pimcore
      PIMCORE_DB_PASSWORD: pimcorepassword
    volumes:
      - ./app:/var/www/html
    depends_on:
      - db

  web:
    #user: "1000:1000" # Forces container to use your host user IDs
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - target: 80
        host_ip: 127.0.0.1
        published: 8080
        protocol: tcp
        mode: host
      # - "8080:80"
      #- "10.0.11.X:8080:8083"
    volumes:
      - ./app:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app

Create /opt/pimcore/nginx.conf.

server {
  listen 80;
  server_name localhost;
  root /var/www/html/public;
  index index.php;

  location / {
    try_files $uri /index.php$is_args$args;
  }

  location ~ ^/index\.php(/|$) {
    fastcgi_pass app:9000;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
  }
}

4) Initialize the Pimcore project skeleton:

Normal:

docker compose run --rm app composer create-project pimcore/skeleton:^11.0 .

In case of policy errors and to circumvent them:

docker compose run --rm app composer create-project pimcore/skeleton:^11.0 . --no-install
docker compose run --rm app composer config policy.advisories.block false
docker compose run --rm app composer update

Note: Delete the files first in the /opt/pimcore/app directory.

5) Start the containers and run the installer:

Run the container in the background.

docker compose up --detach

Execute the installer inside the container.

docker compose exec app vendor/bin/pimcore-install \
--mysql-host-socket=db \
--mysql-username=pimcore \
--mysql-password=pimcorepassword \
--mysql-database=pimcore \
--admin-username=admin \
--admin-password=AdminPassword123! \
--no-interaction

6) Fix the access to the var directory.

Bring the running composer down.

docker compose down

Fix the access for the Nginx webserver running as user www-data (33).

chown -R www-data:www-data /opt/pimcore/var/ 
chmod -R u=rwX,go=rX /opt/pimcore/var/

7) Run the container

Run in the foreground and show the log.

docker compose up

Run instantly in the background.

docker compose up --detach

Backup

A shell script should stop the container and create a backup using a timestamped filename.

docker compose down
tar -czvf "pimcore-backup-$(date -u +"%Y%m%dT%H%M%S").tar.gz" -C /opt pimcore
docker compose up -d

Alternatives

Running as pimcore as a Service.

Create file /etc/systemd/system/pimcore.service.

[Unit]
Description=Pimcore Docker Compose Application
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/pimcore
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

Register the new service and start it.

sudo systemctl daemon-reload
sudo systemctl enable --now pimcore