> ## Documentation Index
> Fetch the complete documentation index at: https://docs.speckle.systems/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These docs contain multiple Speckle product experiences. For Speckle 2026.9, prefer /next/ pages for the topics and changes they cover. The navigation label Current does not override this version-specific precedence.
> Coverage under /next/ is incremental. Use Current documentation for unchanged topics and when a /next/ page says coverage is unavailable or explicitly refers you to Current. Do not infer a feature was removed from a missing page.
> Read the page-specific documentation status, applicability, affected guidance and replacement links in agent-only content. Impacted, changed and superseded apply only to the stated scope; they do not mean the entire feature is deprecated. Historical connector guides apply only to the legacy connector described.
> Match guidance to the customer's deployment version, model data format and connector. Respect plan, permission and compatibility restrictions. If an unknown version or data format changes the answer, ask a focused clarification; do not infer deployment version from the date alone.

# Docker Compose Quickstart

> Run the public Speckle server with Docker Compose for development, evaluation, and testing.

<Warning>
  This Docker Compose path is for development, evaluation, and testing. Speckle does not recommend
  Docker Compose for production deployments. For a customer-operated production environment, use
  [Kubernetes](/developers/server/deployment/kubernetes-with-helm). Speckle Enterprise Server also
  requires Kubernetes.
</Warning>

## Prerequisites

* **Linux VM** with at least 4GB RAM
* **x86\_64** CPU architecture
* **Docker** and **Docker Compose** installed

## Quick Start

