GGitHubrelease/v0.7.69 (#709)
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
ci(contract): leave socket auth off, as production has it (#719) The contract stack should match production, where socket auth stays off until the #710 rollout reaches it. The socket-token endpoints answer 404 while it is off, and fleetbase/postman#71 asserts that unless the environment declares socket_auth_enabled. Reverts the switch from #717/#718. | 15 天前 | |
release/v0.7.69 (#709) * chore(release): v0.7.69 * ci: fix Build Fleetbase Binaries workflow (#701) * ci: compile the geos PHP extension into the static binaries (#702) * feat(backups): admin Database Backups page and mysqldump in the image (#703) * feat(socket-auth): Fleetbase socket server with JWT auth and signed internal publish (#704) * Feature/socket auth (#710) * feat(socket-auth): add the Fleetbase socket server with JWT auth and signed internal publish socket/ builds fleetbase/fleetbase-socket: SocketCluster 17 that verifies API-minted HS256 tokens, authorizes channel subscriptions (local rules, LRU cache, then the API authorize endpoint with a 2 s timeout, failing closed), refuses client publish/transmit/invoke in enforce mode, kicks sockets out on token expiry or identity change, and serves a signed POST /publish and GET /stats on an internal-only listener. Modes: off, log, enforce. Includes node:test unit and integration tests and a Socket CI workflow. * feat(socket-auth): deploy the new socket image with a shared auth key - docker-compose: socket service uses fleetbase/fleetbase-socket (build fallback), publishes only 38000:8000, gets SOCKETCLUSTER_AUTH_KEY/AUTH_MODE/AUTHORIZE_URL; application, queue and scheduler get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL=http://socket:8001. Drops the unused SOCKETCLUSTER_WORKERS/BROKERS. An unset key keeps auth off. - docker-install.sh: generates a 64-char key into the project .env on fresh installs (kept on re-run) and defaults SOCKETCLUSTER_AUTH_MODE to enforce. - helm: socketcluster runs the new image with the key from a Secret (authKey or existingSecret), an auth mode value, the API authorize URL, and a separate ClusterIP-only socketcluster-internal Service for port 8001; API deployments get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL. - docker-bake/publish-docker-images: build and push fleetbase/fleetbase-socket for amd64 and arm64 on release tags; install-smoke builds it from source. * feat(socket-auth): console socket test page listens on test.{user uuid} The configure/socket page subscribed to a shared 'test' channel, which socket auth no longer allows. It now subscribes to the current user's own test.{user uuid} channel, posts that channel to settings/test-socket, follows the channel the API reports publishing to, and logs refused subscriptions. * test(socket-auth): match prettier line wrapping in the console socket test * fix(socket-auth): drop the never-evaluated channelName initializer The constructor subscribes (and sets channelName) before anything reads it, so the tracked initializer never ran and left an uncovered statement. * feat(socket-auth): SOCKETCLUSTER_AUTH_ENABLED switch, off by default Socket auth turned on as soon as a key was present, and fresh installs got a generated key in enforce mode. That would refuse every socket client that does not fetch tokens yet (released mobile apps, Navigator), and the API's own websocket publisher, which keeps publishing as a plain client until it is switched on too. - Socket server: SOCKETCLUSTER_AUTH_ENABLED (true/1/yes/on, default off). While off the mode is forced to `off` whatever the key and mode, the key is not handed to SocketCluster, and the internal publish/stats endpoints stay closed. Startup logs a warning saying auth is off. - docker-compose: passes SOCKETCLUSTER_AUTH_ENABLED (default false) to socket, application, queue and scheduler, matching core-api's switch. - docker-install.sh: still generates and keeps the key, but writes SOCKETCLUSTER_AUTH_ENABLED=false (kept on re-run) and mode `log`, so turning it on starts by logging would-denies. - Helm: socketcluster.authEnabled (default false), rendered as SOCKETCLUSTER_AUTH_ENABLED for the API deployments and the socket server. - socket/README.md: the switch and the rollout order. - Tests: switch-off config cases, parseSwitch, and an integration test where a keyed server with enforce requested and the switch off allows everything and never calls the API. * feat(socket-auth): pass SOCKETCLUSTER_ORIGIN to the API publisher The API's websocket publisher sends no Origin header, which socketcluster-server treats as '*'. With restricted origins every broadcast is refused with 'Invalid origin: *'. The installer now writes an allowed origin to the project .env (kept on re-runs), compose hands it to application, queue and scheduler, and the chart exports socketcluster.origin to the API deployments when set. * feat(console): let public /~/ pages carry a nested path (#711) /~/:slug matched a single segment, so /~/t/{company}/{number} fell through to the catch-all and redirected to sign-in. A wildcard child keeps the virtual route rendering the page, which reads the rest from the URL. * fix(console): application loading action bubbles so extension loading substates render * fix(console): let public /~/ pages scroll again (#712) The theme service puts the current route's name and bodyClassNames on the body, and body.virtual is what lets a public page scroll. Since #711 the current route is virtual.index or virtual.path, so the class was gone and public pages (tracking, inspection) could not scroll. Both child routes now carry the virtual body class. * feat(console): SMS Guard admin page (#714) * feat(console): SMS Guard admin page Admin → API Traffic → SMS Guard: the policy that bounds the platform's text messages (enable, enforce/monitor mode, budgets per organization and platform- wide, destination rules, circuit breaker thresholds, blocked countries and prefixes, alert emails), per-organization exceptions, the pauses in force with a way to pause an organization or lift a pause, and usage per organization from the send ledger. Backed by core-api's int/v1/sms-guard endpoints. * fix(console): drop a stray blank line in the SMS Guard template * fix(console): satisfy lint on the router and SMS Guard tests (#715) * test(console): expect the SMS Guard page in the API Traffic navigator group (#716) * release: v0.7.69 upgrades to the published components core-api 1.6.70, fleetops 0.6.72, storefront 0.4.25, ledger 0.0.13, customer-portal 0.0.16, dev-engine 0.2.18, ember-ui 0.4.6, ember-core 0.3.26 and fleetops-data 0.2.3, in composer.json, package.json, the lock files, the pnpm overrides and the submodule pointers. app/router.js gains the sms-guard and database-backups admin routes that #703 and #714 added only to router.map.js. RELEASE.md covers every module version and the PRs that went into each release branch. * Refresh ERD for release/v0.7.69 (#720) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 15 天前 | |
release/v0.7.69 (#709) * chore(release): v0.7.69 * ci: fix Build Fleetbase Binaries workflow (#701) * ci: compile the geos PHP extension into the static binaries (#702) * feat(backups): admin Database Backups page and mysqldump in the image (#703) * feat(socket-auth): Fleetbase socket server with JWT auth and signed internal publish (#704) * Feature/socket auth (#710) * feat(socket-auth): add the Fleetbase socket server with JWT auth and signed internal publish socket/ builds fleetbase/fleetbase-socket: SocketCluster 17 that verifies API-minted HS256 tokens, authorizes channel subscriptions (local rules, LRU cache, then the API authorize endpoint with a 2 s timeout, failing closed), refuses client publish/transmit/invoke in enforce mode, kicks sockets out on token expiry or identity change, and serves a signed POST /publish and GET /stats on an internal-only listener. Modes: off, log, enforce. Includes node:test unit and integration tests and a Socket CI workflow. * feat(socket-auth): deploy the new socket image with a shared auth key - docker-compose: socket service uses fleetbase/fleetbase-socket (build fallback), publishes only 38000:8000, gets SOCKETCLUSTER_AUTH_KEY/AUTH_MODE/AUTHORIZE_URL; application, queue and scheduler get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL=http://socket:8001. Drops the unused SOCKETCLUSTER_WORKERS/BROKERS. An unset key keeps auth off. - docker-install.sh: generates a 64-char key into the project .env on fresh installs (kept on re-run) and defaults SOCKETCLUSTER_AUTH_MODE to enforce. - helm: socketcluster runs the new image with the key from a Secret (authKey or existingSecret), an auth mode value, the API authorize URL, and a separate ClusterIP-only socketcluster-internal Service for port 8001; API deployments get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL. - docker-bake/publish-docker-images: build and push fleetbase/fleetbase-socket for amd64 and arm64 on release tags; install-smoke builds it from source. * feat(socket-auth): console socket test page listens on test.{user uuid} The configure/socket page subscribed to a shared 'test' channel, which socket auth no longer allows. It now subscribes to the current user's own test.{user uuid} channel, posts that channel to settings/test-socket, follows the channel the API reports publishing to, and logs refused subscriptions. * test(socket-auth): match prettier line wrapping in the console socket test * fix(socket-auth): drop the never-evaluated channelName initializer The constructor subscribes (and sets channelName) before anything reads it, so the tracked initializer never ran and left an uncovered statement. * feat(socket-auth): SOCKETCLUSTER_AUTH_ENABLED switch, off by default Socket auth turned on as soon as a key was present, and fresh installs got a generated key in enforce mode. That would refuse every socket client that does not fetch tokens yet (released mobile apps, Navigator), and the API's own websocket publisher, which keeps publishing as a plain client until it is switched on too. - Socket server: SOCKETCLUSTER_AUTH_ENABLED (true/1/yes/on, default off). While off the mode is forced to `off` whatever the key and mode, the key is not handed to SocketCluster, and the internal publish/stats endpoints stay closed. Startup logs a warning saying auth is off. - docker-compose: passes SOCKETCLUSTER_AUTH_ENABLED (default false) to socket, application, queue and scheduler, matching core-api's switch. - docker-install.sh: still generates and keeps the key, but writes SOCKETCLUSTER_AUTH_ENABLED=false (kept on re-run) and mode `log`, so turning it on starts by logging would-denies. - Helm: socketcluster.authEnabled (default false), rendered as SOCKETCLUSTER_AUTH_ENABLED for the API deployments and the socket server. - socket/README.md: the switch and the rollout order. - Tests: switch-off config cases, parseSwitch, and an integration test where a keyed server with enforce requested and the switch off allows everything and never calls the API. * feat(socket-auth): pass SOCKETCLUSTER_ORIGIN to the API publisher The API's websocket publisher sends no Origin header, which socketcluster-server treats as '*'. With restricted origins every broadcast is refused with 'Invalid origin: *'. The installer now writes an allowed origin to the project .env (kept on re-runs), compose hands it to application, queue and scheduler, and the chart exports socketcluster.origin to the API deployments when set. * feat(console): let public /~/ pages carry a nested path (#711) /~/:slug matched a single segment, so /~/t/{company}/{number} fell through to the catch-all and redirected to sign-in. A wildcard child keeps the virtual route rendering the page, which reads the rest from the URL. * fix(console): application loading action bubbles so extension loading substates render * fix(console): let public /~/ pages scroll again (#712) The theme service puts the current route's name and bodyClassNames on the body, and body.virtual is what lets a public page scroll. Since #711 the current route is virtual.index or virtual.path, so the class was gone and public pages (tracking, inspection) could not scroll. Both child routes now carry the virtual body class. * feat(console): SMS Guard admin page (#714) * feat(console): SMS Guard admin page Admin → API Traffic → SMS Guard: the policy that bounds the platform's text messages (enable, enforce/monitor mode, budgets per organization and platform- wide, destination rules, circuit breaker thresholds, blocked countries and prefixes, alert emails), per-organization exceptions, the pauses in force with a way to pause an organization or lift a pause, and usage per organization from the send ledger. Backed by core-api's int/v1/sms-guard endpoints. * fix(console): drop a stray blank line in the SMS Guard template * fix(console): satisfy lint on the router and SMS Guard tests (#715) * test(console): expect the SMS Guard page in the API Traffic navigator group (#716) * release: v0.7.69 upgrades to the published components core-api 1.6.70, fleetops 0.6.72, storefront 0.4.25, ledger 0.0.13, customer-portal 0.0.16, dev-engine 0.2.18, ember-ui 0.4.6, ember-core 0.3.26 and fleetops-data 0.2.3, in composer.json, package.json, the lock files, the pnpm overrides and the submodule pointers. app/router.js gains the sms-guard and database-backups admin routes that #703 and #714 added only to router.map.js. RELEASE.md covers every module version and the PRs that went into each release branch. * Refresh ERD for release/v0.7.69 (#720) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 15 天前 | |
v0.7.42 | 5 个月前 | |
release/v0.7.69 (#709) * chore(release): v0.7.69 * ci: fix Build Fleetbase Binaries workflow (#701) * ci: compile the geos PHP extension into the static binaries (#702) * feat(backups): admin Database Backups page and mysqldump in the image (#703) * feat(socket-auth): Fleetbase socket server with JWT auth and signed internal publish (#704) * Feature/socket auth (#710) * feat(socket-auth): add the Fleetbase socket server with JWT auth and signed internal publish socket/ builds fleetbase/fleetbase-socket: SocketCluster 17 that verifies API-minted HS256 tokens, authorizes channel subscriptions (local rules, LRU cache, then the API authorize endpoint with a 2 s timeout, failing closed), refuses client publish/transmit/invoke in enforce mode, kicks sockets out on token expiry or identity change, and serves a signed POST /publish and GET /stats on an internal-only listener. Modes: off, log, enforce. Includes node:test unit and integration tests and a Socket CI workflow. * feat(socket-auth): deploy the new socket image with a shared auth key - docker-compose: socket service uses fleetbase/fleetbase-socket (build fallback), publishes only 38000:8000, gets SOCKETCLUSTER_AUTH_KEY/AUTH_MODE/AUTHORIZE_URL; application, queue and scheduler get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL=http://socket:8001. Drops the unused SOCKETCLUSTER_WORKERS/BROKERS. An unset key keeps auth off. - docker-install.sh: generates a 64-char key into the project .env on fresh installs (kept on re-run) and defaults SOCKETCLUSTER_AUTH_MODE to enforce. - helm: socketcluster runs the new image with the key from a Secret (authKey or existingSecret), an auth mode value, the API authorize URL, and a separate ClusterIP-only socketcluster-internal Service for port 8001; API deployments get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL. - docker-bake/publish-docker-images: build and push fleetbase/fleetbase-socket for amd64 and arm64 on release tags; install-smoke builds it from source. * feat(socket-auth): console socket test page listens on test.{user uuid} The configure/socket page subscribed to a shared 'test' channel, which socket auth no longer allows. It now subscribes to the current user's own test.{user uuid} channel, posts that channel to settings/test-socket, follows the channel the API reports publishing to, and logs refused subscriptions. * test(socket-auth): match prettier line wrapping in the console socket test * fix(socket-auth): drop the never-evaluated channelName initializer The constructor subscribes (and sets channelName) before anything reads it, so the tracked initializer never ran and left an uncovered statement. * feat(socket-auth): SOCKETCLUSTER_AUTH_ENABLED switch, off by default Socket auth turned on as soon as a key was present, and fresh installs got a generated key in enforce mode. That would refuse every socket client that does not fetch tokens yet (released mobile apps, Navigator), and the API's own websocket publisher, which keeps publishing as a plain client until it is switched on too. - Socket server: SOCKETCLUSTER_AUTH_ENABLED (true/1/yes/on, default off). While off the mode is forced to `off` whatever the key and mode, the key is not handed to SocketCluster, and the internal publish/stats endpoints stay closed. Startup logs a warning saying auth is off. - docker-compose: passes SOCKETCLUSTER_AUTH_ENABLED (default false) to socket, application, queue and scheduler, matching core-api's switch. - docker-install.sh: still generates and keeps the key, but writes SOCKETCLUSTER_AUTH_ENABLED=false (kept on re-run) and mode `log`, so turning it on starts by logging would-denies. - Helm: socketcluster.authEnabled (default false), rendered as SOCKETCLUSTER_AUTH_ENABLED for the API deployments and the socket server. - socket/README.md: the switch and the rollout order. - Tests: switch-off config cases, parseSwitch, and an integration test where a keyed server with enforce requested and the switch off allows everything and never calls the API. * feat(socket-auth): pass SOCKETCLUSTER_ORIGIN to the API publisher The API's websocket publisher sends no Origin header, which socketcluster-server treats as '*'. With restricted origins every broadcast is refused with 'Invalid origin: *'. The installer now writes an allowed origin to the project .env (kept on re-runs), compose hands it to application, queue and scheduler, and the chart exports socketcluster.origin to the API deployments when set. * feat(console): let public /~/ pages carry a nested path (#711) /~/:slug matched a single segment, so /~/t/{company}/{number} fell through to the catch-all and redirected to sign-in. A wildcard child keeps the virtual route rendering the page, which reads the rest from the URL. * fix(console): application loading action bubbles so extension loading substates render * fix(console): let public /~/ pages scroll again (#712) The theme service puts the current route's name and bodyClassNames on the body, and body.virtual is what lets a public page scroll. Since #711 the current route is virtual.index or virtual.path, so the class was gone and public pages (tracking, inspection) could not scroll. Both child routes now carry the virtual body class. * feat(console): SMS Guard admin page (#714) * feat(console): SMS Guard admin page Admin → API Traffic → SMS Guard: the policy that bounds the platform's text messages (enable, enforce/monitor mode, budgets per organization and platform- wide, destination rules, circuit breaker thresholds, blocked countries and prefixes, alert emails), per-organization exceptions, the pauses in force with a way to pause an organization or lift a pause, and usage per organization from the send ledger. Backed by core-api's int/v1/sms-guard endpoints. * fix(console): drop a stray blank line in the SMS Guard template * fix(console): satisfy lint on the router and SMS Guard tests (#715) * test(console): expect the SMS Guard page in the API Traffic navigator group (#716) * release: v0.7.69 upgrades to the published components core-api 1.6.70, fleetops 0.6.72, storefront 0.4.25, ledger 0.0.13, customer-portal 0.0.16, dev-engine 0.2.18, ember-ui 0.4.6, ember-core 0.3.26 and fleetops-data 0.2.3, in composer.json, package.json, the lock files, the pnpm overrides and the submodule pointers. app/router.js gains the sms-guard and database-backups admin routes that #703 and #714 added only to router.map.js. RELEASE.md covers every module version and the PRs that went into each release branch. * Refresh ERD for release/v0.7.69 (#720) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 15 天前 | |
release/v0.7.69 (#709) * chore(release): v0.7.69 * ci: fix Build Fleetbase Binaries workflow (#701) * ci: compile the geos PHP extension into the static binaries (#702) * feat(backups): admin Database Backups page and mysqldump in the image (#703) * feat(socket-auth): Fleetbase socket server with JWT auth and signed internal publish (#704) * Feature/socket auth (#710) * feat(socket-auth): add the Fleetbase socket server with JWT auth and signed internal publish socket/ builds fleetbase/fleetbase-socket: SocketCluster 17 that verifies API-minted HS256 tokens, authorizes channel subscriptions (local rules, LRU cache, then the API authorize endpoint with a 2 s timeout, failing closed), refuses client publish/transmit/invoke in enforce mode, kicks sockets out on token expiry or identity change, and serves a signed POST /publish and GET /stats on an internal-only listener. Modes: off, log, enforce. Includes node:test unit and integration tests and a Socket CI workflow. * feat(socket-auth): deploy the new socket image with a shared auth key - docker-compose: socket service uses fleetbase/fleetbase-socket (build fallback), publishes only 38000:8000, gets SOCKETCLUSTER_AUTH_KEY/AUTH_MODE/AUTHORIZE_URL; application, queue and scheduler get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL=http://socket:8001. Drops the unused SOCKETCLUSTER_WORKERS/BROKERS. An unset key keeps auth off. - docker-install.sh: generates a 64-char key into the project .env on fresh installs (kept on re-run) and defaults SOCKETCLUSTER_AUTH_MODE to enforce. - helm: socketcluster runs the new image with the key from a Secret (authKey or existingSecret), an auth mode value, the API authorize URL, and a separate ClusterIP-only socketcluster-internal Service for port 8001; API deployments get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL. - docker-bake/publish-docker-images: build and push fleetbase/fleetbase-socket for amd64 and arm64 on release tags; install-smoke builds it from source. * feat(socket-auth): console socket test page listens on test.{user uuid} The configure/socket page subscribed to a shared 'test' channel, which socket auth no longer allows. It now subscribes to the current user's own test.{user uuid} channel, posts that channel to settings/test-socket, follows the channel the API reports publishing to, and logs refused subscriptions. * test(socket-auth): match prettier line wrapping in the console socket test * fix(socket-auth): drop the never-evaluated channelName initializer The constructor subscribes (and sets channelName) before anything reads it, so the tracked initializer never ran and left an uncovered statement. * feat(socket-auth): SOCKETCLUSTER_AUTH_ENABLED switch, off by default Socket auth turned on as soon as a key was present, and fresh installs got a generated key in enforce mode. That would refuse every socket client that does not fetch tokens yet (released mobile apps, Navigator), and the API's own websocket publisher, which keeps publishing as a plain client until it is switched on too. - Socket server: SOCKETCLUSTER_AUTH_ENABLED (true/1/yes/on, default off). While off the mode is forced to `off` whatever the key and mode, the key is not handed to SocketCluster, and the internal publish/stats endpoints stay closed. Startup logs a warning saying auth is off. - docker-compose: passes SOCKETCLUSTER_AUTH_ENABLED (default false) to socket, application, queue and scheduler, matching core-api's switch. - docker-install.sh: still generates and keeps the key, but writes SOCKETCLUSTER_AUTH_ENABLED=false (kept on re-run) and mode `log`, so turning it on starts by logging would-denies. - Helm: socketcluster.authEnabled (default false), rendered as SOCKETCLUSTER_AUTH_ENABLED for the API deployments and the socket server. - socket/README.md: the switch and the rollout order. - Tests: switch-off config cases, parseSwitch, and an integration test where a keyed server with enforce requested and the switch off allows everything and never calls the API. * feat(socket-auth): pass SOCKETCLUSTER_ORIGIN to the API publisher The API's websocket publisher sends no Origin header, which socketcluster-server treats as '*'. With restricted origins every broadcast is refused with 'Invalid origin: *'. The installer now writes an allowed origin to the project .env (kept on re-runs), compose hands it to application, queue and scheduler, and the chart exports socketcluster.origin to the API deployments when set. * feat(console): let public /~/ pages carry a nested path (#711) /~/:slug matched a single segment, so /~/t/{company}/{number} fell through to the catch-all and redirected to sign-in. A wildcard child keeps the virtual route rendering the page, which reads the rest from the URL. * fix(console): application loading action bubbles so extension loading substates render * fix(console): let public /~/ pages scroll again (#712) The theme service puts the current route's name and bodyClassNames on the body, and body.virtual is what lets a public page scroll. Since #711 the current route is virtual.index or virtual.path, so the class was gone and public pages (tracking, inspection) could not scroll. Both child routes now carry the virtual body class. * feat(console): SMS Guard admin page (#714) * feat(console): SMS Guard admin page Admin → API Traffic → SMS Guard: the policy that bounds the platform's text messages (enable, enforce/monitor mode, budgets per organization and platform- wide, destination rules, circuit breaker thresholds, blocked countries and prefixes, alert emails), per-organization exceptions, the pauses in force with a way to pause an organization or lift a pause, and usage per organization from the send ledger. Backed by core-api's int/v1/sms-guard endpoints. * fix(console): drop a stray blank line in the SMS Guard template * fix(console): satisfy lint on the router and SMS Guard tests (#715) * test(console): expect the SMS Guard page in the API Traffic navigator group (#716) * release: v0.7.69 upgrades to the published components core-api 1.6.70, fleetops 0.6.72, storefront 0.4.25, ledger 0.0.13, customer-portal 0.0.16, dev-engine 0.2.18, ember-ui 0.4.6, ember-core 0.3.26 and fleetops-data 0.2.3, in composer.json, package.json, the lock files, the pnpm overrides and the submodule pointers. app/router.js gains the sms-guard and database-backups admin routes that #703 and #714 added only to router.map.js. RELEASE.md covers every module version and the PRs that went into each release branch. * Refresh ERD for release/v0.7.69 (#720) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 15 天前 | |
release is almost ready | 1 年前 | |
fix discord announcement workflow, attempt 4 | 1 年前 | |
v0.7.42 | 5 个月前 | |
ci(release): accept release/v* branches alongside dev-v* Moves the release branch convention to `release/v0.0.0`, and keeps `dev-v0.0.0` working. Both prefixes are honoured deliberately rather than switching on a flag day. Every module repo calls this reusable workflow from @main, so a hard cutover would leave any release branch already open unrecognised — and a merge that produces no tag and no publish looks exactly like a successful one. That is the same silent failure shape as pushing a tag with GITHUB_TOKEN, which is why it is worth avoiding twice. The version derivation is the only functional change: a case statement strips either prefix. Everything after it — semver validation, the manifest checks, the release notes check, the tag collision check, tagging the merge commit — is untouched. erd.yml keys off the release branch too, so it now triggers on release/v* as well. Its guard against re-running on the merge commit is extended the same way. Drop the dev-v arms once no dev-v* branch remains open. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 1 个月前 | |
v0.7.42 | 5 个月前 | |
release/v0.7.69 (#709) * chore(release): v0.7.69 * ci: fix Build Fleetbase Binaries workflow (#701) * ci: compile the geos PHP extension into the static binaries (#702) * feat(backups): admin Database Backups page and mysqldump in the image (#703) * feat(socket-auth): Fleetbase socket server with JWT auth and signed internal publish (#704) * Feature/socket auth (#710) * feat(socket-auth): add the Fleetbase socket server with JWT auth and signed internal publish socket/ builds fleetbase/fleetbase-socket: SocketCluster 17 that verifies API-minted HS256 tokens, authorizes channel subscriptions (local rules, LRU cache, then the API authorize endpoint with a 2 s timeout, failing closed), refuses client publish/transmit/invoke in enforce mode, kicks sockets out on token expiry or identity change, and serves a signed POST /publish and GET /stats on an internal-only listener. Modes: off, log, enforce. Includes node:test unit and integration tests and a Socket CI workflow. * feat(socket-auth): deploy the new socket image with a shared auth key - docker-compose: socket service uses fleetbase/fleetbase-socket (build fallback), publishes only 38000:8000, gets SOCKETCLUSTER_AUTH_KEY/AUTH_MODE/AUTHORIZE_URL; application, queue and scheduler get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL=http://socket:8001. Drops the unused SOCKETCLUSTER_WORKERS/BROKERS. An unset key keeps auth off. - docker-install.sh: generates a 64-char key into the project .env on fresh installs (kept on re-run) and defaults SOCKETCLUSTER_AUTH_MODE to enforce. - helm: socketcluster runs the new image with the key from a Secret (authKey or existingSecret), an auth mode value, the API authorize URL, and a separate ClusterIP-only socketcluster-internal Service for port 8001; API deployments get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL. - docker-bake/publish-docker-images: build and push fleetbase/fleetbase-socket for amd64 and arm64 on release tags; install-smoke builds it from source. * feat(socket-auth): console socket test page listens on test.{user uuid} The configure/socket page subscribed to a shared 'test' channel, which socket auth no longer allows. It now subscribes to the current user's own test.{user uuid} channel, posts that channel to settings/test-socket, follows the channel the API reports publishing to, and logs refused subscriptions. * test(socket-auth): match prettier line wrapping in the console socket test * fix(socket-auth): drop the never-evaluated channelName initializer The constructor subscribes (and sets channelName) before anything reads it, so the tracked initializer never ran and left an uncovered statement. * feat(socket-auth): SOCKETCLUSTER_AUTH_ENABLED switch, off by default Socket auth turned on as soon as a key was present, and fresh installs got a generated key in enforce mode. That would refuse every socket client that does not fetch tokens yet (released mobile apps, Navigator), and the API's own websocket publisher, which keeps publishing as a plain client until it is switched on too. - Socket server: SOCKETCLUSTER_AUTH_ENABLED (true/1/yes/on, default off). While off the mode is forced to `off` whatever the key and mode, the key is not handed to SocketCluster, and the internal publish/stats endpoints stay closed. Startup logs a warning saying auth is off. - docker-compose: passes SOCKETCLUSTER_AUTH_ENABLED (default false) to socket, application, queue and scheduler, matching core-api's switch. - docker-install.sh: still generates and keeps the key, but writes SOCKETCLUSTER_AUTH_ENABLED=false (kept on re-run) and mode `log`, so turning it on starts by logging would-denies. - Helm: socketcluster.authEnabled (default false), rendered as SOCKETCLUSTER_AUTH_ENABLED for the API deployments and the socket server. - socket/README.md: the switch and the rollout order. - Tests: switch-off config cases, parseSwitch, and an integration test where a keyed server with enforce requested and the switch off allows everything and never calls the API. * feat(socket-auth): pass SOCKETCLUSTER_ORIGIN to the API publisher The API's websocket publisher sends no Origin header, which socketcluster-server treats as '*'. With restricted origins every broadcast is refused with 'Invalid origin: *'. The installer now writes an allowed origin to the project .env (kept on re-runs), compose hands it to application, queue and scheduler, and the chart exports socketcluster.origin to the API deployments when set. * feat(console): let public /~/ pages carry a nested path (#711) /~/:slug matched a single segment, so /~/t/{company}/{number} fell through to the catch-all and redirected to sign-in. A wildcard child keeps the virtual route rendering the page, which reads the rest from the URL. * fix(console): application loading action bubbles so extension loading substates render * fix(console): let public /~/ pages scroll again (#712) The theme service puts the current route's name and bodyClassNames on the body, and body.virtual is what lets a public page scroll. Since #711 the current route is virtual.index or virtual.path, so the class was gone and public pages (tracking, inspection) could not scroll. Both child routes now carry the virtual body class. * feat(console): SMS Guard admin page (#714) * feat(console): SMS Guard admin page Admin → API Traffic → SMS Guard: the policy that bounds the platform's text messages (enable, enforce/monitor mode, budgets per organization and platform- wide, destination rules, circuit breaker thresholds, blocked countries and prefixes, alert emails), per-organization exceptions, the pauses in force with a way to pause an organization or lift a pause, and usage per organization from the send ledger. Backed by core-api's int/v1/sms-guard endpoints. * fix(console): drop a stray blank line in the SMS Guard template * fix(console): satisfy lint on the router and SMS Guard tests (#715) * test(console): expect the SMS Guard page in the API Traffic navigator group (#716) * release: v0.7.69 upgrades to the published components core-api 1.6.70, fleetops 0.6.72, storefront 0.4.25, ledger 0.0.13, customer-portal 0.0.16, dev-engine 0.2.18, ember-ui 0.4.6, ember-core 0.3.26 and fleetops-data 0.2.3, in composer.json, package.json, the lock files, the pnpm overrides and the submodule pointers. app/router.js gains the sms-guard and database-backups admin routes that #703 and #714 added only to router.map.js. RELEASE.md covers every module version and the PRs that went into each release branch. * Refresh ERD for release/v0.7.69 (#720) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 15 天前 | |
release/v0.7.67 (#693) * release: v0.7.67 Security release: upgrade to fleetbase/core-api v1.6.67, which generates API keys from the CSPRNG (keys created in the same second were identical across organizations). composer update without -W, so only fleetbase/core-api moves in the lock; packages/core-api gitlink at v1.6.67. * perf: turn Xdebug off in the images; benchmark with concurrent users The v0.7.67 PR benchmark stalled: every request hit k6's 30s timeout (75% errors, 9.6 req/s), so the noisy tenant was never answered at all, let alone throttled, and the isolation checks failed as a side effect. - docker/Dockerfile: Xdebug is installed in the base stage for coverage and ran in its default develop mode in every image, production included. On the dev stack a GET /v1/orders took about twice as long with it (10.2s vs 4.8s median under emulation), and while loaded it keeps the OPcache JIT off. Default XDEBUG_MODE=off; coverage runs set XDEBUG_MODE=coverage explicitly. - k6 throughput now ramps concurrent virtual users (THROUGHPUT_MODE=vus, THROUGHPUT_PEAK_VUS=16) instead of a fixed 50 req/s arrival rate. An open arrival rate above what the runner serves grows the queue without bound until everything times out, and the backlog swamped the noisy-neighbour phase that followed. THROUGHPUT_MODE=rate keeps the old model for hosts of known capacity. - NOISY_RATE defaults to 4 req/s (240/min, double the 120/min limit). - RELEASE.md notes the Xdebug change. | 30 天前 | |
release/v0.7.69 (#709) * chore(release): v0.7.69 * ci: fix Build Fleetbase Binaries workflow (#701) * ci: compile the geos PHP extension into the static binaries (#702) * feat(backups): admin Database Backups page and mysqldump in the image (#703) * feat(socket-auth): Fleetbase socket server with JWT auth and signed internal publish (#704) * Feature/socket auth (#710) * feat(socket-auth): add the Fleetbase socket server with JWT auth and signed internal publish socket/ builds fleetbase/fleetbase-socket: SocketCluster 17 that verifies API-minted HS256 tokens, authorizes channel subscriptions (local rules, LRU cache, then the API authorize endpoint with a 2 s timeout, failing closed), refuses client publish/transmit/invoke in enforce mode, kicks sockets out on token expiry or identity change, and serves a signed POST /publish and GET /stats on an internal-only listener. Modes: off, log, enforce. Includes node:test unit and integration tests and a Socket CI workflow. * feat(socket-auth): deploy the new socket image with a shared auth key - docker-compose: socket service uses fleetbase/fleetbase-socket (build fallback), publishes only 38000:8000, gets SOCKETCLUSTER_AUTH_KEY/AUTH_MODE/AUTHORIZE_URL; application, queue and scheduler get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL=http://socket:8001. Drops the unused SOCKETCLUSTER_WORKERS/BROKERS. An unset key keeps auth off. - docker-install.sh: generates a 64-char key into the project .env on fresh installs (kept on re-run) and defaults SOCKETCLUSTER_AUTH_MODE to enforce. - helm: socketcluster runs the new image with the key from a Secret (authKey or existingSecret), an auth mode value, the API authorize URL, and a separate ClusterIP-only socketcluster-internal Service for port 8001; API deployments get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL. - docker-bake/publish-docker-images: build and push fleetbase/fleetbase-socket for amd64 and arm64 on release tags; install-smoke builds it from source. * feat(socket-auth): console socket test page listens on test.{user uuid} The configure/socket page subscribed to a shared 'test' channel, which socket auth no longer allows. It now subscribes to the current user's own test.{user uuid} channel, posts that channel to settings/test-socket, follows the channel the API reports publishing to, and logs refused subscriptions. * test(socket-auth): match prettier line wrapping in the console socket test * fix(socket-auth): drop the never-evaluated channelName initializer The constructor subscribes (and sets channelName) before anything reads it, so the tracked initializer never ran and left an uncovered statement. * feat(socket-auth): SOCKETCLUSTER_AUTH_ENABLED switch, off by default Socket auth turned on as soon as a key was present, and fresh installs got a generated key in enforce mode. That would refuse every socket client that does not fetch tokens yet (released mobile apps, Navigator), and the API's own websocket publisher, which keeps publishing as a plain client until it is switched on too. - Socket server: SOCKETCLUSTER_AUTH_ENABLED (true/1/yes/on, default off). While off the mode is forced to `off` whatever the key and mode, the key is not handed to SocketCluster, and the internal publish/stats endpoints stay closed. Startup logs a warning saying auth is off. - docker-compose: passes SOCKETCLUSTER_AUTH_ENABLED (default false) to socket, application, queue and scheduler, matching core-api's switch. - docker-install.sh: still generates and keeps the key, but writes SOCKETCLUSTER_AUTH_ENABLED=false (kept on re-run) and mode `log`, so turning it on starts by logging would-denies. - Helm: socketcluster.authEnabled (default false), rendered as SOCKETCLUSTER_AUTH_ENABLED for the API deployments and the socket server. - socket/README.md: the switch and the rollout order. - Tests: switch-off config cases, parseSwitch, and an integration test where a keyed server with enforce requested and the switch off allows everything and never calls the API. * feat(socket-auth): pass SOCKETCLUSTER_ORIGIN to the API publisher The API's websocket publisher sends no Origin header, which socketcluster-server treats as '*'. With restricted origins every broadcast is refused with 'Invalid origin: *'. The installer now writes an allowed origin to the project .env (kept on re-runs), compose hands it to application, queue and scheduler, and the chart exports socketcluster.origin to the API deployments when set. * feat(console): let public /~/ pages carry a nested path (#711) /~/:slug matched a single segment, so /~/t/{company}/{number} fell through to the catch-all and redirected to sign-in. A wildcard child keeps the virtual route rendering the page, which reads the rest from the URL. * fix(console): application loading action bubbles so extension loading substates render * fix(console): let public /~/ pages scroll again (#712) The theme service puts the current route's name and bodyClassNames on the body, and body.virtual is what lets a public page scroll. Since #711 the current route is virtual.index or virtual.path, so the class was gone and public pages (tracking, inspection) could not scroll. Both child routes now carry the virtual body class. * feat(console): SMS Guard admin page (#714) * feat(console): SMS Guard admin page Admin → API Traffic → SMS Guard: the policy that bounds the platform's text messages (enable, enforce/monitor mode, budgets per organization and platform- wide, destination rules, circuit breaker thresholds, blocked countries and prefixes, alert emails), per-organization exceptions, the pauses in force with a way to pause an organization or lift a pause, and usage per organization from the send ledger. Backed by core-api's int/v1/sms-guard endpoints. * fix(console): drop a stray blank line in the SMS Guard template * fix(console): satisfy lint on the router and SMS Guard tests (#715) * test(console): expect the SMS Guard page in the API Traffic navigator group (#716) * release: v0.7.69 upgrades to the published components core-api 1.6.70, fleetops 0.6.72, storefront 0.4.25, ledger 0.0.13, customer-portal 0.0.16, dev-engine 0.2.18, ember-ui 0.4.6, ember-core 0.3.26 and fleetops-data 0.2.3, in composer.json, package.json, the lock files, the pnpm overrides and the submodule pointers. app/router.js gains the sms-guard and database-backups admin routes that #703 and #714 added only to router.map.js. RELEASE.md covers every module version and the PRs that went into each release branch. * Refresh ERD for release/v0.7.69 (#720) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 15 天前 | |
ci(release): accept release/v* branches alongside dev-v* Moves the release branch convention to `release/v0.0.0`, and keeps `dev-v0.0.0` working. Both prefixes are honoured deliberately rather than switching on a flag day. Every module repo calls this reusable workflow from @main, so a hard cutover would leave any release branch already open unrecognised — and a merge that produces no tag and no publish looks exactly like a successful one. That is the same silent failure shape as pushing a tag with GITHUB_TOKEN, which is why it is worth avoiding twice. The version derivation is the only functional change: a case statement strips either prefix. Everything after it — semver validation, the manifest checks, the release notes check, the tag collision check, tagging the merge commit — is untouched. erd.yml keys off the release branch too, so it now triggers on release/v* as well. Its guard against re-running on the merge commit is extended the same way. Drop the dev-v arms once no dev-v* branch remains open. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 1 个月前 | |
ci(release): accept release/v* branches alongside dev-v* Moves the release branch convention to `release/v0.0.0`, and keeps `dev-v0.0.0` working. Both prefixes are honoured deliberately rather than switching on a flag day. Every module repo calls this reusable workflow from @main, so a hard cutover would leave any release branch already open unrecognised — and a merge that produces no tag and no publish looks exactly like a successful one. That is the same silent failure shape as pushing a tag with GITHUB_TOKEN, which is why it is worth avoiding twice. The version derivation is the only functional change: a case statement strips either prefix. Everything after it — semver validation, the manifest checks, the release notes check, the tag collision check, tagging the merge commit — is untouched. erd.yml keys off the release branch too, so it now triggers on release/v* as well. Its guard against re-running on the merge commit is extended the same way. Drop the dev-v arms once no dev-v* branch remains open. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 1 个月前 | |
release/v0.7.69 (#709) * chore(release): v0.7.69 * ci: fix Build Fleetbase Binaries workflow (#701) * ci: compile the geos PHP extension into the static binaries (#702) * feat(backups): admin Database Backups page and mysqldump in the image (#703) * feat(socket-auth): Fleetbase socket server with JWT auth and signed internal publish (#704) * Feature/socket auth (#710) * feat(socket-auth): add the Fleetbase socket server with JWT auth and signed internal publish socket/ builds fleetbase/fleetbase-socket: SocketCluster 17 that verifies API-minted HS256 tokens, authorizes channel subscriptions (local rules, LRU cache, then the API authorize endpoint with a 2 s timeout, failing closed), refuses client publish/transmit/invoke in enforce mode, kicks sockets out on token expiry or identity change, and serves a signed POST /publish and GET /stats on an internal-only listener. Modes: off, log, enforce. Includes node:test unit and integration tests and a Socket CI workflow. * feat(socket-auth): deploy the new socket image with a shared auth key - docker-compose: socket service uses fleetbase/fleetbase-socket (build fallback), publishes only 38000:8000, gets SOCKETCLUSTER_AUTH_KEY/AUTH_MODE/AUTHORIZE_URL; application, queue and scheduler get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL=http://socket:8001. Drops the unused SOCKETCLUSTER_WORKERS/BROKERS. An unset key keeps auth off. - docker-install.sh: generates a 64-char key into the project .env on fresh installs (kept on re-run) and defaults SOCKETCLUSTER_AUTH_MODE to enforce. - helm: socketcluster runs the new image with the key from a Secret (authKey or existingSecret), an auth mode value, the API authorize URL, and a separate ClusterIP-only socketcluster-internal Service for port 8001; API deployments get SOCKETCLUSTER_AUTH_KEY and SOCKETCLUSTER_PUBLISH_URL. - docker-bake/publish-docker-images: build and push fleetbase/fleetbase-socket for amd64 and arm64 on release tags; install-smoke builds it from source. * feat(socket-auth): console socket test page listens on test.{user uuid} The configure/socket page subscribed to a shared 'test' channel, which socket auth no longer allows. It now subscribes to the current user's own test.{user uuid} channel, posts that channel to settings/test-socket, follows the channel the API reports publishing to, and logs refused subscriptions. * test(socket-auth): match prettier line wrapping in the console socket test * fix(socket-auth): drop the never-evaluated channelName initializer The constructor subscribes (and sets channelName) before anything reads it, so the tracked initializer never ran and left an uncovered statement. * feat(socket-auth): SOCKETCLUSTER_AUTH_ENABLED switch, off by default Socket auth turned on as soon as a key was present, and fresh installs got a generated key in enforce mode. That would refuse every socket client that does not fetch tokens yet (released mobile apps, Navigator), and the API's own websocket publisher, which keeps publishing as a plain client until it is switched on too. - Socket server: SOCKETCLUSTER_AUTH_ENABLED (true/1/yes/on, default off). While off the mode is forced to `off` whatever the key and mode, the key is not handed to SocketCluster, and the internal publish/stats endpoints stay closed. Startup logs a warning saying auth is off. - docker-compose: passes SOCKETCLUSTER_AUTH_ENABLED (default false) to socket, application, queue and scheduler, matching core-api's switch. - docker-install.sh: still generates and keeps the key, but writes SOCKETCLUSTER_AUTH_ENABLED=false (kept on re-run) and mode `log`, so turning it on starts by logging would-denies. - Helm: socketcluster.authEnabled (default false), rendered as SOCKETCLUSTER_AUTH_ENABLED for the API deployments and the socket server. - socket/README.md: the switch and the rollout order. - Tests: switch-off config cases, parseSwitch, and an integration test where a keyed server with enforce requested and the switch off allows everything and never calls the API. * feat(socket-auth): pass SOCKETCLUSTER_ORIGIN to the API publisher The API's websocket publisher sends no Origin header, which socketcluster-server treats as '*'. With restricted origins every broadcast is refused with 'Invalid origin: *'. The installer now writes an allowed origin to the project .env (kept on re-runs), compose hands it to application, queue and scheduler, and the chart exports socketcluster.origin to the API deployments when set. * feat(console): let public /~/ pages carry a nested path (#711) /~/:slug matched a single segment, so /~/t/{company}/{number} fell through to the catch-all and redirected to sign-in. A wildcard child keeps the virtual route rendering the page, which reads the rest from the URL. * fix(console): application loading action bubbles so extension loading substates render * fix(console): let public /~/ pages scroll again (#712) The theme service puts the current route's name and bodyClassNames on the body, and body.virtual is what lets a public page scroll. Since #711 the current route is virtual.index or virtual.path, so the class was gone and public pages (tracking, inspection) could not scroll. Both child routes now carry the virtual body class. * feat(console): SMS Guard admin page (#714) * feat(console): SMS Guard admin page Admin → API Traffic → SMS Guard: the policy that bounds the platform's text messages (enable, enforce/monitor mode, budgets per organization and platform- wide, destination rules, circuit breaker thresholds, blocked countries and prefixes, alert emails), per-organization exceptions, the pauses in force with a way to pause an organization or lift a pause, and usage per organization from the send ledger. Backed by core-api's int/v1/sms-guard endpoints. * fix(console): drop a stray blank line in the SMS Guard template * fix(console): satisfy lint on the router and SMS Guard tests (#715) * test(console): expect the SMS Guard page in the API Traffic navigator group (#716) * release: v0.7.69 upgrades to the published components core-api 1.6.70, fleetops 0.6.72, storefront 0.4.25, ledger 0.0.13, customer-portal 0.0.16, dev-engine 0.2.18, ember-ui 0.4.6, ember-core 0.3.26 and fleetops-data 0.2.3, in composer.json, package.json, the lock files, the pnpm overrides and the submodule pointers. app/router.js gains the sms-guard and database-backups admin routes that #703 and #714 added only to router.map.js. RELEASE.md covers every module version and the PRs that went into each release branch. * Refresh ERD for release/v0.7.69 (#720) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> | 15 天前 |