【QPKG】sherpa:ミニパッケージマネージャー(CLI)


sherpa(シャーパ): QNAP NAS用のミニパッケージマネージャー

世界初のマルチアクションCLIパッケージマネージャー!

sherpaによるパッケージ管理は、簡単なアプリケーションのバックアップ、アップグレード、サービスやデーモンの管理、マルチスレッド動作、自己診断と修復、そしてすべての操作をcronによる自動化が可能などの機能を提供します。

重要:これはコマンドラインのパッケージ&サービスマネージャーであり、ベータ版です。自動アップグレードの失敗によりパッケージが壊れることが知られています。診断やログ提供で協力したい方、時々何かが壊れても気にしない方は、ぜひこのパッケージをご利用ください。完全な安定性や「セット&忘れる」ソリューションを求めている場合は、現時点ではここでは見つかりません。絶対に本番環境でsherpaを使用しないでください。CLIやbash・Pythonスクリプトのデバッグに慣れている、またはアプリケーションが長時間停止しても問題ない場合のみご利用ください。

とはいえ、開発の大部分は完了しており、現在は自動パッケージアップグレード時の安定性向上に取り組んでいます。そのため、sherpaは新規(または初期化された)システムでは美しく動作しますが、個別アプリケーションのアップデート時に問題が発生することがあります。

インストール可能なパッケージはこちら

インストール方法

  • SSHでNASに接続し、コマンドプロンプトからQPKGを手動インストールします:
    curl -skL https://tinyurl.com/get-sherpa > /share/Public/sherpa.qpkg; sudo sh /share/Public/sherpa.qpkg;

使い方

  • コマンドプロンプトで以下を実行してください:
    sudo sherpa
    …その後、表示されるヘルプに従ってください。

    QTSのバージョンで’sudo’が利用できない場合は、SSHで’admin’ユーザーとしてNASに接続し、以下を実行してください:
    sherpa

ご提案、アドバイス、ご意見、ご質問などがある場合は、新しいissueを作成するか、ディスカッショントピックを新規作成してください。

このプロジェクトはコミュニティによる共同作業であり、QNAPコミュニティフォーラムの多くのメンバーからのフィードバックをもとに構築されました。ご協力いただいた皆様に感謝します。:nerd_face:

詳細はWikiをご覧ください:https://github.com/OneCDOnly/sherpa/wiki

「いいね!」 7

Readarrユーザーにとって残念なお知らせです。開発者が開発を停止し、現在sherpaで使用されているフォークはアーカイブされました:https://www.reddit.com/r/Readarr/comments/1llqji9/announcement_retirement_of_readarr

もしメンテナンスされているフォークをご存知の方がいれば、教えていただければReadarr QPKGをそちらに切り替えます。そうでない場合、Readarr QPKGは引き続き利用可能ですが、今後アップグレードは行われません。

「いいね!」 1

さらに悪いニュースです:TorrServerの開発者が、バイナリをlibc 2.34必須でコンパイルするようになりましたが、これはQTSでは利用できません。:disappointed:

そのため、現時点ではTorrServerパッケージは実行できません。既存のTorrServerユーザーは、次回TorrServerがアップデートされるとインストールが壊れ、次回の安定版QPKGリリースでTorrServerはsherpaサポートから削除されます。

引き続きこのアプリケーションを使用したい場合は、myQNAPリポジトリに古いバージョンがあります:https://www.myqnap.org/product/torrserver/

既存の設定ファイルを移行できる可能性がありますが、myQNAP版をインストールする前に必ず手動で設定ファイルのバックアップを取ってください。

sherpa版TorrServerはQTS App Centerから手動でアンインストールしてください。

「いいね!」 1

こんにちは OneCD さん、お元気ですか?

最新の Sherpa アップデート後、SickGear で以下のエラーが発生しています。

Error
OverflowError('date value out of range')

