diff --git a/$remote b/$remote
new file mode 100644
index 0000000..3840320
--- /dev/null
+++ b/$remote
@@ -0,0 +1,27 @@
+Split-Path : Cannot bind argument to parameter 'Path' because it is null.
+At line:1 char:177
++ ... ; $EXT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path; $manif ...
++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ + CategoryInfo : InvalidData: (:) [Split-Path], ParameterBindingValidationException
+ + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SplitPathCo
+ mmand
+
+Join-Path : Cannot bind argument to parameter 'Path' because it is null.
+At line:1 char:242
++ ... n.MyCommand.Path; $manifest = Get-Content (Join-Path $EXT_DIR 'manife ...
++ ~~~~~~~~
+ + CategoryInfo : InvalidData: (:) [Join-Path], ParameterBindingValidationException
+ + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.JoinPathCom
+ mand
+
+Local: Remote: 2.7
+[INFO] Updating - ...
+Expand-Archive : Cannot validate argument on parameter 'DestinationPath'. The argument is null or empty. Provide an arg
+ument that is not null or empty, and then try the command again.
+At line:1 char:756
++ ... OutFile $tmp; Expand-Archive $tmp -DestinationPath $EXT_DIR -Force; ...
++ ~~~~~~~~
+ + CategoryInfo : InvalidData: (:) [Expand-Archive], ParameterBindingValidationException
+ + FullyQualifiedErrorId : ParameterArgumentValidationError,Expand-Archive
+
+[OK] Done. Reload extension in chrome://extensions
diff --git a/DEPLOY.md b/DEPLOY.md
new file mode 100644
index 0000000..f5ed0a8
--- /dev/null
+++ b/DEPLOY.md
@@ -0,0 +1,289 @@
+# Деплой 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 |
diff --git a/auto-update.bat b/auto-update.bat
new file mode 100644
index 0000000..c09cfaf
--- /dev/null
+++ b/auto-update.bat
@@ -0,0 +1,41 @@
+@echo off
+setlocal
+
+set VERSION_URL=https://git.ihateamerica.ru/caps_enhancer/version.json
+set ZIP_URL=https://git.ihateamerica.ru/caps_enhancer/caps-enhancer.zip
+set EXT_DIR=%~dp0
+
+:: Читаем локальную версию из manifest.json
+for /f "delims=" %%v in ('powershell -NoProfile -Command "(Get-Content '%EXT_DIR%manifest.json' | ConvertFrom-Json).version"') do set LOCAL_VER=%%v
+
+:: Читаем удалённую версию
+for /f "delims=" %%v in ('curl -sf "%VERSION_URL%"') do set REMOTE_JSON=%%v
+for /f "delims=" %%v in ('powershell -NoProfile -Command "'%REMOTE_JSON%' | ConvertFrom-Json | Select-Object -ExpandProperty version"') do set REMOTE_VER=%%v
+
+if not defined REMOTE_VER (
+ echo [ОШИБКА] Не удалось получить версию с сервера.
+ goto :end
+)
+
+if "%LOCAL_VER%"=="%REMOTE_VER%" (
+ echo [OK] Версия актуальная: %LOCAL_VER%
+ goto :end
+)
+
+echo [INFO] Обновление: %LOCAL_VER% --^> %REMOTE_VER%
+
+set TMP_ZIP=%TEMP%\caps-enhancer-update.zip
+curl -f "%ZIP_URL%" -o "%TMP_ZIP%"
+if errorlevel 1 (
+ echo [ОШИБКА] Не удалось скачать ZIP.
+ goto :end
+)
+
+tar -xf "%TMP_ZIP%" -C "%EXT_DIR%" --overwrite
+del "%TMP_ZIP%"
+
+echo [OK] Обновлено до версии %REMOTE_VER%. Перезагрузи расширение в Chrome.
+
+:end
+endlocal
+pause
diff --git a/js/background.js b/js/background.js
new file mode 100644
index 0000000..0430802
--- /dev/null
+++ b/js/background.js
@@ -0,0 +1,47 @@
+// Фоновый service worker — проверка обновлений расширения
+// Работает только в режиме "Load unpacked" (Developer Mode)
+
+const VERSION_URL = 'https://git.ihateamerica.ru/caps_enhancer/version.json';
+const CHECK_INTERVAL_MINUTES = 60;
+
+chrome.runtime.onInstalled.addListener(() => {
+ chrome.alarms.create('updateCheck', {
+ delayInMinutes: 1,
+ periodInMinutes: CHECK_INTERVAL_MINUTES
+ });
+});
+
+chrome.alarms.onAlarm.addListener((alarm) => {
+ if (alarm.name === 'updateCheck') {
+ checkForUpdates();
+ }
+});
+
+async function checkForUpdates() {
+ try {
+ const res = await fetch(VERSION_URL + '?t=' + Date.now());
+ if (!res.ok) return;
+
+ const { version: remote } = await res.json();
+ const local = chrome.runtime.getManifest().version;
+
+ if (isNewer(remote, local)) {
+ console.log(`[CAPS Enhancer] Обновление: ${local} → ${remote}. Перезагружаю...`);
+ // Небольшая задержка — дать scheduled task время распаковать файлы
+ await new Promise(r => setTimeout(r, 3000));
+ chrome.runtime.reload();
+ }
+ } catch {
+ // Нет соединения или сервер недоступен — молча игнорируем
+ }
+}
+
+function isNewer(remote, local) {
+ const r = remote.split('.').map(Number);
+ const l = local.split('.').map(Number);
+ for (let i = 0; i < Math.max(r.length, l.length); i++) {
+ if ((r[i] || 0) > (l[i] || 0)) return true;
+ if ((r[i] || 0) < (l[i] || 0)) return false;
+ }
+ return false;
+}
diff --git a/manifest.json b/manifest.json
index bd160c9..5676255 100644
--- a/manifest.json
+++ b/manifest.json
@@ -3,12 +3,16 @@
"name": "CAPS Enhancer",
"version": "2.7",
"description": "Добавляет всякие фичи для УТП в CAPS",
+ "update_url": "https://git.ihateamerica.ru/caps_enhancer/update.xml",
"icons": {
"16": "icons/icon16.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
},
- "permissions": ["activeTab", "storage", "tabs"],
+ "background": {
+ "service_worker": "js/background.js"
+ },
+ "permissions": ["activeTab", "storage", "tabs", "alarms"],
"host_permissions": [""],
"action": {
"default_popup": "popup.html",
diff --git a/pack-crx.bat b/pack-crx.bat
new file mode 100644
index 0000000..1adb949
--- /dev/null
+++ b/pack-crx.bat
@@ -0,0 +1,46 @@
+@echo off
+:: Скрипт упаковки расширения в .crx
+:: Запускать из папки caps-enhancer
+:: Требует: Google Chrome установлен
+
+setlocal
+
+:: Путь к Chrome (проверяем оба варианта)
+set CHROME="C:\Program Files\Google\Chrome\Application\chrome.exe"
+if not exist %CHROME% set CHROME="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
+
+:: Текущая директория (где лежит manifest.json)
+set EXT_DIR=%~dp0
+
+:: Файл ключа (генерируется при первой упаковке, сохранять!)
+set KEY_FILE=%~dp0caps-enhancer.pem
+
+echo === CAPS Enhancer - Упаковка расширения ===
+echo.
+
+if exist %KEY_FILE% (
+ echo [INFO] Используется существующий ключ: %KEY_FILE%
+ %CHROME% --pack-extension="%EXT_DIR%" --pack-extension-key="%KEY_FILE%" --no-message-box
+) else (
+ echo [INFO] Ключ не найден. Будет создан новый ключ.
+ echo [WARN] ПЕРВЫЙ РАЗ: сохраните caps-enhancer.pem - он нужен для всех обновлений!
+ %CHROME% --pack-extension="%EXT_DIR%" --no-message-box
+)
+
+echo.
+if exist "%~dp0..\caps-enhancer.crx" (
+ copy "%~dp0..\caps-enhancer.crx" "%~dp0server\caps-enhancer.crx" >nul
+ echo [OK] caps-enhancer.crx скопирован в server\
+) else (
+ echo [WARN] .crx не найден. Chrome мог создать его на уровень выше.
+ echo Проверьте папку рядом с caps-enhancer\
+)
+
+echo.
+echo === Готово! ===
+echo Следующие шаги:
+echo 1. Проверь ID расширения в chrome://extensions
+echo 2. Обнови server\update.xml (EXTENSION_ID и version)
+echo 3. Загрузи server\caps-enhancer.crx и server\update.xml на сервер
+echo.
+pause
diff --git a/server/caps-enhancer.zip b/server/caps-enhancer.zip
new file mode 100644
index 0000000..74b91e9
Binary files /dev/null and b/server/caps-enhancer.zip differ
diff --git a/server/deploy.sh b/server/deploy.sh
new file mode 100644
index 0000000..0c31156
--- /dev/null
+++ b/server/deploy.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+# Скрипт деплоя на сервер.
+# Запускать на сервере после загрузки новых файлов.
+# Использование: ./deploy.sh
+
+set -e
+
+DEPLOY_DIR="/var/www/caps-enhancer/caps-enhancer"
+CRX_FILE="caps-enhancer.crx"
+UPDATE_XML="update.xml"
+
+echo "=== CAPS Enhancer Deploy ==="
+
+# Создаём директорию если не существует
+mkdir -p "$DEPLOY_DIR"
+
+# Копируем файлы (запускать из папки где лежат .crx и update.xml)
+if [ -f "$CRX_FILE" ]; then
+ cp "$CRX_FILE" "$DEPLOY_DIR/"
+ echo "[OK] $CRX_FILE скопирован"
+else
+ echo "[WARN] $CRX_FILE не найден в текущей директории"
+fi
+
+if [ -f "$UPDATE_XML" ]; then
+ cp "$UPDATE_XML" "$DEPLOY_DIR/"
+ echo "[OK] $UPDATE_XML скопирован"
+else
+ echo "[WARN] $UPDATE_XML не найден в текущей директории"
+fi
+
+# Права доступа
+chown -R www-data:www-data "$DEPLOY_DIR"
+chmod -R 755 "$DEPLOY_DIR"
+echo "[OK] Права выставлены"
+
+echo "=== Деплой завершён ==="
+echo "Проверь: https://YOUR_DOMAIN/caps-enhancer/update.xml"
diff --git a/server/install-client.ps1 b/server/install-client.ps1
new file mode 100644
index 0000000..3708ccc
--- /dev/null
+++ b/server/install-client.ps1
@@ -0,0 +1,38 @@
+# Скрипт установки расширения через PowerShell (альтернатива .reg файлу)
+# Запускать с правами администратора:
+# Right Click -> "Запустить от имени администратора"
+# или: Start-Process powershell -Verb RunAs -ArgumentList "-File install-client.ps1"
+
+param(
+ [string]$ExtensionId = "EXTENSION_ID",
+ [string]$UpdateUrl = "https://YOUR_DOMAIN/caps-enhancer/update.xml"
+)
+
+$registryPath = "HKLM:\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist"
+$value = "$ExtensionId;$UpdateUrl"
+
+# Создаём ключ если не существует
+if (-not (Test-Path $registryPath)) {
+ New-Item -Path $registryPath -Force | Out-Null
+ Write-Host "[OK] Создан ключ реестра: $registryPath"
+}
+
+# Ищем свободный номер (1, 2, 3, ...)
+$index = 1
+while (Get-ItemProperty -Path $registryPath -Name "$index" -ErrorAction SilentlyContinue) {
+ # Проверяем, вдруг расширение уже добавлено
+ $existing = (Get-ItemProperty -Path $registryPath -Name "$index")."$index"
+ if ($existing -like "$ExtensionId;*") {
+ Write-Host "[INFO] Расширение уже установлено (запись $index)."
+ Write-Host " Значение: $existing"
+ exit 0
+ }
+ $index++
+}
+
+Set-ItemProperty -Path $registryPath -Name "$index" -Value $value -Type String
+Write-Host "[OK] Расширение добавлено в реестр (запись $index):"
+Write-Host " $value"
+Write-Host ""
+Write-Host "Chrome автоматически установит расширение при следующем запуске."
+Write-Host "Если Chrome уже открыт — перезапустите его."
diff --git a/server/install-client.reg b/server/install-client.reg
new file mode 100644
index 0000000..b2ce863
--- /dev/null
+++ b/server/install-client.reg
@@ -0,0 +1,13 @@
+Windows Registry Editor Version 5.00
+
+; ============================================================
+; Принудительная установка CAPS Enhancer через Windows Registry
+; ============================================================
+
+; Для всех пользователей компьютера (требует прав администратора)
+[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist]
+"1"="hpjnlbenmhmigajedbgmonmnediljbfa;https://git.ihateamerica.ru/caps_enhancer/update.xml"
+
+; --- ИЛИ только для текущего пользователя (без прав админа) ---
+; [HKEY_CURRENT_USER\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist]
+; "1"="hpjnlbenmhmigajedbgmonmnediljbfa;https://git.ihateamerica.ru/caps_enhancer/update.xml"
diff --git a/server/nginx.conf b/server/nginx.conf
new file mode 100644
index 0000000..9e43c81
--- /dev/null
+++ b/server/nginx.conf
@@ -0,0 +1,40 @@
+server {
+ listen 80;
+ listen 443 ssl;
+ server_name YOUR_DOMAIN;
+
+ # SSL (рекомендуется — Chrome требует HTTPS для update_url)
+ # ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem;
+ # ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN/privkey.pem;
+
+ root /var/www/caps-enhancer;
+ index index.html;
+
+ # Директория с файлами расширения
+ location /caps-enhancer/ {
+ # MIME-тип для .crx — обязателен, иначе Chrome откажется качать
+ types {
+ application/x-chrome-extension crx;
+ application/xml xml;
+ text/plain txt;
+ }
+
+ # Разрешаем скачивание
+ add_header Content-Disposition 'attachment' always;
+
+ # CORS — если сервер и расширение на разных доменах
+ add_header Access-Control-Allow-Origin '*' always;
+
+ # Кэш для update.xml — не кэшировать (чтобы обновления прилетали быстро)
+ location ~* \.xml$ {
+ add_header Cache-Control 'no-cache, no-store, must-revalidate' always;
+ add_header Pragma 'no-cache' always;
+ expires 0;
+ }
+
+ # .crx можно кэшировать (файл меняется только при новой версии)
+ location ~* \.crx$ {
+ add_header Cache-Control 'public, max-age=86400' always;
+ }
+ }
+}
diff --git a/server/pack-zip.bat b/server/pack-zip.bat
new file mode 100644
index 0000000..6d258af
--- /dev/null
+++ b/server/pack-zip.bat
@@ -0,0 +1,40 @@
+@echo off
+setlocal
+set ROOT=%~dp0..
+
+:: Читаем версию из manifest.json
+for /f "delims=" %%v in ('powershell -NoProfile -Command "(Get-Content '%ROOT%\manifest.json' | ConvertFrom-Json).version"') do set VERSION=%%v
+echo Упаковка версии %VERSION%...
+
+:: Временная папка
+set TMP=%TEMP%\caps-enhancer-pack
+if exist "%TMP%" rd /s /q "%TMP%"
+md "%TMP%"
+
+:: Копируем файлы расширения
+copy "%ROOT%\manifest.json" "%TMP%\" >nul
+copy "%ROOT%\popup.html" "%TMP%\" >nul
+copy "%ROOT%\popup.css" "%TMP%\" >nul
+copy "%ROOT%\options.html" "%TMP%\" >nul
+copy "%ROOT%\auto-update.bat" "%TMP%\" >nul
+xcopy "%ROOT%\js" "%TMP%\js\" /e /q >nul
+xcopy "%ROOT%\css" "%TMP%\css\" /e /q >nul
+xcopy "%ROOT%\modules" "%TMP%\modules\" /e /q >nul
+xcopy "%ROOT%\icons" "%TMP%\icons\" /e /q >nul
+
+:: Создаём ZIP
+set OUT=%~dp0caps-enhancer.zip
+if exist "%OUT%" del "%OUT%"
+powershell -NoProfile -Command "Compress-Archive -Path '%TMP%\*' -DestinationPath '%OUT%'"
+rd /s /q "%TMP%"
+
+:: Обновляем version.json
+echo {"version": "%VERSION%"} > "%~dp0version.json"
+
+echo.
+echo [OK] server\caps-enhancer.zip
+echo [OK] server\version.json (v%VERSION%)
+echo.
+echo Залей оба файла на сервер: /var/www/caps_enhancer/
+pause
+endlocal
diff --git a/server/update.xml b/server/update.xml
new file mode 100644
index 0000000..56d3807
--- /dev/null
+++ b/server/update.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/server/version.json b/server/version.json
new file mode 100644
index 0000000..fb01bc4
--- /dev/null
+++ b/server/version.json
@@ -0,0 +1 @@
+{"version": "2.7"}