Endurain: セルフホスト可能なStrava風サービス
(github.com/joaovitoriasilva)- Endurainは、ユーザーがデータとホスティング環境を自ら管理できるよう設計されたセルフホスト型フィットネストラッキングサービスで、Stravaに似ているが、プライバシー保護とカスタマイズに重点を置いている
- フロントエンドは Vue.js、バックエンドは Python FastAPI ベースで、PostgreSQL、Jaeger、Alembic、SQLAlchemy などを用いてアクティビティデータ管理と基本的なトラッキングを構成している
- Strava と Garmin Connect との連携をサポートし、
.gpx、.tcx、.fitファイルによるアクティビティの手動アップロードも可能 - Docker イメージと
docker-compose.yml.exampleのサンプルが提供されており、設定は環境変数で処理することで、デプロイとカスタマイズを容易にしている - GitHub リポジトリは読み取り専用ミラーで、プロジェクト活動は Codeberg で行われており、現在は新機能よりも基盤強化に注力する 一時的な機能凍結 状態にある
Endurainが提供する機能
- Endurainはセルフホスト型フィットネストラッキングサービスで、ユーザーがデータとホスティング環境を完全に制御することを目指している
- Strava に似たサービスだが、重点は プライバシー保護 とカスタマイズにある
- アクティビティデータは、外部サービス連携またはファイルアップロード方式で取り込める
- Strava 連携をサポート
- Garmin Connect 連携をサポート
.gpx、.tcx、.fitファイルの手動アップロードをサポート
技術構成
- フロントエンドは Vue.js、Notivue、Bootstrap CSS で構成されている
- バックエンドは Python FastAPI を中心に構成されている
- Alembic
- SQLAlchemy
- Apprise
- Strava 連携用
stravalib - Garmin Connect 連携用
python-garminconnect .gpx取り込み用gpxpy.tcx取り込み用tcxreader.fit取り込み用fitdecode
- データベースには PostgreSQL を使用
- 基本的なトラッキングとモニタリングには Jaeger が使われている
デプロイと設定
- Endurain のデプロイ向けに Docker イメージ が提供されている
- リポジトリには
docker-compose.yml.exampleファイルがあり、デプロイ例を確認できる - 設定は 環境変数 を通じて処理され、柔軟性とカスタマイズのしやすさを提供する
- 詳細は Endurain documentation で確認できる
デモ環境
- インストールなしで Endurain を体験できるデモが提供されている
- https://demo.endurain.com
- ユーザー名:
admin - パスワード:
admin
- デモ環境は Europe/Lisbon タイムゾーン基準で毎日深夜0時にリセットされる
- デモには重要なデータを保存しないこと
プロジェクト運営状況とライセンス
- GitHub リポジトリは 読み取り専用ミラー であり、Issue・プルリクエスト・プロジェクト活動は Codeberg で管理されている
- Endurain は 一時的な機能凍結 状態にある
- プロジェクトが中断されたわけではなく、新機能よりも基盤強化に重点が移っている
- 関連説明は Pausing new features so Endurain can keep growing で確認できる
- 多言語対応があり、Codeberg Translate を通じて翻訳に貢献できる
- ライセンスは AGPL-3.0
- Endurain® は João Vitória Silva の商標
- 個人、教育、研究、コミュニティ目的の非商用セルフホスト、および名称・ロゴの使用は許可される
- 有料ホスティング、製品、サービス提供のように Endurain の名称やロゴを商用利用することは、事前の書面による許可なしには認められない
1件のコメント
Hacker Newsのコメント
intervals.icu(https://intervals.icu/) に少しずつ移行している
寄付ベースなので、ある程度「オープンソース」に近く、Stravaよりずっと良いと感じる
Stravaを使う理由は、友人や家族がモチベーションを与えてくれるからであって、より大きなパワー値や心拍数を得たいからではない
Webアプリとしては欠けている機能が1つあり、スマートウォッチが記録したアクティビティの自動追跡 は難しいように見える
回避策としては、いったんStravaに自動インポートし、その後StravaをEndurainに接続する形になりそう
GarminはFITアクティビティを取り込むためのConnect向けRESTインターフェースを提供している
https://developer.garmin.com/gc-developer-program/activity-a...
だから欠けているのは、Endurainと主要メーカーのプラットフォームとの連携だろう。実際に欠けているかどうかはコードを確認していない
Garminでも可能だった記憶はあるが、最新版はよく分からない
プロの開発者ではなく、10年前に大学で学んだ開発概念くらいの知識しかないのだとしたら、これほど完成度が高く見えるシステムを作ったのは立派だ
ただ、元の開発者本人なのかは分からないが、あとで足を引っ張るようなミスをしてしまったのではないかと怖くならないのか気になる。たとえばセキュリティ問題や、後から修正しづらい不具合のようなものだ
些細なタイプミスや、本来簡単に見つかるはずのバグに1時間を無駄にしてしまうタイプだ
ChatGPTをプロジェクト補助、コード生成、コードの問題点の指摘などに使っている
特にありふれた機能を実装するとき、自分ひとりでやるより 境界条件 をよく押さえてくれるし、セキュリティホールを塞いでほしいと頼んでも、自分のレベルよりはうまく対処してくれる
昨日もフォームを埋めるボットを防ぐ戦略を7つ提案してくれて、そのうちいくつかを数分で適用したら、ボット問題がすぐに止まった
もちろんミスは起きるが、AIツールは自分自身の批判的思考と組み合わせて使えば、そうしたミスを減らす助けになる。AIを頻繁に修正したり、特定の種類の問題を防ぐ観点から助けを求めたり、既存の知識をもとにプロンプトを組み立てたりすれば、ずっと良い答えが得られる
印象的なのは、システムを作り、しかもおそらくコミュニティからのフィードバックに開いている点で、これは経験豊富な開発者がセキュリティを心配して何年もひとりで作るより、むしろ良い結果につながるかもしれない
ミスそのものより重要なのは、発見して修正する速さ だと思う。そして同じことが再び起きないよう、リンター、単体テスト、型システム、CI/CDのような自己強化的な仕組みを整えることが重要だ。冗談半分でこれを謙虚さベースの開発と呼んでいる
どれほど経験豊富な開発者でもこうしたミスはする。自分はもうその段階を超えたと思っているなら、真実を見るにはもっと経験が必要だ
学ぶ最良の方法は、プロジェクトを作り、ミスをし、それをどう直すかを見つけることだ。直すのが難しいほど、次のプロジェクトでは最初の設計段階から考慮するようになる
AIであれ初心者であれ、結局はどれだけ間違っているかの程度の差にすぎないと思う
名前が素晴らしい。enduranceと、スペインの偉大な自転車競技チャンピオン Miguel Induráin の名前をかけた言葉遊びに見える
https://en.m.wikipedia.org/wiki/Miguel_Indur%C3%A1in
EPOの先駆者であるDr. Conconiと組んでいたし、摘発されたことはないが、クリーンだった可能性は低いと思う
これはバックアップ機能付きの 代替フロントエンド に近いのではないか?
結局、このツールに来る前に、まずデータをStravaに渡さなければならない構造に見える
Stravaがまったく不要な、自作のかなり粗削りな代替手段もある: https://github.com/cfe84/gpx-tools/blob/main/README.md
GPXトラックがあるフォルダで実行する CLIコマンド で、セグメントはJSONファイルに直接定義し、そのうえでセグメントごとの成績を一覧できる
アクティビティの記録はOsmAndで行い、foldersyncでsyncthing経由の同期を行ったあと、対象フォルダで実行して使っている
セグメント計算ロジックは参考になるかもしれない。素晴らしいと主張するつもりはないが、サーバーに組み込むのに向いた追加機能になるかもしれない
Stravaのキラー機能はセグメントだと思う。
ユーザー全体で最速の記録、つまりKOMに興味がなくても、特定の道路区間で時間の経過とともに自分の進捗を比較できるのは価値がある。
心拍数と体感強度をあわせて見れば、現在の体力がどの程度か、あるいは最高のコンディションからどれだけ落ちているかを見積もれる。
その次には、悪質なセグメントや投稿者をブロックまたは削除する方法が必要で、投票システムもあり得る。
アクティビティ中にセグメントを検出するのは厄介なので、もっと調べてみたかった。たぶんChatGPTの説明を借りることもできるだろうが、緯度・経度のバウンディングボックスと、その中で開始・終了地点を検出する方式が関係していることくらいは分かっている。
Stravaがセグメントについて何らかの特許を持っていたと、うっすら記憶している。
Gadgetbridge[0]のようなモバイルツールとどう併用できるのか気になる。
このアプリはスマートウォッチの独自アプリを回避し、健康データや位置データを商用サービスにアップロードしないようにしてくれる。
ただしGarminの主要なスポーツウォッチには対応しておらず、一部のデバイスしかサポートしていない[1]。そのため、ウォッチをUSBで接続してトラックを移し、コンピューターからアクセスする必要があり、モバイル対応はない。
[0] https://f-droid.org/en/packages/nodomain.freeyourgadget.gadg...
[1] https://gadgetbridge.org/gadgets/
Fediverseと連携するのか。Stravaを使う主な理由は、ソーシャルネットワークとしての性格にある。
Garmin Connectは分析ツールがStravaより優れている。Endurainはまだ使っていない。
Runalyzeがもうオープンソースではなくなったのは残念だが、以前のバージョンはまだ残っている。
https://github.com/Runalyze/Runalyze