Add Windows 7 deploy bundle pipeline

Self-contained zip (dist/avtoambor-deploy.zip) for end users on Windows 7:
double-click install.bat to install Node 16, then start.bat to launch the
server. start.bat self-relaunches minimized so the console window stays out
of the way. Node is pinned to 16.x and several deps downgraded for Win7
compatibility; the unsupported View Transitions hook is dropped from the
root layout. make bundle wraps scripts/make-bundle.sh.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
David Beccue
2026-05-18 09:38:20 +05:00
parent c882ab5d43
commit 83a59f1677
13 changed files with 2113 additions and 820 deletions

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
16.20.2

View File

@ -1,4 +1,4 @@
.PHONY: help install run build db-init db-reset docker-build docker-shell clean clean-all .PHONY: help install run build db-init db-reset docker-build docker-shell clean clean-all bundle bundle-clean
DC := docker compose DC := docker compose
@ -17,6 +17,8 @@ help:
@echo " make docker-shell Open an interactive bash shell in the container" @echo " make docker-shell Open an interactive bash shell in the container"
@echo " make clean Remove node_modules and build/ (keeps data/)" @echo " make clean Remove node_modules and build/ (keeps data/)"
@echo " make clean-all Also wipe data/ (destroys the DB)" @echo " make clean-all Also wipe data/ (destroys the DB)"
@echo " make bundle Produce dist/avtoambor-deploy.zip for Windows 7"
@echo " make bundle-clean Remove dist/"
@echo "" @echo ""
install: install:
@ -54,3 +56,11 @@ clean:
clean-all: clean clean-all: clean
@rm -rf data @rm -rf data
@echo "wiped data/ as well." @echo "wiped data/ as well."
# Windows 7 deploy bundle. Must be run with Node 16 active (.nvmrc).
bundle:
@bash scripts/make-bundle.sh
bundle-clean:
@rm -rf dist
@echo "removed dist/"

106
deploy/README.md Normal file
View File