Traceback
Traceback (most recent call last):
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/tornado/web.py", line 1848, in _execute result = await result ^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/tornado/gen.py", line 796, in run yielded = self.gen.throw(exc) ^^^^^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/sickgear/webserve.py", line 1044, in get yield self.route_method(route, use_404=True)
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/tornado/gen.py", line 783, in run value = future.result() ^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/tornado/gen.py", line 796, in run yielded = self.gen.throw(exc) ^^^^^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/sickgear/webserve.py", line 350, in route_method result = yield self.async_call(method, filter_kwargs) # method(**filter_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/tornado/gen.py", line 783, in run value = future.result() ^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/sg_futures/py3.py", line 40, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/sickgear/webserve.py", line 359, in async_call raise e
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/sickgear/webserve.py", line 357, in async_call return function(**kw) ^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/sickgear/webserve.py", line 1148, in view_shows return Home(self.application, self.request).view_shows() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/sickgear/webserve.py", line 1758, in view_shows return t.respond() ^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/config/cache/cheetah/_share_CACHEDEV1_DATA__qpkg_OSickGear_repo_cache_gui_slick_interfaces_default_home_tmpl.py", line 441, in respond data_lastdate = VFN(VFN(VFFSL(SL,"SGDatetime",True),"convert_to_setting",False)(VFN(VFFSL(SL,"network_timezones",True),"parse_date_time",False)(VFFSL(SL,"cur_airs_last",True), VFFSL(SL,"cur_show_obj.airs",True), VFFSL(SL,"cur_show_obj.network",True))),"strftime",False)('%Y%m%d%H%M') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/dateutil/tz/tz.py", line 231, in dst if self._isdst(dt): ^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/dateutil/tz/tz.py", line 294, in _isdst if self.is_ambiguous(dt): ^^^^^^^^^^^^^^^^^^^^^
File "/share/CACHEDEV1_DATA/.qpkg/OSickGear/repo-cache/lib/dateutil/tz/tz.py", line 256, in is_ambiguous (naive_dst != self._naive_is_dst(dt - self._dst_saved))) ~~~^~~~~~~~~~~~~~~~~
OverflowError: date value out of range

Request Info
method: GET
uri: /view-shows/
version: HTTP/1.1
headers:
body: b''
remote_ip: xxxxxxxxxxxxxxx
protocol: http
host: xxxxxxxxxxxxxxxxxxx
host_name: xxxxxxxxxxxxxxxxxxx
files: {}
connection:
server_connection:
_start_time: 1758182428.793617
_finish_time: None
path: /view-shows/
query:
arguments: {}
query_arguments: {}
body_arguments: {}
_cookies:

再起動や再インストールも試しましたが、同じエラーが出ます。何かアイデアはありますか?

こんにちは、Shadyさん。新しいフォーラムへようこそ。:slight_smile:

まずは check アクションを実行していただけますか?

sherpa check

sherpa check
sherpa v250822-stable
完了: アクションが完了しました。

• パッケージアクション開始 @ 10:20:15 AM、終了 @ 10:20:41 AM、経過時間 = 26秒

• 以下のパッケージアクションは正常に完了しました:
3秒で補助PIPをインストール
1秒でnzbToMedia QPKGを再有効化
16秒でOSickGear QPKGを再有効化
17秒でSABnzbd QPKGを再有効化

• 以下のパッケージアクションはスキップされました(理由):
1秒で「署名」Entware QPKG(すでに署名済み)
1秒で「署名」Par2 QPKG(NASアーキテクチャ非対応)
1秒で「署名」Par2turbo QPKG(すでに署名済み)
1秒で「署名」sherpa QPKG(すでに署名済み)
1秒で「署名」SortMyQPKGs QPKG(QTSバージョン非対応)
1秒で「署名」Unrar QPKG(すでに署名済み)
1秒で「署名」nzbToMedia QPKG(すでに署名済み)
1秒で「署名」SABnzbd QPKG(すでに署名済み)
1秒で「署名」OSickGear QPKG(すでに署名済み)
1秒でClamAV QPKGを再有効化(未インストール)

