Skip to content

refactor(daemon): systemd oneshot+timer → 常駐デーモン方式へ変更 (issue #54)#55

Merged
liplus-lin-lay merged 1 commit intomainfrom
issue-54-daemon
Mar 5, 2026
Merged

refactor(daemon): systemd oneshot+timer → 常駐デーモン方式へ変更 (issue #54)#55
liplus-lin-lay merged 1 commit intomainfrom
issue-54-daemon

Conversation

@liplus-lin-lay
Copy link
Copy Markdown
Collaborator

設計判断(issue #54 より)

問題

決定: 常駐デーモンに変更

  • 2本の goroutine ticker で 2 つの間隔を プロセス内部で完全に独立管理
  • ログが 1 ストリームに集約 → journalctl -u dipper_ai だけで全状態確認
  • DDNS_TIME=1d, UPDATE_TIME=2m など任意の組み合わせが正しく動く
  • install.sh からタイマー動的生成ロジックが消えてシンプルになった

変更ファイル

  • internal/mode/daemon.go 新規
  • internal/mode/keepalive.go 新規(手動実行用にも残す)
  • internal/mode/update.go forceSync / gate ロジック除去
  • cmd/dipper_ai/main.go daemon / keepalive コマンド追加
  • systemd/dipper_ai.service Type=simple、Restart=on-failure
  • systemd/dipper_ai.timer 削除
  • scripts/install.sh 大幅シンプル化(旧ユニット自動削除も追加)

Closes #54

## 設計判断
systemd タイマー方式では DDNS_TIME と UPDATE_TIME の 2 軸を 1 本のタイマーで
管理せざるを得ず、任意の組み合わせが正しく動作しない仕様バグがあった。
2 本タイマー案(#53)は systemd 側に複雑さを押し出すだけで、実機デバッグで
「どちらのタイマーのせいか」の切り分けが困難になるため採用しない。

常駐デーモンに変更し、2 本の goroutine ticker で 2 つの間隔を内部管理する。
これにより DDNS_TIME=1d + UPDATE_TIME=2m など任意の組み合わせが正しく動く。

## 変更内容
- internal/mode/daemon.go: Daemon() 実装
  - checkTicker (DDNS_TIME): update → check → err_mail サイクル
  - keepaliveTicker (UPDATE_TIME): 全 MyDNS エントリ強制更新
  - nil channel イディオムで UPDATE_TIME=0 時の keepalive を無効化
  - SIGTERM/SIGINT でクリーンシャットダウン
- internal/mode/keepalive.go: MyDNS 強制更新コマンド (手動実行用にも残す)
- internal/mode/update.go: forceSync / gate ロジックをすべて除去
- cmd/dipper_ai/main.go: daemon / keepalive サブコマンド追加
- systemd/dipper_ai.service: Type=oneshot → Type=simple、Restart=on-failure
- systemd/dipper_ai.timer: 削除
- scripts/install.sh: タイマー動的生成ロジックを除去、旧ユニット自動削除追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@liplus-lin-lay liplus-lin-lay merged commit ae2a995 into main Mar 5, 2026
4 checks passed
@liplus-lin-lay liplus-lin-lay deleted the issue-54-daemon branch March 6, 2026 14:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor(daemon): systemd oneshot+timer → 常駐デーモン方式へ変更

1 participant