container-superposition 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -15
- package/dist/scripts/init.js +1 -1534
- package/dist/scripts/init.js.map +1 -1
- package/dist/tool/cli/args.d.ts +20 -0
- package/dist/tool/cli/args.d.ts.map +1 -0
- package/dist/tool/cli/args.js +325 -0
- package/dist/tool/cli/args.js.map +1 -0
- package/dist/tool/cli/run.d.ts +2 -0
- package/dist/tool/cli/run.d.ts.map +1 -0
- package/dist/tool/cli/run.js +318 -0
- package/dist/tool/cli/run.js.map +1 -0
- package/dist/tool/commands/adopt.d.ts.map +1 -1
- package/dist/tool/commands/adopt.js +1 -27
- package/dist/tool/commands/adopt.js.map +1 -1
- package/dist/tool/commands/doctor.d.ts +3 -0
- package/dist/tool/commands/doctor.d.ts.map +1 -1
- package/dist/tool/commands/doctor.js +1068 -70
- package/dist/tool/commands/doctor.js.map +1 -1
- package/dist/tool/commands/explain.d.ts.map +1 -1
- package/dist/tool/commands/explain.js +18 -0
- package/dist/tool/commands/explain.js.map +1 -1
- package/dist/tool/commands/migrate.d.ts +7 -0
- package/dist/tool/commands/migrate.d.ts.map +1 -0
- package/dist/tool/commands/migrate.js +52 -0
- package/dist/tool/commands/migrate.js.map +1 -0
- package/dist/tool/questionnaire/answers.d.ts +16 -0
- package/dist/tool/questionnaire/answers.d.ts.map +1 -0
- package/dist/tool/questionnaire/answers.js +102 -0
- package/dist/tool/questionnaire/answers.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +3 -3
- package/dist/tool/questionnaire/composer.d.ts.map +1 -1
- package/dist/tool/questionnaire/composer.js +902 -37
- package/dist/tool/questionnaire/composer.js.map +1 -1
- package/dist/tool/questionnaire/presets.d.ts +60 -0
- package/dist/tool/questionnaire/presets.d.ts.map +1 -0
- package/dist/tool/questionnaire/presets.js +164 -0
- package/dist/tool/questionnaire/presets.js.map +1 -0
- package/dist/tool/questionnaire/questionnaire.d.ts +10 -0
- package/dist/tool/questionnaire/questionnaire.d.ts.map +1 -0
- package/dist/tool/questionnaire/questionnaire.js +580 -0
- package/dist/tool/questionnaire/questionnaire.js.map +1 -0
- package/dist/tool/schema/manifest-migrations.d.ts +5 -0
- package/dist/tool/schema/manifest-migrations.d.ts.map +1 -1
- package/dist/tool/schema/manifest-migrations.js +45 -0
- package/dist/tool/schema/manifest-migrations.js.map +1 -1
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
- package/dist/tool/schema/overlay-loader.js +25 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -1
- package/dist/tool/schema/project-config.d.ts +14 -2
- package/dist/tool/schema/project-config.d.ts.map +1 -1
- package/dist/tool/schema/project-config.js +277 -34
- package/dist/tool/schema/project-config.js.map +1 -1
- package/dist/tool/schema/target-rules.d.ts +78 -0
- package/dist/tool/schema/target-rules.d.ts.map +1 -0
- package/dist/tool/schema/target-rules.js +367 -0
- package/dist/tool/schema/target-rules.js.map +1 -0
- package/dist/tool/schema/types.d.ts +123 -12
- package/dist/tool/schema/types.d.ts.map +1 -1
- package/dist/tool/utils/merge.d.ts.map +1 -1
- package/dist/tool/utils/merge.js +9 -0
- package/dist/tool/utils/merge.js.map +1 -1
- package/dist/tool/utils/parameters.d.ts +76 -0
- package/dist/tool/utils/parameters.d.ts.map +1 -0
- package/dist/tool/utils/parameters.js +125 -0
- package/dist/tool/utils/parameters.js.map +1 -0
- package/dist/tool/utils/paths.d.ts +2 -0
- package/dist/tool/utils/paths.d.ts.map +1 -0
- package/dist/tool/utils/paths.js +31 -0
- package/dist/tool/utils/paths.js.map +1 -0
- package/docs/creating-overlays.md +151 -2
- package/docs/deployment-targets.md +88 -56
- package/docs/examples.md +20 -17
- package/docs/filesystem-contract.md +5 -0
- package/docs/minimal-and-editor.md +65 -5
- package/docs/overlay-imports.md +202 -101
- package/docs/overlays.md +162 -34
- package/docs/quick-reference.md +99 -0
- package/docs/specs/003-mkdocs2-overlay/spec.md +114 -0
- package/docs/specs/004-doctor-fix/spec.md +70 -0
- package/docs/specs/005-cuda-overlay/spec.md +101 -0
- package/docs/specs/006-rocm-overlay/spec.md +109 -0
- package/docs/specs/007-init-project-file/spec.md +66 -0
- package/docs/specs/007-target-aware-generation/spec.md +126 -0
- package/docs/specs/008-project-file-canonical/spec.md +83 -0
- package/docs/specs/009-project-env/spec.md +147 -0
- package/docs/specs/010-compose-env-materialization/spec.md +130 -0
- package/docs/specs/011-overlay-parameters/spec.md +235 -0
- package/overlays/.shared/README.md +105 -21
- package/overlays/.shared/compose/common-healthchecks.md +60 -0
- package/overlays/.shared/compose/nvidia-gpu-devcontainer.yml +22 -0
- package/overlays/.shared/vscode/recommended-extensions.json +15 -11
- package/overlays/alertmanager/setup.sh +4 -19
- package/overlays/alertmanager/verify.sh +8 -9
- package/overlays/all/README.md +43 -0
- package/overlays/all/devcontainer.patch.json +6 -0
- package/overlays/all/overlay.yml +14 -0
- package/overlays/amp/setup.sh +5 -0
- package/overlays/bun/setup.sh +10 -1
- package/overlays/bun/verify.sh +6 -1
- package/overlays/claude-code/setup.sh +5 -0
- package/overlays/cloudflared/setup.sh +9 -12
- package/overlays/codex/README.md +9 -6
- package/overlays/codex/devcontainer.patch.json +7 -1
- package/overlays/codex/setup.sh +5 -0
- package/overlays/codex/verify.sh +8 -0
- package/overlays/comfyui/.env.example +34 -0
- package/overlays/comfyui/README.md +342 -0
- package/overlays/comfyui/devcontainer.patch.json +15 -0
- package/overlays/comfyui/docker-compose.yml +39 -0
- package/overlays/comfyui/overlay.yml +20 -0
- package/overlays/comfyui/setup.sh +36 -0
- package/overlays/comfyui/verify.sh +103 -0
- package/overlays/commitlint/setup.sh +5 -0
- package/overlays/cuda/README.md +179 -0
- package/overlays/cuda/devcontainer.patch.json +7 -0
- package/overlays/cuda/overlay.yml +17 -0
- package/overlays/cuda/setup.sh +32 -0
- package/overlays/cuda/verify.sh +38 -0
- package/overlays/devcontainer-cli/README.md +50 -0
- package/overlays/devcontainer-cli/devcontainer.patch.json +13 -0
- package/overlays/devcontainer-cli/overlay.yml +16 -0
- package/overlays/devcontainer-cli/setup.sh +14 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/setup.sh +7 -6
- package/overlays/dotnet/setup.sh +14 -7
- package/overlays/duckdb/devcontainer.patch.json +1 -2
- package/overlays/gcloud/devcontainer.patch.json +0 -6
- package/overlays/gcloud/setup.sh +51 -0
- package/overlays/gemini-cli/setup.sh +5 -0
- package/overlays/git-helpers/devcontainer.patch.json +2 -1
- package/overlays/go/setup.sh +15 -14
- package/overlays/jaeger/overlay.yml +2 -0
- package/overlays/just/setup.sh +5 -17
- package/overlays/k3d/README.md +201 -0
- package/overlays/k3d/devcontainer.patch.json +9 -0
- package/overlays/k3d/overlay.yml +19 -0
- package/overlays/k3d/setup.sh +34 -0
- package/overlays/k3d/verify.sh +38 -0
- package/overlays/keycloak/docker-compose.yml +6 -4
- package/overlays/keycloak/verify.sh +4 -3
- package/overlays/kind/devcontainer.patch.json +1 -2
- package/overlays/kind/setup.sh +8 -17
- package/overlays/minio/setup.sh +10 -18
- package/overlays/mkdocs/overlay.yml +2 -1
- package/overlays/mkdocs2/README.md +135 -0
- package/overlays/mkdocs2/devcontainer.patch.json +19 -0
- package/overlays/mkdocs2/overlay.yml +17 -0
- package/overlays/mkdocs2/setup.sh +67 -0
- package/overlays/mkdocs2/verify.sh +35 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +7 -1
- package/overlays/modern-cli-tools/setup.sh +21 -71
- package/overlays/mongodb/devcontainer.patch.json +0 -6
- package/overlays/mongodb/setup.sh +59 -0
- package/overlays/mysql/verify.sh +4 -3
- package/overlays/nats/.env.example +1 -1
- package/overlays/nats/README.md +1 -1
- package/overlays/nats/docker-compose.yml +1 -1
- package/overlays/ngrok/setup.sh +9 -6
- package/overlays/nodejs/setup.sh +5 -0
- package/overlays/ollama/.env.example +14 -0
- package/overlays/ollama/README.md +325 -0
- package/overlays/ollama/devcontainer.patch.json +14 -0
- package/overlays/ollama/docker-compose.yml +24 -0
- package/overlays/ollama/overlay.yml +22 -0
- package/overlays/ollama/setup.sh +106 -0
- package/overlays/ollama/verify.sh +99 -0
- package/overlays/open-webui/.env.example +5 -0
- package/overlays/open-webui/README.md +162 -0
- package/overlays/open-webui/devcontainer.patch.json +14 -0
- package/overlays/open-webui/docker-compose.yml +23 -0
- package/overlays/open-webui/overlay.yml +38 -0
- package/overlays/openapi-tools/devcontainer.patch.json +1 -2
- package/overlays/openapi-tools/setup.sh +9 -8
- package/overlays/opencode/setup.sh +5 -0
- package/overlays/otel-collector/overlay.yml +2 -0
- package/overlays/otel-collector/setup.sh +3 -16
- package/overlays/otel-demo-nodejs/verify.sh +8 -9
- package/overlays/otel-demo-python/verify.sh +16 -10
- package/overlays/pandoc/README.md +22 -15
- package/overlays/pandoc/devcontainer.patch.json +6 -2
- package/overlays/pandoc/setup.sh +217 -18
- package/overlays/pandoc/verify.sh +16 -4
- package/overlays/pgvector/.env.example +6 -0
- package/overlays/pgvector/README.md +215 -0
- package/overlays/pgvector/devcontainer.patch.json +23 -0
- package/overlays/pgvector/docker-compose.yml +32 -0
- package/overlays/pgvector/overlay.yml +44 -0
- package/overlays/playwright/devcontainer.patch.json +3 -1
- package/overlays/playwright/setup.sh +37 -0
- package/overlays/postgres/.env.example +5 -5
- package/overlays/postgres/devcontainer.patch.json +4 -4
- package/overlays/postgres/docker-compose.yml +15 -5
- package/overlays/postgres/overlay.yml +19 -1
- package/overlays/powershell/setup.sh +49 -13
- package/overlays/pre-commit/setup.sh +12 -3
- package/overlays/prometheus/overlay.yml +2 -0
- package/overlays/promtail/verify.sh +16 -10
- package/overlays/pulumi/devcontainer.patch.json +1 -1
- package/overlays/python/setup.sh +28 -9
- package/overlays/python/verify.sh +4 -2
- package/overlays/qdrant/.env.example +4 -0
- package/overlays/qdrant/README.md +216 -0
- package/overlays/qdrant/devcontainer.patch.json +20 -0
- package/overlays/qdrant/docker-compose.yml +25 -0
- package/overlays/qdrant/overlay.yml +40 -0
- package/overlays/redpanda/docker-compose.yml +3 -5
- package/overlays/rocm/README.md +227 -0
- package/overlays/rocm/devcontainer.patch.json +4 -0
- package/overlays/rocm/overlay.yml +17 -0
- package/overlays/rocm/setup.sh +45 -0
- package/overlays/rocm/verify.sh +47 -0
- package/overlays/rust/setup.sh +11 -18
- package/overlays/skaffold/README.md +256 -0
- package/overlays/skaffold/devcontainer.patch.json +9 -0
- package/overlays/skaffold/overlay.yml +20 -0
- package/overlays/skaffold/setup.sh +33 -0
- package/overlays/skaffold/verify.sh +24 -0
- package/overlays/spec-kit/setup.sh +7 -3
- package/overlays/sqlite/setup.sh +14 -14
- package/overlays/sqlserver/docker-compose.yml +3 -3
- package/overlays/sqlserver/verify.sh +22 -5
- package/overlays/tempo/verify.sh +16 -10
- package/overlays/tilt/devcontainer.patch.json +1 -2
- package/overlays/tilt/setup.sh +14 -4
- package/overlays/windsurf-cli/setup.sh +27 -4
- package/overlays/windsurf-cli/verify.sh +13 -3
- package/package.json +4 -2
- package/templates/scripts/setup-utils.sh +228 -0
- package/tool/schema/config.schema.json +141 -9
- package/tool/schema/overlay-manifest.schema.json +38 -0
- package/overlays/.shared/compose/common-healthchecks.yml +0 -38
- /package/overlays/otel-demo-nodejs/{Dockerfile-otel-demo-nodejs → Dockerfile} +0 -0
- /package/overlays/otel-demo-nodejs/{package-otel-demo-nodejs.json → package.json} +0 -0
- /package/overlays/otel-demo-nodejs/{server-otel-demo-nodejs.js → server.js} +0 -0
- /package/overlays/otel-demo-nodejs/{tracing-otel-demo-nodejs.js → tracing.js} +0 -0
- /package/overlays/otel-demo-python/{Dockerfile-otel-demo-python → Dockerfile} +0 -0
- /package/overlays/otel-demo-python/{app-otel-demo-python.py → app.py} +0 -0
- /package/overlays/otel-demo-python/{requirements-otel-demo-python.txt → requirements.txt} +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Open WebUI Overlay
|
|
2
|
+
|
|
3
|
+
Adds [Open WebUI](https://github.com/open-webui/open-webui) as a Docker Compose service, providing a polished browser-based chat interface for Ollama and other OpenAI-compatible LLM backends.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Browser-based chat UI** — Full-featured conversational interface for local LLMs at `http://localhost:3000`
|
|
8
|
+
- **Ollama integration** — Pre-configured to connect to the `ollama` sidecar when the `ollama` overlay is also selected
|
|
9
|
+
- **Multi-model support** — Switch between different Ollama models from the UI without CLI commands
|
|
10
|
+
- **Conversation history** — Persists chat history in a named Docker volume across container rebuilds
|
|
11
|
+
- **OpenAI-compatible** — Works with any backend that speaks the OpenAI Chat Completions API
|
|
12
|
+
- **Port 3000** — Web interface auto-forwarded and opened in the browser
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
Open WebUI runs as a Docker Compose service (`open-webui`) alongside your devcontainer. It connects to the Ollama service (or any OpenAI-compatible API) using the `OLLAMA_BASE_URL` environment variable.
|
|
17
|
+
|
|
18
|
+
**Service configuration:**
|
|
19
|
+
|
|
20
|
+
- Image: `ghcr.io/open-webui/open-webui:main`
|
|
21
|
+
- Network: `devnet` (shared with devcontainer and ollama)
|
|
22
|
+
- Port: `3000` on the host, mapped to `8080` inside the container
|
|
23
|
+
- Volume: `open-webui-data` for persistent chat history and settings
|
|
24
|
+
|
|
25
|
+
When used together with the `ollama` overlay, the stack looks like:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
devcontainer ─── open-webui (port 3000) ─┐
|
|
29
|
+
├── devnet
|
|
30
|
+
ollama (port 11434) ─────┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Open WebUI reads `OLLAMA_BASE_URL` to find the Ollama API. When the `ollama` overlay is selected, this is pre-set to `http://ollama:11434`.
|
|
34
|
+
|
|
35
|
+
## Common Commands
|
|
36
|
+
|
|
37
|
+
### Web Interface
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Open the web UI (auto-forwarded to localhost:3000)
|
|
41
|
+
# Navigate to http://localhost:3000 in your browser
|
|
42
|
+
|
|
43
|
+
# Check service status
|
|
44
|
+
docker compose ps open-webui
|
|
45
|
+
|
|
46
|
+
# View logs
|
|
47
|
+
docker compose logs open-webui
|
|
48
|
+
docker compose logs -f open-webui
|
|
49
|
+
|
|
50
|
+
# Restart the service
|
|
51
|
+
docker compose restart open-webui
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Using with Ollama
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Pull a model with the Ollama CLI (still available in devcontainer)
|
|
58
|
+
ollama pull llama3.2
|
|
59
|
+
|
|
60
|
+
# The model will automatically appear in the Open WebUI model picker
|
|
61
|
+
# Visit http://localhost:3000 and start chatting
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### REST API
|
|
65
|
+
|
|
66
|
+
Open WebUI exposes an OpenAI-compatible REST API at `http://localhost:3000/api`:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# List available models via Open WebUI API
|
|
70
|
+
curl http://localhost:3000/api/models
|
|
71
|
+
|
|
72
|
+
# Chat completion via OpenAI-compatible endpoint
|
|
73
|
+
curl http://localhost:3000/api/chat/completions \
|
|
74
|
+
-H "Content-Type: application/json" \
|
|
75
|
+
-d '{
|
|
76
|
+
"model": "llama3.2",
|
|
77
|
+
"messages": [{"role": "user", "content": "Hello!"}]
|
|
78
|
+
}'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Configuration
|
|
82
|
+
|
|
83
|
+
### Environment Variables
|
|
84
|
+
|
|
85
|
+
Copy `.devcontainer/.env.example` to `.devcontainer/.env` and customize:
|
|
86
|
+
|
|
87
|
+
| Variable | Default | Description |
|
|
88
|
+
| -------------------- | --------------------- | ------------------------------------------------ |
|
|
89
|
+
| `OPEN_WEBUI_VERSION` | `main` | Open WebUI Docker image tag |
|
|
90
|
+
| `OPEN_WEBUI_PORT` | `3000` | Host port for the web interface |
|
|
91
|
+
| `OLLAMA_BASE_URL` | `http://ollama:11434` | Base URL of the Ollama API |
|
|
92
|
+
| `WEBUI_SECRET_KEY` | `supersecret` | Secret key for session signing (change for prod) |
|
|
93
|
+
|
|
94
|
+
### Connecting to a Different LLM Backend
|
|
95
|
+
|
|
96
|
+
If you are not using the `ollama` overlay but have another OpenAI-compatible API available, set `OLLAMA_BASE_URL` in `.devcontainer/.env`:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Point at a remote OpenAI-compatible server
|
|
100
|
+
OLLAMA_BASE_URL=http://my-llm-server:8000
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Use Cases
|
|
104
|
+
|
|
105
|
+
- **Local AI chat** — Interact with local models via a polished UI instead of the CLI
|
|
106
|
+
- **Model comparison** — Switch between models mid-conversation to compare quality
|
|
107
|
+
- **Prompt engineering** — Iterate on system prompts and parameters interactively
|
|
108
|
+
- **Offline AI workflows** — Full AI chat capability without internet access or API costs
|
|
109
|
+
- **Team demos** — Share the forwarded port URL with teammates for collaborative testing
|
|
110
|
+
|
|
111
|
+
**Integrates well with:**
|
|
112
|
+
|
|
113
|
+
- `ollama` — Provides the LLM backend; Open WebUI connects automatically
|
|
114
|
+
- `cuda` — GPU acceleration for faster Ollama inference
|
|
115
|
+
- `python` — Build integrations using the Open WebUI REST API
|
|
116
|
+
|
|
117
|
+
## Troubleshooting
|
|
118
|
+
|
|
119
|
+
### UI Not Loading
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Check the service is running
|
|
123
|
+
docker compose ps open-webui
|
|
124
|
+
|
|
125
|
+
# View startup logs
|
|
126
|
+
docker compose logs open-webui
|
|
127
|
+
|
|
128
|
+
# Restart the service
|
|
129
|
+
docker compose restart open-webui
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### No Models Available
|
|
133
|
+
|
|
134
|
+
If the model picker in Open WebUI shows no models:
|
|
135
|
+
|
|
136
|
+
1. Ensure the `ollama` overlay is selected and the Ollama service is running
|
|
137
|
+
2. Pull a model with `ollama pull llama3.2` from the devcontainer terminal
|
|
138
|
+
3. Refresh the Open WebUI page
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Verify Ollama is reachable from within the Open WebUI container
|
|
142
|
+
docker compose exec open-webui curl -sf http://ollama:11434/api/tags
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Port Conflict on 3000
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# .devcontainer/.env
|
|
149
|
+
OPEN_WEBUI_PORT=3001
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## References
|
|
153
|
+
|
|
154
|
+
- [Open WebUI GitHub](https://github.com/open-webui/open-webui)
|
|
155
|
+
- [Open WebUI Documentation](https://docs.openwebui.com)
|
|
156
|
+
- [Open WebUI Docker Hub](https://ghcr.io/open-webui/open-webui)
|
|
157
|
+
|
|
158
|
+
**Related Overlays:**
|
|
159
|
+
|
|
160
|
+
- [`ollama`](../ollama/README.md) — Local LLM inference server (recommended companion)
|
|
161
|
+
- [`cuda`](../cuda/README.md) — NVIDIA GPU acceleration for faster inference
|
|
162
|
+
- [`python`](../python/README.md) — Python SDK for building integrations
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"runServices": ["open-webui"],
|
|
4
|
+
"forwardPorts": [3000],
|
|
5
|
+
"portsAttributes": {
|
|
6
|
+
"3000": {
|
|
7
|
+
"label": "Open WebUI",
|
|
8
|
+
"onAutoForward": "openBrowser"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"containerEnv": {
|
|
12
|
+
"OPEN_WEBUI_PORT": "3000"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
open-webui:
|
|
5
|
+
image: ghcr.io/open-webui/open-webui:${OPEN_WEBUI_VERSION:-{{cs.OPEN_WEBUI_VERSION}}}
|
|
6
|
+
restart: unless-stopped
|
|
7
|
+
volumes:
|
|
8
|
+
- open-webui-data:/app/backend/data
|
|
9
|
+
environment:
|
|
10
|
+
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-{{cs.OLLAMA_BASE_URL}}}
|
|
11
|
+
WEBUI_SECRET_KEY: ${WEBUI_SECRET_KEY:-{{cs.WEBUI_SECRET_KEY}}}
|
|
12
|
+
ports:
|
|
13
|
+
- '${OPEN_WEBUI_PORT:-{{cs.OPEN_WEBUI_PORT}}}:8080'
|
|
14
|
+
extra_hosts:
|
|
15
|
+
- host.docker.internal:host-gateway
|
|
16
|
+
networks:
|
|
17
|
+
- devnet
|
|
18
|
+
|
|
19
|
+
volumes:
|
|
20
|
+
open-webui-data:
|
|
21
|
+
|
|
22
|
+
networks:
|
|
23
|
+
devnet:
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: open-webui
|
|
2
|
+
name: Open WebUI
|
|
3
|
+
description: Browser-based chat UI for Ollama and OpenAI-compatible LLM backends
|
|
4
|
+
category: dev
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires: []
|
|
8
|
+
suggests:
|
|
9
|
+
- ollama
|
|
10
|
+
conflicts: []
|
|
11
|
+
tags:
|
|
12
|
+
- dev
|
|
13
|
+
- ai
|
|
14
|
+
- llm
|
|
15
|
+
- ui
|
|
16
|
+
- chat
|
|
17
|
+
- openwebui
|
|
18
|
+
ports:
|
|
19
|
+
- port: 3000
|
|
20
|
+
service: open-webui
|
|
21
|
+
protocol: http
|
|
22
|
+
path: /
|
|
23
|
+
description: Open WebUI web interface
|
|
24
|
+
onAutoForward: openBrowser
|
|
25
|
+
parameters:
|
|
26
|
+
OPEN_WEBUI_VERSION:
|
|
27
|
+
description: Open WebUI Docker image tag
|
|
28
|
+
default: main
|
|
29
|
+
OPEN_WEBUI_PORT:
|
|
30
|
+
description: Host port mapped to the Open WebUI web interface (8080 inside container)
|
|
31
|
+
default: '3000'
|
|
32
|
+
OLLAMA_BASE_URL:
|
|
33
|
+
description: Base URL of the Ollama API (leave default when using the ollama overlay)
|
|
34
|
+
default: 'http://ollama:11434'
|
|
35
|
+
WEBUI_SECRET_KEY:
|
|
36
|
+
description: Secret key for Open WebUI session signing (change for any shared environment)
|
|
37
|
+
default: change-me-please
|
|
38
|
+
sensitive: true
|
|
@@ -3,19 +3,20 @@
|
|
|
3
3
|
|
|
4
4
|
set -e
|
|
5
5
|
|
|
6
|
+
# Source shared setup utilities (provides load_nvm)
|
|
7
|
+
# shellcheck source=setup-utils.sh
|
|
8
|
+
source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
|
|
9
|
+
load_nvm
|
|
10
|
+
|
|
6
11
|
echo "🔧 Setting up OpenAPI Tools..."
|
|
7
12
|
|
|
8
13
|
# Install OpenAPI tools globally via npm
|
|
9
14
|
echo "📦 Installing OpenAPI tools..."
|
|
10
15
|
|
|
11
|
-
#
|
|
12
|
-
npm install -g @apidevtools/swagger-cli
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
npm install -g @stoplight/spectral-cli || echo "⚠️ spectral already installed or failed"
|
|
16
|
-
|
|
17
|
-
# Install redocly CLI (documentation and bundling)
|
|
18
|
-
npm install -g @redocly/cli || echo "⚠️ redocly already installed or failed"
|
|
16
|
+
# Wrap each install in run_spinner to suppress noisy deprecation warnings
|
|
17
|
+
run_spinner "swagger-cli" npm install -g @apidevtools/swagger-cli
|
|
18
|
+
run_spinner "spectral" npm install -g @stoplight/spectral-cli
|
|
19
|
+
run_spinner "redocly" npm install -g @redocly/cli
|
|
19
20
|
|
|
20
21
|
# Verify installations
|
|
21
22
|
echo ""
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
set -e
|
|
5
5
|
|
|
6
|
+
# Source shared setup utilities (provides load_nvm)
|
|
7
|
+
# shellcheck source=setup-utils.sh
|
|
8
|
+
source "$(dirname "${BASH_SOURCE[0]}")/setup-utils.sh"
|
|
9
|
+
load_nvm
|
|
10
|
+
|
|
6
11
|
echo "📦 Installing opencode AI coding agent..."
|
|
7
12
|
|
|
8
13
|
# Install opencode-ai globally
|
|
@@ -5,23 +5,10 @@ set -e
|
|
|
5
5
|
|
|
6
6
|
echo "🔧 Configuring OpenTelemetry Collector trace backend..."
|
|
7
7
|
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if [ ! -d "$WORKSPACE_ROOT/.devcontainer" ]; then
|
|
12
|
-
if [ -d "/workspaces" ]; then
|
|
13
|
-
FIRST_WORKSPACE_DIR="$(find /workspaces -maxdepth 1 -mindepth 1 -type d 2>/dev/null | head -n 1)"
|
|
14
|
-
if [ -n "$FIRST_WORKSPACE_DIR" ] && [ -d "$FIRST_WORKSPACE_DIR/.devcontainer" ]; then
|
|
15
|
-
WORKSPACE_ROOT="$FIRST_WORKSPACE_DIR"
|
|
16
|
-
fi
|
|
17
|
-
fi
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
if [ ! -d "$WORKSPACE_ROOT/.devcontainer" ] && [ -d "/workspace/.devcontainer" ]; then
|
|
21
|
-
WORKSPACE_ROOT="/workspace"
|
|
22
|
-
fi
|
|
8
|
+
# Resolve the .devcontainer directory relative to this script.
|
|
9
|
+
DEVCONTAINER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && cd .. && pwd)"
|
|
23
10
|
|
|
24
|
-
OTEL_CONFIG="$
|
|
11
|
+
OTEL_CONFIG="$DEVCONTAINER_DIR/otel-collector-config-otel-collector.yaml"
|
|
25
12
|
|
|
26
13
|
if [ ! -f "$OTEL_CONFIG" ]; then
|
|
27
14
|
echo "⚠️ OTel Collector config not found"
|
|
@@ -6,19 +6,18 @@ echo "🔍 Verifying OTel Demo (Node.js) installation..."
|
|
|
6
6
|
# Track overall success
|
|
7
7
|
ALL_CHECKS_PASSED=true
|
|
8
8
|
|
|
9
|
-
# Check if
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
# Check if HTTP health endpoint is accessible (primary health signal).
|
|
10
|
+
# docker ps is informational only — not reliably accessible in all devcontainers.
|
|
11
|
+
if curl -s -o /dev/null -w "%{http_code}" http://otel-demo-nodejs:8080/health 2>/dev/null | grep -q "200"; then
|
|
12
|
+
echo "✓ Demo app HTTP endpoint is accessible"
|
|
12
13
|
else
|
|
13
|
-
echo "✗
|
|
14
|
+
echo "✗ Demo app HTTP endpoint not responding (http://otel-demo-nodejs:8080/health)"
|
|
14
15
|
ALL_CHECKS_PASSED=false
|
|
15
16
|
fi
|
|
16
17
|
|
|
17
|
-
#
|
|
18
|
-
if
|
|
19
|
-
echo "✓ Demo
|
|
20
|
-
else
|
|
21
|
-
echo "⚠️ Demo app HTTP endpoint not responding yet (may still be starting)"
|
|
18
|
+
# Informational: check via docker ps if available.
|
|
19
|
+
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q otel-demo-nodejs; then
|
|
20
|
+
echo "✓ OTel Demo (Node.js) container visible in docker ps"
|
|
22
21
|
fi
|
|
23
22
|
|
|
24
23
|
# Final result
|
|
@@ -6,19 +6,25 @@ echo "🔍 Verifying OTel Demo (Python) installation..."
|
|
|
6
6
|
# Track overall success
|
|
7
7
|
ALL_CHECKS_PASSED=true
|
|
8
8
|
|
|
9
|
-
#
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
# Wait for demo app HTTP health endpoint (primary health signal).
|
|
10
|
+
# docker ps is informational only — not reliably accessible in all devcontainers.
|
|
11
|
+
APP_READY=false
|
|
12
|
+
for i in {1..40}; do
|
|
13
|
+
if curl -s -o /dev/null -w "%{http_code}" http://otel-demo-python:8081/health 2>/dev/null | grep -q "200"; then
|
|
14
|
+
echo "✓ Demo app HTTP endpoint is accessible"
|
|
15
|
+
APP_READY=true
|
|
16
|
+
break
|
|
17
|
+
fi
|
|
18
|
+
sleep 3
|
|
19
|
+
done
|
|
20
|
+
if [ "$APP_READY" = false ]; then
|
|
21
|
+
echo "✗ Demo app HTTP endpoint not responding after 120 s (http://otel-demo-python:8081/health)"
|
|
14
22
|
ALL_CHECKS_PASSED=false
|
|
15
23
|
fi
|
|
16
24
|
|
|
17
|
-
#
|
|
18
|
-
if
|
|
19
|
-
echo "✓ Demo
|
|
20
|
-
else
|
|
21
|
-
echo "⚠️ Demo app HTTP endpoint not responding yet (may still be starting)"
|
|
25
|
+
# Informational: check via docker ps if available.
|
|
26
|
+
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q otel-demo-python; then
|
|
27
|
+
echo "✓ OTel Demo (Python) container visible in docker ps"
|
|
22
28
|
fi
|
|
23
29
|
|
|
24
30
|
# Final result
|
|
@@ -6,9 +6,10 @@ Adds a complete Markdown → PDF pipeline to your devcontainer, powered by Pando
|
|
|
6
6
|
|
|
7
7
|
- **Pandoc 3.x** — Latest release binary from GitHub (not the outdated apt version)
|
|
8
8
|
- **TeX Live / XeLaTeX** — Full Unicode-capable PDF engine (`texlive-xetex`, `texlive-fonts-extra`, `texlive-latex-extra`)
|
|
9
|
-
- **Quality fonts** — Carlito (body), JetBrains Mono (code), Noto Sans Symbols 2 (Unicode fallback) via system packages
|
|
9
|
+
- **Quality fonts** — Carlito (body), JetBrains Mono (code), Noto Sans Symbols 2 (Unicode fallback), and Noto Color Emoji via system packages
|
|
10
10
|
- Uses the `cross-distro-packages` feature with fallback package names for Carlito (`fonts-carlito|fonts-crosextra-carlito`)
|
|
11
11
|
- **`diagram.lua`** — Lua filter from [pandoc-ext/diagram](https://github.com/pandoc-ext/diagram) for rendering code-block diagrams
|
|
12
|
+
- **`emoji-fallback.lua`** — Built-in Lua filter that rewrites unsupported emoji and flag glyphs to plain-text placeholders for reliable XeLaTeX PDF builds
|
|
12
13
|
- **Mermaid CLI (`mmdc`)** — Installed when the `nodejs` overlay is present; skipped gracefully otherwise
|
|
13
14
|
- **`~/.pandoc/pandoc.yaml`** — Ready-to-use defaults file (XeLaTeX engine, font settings, table tweaks)
|
|
14
15
|
- **VS Code Extensions:** Markdown All in One (`yzhang.markdown-all-in-one`), markdownlint (`DavidAnson.vscode-markdownlint`)
|
|
@@ -30,13 +31,17 @@ Markdown
|
|
|
30
31
|
|
|
31
32
|
Font discovery is updated with `fc-cache -fv` after installation so XeLaTeX can locate the apt-installed fonts.
|
|
32
33
|
|
|
34
|
+
The generated defaults also enable an emoji fallback filter for LaTeX output. The overlay now installs Noto Color Emoji as well, which may improve glyph coverage in some contexts, but the fallback filter remains enabled because XeLaTeX still is not reliable for full emoji and flag rendering. The filter converts unsupported glyphs such as `🇵🇹` to `[PT]` and generic emoji such as `😀` to `[emoji]` before XeLaTeX runs, preventing the `Unicode character ... not set up for use with LaTeX` failure.
|
|
35
|
+
|
|
36
|
+
The setup script also installs a `/usr/local/bin/pandoc` wrapper that automatically applies `~/.pandoc/pandoc.yaml` unless you explicitly pass `-d` or `--defaults`. That makes plain commands like `pandoc doc.md -o doc.pdf` use the overlay defaults.
|
|
37
|
+
|
|
33
38
|
## Common Commands
|
|
34
39
|
|
|
35
40
|
### Basic PDF export
|
|
36
41
|
|
|
37
42
|
```bash
|
|
38
|
-
#
|
|
39
|
-
pandoc
|
|
43
|
+
# Uses the installed wrapper, which applies ~/.pandoc/pandoc.yaml automatically
|
|
44
|
+
pandoc document.md -o document.pdf
|
|
40
45
|
|
|
41
46
|
# Override the output font on the fly
|
|
42
47
|
pandoc -d ~/.pandoc/pandoc.yaml -V mainfont="DejaVu Serif" document.md -o document.pdf
|
|
@@ -45,8 +50,7 @@ pandoc -d ~/.pandoc/pandoc.yaml -V mainfont="DejaVu Serif" document.md -o docume
|
|
|
45
50
|
### PDF with Mermaid diagrams (requires nodejs overlay)
|
|
46
51
|
|
|
47
52
|
```bash
|
|
48
|
-
pandoc -
|
|
49
|
-
--lua-filter ~/.pandoc/filters/diagram.lua \
|
|
53
|
+
pandoc --lua-filter ~/.pandoc/filters/diagram.lua \
|
|
50
54
|
document.md -o document.pdf
|
|
51
55
|
```
|
|
52
56
|
|
|
@@ -95,6 +99,8 @@ The setup script writes a defaults file with proven settings:
|
|
|
95
99
|
|
|
96
100
|
```yaml
|
|
97
101
|
pdf-engine: xelatex
|
|
102
|
+
filters:
|
|
103
|
+
- /home/your-user/.pandoc/filters/emoji-fallback.lua
|
|
98
104
|
|
|
99
105
|
variables:
|
|
100
106
|
mainfont: 'Carlito'
|
|
@@ -129,8 +135,9 @@ variables:
|
|
|
129
135
|
toc: true
|
|
130
136
|
toc-depth: 3
|
|
131
137
|
number-sections: true
|
|
132
|
-
|
|
133
|
-
-
|
|
138
|
+
filters:
|
|
139
|
+
- /home/your-user/.pandoc/filters/emoji-fallback.lua
|
|
140
|
+
- /home/your-user/.pandoc/filters/diagram.lua
|
|
134
141
|
```
|
|
135
142
|
|
|
136
143
|
Then build with:
|
|
@@ -154,21 +161,21 @@ number-sections: true
|
|
|
154
161
|
Uncomment in `~/.pandoc/pandoc.yaml`:
|
|
155
162
|
|
|
156
163
|
```yaml
|
|
157
|
-
|
|
158
|
-
-
|
|
164
|
+
filters:
|
|
165
|
+
- /home/your-user/.pandoc/filters/emoji-fallback.lua
|
|
166
|
+
- /home/your-user/.pandoc/filters/diagram.lua
|
|
159
167
|
```
|
|
160
168
|
|
|
161
169
|
## Unicode and Emoji
|
|
162
170
|
|
|
163
|
-
XeLaTeX handles Unicode well with the Noto
|
|
171
|
+
XeLaTeX handles normal Unicode text well with the bundled fonts. The overlay now also installs Noto Color Emoji, which can help with emoji coverage, but the failure mode in PDF builds is still usually emoji or regional-indicator flags, for example `🇵🇹`, which XeLaTeX may reject before font fallback can help.
|
|
164
172
|
|
|
165
|
-
|
|
173
|
+
The overlay now enables `~/.pandoc/filters/emoji-fallback.lua` by default for LaTeX output. It keeps normal Unicode text intact and rewrites unsupported emoji to plain-text placeholders:
|
|
166
174
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
```
|
|
175
|
+
- `🇵🇹 Porto` becomes `[PT] Porto`
|
|
176
|
+
- `😀` becomes `[emoji]`
|
|
170
177
|
|
|
171
|
-
|
|
178
|
+
If you want to experiment with more native emoji rendering, keep the installed emoji font and override the default Pandoc/LaTeX settings in a project-local `pandoc.yaml`, but the placeholder filter is still the reliable default for PDF generation.
|
|
172
179
|
|
|
173
180
|
## Use Cases
|
|
174
181
|
|
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
3
|
"features": {
|
|
4
4
|
"./features/cross-distro-packages": {
|
|
5
|
-
"apt": "texlive-xetex texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra texlive-lang-european fonts-carlito|fonts-crosextra-carlito fonts-noto fonts-noto-extra fonts-noto-mono fonts-jetbrains-mono fontconfig perl chromium",
|
|
6
|
-
"apk": "fontconfig perl chromium"
|
|
5
|
+
"apt": "texlive-xetex texlive-fonts-recommended texlive-fonts-extra texlive-latex-extra texlive-lang-european lmodern fonts-carlito|fonts-crosextra-carlito fonts-noto fonts-noto-extra fonts-noto-mono fonts-jetbrains-mono fonts-noto-color-emoji fontconfig librsvg2-bin perl chromium",
|
|
6
|
+
"apk": "fontconfig noto-fonts-emoji|noto-emoji perl chromium"
|
|
7
7
|
}
|
|
8
8
|
},
|
|
9
9
|
"customizations": {
|
|
10
10
|
"vscode": {
|
|
11
11
|
"extensions": ["yzhang.markdown-all-in-one", "DavidAnson.vscode-markdownlint"]
|
|
12
12
|
}
|
|
13
|
+
},
|
|
14
|
+
"remoteEnv": {
|
|
15
|
+
"PUPPETEER_EXECUTABLE_PATH": "/usr/local/bin/chromium-no-sandbox",
|
|
16
|
+
"PUPPETEER_SKIP_DOWNLOAD": "true"
|
|
13
17
|
}
|
|
14
18
|
}
|