diff --git a/DOCKER.md b/DOCKER.md index 8f4ea5f7..ae79166d 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -92,3 +92,25 @@ http://localhost:3000 → nginx (web container) git pull ./start.sh rebuild ``` + +## تنبيه التحديثات (System Updates) + +صفحة **Admin → System Updates** تعرض الإصدار الحالي وتقدر تفحص لو في إصدار أحدث على Gitea. للتفعيل: + +1. تأكد أن ملف `latest.json` موجود في جذر الريبو على Gitea بنفس بنية `version.json`: + + ```json + { "version": "0.2.0", "build": "20260601.abc1234" } + ``` + +2. أضف في `.env` (أو `docker-compose.yml` تحت `services.api.environment`): + + ``` + LATEST_VERSION_URL=https://desktop-11cj93j.tail866923.ts.net/rafraa/TX/raw/branch/main/latest.json + ``` + +3. أعد التشغيل: `./start.sh stop && ./start.sh`. + +عند كل إصدار جديد: حدّث `latest.json` في الريبو وادفع. عملاء Tx OS سيرون شارة "Update available" عند ضغطهم على Check Now. + +> رقم البناء (`build`) يُولَّد تلقائياً من git قبل كل `pnpm run build` (انظر `scripts/update-version.mjs`)، فلا تحتاج تعديله يدوياً في `version.json`. diff --git a/latest.json b/latest.json new file mode 100644 index 00000000..859fcad0 --- /dev/null +++ b/latest.json @@ -0,0 +1,4 @@ +{ + "version": "0.1.0-dev", + "build": "20260517.b5efd9eb" +} diff --git a/package.json b/package.json index 5bda7e90..b98a676e 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "license": "MIT", "scripts": { "preinstall": "sh -c 'rm -f package-lock.json yarn.lock; case \"$npm_config_user_agent\" in pnpm/*) ;; *) echo \"Use pnpm instead\" >&2; exit 1 ;; esac'", + "update-version": "node scripts/update-version.mjs", + "prebuild": "pnpm run update-version", "build": "pnpm run typecheck && pnpm -r --if-present run build", "typecheck:libs": "tsc --build", "typecheck": "pnpm run typecheck:libs && pnpm -r --filter \"./artifacts/**\" --filter \"./scripts\" --if-present run typecheck", diff --git a/scripts/update-version.mjs b/scripts/update-version.mjs new file mode 100644 index 00000000..3a7dac3e --- /dev/null +++ b/scripts/update-version.mjs @@ -0,0 +1,32 @@ +#!/usr/bin/env node +import { execSync } from "node:child_process"; +import { readFileSync, writeFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import { dirname, resolve } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const versionPath = resolve(__dirname, "..", "version.json"); + +function git(args) { + return execSync(`git ${args}`, { encoding: "utf8" }).trim(); +} + +let commit = "unknown"; +let date = new Date().toISOString().slice(0, 10).replace(/-/g, ""); +try { + commit = git("log -1 --format=%h"); + date = git("log -1 --format=%cd --date=format:%Y%m%d"); +} catch (err) { + console.warn(`[update-version] git unavailable, using fallback: ${err.message}`); +} + +const build = `${date}.${commit}`; +const current = JSON.parse(readFileSync(versionPath, "utf8")); +const next = { ...current, build }; + +if (current.build === build) { + console.log(`[update-version] build unchanged: ${build}`); +} else { + writeFileSync(versionPath, JSON.stringify(next, null, 2) + "\n"); + console.log(`[update-version] ${current.build} -> ${build}`); +} diff --git a/version.json b/version.json index f0393445..859fcad0 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { "version": "0.1.0-dev", - "build": "20260517" + "build": "20260517.b5efd9eb" }