358 lines
13 KiB
Markdown
358 lines
13 KiB
Markdown
# ForgeFlow
|
|
|
|
## Publish this release to the built-in updater repository
|
|
|
|
Extract the full source ZIP to a folder under Downloads and run:
|
|
|
|
```powershell
|
|
Set-ExecutionPolicy -Scope Process Bypass
|
|
.\Publish-ForgeFlow-Release.ps1
|
|
```
|
|
|
|
The script runs the complete quality gate, clones `git@gitea.itworx.tech:Jens/ForgeFlow.git` into a temporary folder, mirrors the verified source without `.git`, `node_modules` or release ZIPs, commits it on `main` and pushes it. A running older ForgeFlow source installation can then update through **Settings → Updates**.
|
|
|
|
|
|
|
|
ForgeFlow is a desktop release cockpit that turns the complete path from a local
|
|
code change to a verified server deployment into one guided flow:
|
|
|
|
```text
|
|
Local working tree -> Gitea repository -> exact deployed server version
|
|
```
|
|
|
|
It is not an IDE and it does not replace Gitea Actions. ForgeFlow coordinates
|
|
local Git, a private Gitea instance and fixed deployment workflows while keeping
|
|
credentials on the user's own computer.
|
|
|
|

|
|
|
|
## Current status: v0.6.0 self-healing Git and Unraid operations
|
|
|
|
### Git recovery and repository truth
|
|
|
|
- serializes every mutating Git action per repository;
|
|
- waits through a short grace period and automatically retries after safely removing a proven stale lock;
|
|
- detects `HEAD.lock`, `index.lock`, ref locks and worktree locks while skipping object storage;
|
|
- provides repository-specific actions for fetch, fast-forward, push and backed-up divergence reset;
|
|
- creates a `forgeflow/backup-*` safety branch before any reset to upstream.
|
|
|
|
### SSH / Unraid and DockerMan
|
|
|
|
- reconciles interrupted deployments against the live SHA, container state and health;
|
|
- applies DockerMan WebUI, icon and shell labels through an override and writes a persistent XML template fallback;
|
|
- keeps the visible container name such as `Portfolio` while enforcing lowercase internal service/image identities;
|
|
- includes a built-in high-contrast ITWorx icon, local PNG upload, persistent DockerMan image storage and cache refresh;
|
|
- exposes **Open Web UI**, **Repair DockerMan integration** and **Reconcile** directly on deployment cards.
|
|
|
|
### Update reliability
|
|
|
|
- confirms the external updater handshake before closing ForgeFlow;
|
|
- rejects malformed PowerShell update helpers before publication;
|
|
- validates the replacement source and keeps rollback/success status for the next launch;
|
|
- verifies that Gitea reports the exact published release commit.
|
|
|
|
Read [SSH / Unraid deployment](docs/SSH_UNRAID_DEPLOYMENT.md) and the
|
|
[LumaOps audit](docs/LUMAOPS_SERVER_AUDIT.md).
|
|
|
|
### v0.4.2 automatic clone workflow
|
|
|
|
**Clone from Gitea** now uses the first configured project root and creates the
|
|
repository-named subfolder automatically. The native folder picker is reserved
|
|
for the explicit **Choose another location** action. Existing matching checkouts
|
|
are linked; conflicting folders are never overwritten.
|
|
|
|
The Windows environment doctor retains the v0.3.1 npm command-shim correction.
|
|
|
|
Version 0.3.2 is designed so the user does not need to give a developer any
|
|
Gitea token, SSH key, server password or other credential. The application now
|
|
includes:
|
|
|
|
- a five-step setup wizard;
|
|
- computer, Gitea and deployment preflights;
|
|
- protected local token entry;
|
|
- structured local diagnostics with aggressive secret redaction;
|
|
- standard and strict privacy support bundles;
|
|
- fail-closed bundle safety auditing;
|
|
- request IDs that correlate desktop, Actions and server events;
|
|
- root-owned allowlisted server target configuration;
|
|
- a complete setup guide from fresh checkout to first rollback test.
|
|
|
|
Start with [START_HERE.md](START_HERE.md). The full installation and acceptance
|
|
procedure is in [docs/SETUP_GUIDE.md](docs/SETUP_GUIDE.md).
|
|
|
|
## What ForgeFlow can do
|
|
|
|
### Repository workflow
|
|
|
|
- Connect to a private Gitea instance and validate the account locally.
|
|
- Discover Git working trees beneath one or more project roots.
|
|
- Use the first project root as the automatic clone destination.
|
|
- Match local folders to Gitea repositories using normalized `origin` identity.
|
|
- Link existing repositories or clone directly into the default project root.
|
|
- Read real Git status through porcelain v2 and NUL-delimited output.
|
|
- Inspect diffs and select files.
|
|
- Stage and unstage changes.
|
|
- Commit locally or commit and push in one action.
|
|
- Push, fetch and use fast-forward-only pull.
|
|
- Review recent history.
|
|
- Create, switch and publish branches.
|
|
- Stash, list and restore local work.
|
|
- Mark favorites and prioritize repositories requiring attention.
|
|
- Refresh repository state automatically while the application is open.
|
|
|
|
### Deployment workflow
|
|
|
|
- Configure multiple environments per repository.
|
|
- Bind each environment to a fixed branch and fixed Gitea Actions workflows.
|
|
- Run a visible deployment preflight before confirmation.
|
|
- Re-run mandatory checks in the privileged backend before dispatch.
|
|
- Verify a clean tree, correct branch, upstream and ahead/behind state.
|
|
- Verify that the exact full SHA exists on the allowed remote branch.
|
|
- Verify local and remote workflow files and Gitea Actions availability.
|
|
- Dispatch a unique request ID with the exact commit SHA.
|
|
- Poll Gitea Actions runs and jobs.
|
|
- Correlate the workflow with the server status endpoint.
|
|
- Verify that the requested SHA is actually live.
|
|
- Run an independent application healthcheck.
|
|
- Roll back through a separate fixed workflow to the previous exact SHA.
|
|
- Preserve a bounded local operation history.
|
|
|
|
### Safe diagnostics
|
|
|
|
ForgeFlow stores structured JSONL diagnostics in the application-data folder.
|
|
They are intended to make development and troubleshooting possible without
|
|
requesting credentials.
|
|
|
|
The logger records useful operational facts such as:
|
|
|
|
- timestamps, stable event names and duration;
|
|
- Git action outcomes and repository state;
|
|
- Gitea endpoint paths and HTTP status, but not authorization headers;
|
|
- deployment request IDs, workflow stages and health states;
|
|
- preflight results;
|
|
- sanitized error names, codes, messages and stacks.
|
|
|
|
It excludes or redacts:
|
|
|
|
- Gitea tokens and encrypted token blobs;
|
|
- passwords, authorization headers and credential-bearing URLs;
|
|
- private keys and common token patterns;
|
|
- arbitrary environment-variable dumps;
|
|
- local source contents and Git diffs;
|
|
- raw Gitea runner logs from support bundles;
|
|
- user-home paths.
|
|
|
|
Support bundles are audited before writing. If a known runtime secret, private
|
|
key marker or URL credential remains, ForgeFlow aborts the export instead of
|
|
creating the ZIP. Strict privacy mode also hashes repository and user
|
|
identifiers while keeping related events correlatable.
|
|
|
|
Read [docs/DIAGNOSTICS.md](docs/DIAGNOSTICS.md) for the exact policy and its
|
|
limitations.
|
|
|
|
## Security model
|
|
|
|
- Electron main/preload/renderer separation.
|
|
- Sandboxed renderer with context isolation and no direct Node.js access.
|
|
- Narrow, frozen preload API.
|
|
- Trusted renderer-origin checks on privileged IPC.
|
|
- No arbitrary shell command field in the interface.
|
|
- Gitea token stored using Electron `safeStorage` when available.
|
|
- Blank token updates preserve the existing protected token.
|
|
- Atomic local configuration writes and schema migration.
|
|
- Repository-relative path validation for file actions.
|
|
- Supported-protocol and credential-in-URL validation.
|
|
- Fixed workflow, branch and environment allowlists.
|
|
- Root-owned server target configuration.
|
|
- Exact-SHA deployment and rollback.
|
|
- Server-side locking, health validation and status records.
|
|
- Local diagnostic retention, rotation and clear/export controls.
|
|
|
|
More detail is available in [docs/SECURITY.md](docs/SECURITY.md).
|
|
|
|
## Prerequisites
|
|
|
|
For a Windows source setup:
|
|
|
|
- Windows 10 or 11;
|
|
- Node.js 22 or newer;
|
|
- npm;
|
|
- Git on `PATH`;
|
|
- a normal signed-in desktop session;
|
|
- access to your own Gitea instance.
|
|
|
|
For deployment:
|
|
|
|
- Gitea Actions enabled;
|
|
- a trusted Gitea runner with an environment-specific label;
|
|
- a Linux target server reachable by that runner;
|
|
- Git, Docker Compose, `curl` and `flock` on the target server;
|
|
- an existing non-interactive server checkout of the application.
|
|
|
|
## Fastest Windows start
|
|
|
|
Extract the release, open PowerShell in the folder and run:
|
|
|
|
```powershell
|
|
Set-ExecutionPolicy -Scope Process Bypass
|
|
.\setup-windows.ps1
|
|
```
|
|
|
|
The script:
|
|
|
|
1. checks Node.js, npm and Git;
|
|
2. installs the exact dependency versions from `package-lock.json` when present;
|
|
3. runs the environment doctor;
|
|
4. validates the source tree;
|
|
5. runs all automated tests;
|
|
6. starts ForgeFlow.
|
|
|
|
No Gitea or server credential is requested by the PowerShell script. Tokens are
|
|
entered later in the local desktop wizard.
|
|
|
|
Manual equivalent:
|
|
|
|
```bash
|
|
npm install --no-audit --no-fund
|
|
npm run doctor
|
|
npm run check
|
|
npm start
|
|
```
|
|
|
|
## Setup and first acceptance test
|
|
|
|
Follow these documents in order:
|
|
|
|
1. [START_HERE.md](START_HERE.md)
|
|
2. [docs/SETUP_GUIDE.md](docs/SETUP_GUIDE.md)
|
|
3. [docs/UPDATING.md](docs/UPDATING.md)
|
|
4. [docs/DEPLOYMENT_SETUP.md](docs/DEPLOYMENT_SETUP.md)
|
|
5. [docs/STATUS_ENDPOINT.md](docs/STATUS_ENDPOINT.md)
|
|
6. [docs/DIAGNOSTICS.md](docs/DIAGNOSTICS.md)
|
|
|
|
The recommended first test uses a non-critical staging deployment and validates:
|
|
|
|
```text
|
|
preflight -> commit -> push -> deploy -> Actions -> server SHA -> healthcheck -> rollback
|
|
```
|
|
|
|
## Updating an existing source installation
|
|
|
|
Close ForgeFlow, copy the v0.4.2 update overlay over the existing source folder
|
|
and run:
|
|
|
|
```powershell
|
|
Set-ExecutionPolicy -Scope Process Bypass
|
|
.\update-windows.ps1
|
|
```
|
|
|
|
Application configuration and protected credentials are stored outside the
|
|
source folder and are not reset. See [docs/UPDATING.md](docs/UPDATING.md).
|
|
|
|
## Browser demo
|
|
|
|
The standalone visual demo requires no Gitea connection or credentials:
|
|
|
|
```bash
|
|
npm run demo
|
|
```
|
|
|
|
Open the printed local URL. The demo uses `src/renderer/mock-bridge.js`; the
|
|
packaged desktop application uses the privileged `preload.cjs` bridge.
|
|
|
|
## Quality checks
|
|
|
|
```bash
|
|
npm run verify
|
|
npm test
|
|
npm run check
|
|
npm run doctor -- --json
|
|
```
|
|
|
|
Version 0.3.2 contains 45 automated tests. Two integration suites create real
|
|
temporary bare Git remotes and exercise commit, push, branch, stash and exact
|
|
remote-SHA behavior. Detailed coverage is listed in
|
|
[docs/TEST_MATRIX.md](docs/TEST_MATRIX.md).
|
|
|
|
## Development packages
|
|
|
|
```bash
|
|
npm run dist:win
|
|
npm run dist:linux
|
|
npm run dist:mac
|
|
```
|
|
|
|
Windows users can run:
|
|
|
|
```powershell
|
|
.\build-windows.ps1
|
|
```
|
|
|
|
These commands create unsigned development packages. Public distribution still
|
|
requires platform code signing and platform-specific release acceptance.
|
|
|
|
## Server-side deployment model
|
|
|
|
ForgeFlow never sends a free-form deployment command. It dispatches a fixed
|
|
workflow with controlled inputs:
|
|
|
|
```json
|
|
{
|
|
"ref": "main",
|
|
"inputs": {
|
|
"environment": "staging",
|
|
"commit_sha": "0123456789abcdef0123456789abcdef01234567",
|
|
"request_id": "generated-by-forgeflow"
|
|
}
|
|
}
|
|
```
|
|
|
|
The workflow calls a root-owned allowlisted server script. Deployment targets
|
|
are defined in `/etc/forgeflow/targets.conf`, not supplied by the desktop app.
|
|
The server checks repository, environment, paths, branch, exact remote ancestry,
|
|
locking, Docker Compose result and health before it updates the public status
|
|
JSON.
|
|
|
|
## Project structure
|
|
|
|
```text
|
|
main.cjs Electron lifecycle and service composition
|
|
preload.cjs Whitelisted renderer API and event bridge
|
|
src/main/config-store.cjs State, migration and protected token storage
|
|
src/main/git-service.cjs Real Git CLI adapter
|
|
src/main/gitea-service.cjs Gitea REST and Actions adapter
|
|
src/main/repository-service.cjs Discovery, matching and repository aggregation
|
|
src/main/repository-monitor.cjs Background working-tree awareness
|
|
src/main/deployment-service.cjs Dispatch, polling, SHA checks and rollback
|
|
src/main/preflight-service.cjs Computer and deployment readiness checks
|
|
src/main/diagnostics-service.cjs Safe JSONL diagnostics and support bundles
|
|
src/main/log-redaction.cjs Recursive secret and privacy sanitizer
|
|
src/main/ipc.cjs Validated privileged operation boundary
|
|
src/shared/clone-target.cjs Safe automatic clone target planning
|
|
src/shared/zip-writer.cjs Dependency-free diagnostic ZIP writer
|
|
src/renderer/ Desktop UI and browser demo
|
|
examples/gitea-actions/ Fixed deploy and rollback workflow templates
|
|
examples/server/ Allowlisted Linux deployment implementation
|
|
tests/ Unit and real Git integration tests
|
|
docs/ Setup, diagnostics, security and architecture
|
|
```
|
|
|
|
## Scope and remaining acceptance
|
|
|
|
The v0.4.2 logic is prepared for self-service configuration and testing, but no
|
|
source release can prove compatibility with a private environment it has never
|
|
connected to. The remaining acceptance is deliberately local to the user:
|
|
|
|
- validate the exact Gitea version and Actions API;
|
|
- validate the runner label and runner permissions;
|
|
- adapt one target line in the root-owned server configuration;
|
|
- verify the application-specific Docker Compose and health endpoint;
|
|
- execute the documented staging deployment and rollback test;
|
|
- export a Strict support bundle if a failure occurs.
|
|
|
|
No credential needs to be shared for that process.
|
|
|
|
## License
|
|
|
|
MIT. See [LICENSE](LICENSE).
|