cli/cmd/updater/docs/architecture.md
Charon 27d5e2e100 refactor: flatten commands, extract php/ci to own repos (#2)
## Summary
- Extract PHP/Laravel commands to `core/php` repo (42 files, standalone module)
- Extract CI/release + SDK commands to `core/ci` repo (10 files)
- Remove `internal/variants/` build tag system entirely
- Move all 30 remaining command packages from `internal/cmd/` to top-level `cmd/`
- Rewrite `main.go` with direct imports — no more variant selection
- PHP and CI are now optional via commented import lines in main.go

Co-authored-by: Claude <developers@lethean.io>
Reviewed-on: #2
Co-authored-by: Charon <charon@lthn.ai>
Co-committed-by: Charon <charon@lthn.ai>
2026-02-16 14:45:06 +00:00

53 lines
2.5 KiB
Markdown

# Architecture
The `updater` library is designed to facilitate self-updates for Go applications by replacing the running binary with a newer version downloaded from a remote source.
## Update Mechanisms
The library supports two primary update sources:
1. **GitHub Releases:** Fetches releases directly from a GitHub repository.
2. **Generic HTTP:** Fetches update information from a generic HTTP endpoint.
### GitHub Releases
When configured with a GitHub repository URL (e.g., `https://github.com/owner/repo`), the updater uses the GitHub API to find releases.
* **Channel Support:** You can specify a "channel" (e.g., "stable", "beta"). The updater will filter releases based on this channel.
* Ideally, this maps to release tags or pre-release status (though the specific implementation details of how "channel" maps to GitHub release types should be verified in the code).
* **Pull Request Updates:** The library supports updating to a specific pull request artifact, useful for testing pre-release builds.
### Generic HTTP
When configured with a generic HTTP URL, the updater expects the endpoint to return a JSON object describing the latest version.
**Expected JSON Format:**
```json
{
"version": "1.2.3",
"url": "https://your-server.com/path/to/release-asset"
}
```
The updater compares the `version` from the JSON with the current application version. If the remote version is newer, it downloads the binary from the `url`.
## Version Comparison
The library uses Semantic Versioning (SemVer) to compare versions.
* **Prefix Handling:** The `ForceSemVerPrefix` configuration option allows you to standardize version tags by enforcing a `v` prefix (e.g., `v1.0.0` vs `1.0.0`) for consistent comparison.
* **Logic:**
* If `Remote Version` > `Current Version`: Update available.
* If `Remote Version` <= `Current Version`: Up to date.
## Self-Update Process
The actual update process is handled by the `minio/selfupdate` library.
1. **Download:** The new binary is downloaded from the source.
2. **Verification:** (Depending on configuration/implementation) Checksums may be verified.
3. **Apply:** The current executable file is replaced with the new binary.
* **Windows:** The old binary is renamed (often to `.old`) before replacement to allow the write operation.
* **Linux/macOS:** The file is unlinked and replaced.
4. **Restart:** The application usually needs to be restarted for the changes to take effect. The `updater` library currently handles the *replacement*, but the *restart* logic is typically left to the application.