Refactor Docker setup to integrate Web UI and streamline configuration
Publish telemt-api gateway Docker image / test (push) Successful in 23s
Publish telemt-api gateway Docker image / build-and-push (push) Successful in 1m54s

- Updated Dockerfile to build and embed the SvelteKit Web UI directly into the gateway image, eliminating the need for a separate web service.
- Modified .dockerignore to exclude unnecessary directories related to the web service.
- Adjusted config.compose.yaml to remove CORS settings for the web service, as the UI now shares the same origin as the API.
- Enhanced README.md to reflect the new single-port architecture for accessing both the Web UI and API.
- Removed the standalone web Dockerfile and updated related documentation for local development and build processes.
This commit is contained in:
Denozordec
2026-03-30 10:42:28 +07:00
parent 6421a9b28d
commit d69849e5e2
15 changed files with 182 additions and 75 deletions
+3 -2
View File
@@ -1,2 +1,3 @@
# Базовый URL шлюза telemt-api (без завершающего слэша)
PUBLIC_TELEMT_GATEWAY_URL=http://127.0.0.1:8080
# Пусто = запросы к API на том же origin, что и панель (образ Docker со встроенным UI).
# Для dev (Vite :5173, шлюз :8080): http://127.0.0.1:8080
PUBLIC_TELEMT_GATEWAY_URL=
-16
View File
@@ -1,16 +0,0 @@
# Статическая сборка SvelteKit и раздача через serve
FROM node:22-alpine AS build
WORKDIR /app
ARG PUBLIC_TELEMT_GATEWAY_URL=http://127.0.0.1:8080
ENV PUBLIC_TELEMT_GATEWAY_URL=$PUBLIC_TELEMT_GATEWAY_URL
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:22-alpine
RUN npm install -g serve@14
WORKDIR /srv
COPY --from=build /app/build ./build
EXPOSE 4173
CMD ["serve", "-s", "build", "-l", "4173"]
+13 -21
View File
@@ -1,16 +1,17 @@
# Telemt Panel (Web UI)
SvelteKit + shadcn-svelte: обзор флота (`/api/agg/*`), пользователи и IP, панель по каждой ноде через прокси шлюза (`/api/{alias}/…`).
SvelteKit + shadcn-svelte. В **production** статика собирается и **встраивается в образ шлюза** ([Dockerfile](../Dockerfile) в корне репозитория): панель и API на **одном порту** (например `http://127.0.0.1:8080/` — UI, `/api/…` — шлюз).
## Переменные окружения
## Переменная `PUBLIC_TELEMT_GATEWAY_URL`
| Переменная | Описание |
| Значение | Когда |
| --- | --- |
| `PUBLIC_TELEMT_GATEWAY_URL` | Базовый URL шлюза **telemt-api** без завершающего `/` (например `http://127.0.0.1:8080`). Встраивается в клиент при сборке. |
| *(пусто)* | Тот же хост и порт, что у страницы (Docker-образ шлюза, `npm run build` в Dockerfile с `ENV PUBLIC_TELEMT_GATEWAY_URL=`) |
| `http://127.0.0.1:8080` | Локальная разработка: Vite на `:5173`, шлюз на `:8080` |
Скопируйте [.env.example](.env.example) в `.env` и при необходимости измените URL.
Скопируйте [.env.example](.env.example) в `.env` и при необходимости задайте URL.
## Разработка
## Разработка (Vite отдельно от Go)
```powershell
cd web
@@ -18,39 +19,30 @@ npm install
npm run dev
```
Откройте в браузере адрес Vite (по умолчанию `http://localhost:5173`). В конфиге шлюза укажите CORS, например:
Откройте `http://localhost:5173`. В конфиге шлюза включите [CORS](../docs/AGGREGATE.md) для этого origin:
```yaml
cors_allowed_origins:
- "http://localhost:5173"
```
## Сборка
## Сборка только фронта
```powershell
npm run build
npm run preview # проверка статики
```
## Типы из OpenAPI агрегатов
Артефакт — каталог `build/`, при сборке **Docker-образа шлюза** он копируется в `internal/webui/static/` и попадает в бинарник через `embed`.
После изменения [../docs/AGGREGATE_OPENAPI.yaml](../docs/AGGREGATE_OPENAPI.yaml):
## Типы из OpenAPI агрегатов
```powershell
npm run gen:api
```
## Docker
Сборка образа из каталога `web/`:
```powershell
docker build -t telemt-web:local --build-arg PUBLIC_TELEMT_GATEWAY_URL=http://127.0.0.1:8080 .
```
В [docker-compose.yml](../docker-compose.yml) сервис `web` отдаёт UI на порту **4173**. URL шлюза в образе задаётся **build-arg** (см. compose). Браузер на хосте обращается к шлюзу по `http://127.0.0.1:8080` — при другом адресе пересоберите образ с нужным `PUBLIC_TELEMT_GATEWAY_URL`.
Источник: [../docs/AGGREGATE_OPENAPI.yaml](../docs/AGGREGATE_OPENAPI.yaml).
## Ограничения
- Секреты upstream к Telemt задаются на шлюзе (`authorization_env`), не в браузере.
- Mutating CORS: шлюз должен разрешать `POST`, `PATCH`, `DELETE` в preflight (в текущей версии репозитория заголовок `Access-Control-Allow-Methods` это учитывает).
- Для мутаций из другого origin шлюз отдаёт нужные заголовки CORS (в т.ч. методы `POST`, `PATCH`, `DELETE`).