Quick Start: New Project
This guide walks you through creating a new Pimcore project from scratch and deploying it to Pimcore PaaS. If you already have an existing Pimcore project, see Quick Start: Existing Project instead.
Prerequisites
Before starting, ensure you have:
- Pimcore license token and Composer repository URL (from your license certificate)
- Pimcore PaaS Console account at https://console.pimcore.cloud/
- Git installed locally
- Pimcore CLI installed (installation guide)
- Either:
- PHP 8.4+ with Composer (for Option A)
- Docker with Docker Compose (for Option B)
Verifying Prerequisites
Before proceeding, verify your environment meets the requirements:
For Option A (Composer):
php --version # Should show 8.4 or higher
composer --version # Should show Composer is installed
git --version # Should show Git is installed
pimcore-cloud --version # Should show Pimcore CLI is installed
For Option B (Docker):
docker --version # Should show Docker is installed
docker compose version # Should show Docker Compose is installed
git --version # Should show Git is installed
pimcore-cloud --version # Should show Pimcore CLI is installed
Choose Your Setup Method
Select the installation method that matches your local development environment:
| Option | Best For | Requirements |
|---|---|---|
| Option A: Composer | Developers with PHP installed locally | PHP 8.4+, Composer |
| Option B: Docker | Containerized development, no local PHP | Docker, Docker Compose |
Both options result in the same deployed PaaS environment—choose based on your preferred local workflow.
Option A: Composer-Based Installation
Step 1: Create the Project
[LOCAL] Create a new Pimcore PaaS skeleton project:
COMPOSER_MEMORY_LIMIT=-1 composer create-project pimcore/paas-skeleton my-project
cd my-project
Replace my-project with your desired project name.
Step 2: Configure Composer Authentication
[LOCAL] Add your Pimcore license credentials to Composer (replace YOUR_PIMCORE_TOKEN and YOUR_REPO_NAME with actual values from your license certificate):
composer config --auth http-basic.repo.pimcore.com token YOUR_PIMCORE_TOKEN
composer config repositories.pimcore_enterprise composer https://repo.pimcore.com/YOUR_REPO_NAME/
Now install the enterprise dependencies:
composer install
Step 3: Configure Local Environment Variables
[LOCAL] The skeleton includes a .env file with service configuration variables that serve two purposes:
- For PaaS builds: Placeholder values allow Symfony to compile during build (when services aren't available yet)
- For local development: Real configuration pointing to your actual local services
You only need to add your PIMCORE_TOKEN:
# Edit .env and add your token (from your license certificate):
PIMCORE_TOKEN="<your-pimcore-license-token>"
The .env file already contains these service configuration variables:
| Variable | Default Value | Purpose |
|---|---|---|
GOTENBERG_BASE_URL | http://localhost:3000 | Gotenberg service URL (update if using a different host/port) |
REDIS_URL | redis://redis:6379 | Redis connection URL (update with your local Redis URL if needed) |
REDIS_SESSIONS_URL | redis://redis:6379 | Redis sessions connection URL (update with your local Redis URL if needed) |
How .env works:
- PaaS deployment: At runtime,
config/pimcore/startup.phpautomatically overwrites these with real service credentials fromPLATFORM_RELATIONSHIPS. The actual values don't matter for PaaS—only their presence is required for the build phase.- Local development: Update these values to point to your actual local services (e.g.,
REDIS_URL="redis://127.0.0.1:6379"). If you don't use a service locally, the placeholder values are fine.
Step 4: Register Your Pimcore Product
[LOCAL] Product registration is required for Pimcore Platform version 2025.1 or later.
Check your version:
grep '"pimcore/pimcore"' composer.json
If your version is 2025.1 or later, run the registration:
./vendor/bin/pimcore-paas-product-registration
This command generates the registration parameters. Follow the URL provided to complete the registration. You'll need:
PIMCORE_PRODUCT_KEYPIMCORE_INSTANCE_IDENTIFIERPIMCORE_ENCRYPTION_SECRET
Save these values—you'll need them for the PaaS Console configuration later.
Note: If you've already registered your product instance, you can skip this step.
Step 5: Install Pimcore Locally (Optional but Recommended)
[LOCAL] Install Pimcore locally to test your setup before deploying:
./vendor/bin/pimcore-install --install-profile='Pimcore\Paas\Install\PaasProfile'
The PaaS install profile will interactively prompt for database, OpenSearch, RabbitMQ, and other service connections. When prompted, choose an admin username and password. This process may take up to 20 minutes.
You can skip validation for services you don't run locally:
./vendor/bin/pimcore-install --install-profile='Pimcore\Paas\Install\PaasProfile' --skip-validation=gotenberg
Test the local installation at http://localhost/admin (configure your web server to point to the public/ directory).
Note: This step is optional but recommended to ensure your project is properly configured before deploying to PaaS. See the Configuration guide for more details on the PaaS install profile.
Step 6: Initialize Git Repository
[LOCAL] Initialize Git and prepare your repository:
git init
git add .
git commit -m "Initial Pimcore PaaS skeleton"
⚠️ CRITICAL: Rename your branch to main:
git branch -M main
Why? Pimcore PaaS requires
mainas the production branch. The-Mflag renames your current branch tomainregardless of its current name (e.g.,masteror any other default). If you skip this step, your deployment will fail.
Step 7: Configure PaaS Console Variables
[CONSOLE] Log in to the Pimcore PaaS Console and create a new project. Then navigate to Settings → Variables and create the following environment variables:
| Variable Name | Description | Value Example | Sensitive | Available at build time |
|---|---|---|---|---|
env:APP_ENV | Application environment | dev or prod | No | Yes (recommended) |
env:PIMCORE_TOKEN | Pimcore license token | <your-pimcore-license-token> | Yes ✓ | Yes (required) |
env:PIMCORE_REPO | Enterprise Composer repository name (path segment of https://repo.pimcore.com/<name>/) | <your-repo-name> | No | Yes (required) |
env:PIMCORE_ADMIN_USER | Admin username for first login | <your-admin-username> | Yes ✓ | No |
env:PIMCORE_ADMIN_PASSWORD | Admin password for first login | <your-secure-password> | Yes ✓ | No |
env:PIMCORE_PRODUCT_KEY | Product key from registration | <product-key-from-registration> | No | Yes (recommended) |
env:PIMCORE_INSTANCE_IDENTIFIER | Instance identifier from registration | <instance-identifier> | No | Yes (recommended) |
env:PIMCORE_ENCRYPTION_SECRET | Encryption secret from registration | <encryption-secret> | Yes ✓ | Yes (recommended) |
Note: Mark
PIMCORE_TOKEN,PIMCORE_ADMIN_USER,PIMCORE_ADMIN_PASSWORD, andPIMCORE_ENCRYPTION_SECRETas sensitive (check the "sensitive" checkbox). The license token is used as a Composer authentication credential, and the encryption secret is used as the Symfony app secret and for data encryption.Build-time visibility:
PIMCORE_TOKENandPIMCORE_REPOare consumed during the build phase by.platform-scripts/build/composer.sh(Composer authentication and enterprise repository registration). They must be marked as available during build. MarkingAPP_ENV,PIMCORE_ENCRYPTION_SECRET,PIMCORE_PRODUCT_KEY, andPIMCORE_INSTANCE_IDENTIFIERas available at build time as well is recommended:APP_ENVensures the build hook'sbin/console assets:installruns in the correct environment, and the others avoid container cache invalidation on the first runtime request. See the Environment Variables Reference for details.
Step 8: Connect to PaaS Remote
[LOCAL] Connect your local repository to the PaaS remote using the Pimcore CLI:
pimcore-cloud project:set-remote <project-id>
Replace <project-id> with your project ID from the PaaS Console (format: abcdefg123456).
⚠️ CRITICAL: Delete the generated .platform.app.yaml file:
# If .platform.app.yaml was already added to Git, use git rm:
git rm -f .platform.app.yaml
git commit -m "Remove unused .platform.app.yaml"
# Otherwise, simply delete it:
rm -f .platform.app.yaml
Why? The
project:set-remotecommand generates a.platform.app.yamlfile for legacy compatibility, but Pimcore PaaS uses.platform/applications.yamlinstead. If you leave the old file in place, it will cause configuration conflicts during deployment.
Step 9: Deploy to PaaS
[LOCAL] Push your code to deploy:
git push pimcore main
The deployment process will:
- Build your application
- Install dependencies
- Deploy services (MariaDB, Redis, OpenSearch, etc.)
- Run the PaaS install profile (
Pimcore\Paas\Install\PaasProfile) to set up the database schema and initial Pimcore configuration - Install enabled bundles
- Run database migrations
- Make your site available
This first deployment typically takes 10-15 minutes.
Step 10: Verify Your Deployment
[CONSOLE] Check the deployment status:
- Open your project in the PaaS Console
- Navigate to the Environments tab
- Wait for the
mainenvironment to show Active status - Click the generated URL to access your site
[LOCAL] You can also check deployment logs:
pimcore-cloud environment:logs
Log in to the admin panel at https://your-site-url/admin using the credentials you configured in Step 7.
Option B: Docker-Based Installation
Step 1: Create the Project
[LOCAL] Create a new Pimcore PaaS skeleton project using Docker:
docker run -u `id -u`:`id -g` --rm -v `pwd`:/var/www/html pimcore/pimcore:php8.4-latest composer create-project pimcore/paas-skeleton my-project
Note for Windows users: Replace
`id -u`:`id -g`with your user:group ID (e.g.,1000:1000).
Replace my-project with your desired project name.
Step 2: Configure Docker Compose
[LOCAL] Set the correct user permissions for Docker Compose:
# Linux:
sed -i "s|#user: '1000:1000'|user: '$(id -u):$(id -g)'|g" docker-compose.yaml
# macOS:
sed -i '' "s|#user: '1000:1000'|user: '$(id -u):$(id -g)'|g" docker-compose.yaml
Start the Docker services:
docker compose up -d
This starts MariaDB, Redis, and the PHP container needed for local development.
Step 3: Configure Composer Authentication
[LOCAL] Add your Pimcore license credentials inside the Docker container (replace YOUR_PIMCORE_TOKEN and YOUR_REPO_NAME with actual values):
docker compose exec php composer config --auth http-basic.repo.pimcore.com token YOUR_PIMCORE_TOKEN
docker compose exec php composer config repositories.pimcore_enterprise composer https://repo.pimcore.com/YOUR_REPO_NAME/
Now install the enterprise dependencies:
docker compose exec php composer install
Step 4: Configure Local Environment Variables
[LOCAL] The skeleton includes a .env file with service configuration variables that serve two purposes:
- For PaaS builds: Placeholder values allow Symfony to compile during build (when services aren't available yet)
- For local development: Real configuration pointing to your actual local services
You only need to add your PIMCORE_TOKEN:
# Edit .env and add your token (from your license certificate):
PIMCORE_TOKEN="<your-pimcore-license-token>"
The .env file already contains these service configuration variables:
| Variable | Default Value | Purpose |
|---|---|---|
GOTENBERG_BASE_URL | http://localhost:3000 | Gotenberg service URL (Docker Compose configures actual service) |
REDIS_URL | redis://redis:6379 | Redis connection URL (matches Docker Compose service name) |
REDIS_SESSIONS_URL | redis://redis:6379 | Redis sessions connection URL (matches Docker Compose service name) |
How .env works with Docker:
- PaaS deployment: At runtime,
config/pimcore/startup.phpautomatically overwrites these with real service credentials fromPLATFORM_RELATIONSHIPS. The actual values don't matter for PaaS—only their presence is required for the build phase.- Local Docker development: Your
docker-compose.yamlconfigures actual services (MariaDB, Redis, Gotenberg, etc.) with matching hostnames. The default values work out-of-the-box with the provided Docker setup.
Step 5: Register Your Pimcore Product
[LOCAL] Product registration is required for Pimcore Platform version 2025.1 or later.
Check your version:
docker compose exec php grep '"pimcore/pimcore"' composer.json
If your version is 2025.1 or later, run the registration:
docker compose exec php ./vendor/bin/pimcore-paas-product-registration
Follow the URL provided to complete registration. Save these values for later:
PIMCORE_PRODUCT_KEYPIMCORE_INSTANCE_IDENTIFIERPIMCORE_ENCRYPTION_SECRET
Step 6: Install Pimcore Locally (Optional but Recommended)
[LOCAL] Install Pimcore inside the Docker container:
docker compose exec php ./vendor/bin/pimcore-install --install-profile='Pimcore\Paas\Install\PaasProfile'
The PaaS install profile will interactively prompt for database, OpenSearch, RabbitMQ, and other service connections. When prompted, choose an admin username and password. This may take up to 20 minutes.
Access your local installation at http://localhost/admin.
Note: See the Configuration guide for more details on the PaaS install profile.
Step 7: Initialize Git Repository
[LOCAL] Initialize Git (outside the container):
git init
git add .
git commit -m "Initial Pimcore PaaS skeleton"
⚠️ CRITICAL: Rename your branch to main:
git branch -M main
Why? Pimcore PaaS requires
mainas the production branch. The-Mflag renames your current branch tomainregardless of its current name (e.g.,masteror any other default). If you skip this step, your deployment will fail.
Step 8: Configure PaaS Console Variables
[CONSOLE] Log in to the Pimcore PaaS Console and create a new project. Then navigate to Settings → Variables and create the following environment variables:
| Variable Name | Description | Value Example | Sensitive | Available at build time |
|---|---|---|---|---|
env:APP_ENV | Application environment | dev or prod | No | Yes (recommended) |
env:PIMCORE_TOKEN | Pimcore license token | <your-pimcore-license-token> | Yes ✓ | Yes (required) |
env:PIMCORE_REPO | Enterprise Composer repository name (path segment of https://repo.pimcore.com/<name>/) | <your-repo-name> | No | Yes (required) |
env:PIMCORE_ADMIN_USER | Admin username | <your-admin-username> | Yes ✓ | No |
env:PIMCORE_ADMIN_PASSWORD | Admin password | <your-secure-password> | Yes ✓ | No |
env:PIMCORE_PRODUCT_KEY | Product key from Step 5 | <product-key-from-registration> | No | Yes (recommended) |
env:PIMCORE_INSTANCE_IDENTIFIER | Instance identifier from Step 5 | <instance-identifier> | No | Yes (recommended) |
env:PIMCORE_ENCRYPTION_SECRET | Encryption secret from Step 5 | <encryption-secret> | Yes ✓ | Yes (recommended) |
Note: Mark
PIMCORE_TOKEN,PIMCORE_ADMIN_USER,PIMCORE_ADMIN_PASSWORD, andPIMCORE_ENCRYPTION_SECRETas sensitive (check the "sensitive" checkbox). The encryption secret is used as the Symfony app secret and for data encryption.Build-time visibility:
PIMCORE_TOKENandPIMCORE_REPOare consumed during the build phase by.platform-scripts/build/composer.sh(Composer authentication and enterprise repository registration). They must be marked as available during build. MarkingAPP_ENV,PIMCORE_ENCRYPTION_SECRET,PIMCORE_PRODUCT_KEY, andPIMCORE_INSTANCE_IDENTIFIERas available at build time as well is recommended:APP_ENVensures the build hook'sbin/console assets:installruns in the correct environment, and the others avoid container cache invalidation on the first runtime request. See the Environment Variables Reference for details.
Step 9: Connect to PaaS Remote
[LOCAL] Connect your repository to PaaS (outside the container):
pimcore-cloud project:set-remote <project-id>
Replace <project-id> with your project ID from the PaaS Console.
⚠️ CRITICAL: Delete the generated .platform.app.yaml file:
# If .platform.app.yaml was already added to Git, use git rm:
git rm -f .platform.app.yaml
git commit -m "Remove unused .platform.app.yaml"
# Otherwise, simply delete it:
rm -f .platform.app.yaml
Why? The
project:set-remotecommand generates a.platform.app.yamlfile, but PaaS uses.platform/applications.yaml. The old file causes configuration conflicts.
Step 10: Deploy to PaaS
[LOCAL] Push your code to deploy:
git push pimcore main
The deployment process takes 10-15 minutes for the first deployment.
Step 11: Verify Your Deployment
[CONSOLE] Check deployment status:
- Open your project in the PaaS Console
- Navigate to Environments tab
- Wait for
mainenvironment to show Active - Click the URL to access your site
[LOCAL] Check deployment logs if needed:
pimcore-cloud environment:logs
Log in at https://your-site-url/admin with the credentials from Step 8.
Next Steps
Now that your Pimcore instance is running on PaaS:
- Environment Variables Reference - Learn about all available environment variables and how they work
- Configuration Guide - Customize your PaaS setup (RabbitMQ, OpenSearch, S3, etc.)
- Good to Know - Operational tips for running Pimcore on PaaS
- FAQ & Troubleshooting - Common issues and solutions
Common Issues
Deployment fails with "branch not found"
Make sure you renamed your branch to main (see Step 6 or 7). PaaS looks for the main branch by default.
Configuration conflicts during deployment
Check if .platform.app.yaml exists in your repository. If it does, delete it (see Step 8 or 9). PaaS uses .platform/applications.yaml instead.
Admin login doesn't work
Verify that you set PIMCORE_ADMIN_USER and PIMCORE_ADMIN_PASSWORD in the PaaS Console (Step 7 or 8). These variables are required for the initial admin user creation.
For more troubleshooting help, see the FAQ & Troubleshooting guide.