glpi Docker & Self-Hosted Deployment

GitHub

GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.

RAW Compose
1. Pull Image (DOCKERHUB) docker pull library/mariadb
2. Docker Run (1-Click Launch) docker run -d --name glpi -p 8080:8080 --restart always mariadb:11.8
3. Podman Run podman run -d --name glpi -p 8080:8080 --restart always mariadb:11.8
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://docker.io/library/mariadb:11.8
5. ORAS Pull (OCI Artifact) oras pull mariadb:11.8
6. Compose Deployment docker compose up -d
docker-compose.yaml
Download .yml
services:
  app:
    build:
      context: ".docker/app"
      args:
        PHP_VERSION: "8.4"
    restart: "unless-stopped"
    volumes:
      - ".:/var/www/glpi:rw"
      - "custom_php_ini:/usr/local/etc/php/custom_conf.d/:rw"
    ports:
      - "8080:80"
      - "8090:8090" # E2E test server
      - "9637:9637"
    depends_on:
      - db
    extra_hosts:
      - "host.docker.internal:host-gateway"

  db:
    image: "mariadb:11.8"
    restart: "unless-stopped"
    volumes:
      - "db:/var/lib/mysql"
      - ".docker/initdb.sql:/docker-entrypoint-initdb.d/initdb.sql"
    environment:
      MARIADB_ROOT_PASSWORD: "glpi"
      MARIADB_DATABASE: "glpi"
      MARIADB_USER: "glpi"
      MARIADB_PASSWORD: "glpi"
    expose:
      - "3306"

  mailpit:
    image: "axllent/mailpit"
    restart: "unless-stopped"
    expose:
      - "1025"
    ports:
      - "8025:8025"

  dbgate:
    image: "dbgate/dbgate:latest"
    restart: "unless-stopped"
    ports:
      - "9000:3000"
    environment:
      CONNECTIONS: "glpi"

      LABEL_glpi: "GLPI Mysql Server"
      SERVER_glpi: "db"
      USER_glpi: "glpi"
      PASSWORD_glpi: "glpi"
      PORT_glpi: 3306
      ENGINE_glpi: "mysql@dbgate-plugin-mysql"

  # OpenID OAuth server
  # Opt-in: `docker compose --profile keycloak up -d keycloak`.
  # Same host:9090 as in-container port so the OIDC issuer is identical whether
  # reached from the browser (needs `127.0.0.1 keycloak.glpi.local` in /etc/hosts) or from
  # the app container (compose DNS alias). See .docker/keycloak/README.md.
  keycloak:
    image: "quay.io/keycloak/keycloak:26.0"
    profiles: ["keycloak"]
    restart: "unless-stopped"
    command: ["start-dev", "--import-realm", "--http-port=9090"]
    environment:
      KC_BOOTSTRAP_ADMIN_USERNAME: "admin"
      KC_BOOTSTRAP_ADMIN_PASSWORD: "admin"
      KC_HOSTNAME: "http://keycloak.glpi.local:9090"
      KC_HTTP_ENABLED: "true"
      KC_HEALTH_ENABLED: "true"
    ports:
      - "9090:9090"
    # Network alias so the app container resolves the same hostname as the browser,
    # keeping the OIDC issuer identical on both sides.
    networks:
      default:
        aliases:
          - "keycloak.glpi.local"
    volumes:
      - "./.docker/keycloak/realm-glpi.json:/opt/keycloak/data/import/realm-glpi.json:ro"

  # To create a preconfigured LDAP object in GLPI, run `make console c='tools:generate_dev_ldap'`
  openldap:
    image: "osixia/openldap:latest"
    restart: "unless-stopped"
    environment:
      LDAP_ORGANISATION: "GLPI"
      LDAP_DOMAIN: "glpi.org"
      LDAP_ADMIN_USERNAME: "admin"
      LDAP_ADMIN_PASSWORD: "admin"
    command: "--copy-service"
    volumes:
      - "./tests/LDAP/ldif/10-users.ldif:/container/service/slapd/assets/config/bootstrap/ldif/50-bootstrap.ldif:rw"
      - "ldap_files:/var/lib/ldap:rw"
      - "ldap_config:/etc/ldap/slapd.d/:rw"

volumes:
  db:
  custom_php_ini:
  ldap_files:
  ldap_config: