2P by GN⁺ | ★ favorite | 댓글 1개
  • 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을 체험할 수 있는 데모가 제공됨
  • 데모 환경은 Europe/Lisbon 시간대 기준 매일 자정에 초기화됨
  • 데모에는 중요한 데이터를 저장하지 않아야 함

프로젝트 운영 상태와 라이선스

  • GitHub 저장소는 읽기 전용 미러이며, 이슈·풀 리퀘스트·프로젝트 활동은 Codeberg에서 관리됨
  • Endurain은 임시 기능 동결 상태임
  • 다국어 지원이 있으며 Codeberg Translate를 통해 번역에 기여할 수 있음
  • 라이선스는 AGPL-3.0
  • Endurain®은 João Vitória Silva의 상표임
    • 개인, 교육, 연구, 커뮤니티 목적의 비상업적 자체 호스팅과 이름·로고 사용은 허용됨
    • 유료 호스팅, 제품, 서비스 제공처럼 Endurain 이름이나 로고를 상업적으로 사용하는 것은 사전 서면 허가 없이 허용되지 않음

댓글과 토론

Hacker News 의견들
  • intervals.icu(https://intervals.icu/) 쪽으로 조금씩 옮겨가고 있음
    기부 기반이라 어느 정도 “오픈 소스”에 가깝고, Strava보다 훨씬 낫다고 느낌

    • “기부 기반이라 오픈 소스에 가깝다”는 게 대체 무슨 뜻인지 모르겠음
    • 사이트에서 소스 코드 링크를 못 찾겠는데, 어디를 봐야 하는지 궁금함
    • 그건 좀 다름. Strava는 소셜 플랫폼에 더 가깝고, intervals.icu는 훈련과 진척 관리 플랫폼에 더 가까움
      Strava를 쓰는 이유는 친구와 가족이 동기부여를 해주기 때문이지, 더 큰 파워/심박 수치를 얻고 싶어서가 아님
  • 웹 앱으로는 빠진 기능이 하나 있는데, 스마트워치가 기록한 활동 자동 추적은 어렵다고 봄
    우회 방법은 Strava로 자동 가져오기 한 뒤 Strava를 Endurain에 연결하는 식으로 보임

    • 웹 앱도 Garmin 스마트워치 활동을 자동으로 가져올 수 있음
      Garmin은 FIT 활동을 가져오기 위한 Connect용 REST 인터페이스를 제공함
      https://developer.garmin.com/gc-developer-program/activity-a...
    • 스마트워치가 Strava에 직접 활동을 올리는 건 아니지 않나? 보통 Garmin Connect 같은 제조사 클라우드 서비스에 연결되고, Strava가 그쪽과 API 연동을 하는 구조일 것임
      그러니 빠진 건 Endurain과 주요 제조사 플랫폼 간 연동으로 보임. 실제로 빠졌는지는 코드는 확인 안 해봄
    • 예전에 썼을 때는 Suunto 앱에서 사용자 지정 데이터 업로드를 설정할 수 있었고, 당시 Strava 업로드도 그런 식이었음
      Garmin도 가능했던 것으로 기억하지만, 최신 버전은 잘 모르겠음
    • 한 가지 방향은 여러 서비스와 연동되는 RunGap에 통합하는 것일 수 있음
  • 직업 개발자가 아니고 10년 전 대학에서 배운 개발 개념 정도라면, 이렇게 완성도 있어 보이는 시스템을 만든 건 잘한 일임
    다만 원 개발자인지는 모르겠지만, 나중에 발목 잡을 실수를 했을까 봐 두렵지는 않은지 궁금함. 예를 들면 보안 문제나 나중에 고치기 어려운 오류 같은 것들

    • 오랫동안 아마추어 프로그래머로 지냈지만, 코딩에 정말 능숙해질 시간은 없었음
      사소한 오타나 쉽게 찾을 수 있어야 할 버그에 한 시간을 날리는 유형임
      ChatGPT를 프로젝트 보조, 코드 생성, 코드 문제 지적 등에 쓰고 있음
      특히 흔한 기능을 구현할 때는 내가 혼자 했을 때보다 경계 조건을 더 잘 챙기는 편이고, 보안 구멍을 막아달라고 해도 내 수준보다는 낫게 처리함
      어제도 폼을 채우는 봇을 막는 전략을 7가지 제안했고, 그중 몇 개를 몇 분 만에 적용하자 봇 문제가 바로 멈췄음
      실수는 당연히 생기지만, AI 도구는 스스로의 비판적 사고와 함께 쓰면 그런 실수를 줄이는 데 도움이 됨. 자주 AI를 교정하거나, 특정 문제 유형을 막는 관점에서 도움을 요청하거나, 기존 지식을 바탕으로 프롬프트를 짜면 훨씬 나은 답을 얻음
    • 모든 개발자는 실수를 함. 경험은 명백한 실수의 기준선을 덜 명백한 실수 쪽으로 옮겨줄 뿐임
      인상적인 건 시스템을 만들고 아마도 커뮤니티 피드백에 열어뒀다는 점인데, 이는 경험 많은 개발자가 보안을 걱정하며 몇 년 동안 혼자 만드는 것보다 더 나은 결과로 이어질 수도 있음
      실수 자체보다 중요한 건 발견하고 고치는 속도라고 봄. 그리고 같은 일이 다시 생기지 않도록 린터, 단위 테스트, 타입 시스템, CI/CD 같은 자기 강화 시스템을 세우는 게 중요함. 농담 삼아 이걸 겸손 기반 개발이라고 부름
    • 이런 두려움에 휘둘리면 실제로는 아무것도 만들지 못함
      가장 경험 많은 개발자도 이런 실수를 함. 자신은 그런 단계를 넘어섰다고 생각한다면, 진실을 보려면 더 많은 경험이 필요함
      배우는 가장 좋은 방법은 프로젝트를 만들고, 실수하고, 고치는 법을 찾는 것임. 고치기 어려울수록 다음 프로젝트에서는 처음 설계부터 고려하게 됨
    • PHP를 대충 훑어보니 비밀번호 해싱에 SHA-2를 쓰는 것 같아서, 그런 문제가 있을 가능성은 꽤 높아 보임
      AI든 초보자든 결국 얼마나 틀렸느냐의 정도 차이일 뿐이라고 봄
    • 무엇을 두려워해야 하는지 모르겠음. 실제 위험이 뭔가?
  • 이름이 훌륭함. endurance와 스페인의 위대한 사이클 챔피언 Miguel Induráin 이름을 엮은 말장난으로 보임
    https://en.m.wikipedia.org/wiki/Miguel_Indur%C3%A1in

    • 모두가 미친 듯이 도핑하던 시절의 최고 중 최고였음
      EPO 선구자 Dr. Conconi와 함께 일했고, 적발된 적은 없지만 깨끗했을 가능성은 낮아 보임
  • 이건 백업 기능이 붙은 대체 프런트엔드에 더 가까운 것 아닌가?
    결국 이 도구에 오기 전에 데이터를 먼저 Strava에 줘야 하는 구조로 보임

    • 그런 것 같음. 문제는 Strava API 계약(https://www.strava.com/legal/api)이 Strava가 가진 기능을 복제하는 것을 명시적으로 금지한다는 점임
  • Strava가 전혀 필요 없는, 내가 만든 꽤 투박한 대안도 있음: https://github.com/cfe84/gpx-tools/blob/main/README.md
    GPX 트랙이 있는 폴더에서 실행하는 CLI 명령이고, 세그먼트는 JSON 파일에 직접 정의한 뒤 세그먼트별 성과를 나열할 수 있음
    활동 기록은 OsmAnd로 하고, foldersync로 syncthing을 통해 동기화한 뒤 대상 폴더에서 실행해 사용함
    세그먼트 계산 로직을 참고할 수 있음. 훌륭하다고 주장하진 않지만, 서버에 넣기 좋은 추가 기능이 될 수도 있음

  • Strava의 킬러 기능은 세그먼트라고 생각함
    전체 사용자 중 가장 빠른 기록, 즉 KOM에 관심이 없더라도 특정 도로 구간에서 시간이 지나며 내 진척을 비교할 수 있는 건 가치가 있음
    심박수와 체감 강도를 함께 보면 현재 체력이 어느 정도인지, 혹은 최고 컨디션에서 얼마나 떨어졌는지 가늠할 수 있음

    • 누군가 활동 유형별 세그먼트와 순위표를 위한 열린 중앙 허브를 만들면 됨
      그다음에는 악성 세그먼트와 제출자를 차단하거나 제거할 방법이 필요하고, 투표 시스템이 가능할 수도 있음
      활동 중 세그먼트를 감지하는 건 까다로워서 더 조사해보고 싶었음. 아마 ChatGPT 설명을 빌릴 수도 있겠지만, 위도/경도 경계 상자와 그 안에서 시작·끝 지점을 감지하는 방식이 관련된다는 정도는 알고 있음
      Strava가 세그먼트에 대해 어떤 특허를 갖고 있었던 것으로 어렴풋이 기억함
    • 멋진 기능인 건 맞지만, Strava는 그걸 꽤 강하게 밀어붙여 연 80달러를 내고 싶게 만듦
  • 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은 아직 써보지 않았음

    • Strava의 FOSS ActivityPub 버전을 원함
  • Runalyze가 더 이상 오픈 소스가 아니라 아쉽지만, 예전 버전은 아직 남아 있음
    https://github.com/Runalyze/Runalyze