<Steps>
  <Step title="Create Directory">
    ```bash theme={null}
    mkdir /opt/speckle/
    cd /opt/speckle/
    ```
  </Step>

  <Step title="Create Object Storage Config">
    Speckle stores files and 3D data in S3-compatible object storage. This guide uses
    [Garage](https://garagehq.deuxfleurs.fr/), which needs a small config file. Create
    `garage.toml` next to the compose file:

    ```toml theme={null}
    metadata_dir = "/data/meta"
    data_dir = "/data/blocks"
    db_engine = "sqlite"
    replication_factor = 1

    rpc_bind_addr = "[::]:3901"
    rpc_public_addr = "127.0.0.1:3901"
    # replace with your own: `openssl rand -hex 32`
    rpc_secret = "5a3e2c6d8f0b1e4a7c9d2f5b8e1a4c7d0f3b6e9a2c5d8f1b4e7a0c3d6f9b2e5a"

    [s3_api]
    s3_region = "us-east-1"
    api_bind_addr = "[::]:9000"
    root_domain = ".s3.garage.localhost"
    ```
  </Step>

  <Step title="Create Docker Compose File">
    Create a file named `docker-compose.yml` with the following content:

    ```yaml theme={null}
    version: '2.3'
    name: 'speckle-server'

    services:
      postgres:
        image: 'postgres:18.3-alpine3.23'
        restart: always
        environment:
          POSTGRES_DB: speckle
          POSTGRES_USER: speckle
          POSTGRES_PASSWORD: speckle
        volumes:
          - ./postgres-data:/var/lib/postgresql/data/

      redis:
        image: 'valkey/valkey:8-alpine'
        restart: always
        volumes:
          - ./redis-data:/data

      garage:
        image: 'dxflrs/garage:v2.4.1'
        command: /garage server --single-node --default-access-key --default-bucket
        restart: always
        environment:
          GARAGE_DEFAULT_ACCESS_KEY: 'minioadmin'
          GARAGE_DEFAULT_SECRET_KEY: 'minioadminminioadmin'
          GARAGE_DEFAULT_BUCKET: 'speckle-server'
        ports:
          - '127.0.0.1:9000:9000'
        volumes:
          - ./garage.toml:/etc/garage.toml:ro
          - ./garage-data:/data

      speckle-ingress:
        image: speckle/speckle-docker-compose-ingress:latest
        restart: always
        ports:
          - '127.0.0.1:80:8080'

      speckle-frontend-2:
        image: speckle/speckle-frontend-2:latest
        restart: always
        environment:
          NUXT_PUBLIC_SERVER_NAME: 'local'
          NUXT_PUBLIC_API_ORIGIN: 'http://127.0.0.1'
          NUXT_PUBLIC_BACKEND_API_ORIGIN: 'http://speckle-server:3000'
          NUXT_PUBLIC_BASE_URL: 'http://127.0.0.1'
          NUXT_REDIS_URL: 'redis://redis'
          # Set to true if running it w/ SSL
          NUXT_PUBLIC_SSL_ENABLED: 'false'

      speckle-server:
        image: speckle/speckle-server:latest
        restart: always
        depends_on:
          - postgres
          - redis
          - garage
        environment:
          CANONICAL_URL: 'http://127.0.0.1'
          SESSION_SECRET: 'your-secret-key-here'
          STRATEGY_LOCAL: 'true'
          POSTGRES_URL: 'postgres'
          POSTGRES_USER: 'speckle'
          POSTGRES_PASSWORD: 'speckle'
          POSTGRES_DB: 'speckle'
          # File-import jobs are queued in this database; must match the ifc-import-service below
          FILEIMPORT_QUEUE_POSTGRES_URL: 'postgresql://speckle:speckle@postgres/speckle'
          # Required on public Speckle Server releases so IFC jobs are queued for ifc-import-service
          FF_NEXT_GEN_FILE_IMPORTER_ENABLED: 'true'
          REDIS_URL: 'redis://redis'
          S3_ENDPOINT: 'http://garage:9000'
          S3_PUBLIC_ENDPOINT: 'http://127.0.0.1:9000'
          S3_ACCESS_KEY: 'minioadmin'
          S3_SECRET_KEY: 'minioadminminioadmin'
          S3_BUCKET: 'speckle-server'
          FRONTEND_ORIGIN: 'http://127.0.0.1'
          EMAIL: 'true'
          EMAIL_HOST: 'your-email-host-domain-here'
          EMAIL_PORT: '587' # or another SMTP compatible port as defined by your transactional (SMTP relay) email provider
          EMAIL_USERNAME: 'your-email-service-username'
          EMAIL_PASSWORD: 'your-email-service-password'
          EMAIL_SECURE: 'false' # enable to require SSL (Note that TLS is often preferred; see EMAIL_REQUIRE_TLS)
          EMAIL_REQUIRE_TLS: 'true' # enable to require TLS. Disable if SSL is used instead.
          EMAIL_FROM: 'an-email-address-you-own-and-configured-with-your-transactional-email-provider@example.org'

      preview-service:
        image: speckle/speckle-preview-service:latest
        restart: always
        depends_on:
          - speckle-server
        environment:
          REDIS_URL: 'redis://redis'

      webhook-service:
        image: speckle/speckle-webhook-service:latest
        restart: always
        depends_on:
          - speckle-server
        environment:
          PG_CONNECTION_STRING: 'postgres://speckle:speckle@postgres/speckle'

      ifc-import-service:
        image: speckle/speckle-ifc-import-service:latest
        restart: always
        depends_on:
          - speckle-server
        environment:
          FILEIMPORT_QUEUE_POSTGRES_URL: 'postgresql://speckle:speckle@postgres/speckle'
    ```
  </Step>

  <Step title="Start the Server">
    ```bash theme={null}
    docker compose up -d
    ```
  </Step>
</Steps>

## Access Your Server

Once running, access your Speckle server at:

* **Frontend**: `http://your-server-ip`

## Next Steps

1. **Create your first user** by visiting the frontend URL
2. **Configure your server** - a full example is [part of the server repo](https://github.com/specklesystems/speckle-server/blob/main/docker-compose-speckle.yml)
3. **Use non-default credentials and secrets** before sharing the environment with other testers
4. **Review logs and resource use** while evaluating your expected workload

## Getting Help

* **Community Forum**: [speckle.community](https://speckle.community)
* **Professional Support**: [https://speckle.systems/pricing/](https://speckle.systems/pricing/)

<Note>
  Do not promote this Docker Compose environment into production. Use the [Kubernetes deployment
  guide](/developers/server/deployment/kubernetes-with-helm) to design a customer-operated
  production environment.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.