Skip to content

Symfony Guide

Symfony Guide

Get Symfony running with PostgreSQL, Redis, and optimized caching.

Quick Start

1. Create docker-compose.yml

services:
  app:
    image: ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.3-bookworm
    ports:
      - "8000:80"
    volumes:
      - .:/var/www/html
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: symfony
      POSTGRES_USER: symfony
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres-data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

volumes:
  postgres-data:

2. Update .env

DATABASE_URL="postgresql://symfony:secret@postgres:5432/symfony?serverVersion=16"
REDIS_URL=redis://redis:6379

3. Start

docker compose up -d
docker compose exec app php bin/console doctrine:migrations:migrate

Visit http://localhost:8000


Configuration

Database (.env)

# PostgreSQL
DATABASE_URL="postgresql://symfony:secret@postgres:5432/symfony?serverVersion=16"

# Or MySQL
DATABASE_URL="mysql://symfony:secret@mysql:3306/symfony?serverVersion=8.0"

Cache & Session (config/packages/framework.yaml)

framework:
    cache:
        app: cache.adapter.redis
        default_redis_provider: '%env(REDIS_URL)%'
    session:
        handler_id: '%env(REDIS_URL)%'

See Environment Variables for all options.


Development Setup

Use dev image with Xdebug:

services:
  app:
    image: ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.3-bookworm-dev
    environment:
      - APP_ENV=dev
      - XDEBUG_MODE=debug,develop,coverage
      - XDEBUG_CONFIG=client_host=host.docker.internal

See Development Workflow for Xdebug setup.


Production Checklist

services:
  app:
    image: ghcr.io/cboxdk/php-baseimages/php-fpm-nginx:8.3-bookworm
    volumes:
      - .:/var/www/html:ro
      - ./var:/var/www/html/var
    environment:
      - APP_ENV=prod
    restart: unless-stopped
# Before deploy
APP_ENV=prod composer install --no-dev --optimize-autoloader
php bin/console cache:clear --env=prod
php bin/console cache:warmup --env=prod
php bin/console doctrine:migrations:migrate --no-interaction

See Production Deployment for full guide.


Common Mistakes

❌ Using localhost

# Wrong
DATABASE_URL="postgresql://symfony:secret@localhost:5432/symfony"

# Correct - use Docker service name
DATABASE_URL="postgresql://symfony:secret@postgres:5432/symfony"

❌ Missing var directory permissions

docker compose exec app chown -R www-data:www-data var

❌ APP_ENV not set

Always set APP_ENV=prod in production.


Verification

# Test database
docker compose exec app php bin/console doctrine:query:sql "SELECT 1"

# Test cache
docker compose exec app php bin/console cache:clear

# Run tests
docker compose exec app php bin/phpunit

Next Steps

Topic Guide
Development workflow Development Workflow
Production deploy Production Deployment
Add extensions Extending Images
All env vars Environment Variables