Docker-сервис, выбор основы и сравнение моделей, сборщик датасета
docker / build (push) Failing after 39s

- Docker: Dockerfile (CPU), compose с FlareSolverr, настройка через DUB_* переменные,
  токен доступа к /predict, tools/pack_models.py, workflow Gitea Actions, docs/docker.md
- Модель грузится офлайн (config.json рядом с весами); общий код вынесен в src/spans.py,
  сервису не нужны sklearn/matplotlib/pandas
- Обучение: профили tiny2/base/large/modern, запуски в models/runs, реестр и честное
  сравнение на одной тестовой выборке (src/runs.py), пункт меню «Модели»
- Датасет: язык и аудио-параметры дорожек, 18+ по строкам «Аудио», ручные метки по ссылкам,
  переиндексация сохранённого HTML, параллельная сборка, сбалансированная выборка
- Тексты страниц (data/pages) больше не хранятся в git

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
DenozordecandClaude Sonnet 5.5 committed 2026-10-28 17:19:10 +07:00
1 parent d155b8584b
commit efc9a4f56a
411 files changed
+87495 -27363

No files matched your search

+97
View File
@@ -0,0 +1,97 @@
# Сборка и публикация Docker-образа DUB-AI в реестр контейнеров Gitea.
#
# Запускается: пуш в main/master, тег v*, вручную (workflow_dispatch).
# Нужно один раз настроить (подробно — docs/docker.md, раздел «CI/CD в Gitea»):
# * включить Actions в репозитории и зарегистрировать act_runner с доступом к Docker;
# * Secrets репозитория:
# REGISTRY_USER пользователь Gitea
# REGISTRY_TOKEN токен с правами write:package
# MODELS_URL (необязательно) ссылка на models-bundle.tar.gz; без неё образ собирается без моделей
# MODELS_TOKEN (необязательно) токен для скачивания по MODELS_URL
name: docker
on:
push:
branches: [main, master]
tags: ["v*"]
workflow_dispatch:
env:
IMAGE_NAME: dub-ai
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Проверка синтаксиса кода сервиса
run: |
python3 -m compileall -q src
python3 -c "import ast,sys; [ast.parse(open(f, encoding='utf-8').read()) for f in ('tools/pack_models.py',)]"
- name: Модели (docker-models/models)
env:
MODELS_URL: ${{ secrets.MODELS_URL }}
MODELS_TOKEN: ${{ secrets.MODELS_TOKEN }}
run: |
if [ -n "$MODELS_URL" ]; then
echo "скачиваю модели"
if [ -n "$MODELS_TOKEN" ]; then
curl -fsSL -H "Authorization: token $MODELS_TOKEN" "$MODELS_URL" -o models-bundle.tar.gz
else
curl -fsSL "$MODELS_URL" -o models-bundle.tar.gz
fi
tar -xzf models-bundle.tar.gz -C docker-models
test -f docker-models/models/best/model.pt
ls -la docker-models/models/best docker-models/models/segmenter
else
echo "MODELS_URL не задан: образ будет без моделей (их нужно смонтировать: -v ./models:/app/models:ro)"
fi
- name: Теги образа
id: meta
run: |
REGISTRY="${GITHUB_SERVER_URL#*://}" # хост Gitea без схемы
REPO="$(echo "${GITHUB_REPOSITORY}" | tr '[:upper:]' '[:lower:]')"
IMAGE="${REGISTRY}/${REPO}/${IMAGE_NAME}"
TAGS="${IMAGE}:sha-${GITHUB_SHA::8}"
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
TAGS="$TAGS ${IMAGE}:${GITHUB_REF_NAME}"
fi
case "${GITHUB_REF_NAME}" in main|master) TAGS="$TAGS ${IMAGE}:latest";; esac
echo "registry=${REGISTRY}" >> "$GITHUB_OUTPUT"
echo "tags=${TAGS}" >> "$GITHUB_OUTPUT"
echo "теги: ${TAGS}"
- name: Сборка
run: |
set -e
ARGS=""
for t in ${{ steps.meta.outputs.tags }}; do ARGS="$ARGS -t $t"; done
docker build $ARGS .
- name: Проверка образа (если модели внутри)
run: |
set -e
FIRST="$(echo '${{ steps.meta.outputs.tags }}' | cut -d' ' -f1)"
if [ ! -f docker-models/models/best/model.pt ]; then
echo "моделей в образе нет — запуск пропущен"; exit 0
fi
docker run -d --name dub-smoke "$FIRST"
for i in $(seq 1 60); do
if docker exec dub-smoke python -c "import urllib.request as u; print(u.urlopen('http://127.0.0.1:8000/health', timeout=4).read().decode())"; then
docker rm -f dub-smoke; exit 0
fi
sleep 5
done
docker logs dub-smoke; docker rm -f dub-smoke; exit 1
- name: Публикация в реестр Gitea
env:
REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
run: |
set -e
echo "$REGISTRY_TOKEN" | docker login "${{ steps.meta.outputs.registry }}" -u "$REGISTRY_USER" --password-stdin
for t in ${{ steps.meta.outputs.tags }}; do docker push "$t"; done