今のところ良さそうです。:+1:

次の作業:SickGearでcleanアクションを実行してください:

/etc/init.d/sickgear.sh clean

…その後、startを試してください:

/etc/init.d/sickgear.sh start debug
[~] # /etc/init.d/sickgear.sh clean
> source: sickgear.sh, action: clean, time: Thu 18 Sep 2025 10:56:11 AM BST, load: 0.20 
- package: 250822, service: 250822, library: 250822
> QPKG 有効: true
> アプリケーション自動更新: true
- アクティブな git ブランチ: main
- デーモン PID: 11350
> デーモン PID 11350 を SIGTERM で停止(最大120秒まで): 1, 2, OK
- デーモン PID: なし
> ローカルリポジトリのクリーン: OK
> 仮想 Python 環境のクリーン: OK
> PyPI キャッシュのクリーン: OK
> 一時パスのクリーン: OK
- ファイル存在: /opt/bin/git
> リモートリポジトリから 'OSickGear' を作成: OK
- アクティブな git ブランチ: main
> 新しい仮想 Python 環境を作成: OK
> QPKG 'pip' 設定を作成: OK
> '/share/CACHEDEV1_DATA/.qpkg/OSickGear/pip-cache' を 'pip' キャッシュとして追加: OK
> '/share/CACHEDEV1_DATA/.qpkg/OSickGear/qpkg-wheels' を 'pip' 検索パスに追加: OK
> pip-requirements.txt から問題のある PyPI モジュールを除外: OK
> pip-recommended.txt から問題のある PyPI モジュールを除外: OK
> pip-requirements.txt から PyPI モジュールをインストール: OK
> pip-recommended.txt から PyPI モジュールをインストール: OK
> 設定ファイルからポートを読み込み: OK
> デーモンを起動: OK
> デーモンプロセス名が表示されるまで監視(最大120秒まで): 1, OK
> PID が生存していることを確認するため10秒待機: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 完了
- デーモン PID: 8916
- デーモン待ち受けアドレス: 0.0.0.0
> HTTPS ポート有効: false
- HTTP ポート: 7181
> ポート 7181 の応答をテスト(最大120秒まで): OK
> QPKG アイコンを UI ポートで更新: OK
= source: sickgear.sh, action: clean, time: Thu 18 Sep 2025 10:56:36 AM BST, result: OK, elapsed: 0h:00m:26s, load: 0.45 
[~] # /etc/init.d/sickgear.sh start debug
> source: sickgear.sh, action: start, time: Thu 18 Sep 2025 10:56:56 AM BST, load: 0.32 
- package: 250822, service: 250822, library: 250822
> QPKG 有効: true
> アプリケーション自動更新: true
- アクティブな git ブランチ: main
- デーモン PID: 8916
= source: sickgear.sh, action: start, time: Thu 18 Sep 2025 10:56:56 AM BST, result: OK, elapsed: 23ms, load: 0.32 

実行しましたが、まだエラーが表示されます

クリーンは良さそうで、スタートも問題なさそうです(実際、SickGearデーモンはすでに実行中のようです)。:+1:

そのエラーはどこで見ましたか?

http://xxxxxxxxxxxxx:7181/view-shows

ログインは正常にできますが、ショーページに進むとエラーが発生します。

ウェブブラウザのページを強制的に再読み込みしましたか?CTRL+F5。

はい、まだうまくいきません

うーん、SickGearデータベースに無効な値が書き込まれているのではないかと思います。

テスト目的で、SickGearを新しいデータベースで起動してみましょう。まず既存のデータベースをバックアップし、後で元に戻します。これは修正ではなく、あくまでテストです。

現在のデータベースファイルをバックアップするには:

