Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@
- Require a matching source manifest for new installations; preserve unknown metadata for legacy installations instead of guessing a version.
- Add package integrity to `doctor` and document the development feature in all four languages.

This development work has not been deployed to Dots. Release checks, notifications and verified updates remain separate work in #28–#30.
- Add bounded stable-release checks with explicit download proxy selection and validated release manifests (#28).
- Add opt-in, cached local notifications with expiry, deduplication and no network work during startup (#29).

- Add detached manual updates from fixed releases or explicitly reviewed local bundles, with code-only backups, a persistent transaction journal and bounded shim rollback (#30).

The reviewed `0.4.0-dev` candidate passed normal update, intentional startup-failure rollback, checksum-refusal and fresh external SSH/ping checks in Dots. See the [dated validation report](docs/validation/v0.4.0-update-trial.md) for the independent review, CI evidence and limits. This is not a published v0.4.0 release.

## v0.3.1 — 2026-10-19

Expand Down
2 changes: 2 additions & 0 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ bash /workspace/.dots-tailscale/start.sh login

開発版では `dots-ts version` と `dots-ts version --json` で、dots-tailscale パッケージと Tailscale バイナリのバージョンを別々に確認できます。v0.3.1 にはまだ含まれていません。詳しくは[パッケージのバージョンとファイルの確認](docs/usage.ja.md#package-version)を参照してください。

開発版には、安定版リリースの確認、任意で有効にするキャッシュ通知、コードのバックアップとロールバックに対応した手動更新も追加されます。実行条件、独立した復旧用ターミナルの確認、別途行う SSH 検証は[更新ガイド](docs/usage.ja.md#update-management)を参照してください。

## 同梱内容

| パス | 用途 |
Expand Down
2 changes: 2 additions & 0 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ bash /workspace/.dots-tailscale/start.sh login

개발 버전의 `dots-ts version`과 `dots-ts version --json`은 dots-tailscale 패키지 버전과 내부 Tailscale 버전을 따로 보여줍니다. v0.3.1에는 아직 없는 명령입니다. 자세한 내용은 [패키지 버전과 파일 확인](docs/usage.ko.md#package-version)을 참고하세요.

개발 버전에는 정식 릴리스 확인, 선택적으로 켜는 캐시 알림, 코드 백업과 원복을 갖춘 수동 업데이트도 추가됩니다. 실행 조건, 복구 터미널 확인과 별도 SSH 검증은 [업데이트 안내](docs/usage.ko.md#update-management)를 참고하세요.

## 구성 요소

| 경로 | 역할 |
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ Install all four source files from [v0.3.1](https://github.com/abruption/dots-ta

The development build adds `dots-ts version` and `dots-ts version --json` to show the dots-tailscale package version separately from the Tailscale binary version. These commands are not included in v0.3.1. See [package version and file verification](docs/usage.md#package-version).

The development build also adds stable-release checks, opt-in cached notifications and verified manual updates with code-only rollback. See [update management](docs/usage.md#update-management) for requirements, recovery-terminal confirmation and the separate external SSH check.

## Included

| Path | Purpose |
Expand Down
2 changes: 2 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ bash /workspace/.dots-tailscale/start.sh login

开发版新增了 `dots-ts version` 和 `dots-ts version --json`,可以分别查看 dots-tailscale 软件包版本和 Tailscale 程序版本。v0.3.1 尚不包含这些命令。详情见[软件包版本与文件校验](docs/usage.zh-CN.md#package-version)。

开发版还新增了正式版本检查、可选的缓存通知,以及支持代码备份和回滚的手动更新。运行条件、独立恢复终端确认和单独的 SSH 验证,请参阅[更新说明](docs/usage.zh-CN.md#update-management)。

## 项目内容

| 路径 | 用途 |
Expand Down
66 changes: 66 additions & 0 deletions docs/usage.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,72 @@ JSON では `package.declared_version`、`package.source_revision`、`package.in

メンテナンス時は、確認済みのソース変更後に `python3 scripts/source_manifest.py` を実行し、差分を確認してから `python3 scripts/source_manifest.py --check` で検証します。CI はファイルを書き換えず、検証のみ行います。生成は確認済みのソースチェックアウトで行い、インストール先では行わないでください。リリースにはソースファイル 4 つに対応するマニフェストも含める必要があります。既存の v0.3.1 リリースには含まれていません。

<a id="update-management"></a>

## リリース確認とローカル通知(開発中)

これらのコマンドは v0.4.0 に向けて開発中です。新しいヘルパーが必要です。リリースを公開しても、既存のインストールは更新されません。リリース確認では `abruption/dots-tailscale` の安定版のうち、ソースファイル 4 つと一致する `source-manifest.json` を含むものだけを対象にします。このマニフェストを含まない古いリリース(v0.3.1 を含む)は、検証済みの更新用バンドルとして扱わず、非対応として報告します。

```bash
/workspace/.dots-tailscale/dots-ts update check --json
/workspace/.dots-tailscale/dots-ts update check --tag v0.4.0 --proxy http://browser-proxy:8889 --json
```

2つ目の例は特定の安定版を選択します。そのリリースが公開された後にのみ使用できます。`--proxy` を指定しない場合、確認では直接 HTTPS を使い、シェルのプロキシ認証情報を引き継ぎません。必要な場合は、プラットフォームのダウンロード用プロキシを明示的に指定してください。shim 用およびアプリケーション用の SOCKS/HTTP プロキシとは別の設定です。HTTPS 証明書の検証は有効のままです。GitHub トークンは不要です。

`update check` はインストール済みのコード、ノード state、設定、プロセスを変更しません。JSON の `status` は `update_available`、`current`、`local_newer`、`not_comparable`、`check_failed` のいずれかです。`selection` は最新バージョンを選んだか、バージョンを固定して選んだかを示します。終了コードは、比較が有効なら `0`、ローカルのインストールを比較できない場合は `1`、検索に失敗した場合は `2` です。終了コード `0` だから更新があると決めつけず、status を確認してください。リモートのリリースが見つかっても、不明、変更済み、または異なる版が混在するローカルソースが信頼済みのバージョンになるわけではありません。

通知は明示的に有効にした場合だけ使われ、ローカルで処理されます。更新をインストールせず、タイマーを登録せず、外部メッセージも送信しません。

```bash
/workspace/.dots-tailscale/dots-ts update notifications configure --enable --interval-hours 24
/workspace/.dots-tailscale/dots-ts update notifications refresh --proxy http://browser-proxy:8889
/workspace/.dots-tailscale/dots-ts update notifications show
/workspace/.dots-tailscale/dots-ts update notifications notify
/workspace/.dots-tailscale/dots-ts update notifications configure --disable
```

`refresh` は時間を制限したネットワーク確認を行い、結果をローカルに保存します。設定済みの間隔に従い、間隔が経過する前に再確認する場合は `--force` を明示的に指定します。`notify` はキャッシュだけを読み取り、有効期限を確認し、同じバージョンの通知を繰り返しません。対話型の起動が成功すると、短い時間制限内に stderr へキャッシュ済み通知を表示する場合があります。通知確認が失敗しても起動結果は変わりません。生の `cli` 転送や JSON 出力には通知文を追加しません。保存先が読み取り専用の場合や `refresh` に失敗した場合、古い結果を新しい確認の成功として扱うことはありません。記録時刻と期限切れ/エラー状態は `show` で確認してください。定期的な `refresh` には、別途明示的に設定した呼び出し元が必要です。VM が停止している間に VM 内のコマンドが実行されることはありません。

### 確認済みバンドルによる手動更新

インストール先、ランタイムソケット、Linux のプロセス情報を参照できる環境で実行してください。`update apply` には Linux、Python 3.9 以降、pidfd のサポートが必要です。開始前に、クラウドコンピューターを操作できる独立したターミナルを開いてください。`--confirm-recovery-terminal` は確認したことを記録するだけで、そのターミナルが利用可能かを検査するものではありません。トランザクションワーカーは呼び出し元のセッションから切り離されるため、SSH 経由で処理を開始できますが、SSH 接続自体は復旧手段になりません。

確認済みの安定版を固定して選びます。

```bash
/workspace/.dots-tailscale/dots-ts update apply --tag v0.4.1 --proxy http://browser-proxy:8889 --confirm-recovery-terminal --json
/workspace/.dots-tailscale/dots-ts update status --id TRANSACTION_ID --json
```

これは使用例であり、v0.4.1 の公開を告知するものではありません。`TRANSACTION_ID` は apply が返す ID に置き換えてください。リリースのダウンロードがブロックされている場合や、未公開候補を明示的に試す場合は、確認済みのローカルソースバンドルも使用できます。

```bash
/workspace/.dots-tailscale/dots-ts update apply --bundle /workspace/reviewed-bundle --confirm-recovery-terminal --json
```

バンドルにはソースファイル 4 つと、それらに対応する元のマニフェストが必要です。ローカル選択では開発版も指定できますが、公開済みの GitHub リリースとしては扱いません。更新ツールはファイルを置き換える前にハッシュと構文を検証します。チェックサムが一致することは選択したバンドルとの整合性を示しますが、作成者を独立に信頼できることの証明にはなりません。

`started` は切り離されたワーカーが処理を受け付けたことを示し、更新の成功を意味しません。再接続した後に `update status` を確認してください。最終状態は `applied`、`failed_rolled_back`、`rollback_failed_manual_required` を区別します。ローカルの準備状態とバージョン確認だけでは外部からの SSH 接続を証明できません。`applied` またはロールバック成功後に、新しい SSH 接続を厳格なホスト鍵確認付きで開き、目的の接続を別途テストしてください。

ワーカーは、setup と proxy apply が使うものと同じ操作ロックを保持したまま、4 つのソースファイルとそのマニフェストだけをバックアップして置き換えます。再起動するのは特定済みの shim プロセスだけです。tailscaled と sshd は動作したままです。ノード state、ログイン資格情報、秘密鍵、SSH 設定、プロキシ設定をコピーしたり初期化したりしません。同梱 Tailscale バイナリのバージョンを変更するリリースは、この更新ツールの対象外として拒否されます。識別できないプロセスを終了したり、ソケットを削除したりしません。

インストール済みのマニフェストが一致している必要があります。メタデータのない古いインストールでは、インストール済みの 4 ファイルすべてを、別途入手して確認したリリースと照合してください。インストール済みファイル自身から期待するチェックサムを生成しないでください。出所を確認できない場合や、異なるソースが混在している場合は手動確認のため中止します。既存インストールに対する意図的な移行でソースチェックアウトを使う場合も、更新ツールを実行する前に、そのチェックアウトが自身のマニフェストと一致している必要があります。

未完了のトランザクションがあると、新しい更新は開始できません。ワーカーの強制終了後や VM の入れ替え後は、独立したターミナルから状態とコードのみのバックアップを確認してください。再試行のためにジャーナルを削除したり、次の処理が安全だと決めつけたりしないでください。ロールバック後も準備状態を確認できない場合は、証拠を保持し、確認済みのバックアップから手動で復旧してください。この更新ツールは VM を自動復旧するサービスではありません。

トランザクションの記録は `.update-transactions/TRANSACTION_ID/` に保存されます。`journal.json` は進行段階、`stage/` は選択したバンドル、`backup/` は以前のソースのみを保持し、`supervisor/` には updater のコードのスナップショットを保存します。外部から接続を確認するまでは記録を残してください。`update status` の終了コードは、実行中または適用済みなら 0、拒否、ロールバック、中断、手動復旧が必要な場合は 1 です。実行中の終了コード 0 は完了を意味しません。

`applied` は、選んだコードがマニフェストと一致し、ローカルの準備状態の確認を通過したことを表します。shim の CONNECT/WebSocket 通信全体を検証した結果ではありません。再起動する shim には upstream のホスト・ポートと絶対パスの SSL 証明書設定を引き継ぎますが、その他のシェル環境やデバッグ設定は引き継ぎません。stdout/stderr は破棄するため、以前の `shim.log` への新しい出力を期待せず、トランザクションの固定エラーコードと別途行う接続確認を使ってください。

中断したトランザクションは、証拠を削除せずに手動復旧を完了できます。

1. 独立したターミナルで worker が終了したことを確実に確認します。PID が見えないことや status が不明なことだけでは、終了した証拠になりません。
2. 必要なら確認済みのコードバンドルを復元して起動し、マニフェスト、ローカルの準備状態、新しい外部 SSH 接続を厳密なホスト鍵検証付きで確認します。古いヘルパーでは、別途確認済みのソースランナーによるマニフェスト確認が必要な場合があります。
3. worker が動いておらず、インストール先の `.operation.lock` を取得した状態で、確認済みのトランザクションディレクトリ全体を `.update-transactions/` の外にある、自分が所有する権限 700 の `.update-recovery-archive/` へ移します。記録とバックアップは一緒に残してください。これで未完了トランザクションの検索対象から外れます。apply の制限を回避するために、実行中または未確認の記録を移してはいけません。

確認済みの開発候補を 2026-10-21 に Dots で試験しました。通常の適用、意図的な起動失敗からのロールバック、外部 SSH の確認結果と範囲は[更新の検証記録](validation/v0.4.0-update-trial.md)を参照してください。

<a id="development-helpers"></a>

## v0.3.1 ヘルパーと任意のアプリケーションプロキシ
Expand Down
Loading
Loading