Files
avtoambor/INSTALL_WINDOWS.md
2026-05-16 07:54:15 +05:00

303 lines
10 KiB
Markdown

# Installing AvtoAmbor on Windows (7 or higher)
This guide installs AvtoAmbor as a background service that starts automatically
when the machine boots, and opens itself in the default browser on login. After
setup the shop staff just turn the computer on — the app is running at
`http://localhost:3000` before they log in, and a browser tab opens to it
right after they log in.
> **Node.js version note for Windows 7 / 8**
> Node.js 20 (used in the Docker dev image) officially supports Windows 10+
> only. On **Windows 7 or 8** install **Node.js 16.x** instead (the last line
> that runs on those versions). SvelteKit's Node adapter and `better-sqlite3`
> both run fine on Node 16. On **Windows 10 or 11** use **Node.js 20 LTS**.
---
## 1. Prepare the build on the dev machine
On the Linux dev box, produce a production build and gather the files needed
on the Windows host.
```sh
make build # produces ./build (SvelteKit adapter-node output)
make db-init # ensure data/avtoambor.db exists (skip if you already have one)
```
Then create a single folder you'll copy to Windows. Call it `avtoambor-dist`:
```
avtoambor-dist/
├── build/ # entire ./build directory from `make build`
├── data/
│ └── avtoambor.db # the SQLite database
├── package.json
├── package-lock.json
└── scripts/ # only if you want db-init available on the host
```
`node_modules/` is **not** copied — it will be reinstalled on Windows so the
native `better-sqlite3` binary matches the Windows Node version.
Zip the folder and transfer it (USB stick, network share, scp, etc.).
---
## 2. On the Windows machine — one-time install
### 2.1 Install Node.js
- **Windows 10 / 11**: download the LTS x64 MSI from <https://nodejs.org> and
run the installer with defaults. Verify in a new `cmd` window:
```
node --version
npm --version
```
- **Windows 7 / 8**: download Node.js **v16.20.2** from
<https://nodejs.org/dist/v16.20.2/> (`node-v16.20.2-x64.msi`). Install with
defaults. Same verification.
If the `node` command isn't found in a new terminal, log out and back in (the
installer adds `PATH` entries that don't apply to already-open shells).
### 2.2 Install build tools for `better-sqlite3`
`better-sqlite3` is a native module and needs a C++ toolchain to compile on
first install:
```
npm install --global --production windows-build-tools
```
> On Node 16+ this package is deprecated but still works. Alternatively, install
> "Desktop development with C++" from the Visual Studio Build Tools 2019
> installer (<https://aka.ms/vs/16/release/vs_buildtools.exe>) plus Python 3.
### 2.3 Lay the app down
Pick a stable location — `C:\AvtoAmbor` is the convention used below. Extract
the zip so you end up with:
```
C:\AvtoAmbor\
├── build\
├── data\avtoambor.db
├── package.json
├── package-lock.json
└── scripts\
```
Open `cmd.exe` **as Administrator**, cd into the folder, and install
production dependencies:
```
cd C:\AvtoAmbor
npm ci --omit=dev
```
This compiles `better-sqlite3` against the installed Node version. It can take
a few minutes the first time.
### 2.4 Smoke-test
Still in `C:\AvtoAmbor`:
```
node build\index.js
```
You should see a line like `Listening on 0.0.0.0:3000`. Open
<http://localhost:3000> in any browser to confirm the UI loads. Press
`Ctrl+C` to stop.
---
## 3. Run as a Windows service that starts on boot
We use **NSSM** (the Non-Sucking Service Manager) — it's a single tiny `.exe`,
no installer needed, and runs identically on Windows 7 through 11.
### 3.1 Install NSSM
1. Download `nssm-2.24.zip` from <https://nssm.cc/release/nssm-2.24.zip>.
2. Extract it. Copy `nssm-2.24\win64\nssm.exe` to `C:\AvtoAmbor\nssm.exe`
(use `win32\nssm.exe` instead if your Windows is 32-bit).
### 3.2 Register the service
In an **Administrator** `cmd.exe`:
```
cd C:\AvtoAmbor
nssm install AvtoAmbor
```
A GUI window opens. Fill in:
| Tab | Field | Value |
| ------------- | ------------------ | -------------------------------------- |
| Application | Path | `C:\Program Files\nodejs\node.exe` |
| Application | Startup directory | `C:\AvtoAmbor` |
| Application | Arguments | `build\index.js` |
| Details | Display name | `AvtoAmbor` |
| Details | Description | `Auto-parts inventory web app` |
| Details | Startup type | `Automatic` |
| Log on | (leave as) | `Local System account` |
| Process | Process priority | `Normal` |
| I/O | Output (stdout) | `C:\AvtoAmbor\logs\out.log` |
| I/O | Error (stderr) | `C:\AvtoAmbor\logs\err.log` |
| File rotation | Rotate Files | ✔ (rotate at 10 MB is fine) |
| Environment | (one var per line) | `NODE_ENV=production` |
| | | `PORT=3000` |
| | | `HOST=0.0.0.0` |
| | | `TZ=Asia/Dushanbe` |
Create the log folder first:
```
mkdir C:\AvtoAmbor\logs
```
Click **Install service**, then start it:
```
nssm start AvtoAmbor
```
Verify:
```
sc query AvtoAmbor
```
Should report `STATE : 4 RUNNING`. Open <http://localhost:3000> in a browser
— the app should respond.
> **Prefer the command line?** The same service can be created without the
> GUI:
> ```
> nssm install AvtoAmbor "C:\Program Files\nodejs\node.exe" "build\index.js"
> nssm set AvtoAmbor AppDirectory C:\AvtoAmbor
> nssm set AvtoAmbor AppStdout C:\AvtoAmbor\logs\out.log
> nssm set AvtoAmbor AppStderr C:\AvtoAmbor\logs\err.log
> nssm set AvtoAmbor AppEnvironmentExtra NODE_ENV=production PORT=3000 HOST=0.0.0.0 TZ=Asia/Dushanbe
> nssm set AvtoAmbor Start SERVICE_AUTO_START
> nssm start AvtoAmbor
> ```
### 3.3 Allow port 3000 if other machines on the LAN need access
Skip this section if only the local machine ever opens the app.
```
netsh advfirewall firewall add rule name="AvtoAmbor 3000" dir=in action=allow protocol=TCP localport=3000
```
---
## 4. Open the app in a browser automatically on login
The service runs before any user logs in, but you probably want a browser tab
to open as soon as the shop user logs in.
1. Press `Win + R`, type `shell:startup`, press Enter.
That opens `C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`.
2. Right-click → **New → Shortcut**.
3. Location of the item:
```
"C:\Program Files\Google\Chrome\Application\chrome.exe" --start-maximized --app=http://localhost:3000
```
(Use `msedge.exe` from `C:\Program Files (x86)\Microsoft\Edge\Application\`
if Chrome isn't installed, or `firefox.exe` from
`C:\Program Files\Mozilla Firefox\`.)
4. Name the shortcut `AvtoAmbor`.
`--app=` opens the page in a kiosk-style frameless window — feels more like a
desktop app and hides the address bar. Drop the flag if you want a normal
browser window.
> **Tip — start the browser slightly after login**
> If Chrome opens before the service has fully started, the first load may
> fail. Replace the shortcut target with a small batch file
> (`C:\AvtoAmbor\open-browser.bat`) that waits a few seconds:
> ```bat
> @echo off
> timeout /t 5 /nobreak >nul
> start "" "C:\Program Files\Google\Chrome\Application\chrome.exe" --start-maximized --app=http://localhost:3000
> ```
> and point the Startup shortcut at that batch file.
---
## 5. Day-to-day operations
| Task | Command (Admin `cmd`) |
| -------------------------- | ---------------------------------------------- |
| Start the service | `nssm start AvtoAmbor` |
| Stop the service | `nssm stop AvtoAmbor` |
| Restart | `nssm restart AvtoAmbor` |
| Check status | `sc query AvtoAmbor` |
| Edit service settings | `nssm edit AvtoAmbor` |
| Remove the service | `nssm remove AvtoAmbor confirm` |
| Tail the app log | `type C:\AvtoAmbor\logs\out.log` |
| Tail the error log | `type C:\AvtoAmbor\logs\err.log` |
The Services snap-in (`services.msc`) also shows **AvtoAmbor** and can be
used by anyone with admin rights.
---
## 6. Backups
The SQLite database is a single file: `C:\AvtoAmbor\data\avtoambor.db`. Stop
the service before copying it, or use the in-app backup endpoint if one
exists. A minimal nightly backup with Task Scheduler:
1. Create `C:\AvtoAmbor\backup.bat`:
```bat
@echo off
set STAMP=%date:~-4%-%date:~-10,2%-%date:~-7,2%
copy /Y "C:\AvtoAmbor\data\avtoambor.db" "C:\AvtoAmbor\backups\avtoambor-%STAMP%.db"
```
2. `mkdir C:\AvtoAmbor\backups`
3. Task Scheduler → **Create Basic Task** → Daily → run `backup.bat` at e.g.
02:00 → "Run whether user is logged on or not" + highest privileges.
---
## 7. Upgrading to a new version of the app
```
nssm stop AvtoAmbor
```
Replace `C:\AvtoAmbor\build\` with the new `build/` directory. If
`package.json` or `package-lock.json` changed, also copy those over and run:
```
cd C:\AvtoAmbor
npm ci --omit=dev
```
Then:
```
nssm start AvtoAmbor
```
The database in `data\` is untouched by an upgrade.
---
## 8. Troubleshooting
- **Service won't start, no useful error**
Check `C:\AvtoAmbor\logs\err.log`. The two most common causes are
(a) `better-sqlite3` was compiled against a different Node version — rerun
`npm ci --omit=dev`; (b) port 3000 is already in use — `netstat -ano | findstr :3000`
to find the offending PID.
- **`Error: The module was compiled against a different Node.js version`**
You upgraded Node. From `C:\AvtoAmbor` run `npm rebuild better-sqlite3`.
- **Browser shows "This site can't be reached" right after login**
The service hadn't finished starting. Use the batch-file delay trick in §4.
- **Database is locked**
Something else has the DB open — usually a stray `node.exe` from a previous
manual run. End it in Task Manager, then `nssm restart AvtoAmbor`.
- **Need to access from another PC on the LAN**
Confirm the firewall rule (§3.3) and open `http://<windows-host-ip>:3000`
from the other machine. Find the IP with `ipconfig`.