# Деплой CAPS Enhancer — Self-Hosted Auto-Update
## Как это работает
```
[Сервер] [Браузер пользователя]
update.xml <── Chrome опрашивает каждые ~5 часов
caps-enhancer.crx <── Chrome скачивает при новой версии
```
Chrome сравнивает `version` в `update.xml` с версией установленного расширения.
Если версия на сервере выше — скачивает `.crx` и устанавливает обновление автоматически.
Пользователь устанавливает расширение **один раз** через реестр Windows — дальше всё автоматически.
---
## Часть 1: Первоначальная упаковка (делается один раз)
### Шаг 1. Прописать URL обновления в manifest.json
Открой `manifest.json` и замени `YOUR_DOMAIN` на реальный домен:
```json
"update_url": "https://updates.example.com/caps-enhancer/update.xml",
```
### Шаг 2. Упаковать расширение в .crx
**Способ A — через bat-скрипт (рекомендуется):**
Запусти `pack-crx.bat` из папки проекта. Скрипт сам найдёт Chrome и упакует расширение.
**Способ B — вручную через Chrome:**
1. Открой `chrome://extensions`
2. Включи "Режим разработчика" (правый верхний угол)
3. Нажми "Упаковать расширение"
4. В поле "Корневой каталог расширения" укажи папку `caps-enhancer`
5. Поле "Файл закрытого ключа" оставь пустым при первой упаковке
6. Нажми "Упаковать расширение"
Chrome создаст два файла **в папке рядом с `caps-enhancer`**:
- `caps-enhancer.crx` — файл расширения
- `caps-enhancer.pem` — приватный ключ
> **КРИТИЧНО:** Сохрани `caps-enhancer.pem` в надёжное место!
> Этот ключ определяет ID расширения. Если потеряешь — ID изменится,
> и все установленные у пользователей копии придётся переустанавливать вручную.
### Шаг 3. Узнать ID расширения
**После первой упаковки:**
1. Открой `chrome://extensions`
2. Нажми "Загрузить распакованное расширение" → выбери папку `caps-enhancer`
3. Скопируй ID расширения (длинная строка из 32 символов, например `abcdefghijklmnopqrstuvwxyzabcdef`)
**Или через файл ключа (если Chrome уже закрыт):**
```bash
# На Linux/Mac:
openssl rsa -in caps-enhancer.pem -pubout | openssl dgst -sha256 -binary | base32 | head -c 32 | tr '[:upper:]' '[:lower:]'
```
### Шаг 4. Обновить update.xml
Открой `server/update.xml` и замени:
- `EXTENSION_ID` — ID из предыдущего шага
- `YOUR_DOMAIN` — твой домен
- `version` — текущая версия (из manifest.json)
```xml
```
---
## Часть 2: Настройка сервера
### Требования к серверу
- Любой веб-сервер (nginx, Apache, Caddy, даже GitHub Pages)
- **HTTPS обязателен** — Chrome отказывается скачивать `.crx` по HTTP
- Корректные MIME-типы (см. ниже)
### Вариант A: nginx
Скопируй `server/nginx.conf` на сервер и замени `YOUR_DOMAIN`:
```bash
sudo cp server/nginx.conf /etc/nginx/sites-available/caps-enhancer
sudo ln -s /etc/nginx/sites-available/caps-enhancer /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```
Структура файлов на сервере:
```
/var/www/caps-enhancer/
└── caps-enhancer/
├── update.xml
└── caps-enhancer.crx
```
### Вариант B: Apache
Добавь в `.htaccess` или конфиг:
```apache
AddType application/x-chrome-extension .crx
AddType application/xml .xml
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
```
### Вариант C: Caddy (самый простой, HTTPS автоматически)
```
updates.example.com {
root * /var/www/caps-enhancer
file_server
@xml path *.xml
header @xml Cache-Control "no-cache, no-store, must-revalidate"
}
```
### Вариант D: GitHub Pages / любой статический хостинг
Положи `update.xml` и `caps-enhancer.crx` в репозиторий.
GitHub Pages раздаёт файлы по HTTPS автоматически.
> Убедись что хостинг отдаёт `.crx` с типом `application/x-chrome-extension`
> или `application/octet-stream`. GitHub Pages обычно справляется.
### Загрузка файлов на сервер
```bash
# С локальной машины через scp
scp server/caps-enhancer.crx server/update.xml user@your-server:/var/www/caps-enhancer/caps-enhancer/
# Или через rsync
rsync -av server/caps-enhancer.crx server/update.xml user@your-server:/var/www/caps-enhancer/caps-enhancer/
```
### Проверка сервера
После загрузки проверь:
```bash
# update.xml должен вернуть XML с версией
curl -I https://updates.example.com/caps-enhancer/update.xml
# .crx должен вернуть 200 и Content-Type: application/x-chrome-extension
curl -I https://updates.example.com/caps-enhancer/caps-enhancer.crx
```
---
## Часть 3: Установка на компьютеры пользователей
Chrome не позволяет устанавливать сторонние расширения вручную через stable-канал.
Единственный способ — через **Windows Policy (реестр)**.
### Способ A: .reg файл (для ручной установки)
1. Открой `server/install-client.reg`
2. Замени `EXTENSION_ID` и `YOUR_DOMAIN`
3. Дай пользователю этот файл
4. Пользователь дважды кликает на `.reg` → соглашается → перезапускает Chrome
```reg
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist]
"1"="abcdefghijklmnopqrstuvwxyzabcdef;https://updates.example.com/caps-enhancer/update.xml"
```
> Требует прав администратора (HKLM).
> Для установки без прав — использовать HKCU (только для текущего пользователя).
### Способ B: PowerShell скрипт
Отредактируй `server/install-client.ps1` (замени ID и домен), запусти от имени администратора:
```powershell
# Запуск от имени администратора:
Start-Process powershell -Verb RunAs -ArgumentList "-File C:\path\to\install-client.ps1"
```
### Способ C: Групповые политики (GPO) — для домена
1. Открой **Group Policy Management Console** (gpmc.msc)
2. Создай или отредактируй GPO
3. Перейди: `Computer Configuration` → `Administrative Templates` → `Google` → `Google Chrome` → `Extensions`
4. Включи политику **"Configure the list of force-installed apps and extensions"**
5. Добавь строку: `abcdefghijklmnopqrstuvwxyzabcdef;https://updates.example.com/caps-enhancer/update.xml`
> Если шаблонов Google нет — скачай ADMX: https://chromeenterprise.google/intl/ru/browser/download/
### Что видит пользователь после установки
- Chrome автоматически устанавливает расширение при следующем запуске
- Иконка появляется в панели расширений
- Пользователь **не может удалить** принудительно установленное расширение (managed)
---
## Часть 4: Выпуск обновления
При каждом обновлении расширения:
### 1. Обнови версию в manifest.json
```json
"version": "2.8"
```
### 2. Упакуй расширение с тем же ключом
Запусти `pack-crx.bat` — скрипт автоматически использует существующий `caps-enhancer.pem`.
### 3. Обнови update.xml
```xml
```
### 4. Загрузи на сервер
```bash
scp caps-enhancer.crx update.xml user@your-server:/var/www/caps-enhancer/caps-enhancer/
```
### 5. Готово
Chrome проверяет обновления примерно каждые **5 часов** в фоне.
Обновление применяется при следующем перезапуске браузера (или при перезагрузке расширения).
Форсировать проверку обновлений вручную можно в `chrome://extensions` → "Обновить расширения".
---
## Итоговая структура файлов
```
caps-enhancer/
├── manifest.json ← update_url прописан
├── pack-crx.bat ← запускать для упаковки
├── caps-enhancer.pem ← ХРАНИТЬ В БЕЗОПАСНОМ МЕСТЕ (создаётся при первой упаковке)
├── DEPLOY.md ← эта инструкция
├── ...остальные файлы расширения...
└── server/
├── update.xml ← загружать на сервер при каждом обновлении
├── caps-enhancer.crx ← загружать на сервер при каждом обновлении
├── nginx.conf ← конфиг для nginx (один раз)
├── deploy.sh ← скрипт деплоя на сервере
├── install-client.reg ← раздать пользователям для установки
└── install-client.ps1 ← альтернатива .reg файлу
```
---
## Troubleshooting
| Проблема | Причина | Решение |
|----------|---------|---------|
| Chrome не устанавливает расширение | Нет ключа реестра | Проверь `HKLM\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist` |
| "Extension not from Chrome Web Store" | Расширение установлено не через policy | Используй реестр, не ручную установку |
| Обновление не прилетает | update.xml закэширован или неверный ID | Очисти кэш, проверь EXTENSION_ID в update.xml |
| Chrome отказывается качать .crx | HTTP вместо HTTPS | Настрой SSL на сервере |
| .crx не скачивается | Неверный MIME-тип | Добавь `application/x-chrome-extension` для `.crx` |
| ID расширения изменился | Потерян .pem файл | Перераспространить .reg с новым ID |