Repository navigation
ser2net v2.8.0 — Turkish web UI, Linux arm64, Windows service, Docker image, notifications, Modbus write + Sparkplug B, classic ser2net import (#28–#32)
Upgrading from 2.7.x
Nothing to migrate: replace the program (or pull the new image) and restart. config.json and data/ are used as they are.
- Backups: the first configuration change keeps the old
config.jsonindata/backups/. - Trace paths: a trace path in an old config becomes a file name under
data/traces/, and the start-up log names the move. This is a security fix (below). - Docker: the image runs as an unprivileged user (uid 10001). A
/datavolume written by the old root image is taken over on its first start. The image is now on GHCR:ghcr.io/haliskilic/ser2net:2.8.0(also2.8andlatest), for amd64 + arm64.docker-compose.ymluses it. - Web UI language: English or Turkish, by the browser's language, unless a visitor picks TR / EN or the admin sets Settings → Web UI access → Default language.
- Import: importing now shows a preview first. Scripts that post the 2.7-style one-step import still replace every mapping, as before.
Security
- Updating is recommended: v2.7.1 ships dependency versions with known vulnerabilities. They are fixed here:
- starlette: GHSA-82w8-qh3p-5jfq (high), form size limits ignored for URL-encoded bodies, which affects the sign-in form; GHSA-jp82-jpqv-5vv3 (low).
- anyio: GHSA-82r6-8w77-94w6 and GHSA-5p39-cfhj-2xmp.
- pyasn1 0.6.5 (ldap3), bundled in the executables.
- Traces can no longer write outside the data directory. A mapping's trace was a free file path, so an operator (not only an admin) could have network bytes appended to any file the service may write:
config.json, a startup script, and as root in Docker. Traces now always go to<data>/traces/<mapping id>-<file name>. - The Docker image no longer runs as root.
- Audit records can't be forged with control characters in a user-supplied name.
Added
-
Turkish web UI next to English. Logs, the audit log and the REST API stay English; notifications use the admin's default language.
-
USB identity: a mapping can find its device by VID:PID + serial number, so re-plugging an adapter as another
ttyUSB*/COM*keeps it working.- The port list shows
/dev/serial/by-idnames, and they can be selected. - The kernel's placeholder
ttySports without hardware are hidden.
- The port list shows
-
Notifications by webhook (JSON, Slack/Mattermost, Microsoft Teams, Discord, Telegram) and/or e-mail (SMTP) when:
- a serial device is lost or comes back;
- a mapping fails to start;
- clients connect or disconnect;
- a sign-in fails.
Repeats are suppressed and the rate is limited; Settings → Notifications can send a test message.
-
Dashboard: search, state filter, sort, and start / stop / restart of the selected mappings. The table is redrawn only when it changed, so it no longer flickers or loses the selection.
-
Traces in the UI: download a mapping's trace files (current + rotated), and a live hex view in the console with both directions and timestamps.
-
Modbus write from MQTT: points with
"writable": truetake values from<topic>/<point>/set.- Coils use FC5/FC15, holding registers FC6/FC16. The result goes to
…/set/result. - Coils and discrete inputs (FC1/FC2) can be polled too.
- Coils use FC5/FC15, holding registers FC6/FC16. The result goes to
-
Sparkplug B: a Modbus-polling mapping can be an edge node whose devices are the Modbus units it polls (
unit1,unit2, …).- NBIRTH/NDEATH carry
bdSeq; DBIRTH/DDATA carryseq. - Points are written through DCMD; NCMD triggers a rebirth.
- No protobuf dependency.
- NBIRTH/NDEATH carry
-
Import from the classic ser2net:
ser2net.yaml(4.x) andser2net.conf(3.x) go through the import preview. Options without an equivalent are listed as warnings.- ser2net opens a device only while a client is connected, but a mapping here keeps it open. So of several ports on one device, the first comes in enabled and the others disabled.
-
Configuration backups (newest 50, download / restore; a restore can be undone), an import preview (merge or replace) and an audit log viewer (search, filters, CSV) in Settings.
-
Linux arm64 executable (
ser2net-linux-arm64, glibc ≥ 2.28): Raspberry Pi 3/4/5 with a 64-bit OS, ARM gateways. -
Windows service with no extra software:
ser2net.exe --install-service/--uninstall-service.- It starts at boot and restarts after a failure;
--service-nameallows several instances.
- It starts at boot and restarts after a failure;
-
Release integrity:
SHA256SUMS, a CycloneDX SBOM per executable, and GitHub build-provenance and SBOM attestations. -
--about: component versions for bug reports. -
--licenses: the license texts of every bundled component. -
--healthcheck: used by the Docker HEALTHCHECK. -
SER2NET_LIB_OVERRIDE: loads a replacement ldap3 (LGPL).
Fixed
- The session lifetime setting now takes effect: sessions always lasted 8 hours before. It is under Settings → Web UI access.
- Writing a trace no longer blocks the event loop, and trace files rotate at a size limit (default 10 MB, 3 old files kept).
- The Docker HEALTHCHECK no longer reports a fresh container unhealthy while it waits for the first-run setup.
Changed
- Dependencies updated: starlette 1.10.0, uvicorn 0.54.0, websockets 17.4, python-multipart 0.0.33, anyio 4.16.0.
- Python 3.10 keeps the last releases that support it.
- The offline wheels in
vendor/wheels/match.
- CI adds mypy, pip-audit, coverage and Dependabot, and
mainis protected. - New repository files:
SECURITY.md,CONTRIBUTING.md,CHANGELOG.md.
Tested before publishing
- Every PR runs the test suite on Linux and Windows × Python 3.10–3.13.
- The executables are built and tested before they are attached. That includes the arm64 one, in 9 clean distributions each, and a real Windows service install / restart-after-crash / stop / uninstall.
- The dashboard, the mapping views and the settings page are checked in a browser at 1440 → 390 px, in English and Turkish.
- The Docker image is smoke-tested on amd64 and arm64, including the upgrade from a v2.7.1 volume.
Verify a download
sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify ser2net-linux-x64 --repo haliskilic/ser2net
Türkçe özet
- Türkçe arayüz: üst menüde TR / EN; seçilmemişse tarayıcının dili ya da admin'in varsayılan dili. Log'lar, audit log ve REST API İngilizce kalıyor.
- Güncellemen önerilir: v2.7.1'deki starlette ve anyio sürümlerinde bilinen güvenlik açıkları var, bu sürümde kapandı.
- Trace güvenlik düzeltmesi: trace dosyaları artık yalnızca
data/traces/altına yazılabiliyor. Eskiden bir operator herhangi bir dosyaya yazdırabiliyordu. - Yeni özellikler:
- USB kimliğiyle cihaz bulma;
- webhook ve e-posta bildirimleri;
- panoda arama, filtre ve toplu işlem;
- trace indirme ve canlı hex görünümü;
- MQTT'den Modbus yazma;
- Sparkplug B (her Modbus unit'i bir cihaz);
- klasik
ser2net.yaml/ser2net.confiçe aktarma; - config yedekleri ve geri yükleme;
- içe aktarma önizlemesi;
- audit log ekranı.
- Dağıtım:
- Linux arm64 binary'si;
- ek program gerektirmeyen Windows servisi;
- GHCR'de amd64 + arm64 Docker imajı (root olmayan kullanıcıyla);
SHA256SUMS, SBOM ve build provenance.
- Yükseltme: v2.7.x'ten geçişte bir şey yapmana gerek yok.
config.jsonvedata/olduğu gibi kullanılıyor; ilk değişiklikte eski configdata/backups/içine yedekleniyor.
Downloads: ser2net-windows-x64.exe (Windows 10/11, Server 2016+) · ser2net-linux-x64 (x86_64, glibc ≥ 2.28) · ser2net-linux-arm64 (aarch64, glibc ≥ 2.28). They are standalone: nothing else to install. Docker: docker pull ghcr.io/haliskilic/ser2net:2.8.0.