@ -0,0 +1,106 @@
# Замена Масла ГП — Установка на Windows 7 (и новее)
Программа учёта расходных материалов и инструментов. Работает локально на
вашем компьютере без интернета.
## Что внутри архива
| Файл | Назначение |
| -------------------------- | ----------------------------------------------------- |
| `install.bat` | Шаг 1 — установить Node.js (запускается один раз). |
| `start.bat` | Шаг 2 — запустить программу. |
| `backup.bat` | Создать резервную копию вручную. |
| `node-v16.20.2-x64.msi` | Установщик Node.js для 64-битной Windows. |
| `node-v16.20.2-x86.msi` | Установщик Node.js для 32-битной Windows. |
| `build/` | Программа (не редактировать). |
| `node_modules/` | Библиотеки (не редактировать). |
| `scripts/` | Служебные скрипты (создание базы данных). |
| `src/` | Файлы схемы базы данных. |
| `data/` | Здесь хранится база `avtoambor.db`. **Это ваши данные.** |
| `backups/` | Автоматические и ручные резервные копии базы. |
## Первый запуск
1. **Распакуйте архив целиком** в удобную папку, например `C:\avtoambor`.
Все файлы должны лежать рядом — не перемещайте `.bat`-файлы отдельно от
`build/` и `node_modules/`.
2. **Запустите `install.bat`** двойным щелчком.
Откроется стандартный установщик Node.js — нажимайте «Далее» до конца,
соглашайтесь со всеми значениями по умолчанию.
Если установщик попросит разрешение администратора — разрешите.
3. **Запустите `start.bat`** двойным щелчком.
Появится чёрное окно с надписью «Сервер запущен на http://localhost:3000»,
и автоматически откроется браузер с программой.
**Не закрывайте чёрное окно** пока вы работаете с программой — оно
запускает сервер. Чтобы остановить программу, закройте окно.
## Ежедневное использование
- Запускайте `start.bat`, когда нужно открыть программу.
- Окно браузера можно закрывать и снова открывать по адресу
http://localhost:3000 — данные сохраняются в файле базы.
- Для остановки программы — закройте чёрное окно сервера.
## Резервные копии
Программа автоматически копирует базу `data\avtoambor.db` в папку `backups\`
каждые 5 минут, если в базе были изменения. Старые копии прорежаются:
последние 7 дней сохраняются полностью, дальше — по одной копии на день.
Чтобы сделать копию вручную — запустите `backup.bat`.
В админ-панели программы (`http://localhost:3000/admin`, пароль внутри) есть
страница «Резервные копии» — там можно скачать любую копию или восстановить
её одним щелчком.
## Ярлык на рабочем столе (рекомендуется)
Чтобы не открывать каждый раз папку `C:\avtoambor\`, поставьте значок на
рабочий стол:
1. Откройте папку `C:\avtoambor\`.
2. Щёлкните правой кнопкой по `start.bat`**Отправить** → **Рабочий стол
(создать ярлык)**.
3. На рабочем столе появится новый значок. Переименуйте его в «Замена Масла
ГП».
4. Теперь, чтобы запустить программу, достаточно двойного клика по этому
значку.
## Автозапуск при включении компьютера (необязательно)
Если хотите, чтобы программа стартовала сама сразу после включения
компьютера — без двойного клика по значку:
1. Нажмите `Win + R`, введите `shell:startup`, нажмите Enter.
2. Перетащите ярлык с рабочего стола (тот, что создали выше) в открывшуюся
папку автозагрузки. Или создайте новый ярлык на `C:\avtoambor\start.bat`
прямо в этой папке.
3. При следующем включении компьютера программа запустится сама.
## Если что-то не работает
- **`start.bat` пишет «Node.js не найден»** — запустите `install.bat` и
после установки выйдите из системы и войдите снова (или перезагрузите
компьютер), чтобы Windows обновила переменные окружения.
- **Браузер открылся, но показывает «Не удаётся открыть страницу»** — сервер
ещё запускается. Подождите 510 секунд и обновите страницу (F5).
- **При `start.bat` чёрное окно мигает и закрывается** — щёлкните правой
кнопкой по `start.bat`, выберите «Запуск от имени администратора», чтобы
увидеть сообщение об ошибке.
- **База данных «повреждена» или потеряна** — закройте `start.bat`, в папке
`backups\` найдите свежую копию `zamena-masla-gp-ГГГГ-ММ-ДД_ЧЧ-ММ-СС.db`,
скопируйте её в `data\avtoambor.db` (с заменой), снова запустите
`start.bat`.
## Обновление до новой версии
1. Закройте `start.bat`.
2. Распакуйте новый архив **поверх старой папки** — папки `data\` и `backups\`
при этом сохранятся, ваши данные не пострадают.
3. Снова запустите `start.bat`.
---
Версия инструкции: 2026-05-18.

32
deploy/backup.bat Normal file
View File

@ -0,0 +1,32 @@
@echo off
REM One-shot backup of data\avtoambor.db into backups\ with a timestamp.
REM The server already takes automatic backups every 5 minutes when something
REM has changed; this script is for an explicit manual snapshot.
chcp 65001 >nul
setlocal
cd /d "%~dp0"
if not exist "data\avtoambor.db" (
echo Файл данных не найден: data\avtoambor.db
pause
exit /b 1
)
if not exist "backups" mkdir backups
REM Build YYYY-MM-DD_HH-MM-SS using WMIC (locale-independent).
for /f "skip=1 delims=" %%a in ('wmic os get LocalDateTime') do if not defined LDT set "LDT=%%a"
set "STAMP=%LDT:~0,4%-%LDT:~4,2%-%LDT:~6,2%_%LDT:~8,2%-%LDT:~10,2%-%LDT:~12,2%"
set "DEST=backups\zamena-masla-gp-%STAMP%.db"
copy /Y "data\avtoambor.db" "%DEST%" >nul
if errorlevel 1 (
echo Не удалось создать резервную копию.
pause
exit /b 1
)
echo Резервная копия сохранена: %DEST%
pause
endlocal

305
deploy/index.html Normal file
View File

@ -0,0 +1,305 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Замена Масла ГП — установка на Windows 7</title>
<style>
body {
font-family: -apple-system, "Segoe UI", Tahoma, Arial, sans-serif;
max-width: 720px;
margin: 2rem auto;
padding: 0 1rem 3rem;
color: #1d2330;
background: #fbf7f1;
line-height: 1.55;
}
h1 { font-size: 1.6rem; margin: 0 0 0.5rem; }
h2 { font-size: 1.15rem; margin: 1.75rem 0 0.5rem; color: #00553e; }
h3 { font-size: 1rem; margin: 1.25rem 0 0.4rem; }
.lang-nav {
display: flex;
gap: 0.5rem;
margin: 1rem 0 1.5rem;
flex-wrap: wrap;
}
.lang-nav a {
padding: 0.4rem 0.85rem;
background: #fff;
border: 1px solid #c8cfdc;
border-radius: 4px;
color: #1d2330;
text-decoration: none;
font-size: 0.92rem;
}
.lang-nav a:hover { background: #eef1f6; }
.download {
display: inline-block;
margin: 1.25rem 0 0.5rem;
padding: 0.75rem 1.25rem;
background: #006a4e;
color: #fff;
font-weight: 600;
text-decoration: none;
border-radius: 4px;
}
.download:hover { background: #00553e; }
.meta { color: #6b7388; font-size: 0.9rem; }
code, kbd {
background: #eef1f6;
padding: 1px 6px;
border-radius: 3px;
font-size: 0.9em;
}
ol, ul { padding-left: 1.25rem; }
ol li, ul li { margin: 0.55rem 0; }
.note {
background: #fff;
border-left: 3px solid #006a4e;
padding: 0.6rem 0.85rem;
margin: 1rem 0;
font-size: 0.92rem;
}
.warn {
background: #fdecea;
border: 1px solid #f5c2c0;
color: #8a1f1b;
padding: 0.6rem 0.85rem;
border-radius: 4px;
margin: 1rem 0;
font-size: 0.92rem;
}
section {
border-top: 1px solid #d8dde7;
padding-top: 1rem;
margin-top: 2.5rem;
}
section:first-of-type { border-top: none; padding-top: 0; margin-top: 0; }
</style>
</head>
<body>
<h1>Замена Масла ГП</h1>
<p class="meta">Программа учёта для Windows 7 (64-бит)
· Программаи баҳисобгирӣ барои Windows 7 (64-бит)
· Inventory app for Windows 7 (64-bit)</p>
<nav class="lang-nav">
<a href="#ru">Русский</a>
<a href="#tg">Тоҷикӣ</a>
<a href="#en">English</a>
</nav>
<a class="download" href="avtoambor-deploy.zip">
Скачать архив · Боргирӣ · Download (≈ 57 МБ / MB)
</a>
<!-- =========================================================== -->
<!-- RUSSIAN -->
<!-- =========================================================== -->
<section id="ru" lang="ru">
<h2>Русский — установка на Windows 7</h2>
<div class="warn">
Программа собрана для <strong>64-битной</strong> Windows 7. Проверьте версию:
правый клик по «Компьютер» → «Свойства» → «Тип системы». Должно быть
«64-разрядная операционная система».
</div>
<h3>Установка — один раз</h3>
<ol>
<li>
Нажмите кнопку <strong>Скачать архив</strong> выше. Сохраните файл
<code>avtoambor-deploy.zip</code> на диск <code>C:\</code>.
</li>
<li>
Правый клик по архиву → <strong>Извлечь всё…</strong> → укажите путь
<code>C:\</code><strong>Извлечь</strong>. Должна появиться папка
<code>C:\avtoambor\</code>.
</li>
<li>
Откройте папку <code>C:\avtoambor\</code> и сделайте двойной клик
по <strong>install.bat</strong>. Откроется установщик Node.js — нажимайте
«Далее», соглашайтесь со всем по умолчанию. Если Windows спросит
разрешения администратора — разрешите.
</li>
<li>
После того как установщик закончит, <strong>выйдите из системы и войдите
снова</strong> (или перезагрузите компьютер).
</li>
<li>
Двойной клик по <strong>start.bat</strong>. Откроется чёрное окно с
надписью «Сервер запущен на http://localhost:3000», и автоматически
откроется браузер с программой.
</li>
</ol>
<div class="note">
<strong>Важно:</strong> чёрное окно сервера должно оставаться открытым,
пока вы пользуетесь программой. Закрытие окна = остановка сервера.
</div>
<h3>Ярлык на рабочем столе (рекомендуется)</h3>
<ol>
<li>Откройте папку <code>C:\avtoambor\</code>.</li>
<li>Щёлкните правой кнопкой по <strong>start.bat</strong><strong>Отправить</strong><strong>Рабочий стол (создать ярлык)</strong>.</li>
<li>На рабочем столе появится значок — переименуйте его в «Замена Масла ГП».</li>
<li>Теперь для запуска программы достаточно двойного клика по этому значку.</li>
</ol>
<h3>Автозапуск при включении компьютера (необязательно)</h3>
<ol>
<li>Нажмите <kbd>Win</kbd>+<kbd>R</kbd>, введите <code>shell:startup</code>, нажмите Enter.</li>
<li>Перетащите ярлык с рабочего стола (созданный выше) в открывшуюся папку.</li>
<li>При следующем включении компьютера программа запустится сама.</li>
</ol>
<h3>Резервные копии</h3>
<p>
Программа сама копирует базу данных каждые 5 минут в папку
<code>backups\</code>, если в данных были изменения.
Для ручной копии — двойной клик по <strong>backup.bat</strong>.
</p>
<h3>Если что-то не работает</h3>
<ul>
<li><strong><code>start.bat</code> пишет «Node.js не найден»</strong> — вы пропустили шаг 4 (нужно выйти из системы и зайти снова).</li>
<li><strong>Чёрное окно мигает и сразу закрывается</strong> — откройте <code>cmd</code>, выполните <code>cd C:\avtoambor</code>, затем <code>start.bat</code>. Прочитайте сообщение об ошибке.</li>
<li><strong>Браузер пишет «Не удаётся открыть страницу»</strong> — подождите 510 секунд и обновите страницу (<kbd>F5</kbd>).</li>
<li><strong>Программа потеряла данные</strong> — закройте окно сервера, в папке <code>backups\</code> найдите свежий файл <code>zamena-masla-gp-…-….db</code>, скопируйте его в <code>data\avtoambor.db</code> (с заменой), снова запустите <code>start.bat</code>.</li>
</ul>
</section>
<!-- =========================================================== -->
<!-- TAJIK -->
<!-- =========================================================== -->
<section id="tg" lang="tg">
<h2>Тоҷикӣ — насб ба Windows 7</h2>
<div class="warn">
Барнома барои <strong>Windows 7-и 64-бита</strong> омода шудааст. Версияро
тафтиш кунед: тугмаи рости муш ба «Компьютер» → «Свойства» → «Тип системы».
Бояд «64-разрядная операционная система» нависта бошад.
</div>
<h3>Насб — як маротиба</h3>
<ol>
<li>
Тугмаи <strong>Скачать архив</strong>-ро дар боло пахш кунед. Файли
<code>avtoambor-deploy.zip</code>-ро ба диски <code>C:\</code> нигоҳ доред.
</li>
<li>
Тугмаи рости муш ба архив → <strong>Извлечь всё…</strong> → роҳи
<code>C:\</code>-ро нишон диҳед → <strong>Извлечь</strong>. Папкаи
<code>C:\avtoambor\</code> бояд пайдо шавад.
</li>
<li>
Папкаи <code>C:\avtoambor\</code>-ро кушоед ва дубора ба
<strong>install.bat</strong> зер кунед. Насбкунандаи Node.js кушода
мешавад — «Далее»-ро пахш кунед ва ба ҳамаи интихобҳои стандартӣ розӣ
шавед. Агар Windows иҷозати администраторро пурсад — иҷозат диҳед.
</li>
<li>
Пас аз ба итмом расидани насбкунанда, <strong>аз система бароед ва
дубора ворид шавед</strong> (ё компютерро аз нав сар кунед).
</li>
<li>
Дубора ба <strong>start.bat</strong> зер кунед. Тирезаи сиёҳ бо навишти
«Сервер запущен на http://localhost:3000» кушода мешавад ва браузер
худаш барномаро мекушояд.
</li>
</ol>
<div class="note">
<strong>Муҳим:</strong> то даме ки бо барнома кор мекунед, тирезаи сиёҳи
сервер бояд кушода бошад. Бастани тиреза = қатъ кардани сервер.
</div>
<h3>Тугмача дар мизи корӣ (тавсия)</h3>
<ol>
<li>Папкаи <code>C:\avtoambor\</code>-ро кушоед.</li>
<li>Тугмаи рости муш ба <strong>start.bat</strong><strong>Отправить</strong><strong>Рабочий стол (создать ярлык)</strong>.</li>
<li>Дар мизи корӣ тугмачаи нав пайдо мешавад — номи онро ба «Замена Масла ГП» иваз кунед.</li>
<li>Акнун барои оғоз кардани барнома дубора ба ҳамин тугмача зер кунед.</li>
</ol>
<h3>Худкор оғоз кардан ҳангоми ба кор андохтани компютер (ихтиёрӣ)</h3>
<ol>
<li><kbd>Win</kbd>+<kbd>R</kbd>-ро пахш кунед, <code>shell:startup</code>-ро дохил кунед, Enter-ро пахш кунед.</li>
<li>Тугмачаро аз мизи корӣ (ҳамонеро ки боло сохтед) ба папкае ки кушода шуд кашед.</li>
<li>Ҳангоми навбатии ба кор андохтани компютер барнома худаш оғоз меёбад.</li>
</ol>
<h3>Нусхаҳои эҳтиётӣ</h3>
<p>
Барнома худаш базаро ҳар 5 дақиқа ба папкаи <code>backups\</code> нусха
мегирад, агар дар маълумот тағйирот бошад. Барои нусхаи дастӣ —
дубора ба <strong>backup.bat</strong> зер кунед.
</p>
<h3>Агар чизе кор накунад</h3>
<ul>
<li><strong><code>start.bat</code> «Node.js не найден» менависад</strong> — шумо қадами 4-умро гум кардаед (бояд аз система бароед ва дубора ворид шавед).</li>
<li><strong>Тирезаи сиёҳ як лаҳза пайдо шуда баста мешавад</strong><code>cmd</code>-ро кушоед, <code>cd C:\avtoambor</code> ва пас <code>start.bat</code>-ро иҷро кунед. Паёми хаторо хонед.</li>
<li><strong>Браузер «Не удаётся открыть страницу» менависад</strong> — 510 сония интизор шавед ва саҳифаро нав кунед (<kbd>F5</kbd>).</li>
<li><strong>Маълумот гум шудааст</strong> — тирезаи серверро банд кунед, дар папкаи <code>backups\</code> файли наватарини <code>zamena-masla-gp-…-….db</code>-ро ёбед, онро ба <code>data\avtoambor.db</code> нусхабардорӣ кунед (бо ҷойгузинӣ), бори дигар <code>start.bat</code>-ро иҷро кунед.</li>
</ul>
</section>
<!-- =========================================================== -->
<!-- ENGLISH -->
<!-- =========================================================== -->
<section id="en" lang="en">
<h2>English — install on Windows 7</h2>
<div class="warn">
This bundle targets <strong>64-bit Windows 7</strong>. Verify by right-clicking
"Computer" → Properties → "System type": should read "64-bit Operating System".
</div>
<h3>One-time install</h3>
<ol>
<li>Click <strong>Download</strong> above. Save <code>avtoambor-deploy.zip</code> to <code>C:\</code>.</li>
<li>Right-click the zip → <strong>Extract All…</strong> → path <code>C:\</code><strong>Extract</strong>. You should get <code>C:\avtoambor\</code>.</li>
<li>Open <code>C:\avtoambor\</code> and double-click <strong>install.bat</strong>. The Node.js installer wizard opens — click Next, accept defaults. Allow if Windows asks for admin permission.</li>
<li>When the wizard finishes, <strong>log out of Windows and log back in</strong> (or reboot) so the new <code>PATH</code> takes effect.</li>
<li>Double-click <strong>start.bat</strong>. A black console opens with "Сервер запущен на http://localhost:3000" and the browser opens to the app automatically.</li>
</ol>
<div class="note">
<strong>Important:</strong> the black server window must stay open while you
use the app. Closing it stops the server.
</div>
<h3>Desktop shortcut (recommended)</h3>
<ol>
<li>Open <code>C:\avtoambor\</code>.</li>
<li>Right-click <strong>start.bat</strong><strong>Send to</strong><strong>Desktop (create shortcut)</strong>.</li>
<li>Rename the new desktop icon to "Замена Масла ГП".</li>
<li>From now on, double-click that icon to start the app.</li>
</ol>
<h3>Autostart on boot (optional)</h3>
<ol>
<li>Press <kbd>Win</kbd>+<kbd>R</kbd>, type <code>shell:startup</code>, press Enter.</li>
<li>Drag the desktop shortcut you just made into the folder that opens.</li>
<li>Next boot, the app starts itself.</li>
</ol>
<h3>Backups</h3>
<p>
The app auto-snapshots the DB into <code>backups\</code> every 5 minutes when
there have been changes. For a manual snapshot, double-click <strong>backup.bat</strong>.
</p>
<h3>Troubleshooting</h3>
<ul>
<li><strong><code>start.bat</code> says "Node.js не найден"</strong> — you skipped step 4 (log out / reboot).</li>
<li><strong>Black window flashes and disappears</strong> — open <code>cmd</code>, run <code>cd C:\avtoambor</code> then <code>start.bat</code>, and read the error message.</li>
<li><strong>Browser shows "can't reach this page"</strong> — wait 510 seconds and refresh (<kbd>F5</kbd>).</li>
<li><strong>Lost data</strong> — close the server window, find the newest <code>zamena-masla-gp-…-….db</code> in <code>backups\</code>, copy it over <code>data\avtoambor.db</code>, restart <code>start.bat</code>.</li>
</ul>
</section>
</body>
</html>

43
deploy/install.bat Normal file
View File

@ -0,0 +1,43 @@
@echo off
REM Install Node.js 16.20.2 from a bundled MSI.
REM Picks x64 or x86 based on the Windows architecture.
chcp 65001 >nul
setlocal
cd /d "%~dp0"
if exist "%ProgramFiles%\nodejs\node.exe" (
echo Node.js уже установлен в %ProgramFiles%\nodejs.
echo Пропускаем установку.
goto :done
)
if exist "%ProgramFiles(x86)%\nodejs\node.exe" (
echo Node.js уже установлен в %ProgramFiles(x86)%\nodejs.
echo Пропускаем установку.
goto :done
)
set "MSI=node-v16.20.2-x64.msi"
if /i "%PROCESSOR_ARCHITECTURE%"=="x86" if not defined PROCESSOR_ARCHITEW6432 set "MSI=node-v16.20.2-x86.msi"
if not exist "%MSI%" (
echo Ошибка: файл %MSI% не найден рядом с install.bat.
echo Убедитесь, что архив распакован полностью.
pause
exit /b 1
)
echo Устанавливаем Node.js (%MSI%)...
echo Откроется стандартный установщик Windows — нажмите "Далее" до конца.
msiexec /i "%~dp0%MSI%"
if errorlevel 1 (
echo Установка Node.js завершилась с ошибкой.
pause
exit /b 1
)
:done
echo.
echo Готово. Закройте это окно и запустите start.bat.
pause
endlocal

Binary file not shown.

Binary file not shown.

42
deploy/start.bat Normal file
View File

@ -0,0 +1,42 @@
@echo off
REM Start the Zamena Masla GP server on http://localhost:3000.
if not "%ZMGP_MINIMIZED%"=="1" (
set ZMGP_MINIMIZED=1
start "Zamena Masla GP" /min "%~f0" %*
exit /b
)
chcp 65001 >nul
setlocal
cd /d "%~dp0"
set "NODE_EXE=%ProgramFiles%\nodejs\node.exe"
if not exist "%NODE_EXE%" set "NODE_EXE=%ProgramFiles(x86)%\nodejs\node.exe"
if not exist "%NODE_EXE%" (
echo Node.js не найден. Сначала запустите install.bat.
pause
exit /b 1
)
if not exist "data\avtoambor.db" (
echo База данных не найдена — создаём пустую...
if not exist "data" mkdir data
"%NODE_EXE%" scripts\init-db.js
if errorlevel 1 (
echo Не удалось создать базу данных.
pause
exit /b 1
)
)
set "NODE_ENV=production"
set "PORT=3000"
set "HOST=0.0.0.0"
set "ORIGIN=http://localhost:3000"
start "" http://localhost:3000
echo Сервер запущен на http://localhost:3000
echo Закройте это окно, чтобы остановить программу.
"%NODE_EXE%" build\index.js
endlocal

2282
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,9 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
"engines": {
"node": "16.x"
},
"scripts": { "scripts": {
"dev": "vite dev --host 0.0.0.0 --port 3000", "dev": "vite dev --host 0.0.0.0 --port 3000",
"build": "vite build", "build": "vite build",
@ -11,12 +14,13 @@
"db:init": "node scripts/init-db.js" "db:init": "node scripts/init-db.js"
}, },
"devDependencies": { "devDependencies": {
"@sveltejs/adapter-node": "^5.2.0", "@sveltejs/adapter-node": "1.3.1",
"@sveltejs/kit": "^2.5.0", "@sveltejs/kit": "1.30.4",
"svelte": "^4.2.0", "@sveltejs/vite-plugin-svelte": "2.5.3",
"vite": "^5.2.0" "svelte": "4.2.19",
"vite": "4.5.5"
}, },
"dependencies": { "dependencies": {
"better-sqlite3": "^11.3.0" "better-sqlite3": "7.6.2"
} }
} }

85
scripts/make-bundle.sh Executable file
View File

@ -0,0 +1,85 @@
#!/usr/bin/env bash
# Build dist/avtoambor-deploy.zip — a self-contained Windows 7 bundle.
#
# The bundle's node_modules/better-sqlite3 ships a native binary for
# win32-x64 + Node 16 (ABI v93), fetched via prebuild-install. The local
# dev tree (../node_modules/) is never touched, so `make run` / `npm run
# dev` keep working with the Linux binary.
set -euo pipefail
cd "$(dirname "$0")/.."
ROOT="$(pwd)"
DIST="$ROOT/dist"
STAGE="$DIST/avtoambor"
ZIP="$DIST/avtoambor-deploy.zip"
NODE_VERSION="16.20.2"
NODE_ABI="93"
# Sanity: we need Node 16 active so the build matches the runtime target.
NODE_MAJOR="$(node -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0)"
if [ "$NODE_MAJOR" != "16" ]; then
echo "make-bundle.sh: Node 16 must be active (got $(node --version 2>/dev/null || echo none))."
echo " run: nvm use (reads .nvmrc → 16.20.2)"
exit 1
fi
for cmd in npm zip rsync; do
command -v "$cmd" >/dev/null || { echo "make-bundle.sh: missing required tool: $cmd"; exit 1; }
done
echo "==> Building production output (vite build)"
npm run build
echo "==> Preparing staging directory: $STAGE"
rm -rf "$DIST"
mkdir -p "$STAGE"
echo "==> Installing production dependencies into staging"
cp package.json package-lock.json "$STAGE/"
( cd "$STAGE" && npm ci --omit=dev --no-audit --no-fund )
echo "==> Swapping better-sqlite3 native binary → win32-x64 / node v$NODE_ABI"
BS3="$STAGE/node_modules/better-sqlite3"
[ -d "$BS3" ] || { echo "make-bundle.sh: better-sqlite3 not present in staging"; exit 1; }
(
cd "$BS3"
# Remove the Linux binary that npm just installed; prebuild-install would
# otherwise skip the download believing the binary is already in place.
rm -rf build/Release
npx --no-install prebuild-install \
--runtime=node \
--target="v$NODE_VERSION" \
--platform=win32 \
--arch=x64 \
--verbose
)
# Confirm the swap landed.
if [ ! -f "$BS3/build/Release/better_sqlite3.node" ]; then
echo "make-bundle.sh: prebuild-install did not produce build/Release/better_sqlite3.node"
exit 1
fi
echo " binary: $(file "$BS3/build/Release/better_sqlite3.node" | cut -d: -f2-)"
echo "==> Copying app files into staging"
rsync -a --delete build/ "$STAGE/build/"
mkdir -p "$STAGE/scripts"
cp scripts/init-db.js "$STAGE/scripts/"
mkdir -p "$STAGE/src/lib/server"
cp src/lib/server/schema.sql src/lib/server/seed.sql "$STAGE/src/lib/server/"
mkdir -p "$STAGE/data" "$STAGE/backups"
echo "==> Copying deploy/ assets to the bundle root (double-click access)"
# README, .bat launchers, MSI installers — all at the top level of the zip.
cp deploy/install.bat deploy/start.bat deploy/backup.bat "$STAGE/"
cp deploy/README.md "$STAGE/"
cp deploy/node-v16.20.2-x64.msi "$STAGE/"
cp deploy/node-v16.20.2-x86.msi "$STAGE/"
echo "==> Creating zip: $ZIP"
( cd "$DIST" && zip -rq "$(basename "$ZIP")" "$(basename "$STAGE")" )
ZIP_SIZE="$(du -h "$ZIP" | cut -f1)"
echo
echo "Bundle ready:"
echo " $ZIP ($ZIP_SIZE)"

View File

@ -1,16 +1,5 @@
<script> <script>
import { onNavigate } from '$app/navigation';
import Header from '$lib/components/Header.svelte'; import Header from '$lib/components/Header.svelte';
onNavigate((navigation) => {
if (!document.startViewTransition) return;
return new Promise((resolve) => {
document.startViewTransition(async () => {
resolve();
await navigation.complete;
});
});
});
</script> </script>
<Header /> <Header />