File size: 3,329 Bytes
2526f60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
644ba85
 
2526f60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54bc653
2526f60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# Hugging Face Space deploy

Целевая схема:

```text
Corporate GitLab repository
        ↓ GitLab CI
Private Hugging Face Docker Space
        ↓ CPU Basic / Free
HiveTrace Leaderboard
```

## Hugging Face Space

Space создается вручную один раз.

Рекомендуемые настройки:

- Visibility: `Private`
- SDK: `Docker`
- Hardware: `CPU Basic` / free
- App port: `5173`

В `README.md` проекта уже есть Space frontmatter:

```yaml
---
title: HiveTrace Leaderboard
emoji: 🛡️
colorFrom: green
colorTo: indigo
sdk: docker
app_port: 5173
pinned: true
---
```

## Runtime secrets and variables in Hugging Face

В Space Settings нужно добавить runtime secret:

```text
HF_TOKEN=hf_...
```

Этот токен нужен приложению для чтения приватного Hugging Face bucket. Его нельзя делать
`PUBLIC_*` переменной и нельзя коммитить в репозиторий.

Variables:

```text
HF_BUCKET_ID=hivetrace/leaderboard_frontend_v2
HF_BUCKET_PREFIX=latest
HF_BUCKET_CACHE_TTL_MS=300000
HF_BUCKET_REQUEST_TIMEOUT_MS=60000
HF_BUCKET_REQUEST_RETRIES=2
```

Опционально:

```text
HF_BUCKET_ENDPOINT=https://huggingface.co
```

## GitLab CI variables

В корпоративном GitLab нужно добавить CI/CD variables:

```text
HF_USERNAME=<huggingface-user-or-service-account-name>
HF_SPACE_TOKEN=<huggingface-write-token-for-space-repo>
HF_SPACE_REPO=<namespace>/<space-name>
```

Пример:

```text
HF_SPACE_REPO=hivetrace/guard-leaderboard
```

`HF_SPACE_TOKEN` должен иметь право записи в Space repository.

Важно: `HF_SPACE_TOKEN` и runtime `HF_TOKEN` для чтения bucket лучше держать разными
токенами.

`HF_SPACE_TOKEN` в GitLab лучше пометить как masked/protected variable.

## Deploy flow

`.gitlab-ci.yml` делает два этапа:

1. `validate`
   - `pnpm install --frozen-lockfile`
   - `pnpm check` (внутри генерирует Paraglide output)
   - `pnpm build`

2. `deploy:huggingface`
   - срабатывает только на ветке `prod`
   - пушит текущий commit в private Hugging Face Space repository
   - использует force push, потому что Hugging Face Space является deploy-репозиторием
   - Space автоматически пересобирает Docker image после push

## Production branch

Продакшн-деплой запускается только из ветки `prod`.

Типовой flow:

```bash
git checkout prod
git merge main
git push origin prod
```

После push в `prod` GitLab CI выполнит validate-этап и затем отправит этот commit в
ветку `main` Hugging Face Space repository.

## Local Docker smoke test

Перед первым deploy желательно локально проверить Docker image:

```bash
docker build -t hivetrace-leaderboard .
docker run --rm -p 5173:5173 \
  -e HF_TOKEN=hf_... \
  -e HF_BUCKET_ID=hivetrace/leaderboard_frontend_v2 \
  -e HF_BUCKET_PREFIX=latest \
  hivetrace-leaderboard
```

После запуска открыть:

```text
http://127.0.0.1:5173/
```