# Compose stacks for phy-srv-gpu01 Rendered by `ironicbadger.docker_compose_generator` (pinned to 2.0.1) into `{{ docker_compose_generator_output_path }}/compose.yaml` on the host. The fragments here are **Jinja2 templates**, not plain compose files — Ansible variables are substituted at render time. | Stack | Contains | | --- | --- | | `01-vllm` | vLLM, serves the chat model on port 8000 (OpenAI API) | | `02-embeddings` | second vLLM instance, embedding model on port 8001 | | `03-openwebui` | Open WebUI (port 80) + pgvector Postgres | | `99-network` | the shared `llmnet` bridge — must sort last | Ordering comes from the `NN-` prefix; `99-network` keeps `networks:` at the bottom of the generated file. The leading comment in `99-network/compose.yml` is load-bearing: the role indents only the first line of each fragment, and the comment absorbs that indentation so `networks:` stays top-level. ## Deploy ```sh just compose phy_srv_gpu01 # renders ~/docker/compose.yaml on the host ``` The role only **writes** the file. Bringing the stack up is deliberate: ```sh ssh sbxadmin@192.168.66.69 'cd ~/docker && docker compose up -d' ``` ## Before the first run - Secrets must exist in `group_vars/secrets.yml` (`just vault edit`): `vault_owui_secret_key`, `vault_owui_db_password`, `vault_ldap_bind_password` - LDAP parameters in `group_vars/phy_srv_gpu01.yml` need the real bind DN and base DN from the customer - `vllm_image` must point at a build that works on SM120 (Blackwell) — verify before deploying, the official image is not guaranteed to work