/etc/init.d/sickgear.sh backup

…次に、SickGearの設定をデフォルトにリセットします:

/etc/init.d/sickgear.sh reset-config

これで再度SickGearのウェブページにアクセスしてみてください。TV番組リストは空になっているはずです。何かエラーは表示されますか?

この操作を試した後、SickGearのデータベースファイルを復元してください:

/etc/init.d/sickgear.sh restore

SickGearは必要に応じて自動的に停止・起動されます。今回は出力を投稿する必要はありません。

それらも試しましたが、うまくいきません。同じエラーメッセージが出ます。

確認ですが、設定をリセットした後、復元する前にSickGearのウェブページにアクセスしようとしましたか?そして同じエラーが表示されましたか?

この問題はSickGear開発者の支援が必要かもしれません: [How to] Report Issues · SickGear/SickGear Wiki · GitHub

また、「公式」のSickGearパッケージも利用可能なので、試してみる価値があるかもしれません: Install SickGear 05 QNAP · SickGear/SickGear Wiki · GitHub

Ok、不正をしました。Claude(クロード)を使ってエラーをデコードしました :slight_smile:

SickGear 日付オーバーフローエラー - 問題の概要と修正

問題点:

SickGearは、view-showsページを読み込もうとした際に OverflowError('date value out of range') をスローしていました。このエラーは、番組の放送日を処理するタイムゾーン計算中に発生しました。

根本原因:

SickGearのデータベースには、適切な最近の日付ではなく1970年(1970年1月9日頃)のタイムスタンプが含まれていました:

  • 番組: last_update_indexer の値が約739435(1970-01-09に相当)
  • エピソード: airdate の値が約738153-738181(これも1970年)

これら非常に古い日付が原因で、Pythonのdateutilタイムゾーン計算関数が夏時間の移行やタイムゾーン変換を処理しようとした際に失敗しました。

修正方法:

問題のあるタイムスタンプを修正するための2つのSQL UPDATEコマンド:

sql

-- 番組の更新タイムスタンプを修正(現在時刻に設定)
UPDATE tv_shows SET last_update_indexer = strftime('%s', 'now') WHERE last_update_indexer < 946684800;

-- エピソードの放送日を修正(NULL/不明に設定)
UPDATE tv_episodes SET airdate = NULL WHERE airdate > 0 AND airdate < 946684800;

解決手順:

  1. SickGearサービス(PID 31531)を停止
  2. データベース(sickbeard.db)をバックアップ
  3. 問題のある日付を修正するSQLを適用
  4. /share/CACHEDEV1_DATA/.qpkg/OSickGear/sickgear.sh start を使ってSickGearを再起動

この修正により、データベース内のすべての日付が現代のタイムゾーン計算で有効な範囲内となり、SickGearのWebインターフェースが正常に動作するようになります。

おお、いいですね!:+1:

それで実際に問題は解決しましたか?

はい、とてもよく動作します。プログラミング未経験者として、Claude(クロード)が問題を見つけて、コードを書き、修正方法まで教えてくれるのは本当に賢いと思います。

素晴らしいですね!

それでも、この問題と修正方法を開発者に知らせておく価値はあります。再発防止に役立つかもしれません。

こんにちは、このエラーは何ですか?

[~] # sherpa check
sherpa v250927-stable
完了: アクションが完了しました。

• パッケージアクション開始 @ 2:15:17 PM、終了 @ 2:15:24 PM、経過 = 7秒

• 次のパッケージアクションはスキップされました(理由):
    "sign" Entware QPKG 1秒で(すでに署名済み)
    "sign" Par2turbo QPKG 1秒で(すでに署名済み)
    "sign" sherpa QPKG 1秒で(すでに署名済み)
    "sign" OTransmission QPKG 1秒で(すでに署名済み)

• このパッケージアクションは失敗しました(理由):
    reactivate OTransmission QPKG 2秒で (1)