commit fffb3317efb2141777ae37e12b59b21ad4743c39 Author: EugeneTes Date: Mon Jul 13 06:38:23 2026 +0000 Initial commit: AnyDesk installer for Raspberry Pi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..80fe587 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Build artefacts — fetched by build.sh, never committed +src/anydesk_arm64.deb +packages/ +*.pkg diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..5f2cf95 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,108 @@ +# insin_anydesk + +Insin package that installs [AnyDesk](https://anydesk.com) on Raspberry Pi devices +(arm64) managed by a self-hosted Insin server. + +The package is published to the Insin server and assigned to the `raspberry pi` +device group in the admin panel. Each device's `insin monitor` picks it up on +its next heartbeat, extracts the pkg, and runs `postinst` as root. + +## Package structure + +``` +insin_anydesk/ +├── build.sh # CI script: pull deb + CLI, pack, publish +├── src/ # pkg contents — `cd src && insin pack anydesk@` +│ ├── postinst # apt-installs bundled .deb, enables systemd unit +│ ├── prem # stops + apt-removes anydesk on pkg removal +│ ├── install.cfg # install_path=/opt/insin/anydesk +│ └── anydesk_arm64.deb # bundled at build time by build.sh (gitignored) +└── packages/ # `insin pack` output (gitignored) +``` + +Recognised files in the ZIP (per Insin's package manager): + +| File | Role | +|---------------|-------------------------------------------------------------------| +| `postinst` | Bash script run as root after extraction. New installs and version bumps trigger it; same-version reassignments are skipped. | +| `prem` | Bash script run before removal, or before overlaying a new version on top of an existing install. | +| `install.cfg` | `key=value` overrides. Supported keys: `install_path`, `run_postinst`, `run_prem`. | + +Everything else in the ZIP (the `.deb`) is copied verbatim into the install +directory (`install_path`) alongside the scripts, so `postinst` can reference it +as `./anydesk_arm64.deb`. + +### Metadata + +There is no manifest inside the pkg — Insin derives `name` and `version` from +the `name@version.pkg` filename. The version must parse as `MAJOR.MINOR.PATCH` +(`Version.Parse`). The pkg version tracks the upstream AnyDesk version: +`anydesk@6.4.0` bundles the AnyDesk 6.4.0-1 arm64 `.deb`. + +Republishing the same version is rejected server-side with 409. To force a +retry after a failed install, bump the version. + +## Environment variables + +| Var | Where | Purpose | +|-----------------|-----------|----------------------------------------------------------------------------------| +| `INSIN_URL` | build | Base URL of the Insin server (no trailing slash, no `/api`). | +| `INSIN_TOKEN` | build | Service token minted in the Insin admin panel (Service Tokens → New token). | +| `GIT_URL` | repo host | Full clone URL of this repo on Gitea (already set globally). | +| `GIT_USER` | repo host | Gitea username for push/pull (already set globally). | +| `GIT_KEY` | repo host | Gitea personal access token (already set globally). | +| `ANYDESK_VERSION` | build (optional) | Full deb tag (e.g. `6.4.0-1`). Default: `6.4.0-1`. | +| `PKG_VERSION` | build (optional) | Insin pkg semver. Default: `ANYDESK_VERSION` with the `-N` suffix stripped. | +| `INSIN_CLI_RID` | build (optional) | Override CLI artifact rid. Default: derived from `uname -m`; only `linux-arm64` is currently published, so the runner must be arm64. | + +Never echo `INSIN_TOKEN`, `GIT_KEY`, or `GIT_USER` to logs. `build.sh` pipes +CLI stderr through a sed redactor as a safety net. + +## Build & publish + +```sh +./build.sh +# or override the anydesk version +ANYDESK_VERSION=6.4.1-1 PKG_VERSION=6.4.1 ./build.sh +``` + +`build.sh`: + +1. Downloads `anydesk_${ANYDESK_VERSION}_arm64.deb` from + `download.anydesk.com/rpi/` into `src/`. +2. Fetches the latest `insin` CLI (`linux-arm64`) from + `$INSIN_URL/api/v1/downloads/cli` into `/tmp/insin/`. +3. `cd src && insin pack anydesk@${PKG_VERSION}` → + `packages/anydesk@${PKG_VERSION}.pkg`. +4. `insin publish packages/anydesk@${PKG_VERSION}.pkg`. + +## Rolling out + +Publishing puts the pkg on the server. It does **not** assign it to any +device. After publish: + +- Admin panel → **Groups → raspberry pi → Assignments** → add + `anydesk@`, OR +- `PUT $INSIN_URL/api/v1/admin/groups//assignments` with + `Authorization: AdminToken $INSIN_TOKEN` and body + `{ "packageName": "anydesk", "version": "" }`. + +Each Pi picks up the assignment on its next heartbeat (default 10 min) and +runs `postinst`. + +## On-device runtime + +- `postinst` and `prem` run under `/bin/bash -c "./