尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Check equipment in and out, track supply levels, and keep a full activity log. One installer, one PC on your network, no monthly fees.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A self-hosted inventory management system for small teams. Runs as a Windows service with a web UI accessible from any device on your network.
/terminal screen for a shared tablet or front desk: scan or search, then check out, check in, consume, and (for Admins/Managers) restockINSUFFICIENT_QUANTITY, and interactive Swagger docs are served at /api/docsInventoryStore-Setup-<version>.exe from the latest releaseLinux runs the same web app headless as a systemd service (no tray icon - manage it with systemctl and reach the UI in your browser).
InventoryStore-linux-x64-<version>.tar.gz from the latest releasetar xzf InventoryStore-linux-x64-<version>.tar.gz
cd InventoryStore-linux-x64-<version>
sudo ./install.sh
inventorystore service account, installs to /opt/inventorystore, stores data in /var/lib/inventorystore, and enables the service at boothttp://<host-ip>:5050) to create your admin accountService management:
systemctl status inventorystore # check state
journalctl -u inventorystore -f # follow logs
sudo systemctl restart inventorystore
Linux system requirements:
openssh-client (sudo apt install openssh-client) - required only for Serveo remote accessInventory Store can manage its own certificate. Go to Settings → Network → HTTPS / TLS and choose:
ufw and any cloud provider security group).pfx (certificate + key) if you already have oneThe systemd unit grants CAP_NET_BIND_SERVICE so the unprivileged service can bind ports 80 and 443.
If a reverse proxy (HostRouter, nginx, Traefik, a cloud load balancer) already terminates TLS in front of Inventory Store, the app should not own the machine's web ports. Set a port override and it switches into proxy mode:
X-Forwarded-For, -Proto and -Host are honoured, so the client IP, Request.IsHttps and generated links reflect the public request rather than the proxy hop.Linux - add a drop-in at /etc/systemd/system/inventorystore.service.d/hosted.conf (a ready-made linux/hosted.conf.sample ships in this repo):
[Service]
Environment=Proxy__Port=8080
Environment=Proxy__RedirectToTls=false
Windows - add the Proxy section to appsettings.json next to the executable:
"Proxy": {
"Port": 8080,
"RedirectToTls": false
}
| Setting | Env alias | Meaning |
|---|---|---|
Proxy:Port | INVENTORYSTORE_PROXY_PORT | Port to bind instead of 5050. Setting it turns proxy mode on. |
Proxy:RedirectToTls | INVENTORYSTORE_PROXY_REDIRECT_TO_TLS | Redirect plain-HTTP requests to https://. Uses the forwarded scheme, so it only fires when the proxy itself received plain HTTP - it cannot loop. Leave off if the proxy already redirects. |
Proxy:Enabled | INVENTORYSTORE_PROXY_ENABLED | Turn on forwarded-header handling without changing the port. Implied by Proxy:Port. |
Proxy:TrustedProxies | INVENTORYSTORE_PROXY_TRUSTED_PROXIES | Comma-separated upstream IPs allowed to set X-Forwarded-*. Unset accepts them from any upstream, which is fine when the app port is reachable only by the proxy. |
Restart the service after changing these; they are read once at startup.
See QUICKSTART.md for step-by-step instructions on the most common tasks.
See the User Guide for full documentation.
Inventory Store can expose the web UI over the internet so staff can access it from outside the office without VPN or port forwarding.
Go to Settings → Remote Access and choose:
| Option | Description |
|---|---|
| Quick Tunnel | Zero-config Cloudflare tunnel - URL changes each session |
| Serveo | Free persistent subdomain (yourname.serveousercontent.com) - requires a free Serveo account |
| localtunnel | Free subdomain via loca.lt - shows an interstitial page to visitors |
Serveo setup (one-time):
When you run Inventory Store as a managed, hosted instance for a customer, set the environment variable PROFESSIONAL_SERVICES_HOSTED=true before starting the app. It is read once at startup.
In this mode the first admin account (the earliest-created admin) becomes a protected system account that the customer cannot tamper with:
Create your provider admin first so it becomes the protected account, then create a separate admin for the customer.
Set the variable wherever the service environment is defined. On Linux, add it to the systemd unit:
[Service]
Environment=PROFESSIONAL_SERVICES_HOSTED=true
On Windows, add it to the service's environment (for example via the registry Environment value for the service, or a machine environment variable) and restart the service.
Leave the variable unset, or set to any value other than true, for normal self-hosted use; the first admin then behaves like any other admin.
cd src/InventoryStore.App
dotnet run
On Windows the app starts in tray mode; on Linux it runs headless. Either way it hosts the web UI at http://localhost:5051 (dev mode uses 5051 to avoid conflicting with a running production service on 5050).
The build target is selected by the runtime identifier: a linux-* RID compiles a headless net8.0 build (no WinForms, no tray), and anything else compiles the Windows net8.0-windows build with the tray companion. Plain dotnet run with no RID uses the Windows configuration.
dotnet publish src/InventoryStore.App/InventoryStore.App.csproj \
-c Release -r linux-x64 --self-contained true \
-p:PublishSingleFile=true -o publish/linux-app
Stage the release archive alongside the systemd files in linux/:
mkdir -p stage/app && cp -r publish/linux-app/. stage/app/
cp linux/install.sh linux/inventorystore.service stage/
tar czf InventoryStore-linux-x64.tar.gz -C stage .
# Requires ImageMagick: choco install imagemagick.app
pwsh tools/New-Icon.ps1
# Requires Inno Setup: choco install innosetup
$v = (Get-Date -Format "yyyyMMdd.HHmm")
dotnet publish src/InventoryStore.App -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -o publish/app
dotnet publish src/InventoryStore.Tray -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -o publish/tray
iscc /DAppVersion="$v" /DAppSemVer="1.$v" installer/setup.iss
Push a tag in the format vYY.MMDD.HHMM to trigger the GitHub Actions release workflow. Add -rc for a prerelease:
git tag -a v26.0606.1430-rc -m "v26.0606.1430-rc"
git push origin v26.0606.1430-rc
pwsh deploy/promote-release.ps1 v26.0606.1430-rc # later: make the prerelease the stable release
The workflow runs the tests, builds the Windows installer and the Linux archive, and creates the release. A prerelease
is not offered as an update to anyone: the in-app update check and update.sh only look at the latest stable release.
Tags in the old vYYYYMMDD.HHMM format no longer trigger a release.
The extra inventorystore-hosted.tar.gz asset is for hosted deployments that install releases automatically; it is not
needed for the steps above.
InventoryStore.Domain - Entities, repository interfaces
InventoryStore.Application - Services, DTOs, service interfaces
InventoryStore.Infrastructure - EF Core (SQLite), repository implementations
InventoryStore.App - ASP.NET Core web server + Windows service host
InventoryStore.Tray - Lightweight tray companion (manages the service)
Data is stored in %APPDATA%\InventoryStore\inventory.db (SQLite). The schema is automatically migrated on startup - no manual migration steps required.
MIT - see LICENSE.
Third-party software notices: see NOTICES.md.