Endurain: บริการแบบ Strava ที่โฮสต์เองได้
(github.com/joaovitoriasilva)- Endurain เป็นบริการติดตามฟิตเนสแบบโฮสต์เอง ออกแบบมาให้ผู้ใช้ควบคุมข้อมูลและสภาพแวดล้อมการโฮสต์ได้เอง คล้าย Strava แต่เน้นความเป็นส่วนตัวและการปรับแต่ง
- ฟรอนต์เอนด์ใช้ Vue.js ส่วนแบ็กเอนด์ใช้ Python FastAPI และใช้ PostgreSQL, Jaeger, Alembic, SQLAlchemy ฯลฯ เพื่อจัดการข้อมูลกิจกรรมและการติดตามพื้นฐาน
- รองรับการเชื่อมต่อกับ Strava และ Garmin Connect รวมถึงอัปโหลดกิจกรรมด้วยตนเองผ่านไฟล์
.gpx,.tcx,.fit - มี Docker image และตัวอย่าง
docker-compose.yml.exampleให้ใช้งาน โดยจัดการการตั้งค่าผ่าน environment variables เพื่อให้ deploy และปรับแต่งได้ง่าย - GitHub repository เป็น mirror แบบอ่านอย่างเดียว ส่วนกิจกรรมของโปรเจกต์ดำเนินการบน Codeberg และขณะนี้อยู่ในสถานะ หยุดเพิ่มฟีเจอร์ชั่วคราว เพื่อเน้นเสริมความแข็งแรงของฐานระบบมากกว่าฟีเจอร์ใหม่
ฟีเจอร์ที่ Endurain มีให้
- Endurain เป็นบริการติดตามฟิตเนสแบบโฮสต์เอง โดยมีเป้าหมายให้ผู้ใช้ควบคุมข้อมูลและสภาพแวดล้อมการโฮสต์ได้อย่างเต็มที่
- เป็นบริการที่คล้าย Strava แต่เน้นที่ ความเป็นส่วนตัว และการปรับแต่ง
- สามารถนำเข้าข้อมูลกิจกรรมได้ผ่านการเชื่อมต่อกับบริการภายนอกหรือการอัปโหลดไฟล์
- รองรับการเชื่อมต่อ Strava
- รองรับการเชื่อมต่อ Garmin Connect
- รองรับการอัปโหลดไฟล์
.gpx,.tcx,.fitด้วยตนเอง
สแต็กเทคโนโลยี
- ฟรอนต์เอนด์ประกอบด้วย Vue.js, Notivue, Bootstrap CSS
- แบ็กเอนด์สร้างโดยมี Python FastAPI เป็นแกนหลัก
- Alembic
- SQLAlchemy
- Apprise
stravalibสำหรับเชื่อมต่อ Stravapython-garminconnectสำหรับเชื่อมต่อ Garmin Connectgpxpyสำหรับนำเข้า.gpxtcxreaderสำหรับนำเข้า.tcxfitdecodeสำหรับนำเข้า.fit
- ฐานข้อมูลใช้ PostgreSQL
- ใช้ Jaeger สำหรับการ tracing และ monitoring พื้นฐาน
การ deploy และการตั้งค่า
- มี Docker image สำหรับ deploy Endurain
- ใน repository มีไฟล์
docker-compose.yml.exampleเพื่อดูตัวอย่างการ deploy - การตั้งค่าจัดการผ่าน environment variables จึงให้ความยืดหยุ่นและสะดวกต่อการปรับแต่ง
- ดูข้อมูลเพิ่มเติมได้ที่ เอกสาร Endurain
สภาพแวดล้อมเดโม
- มีเดโมให้ทดลองใช้ Endurain โดยไม่ต้องติดตั้ง
- https://demo.endurain.com
- ชื่อผู้ใช้:
admin - รหัสผ่าน:
admin
- สภาพแวดล้อมเดโมจะถูกรีเซ็ตทุกวันตอนเที่ยงคืนตามเขตเวลา Europe/Lisbon
- ไม่ควรเก็บข้อมูลสำคัญไว้ในเดโม
สถานะการดำเนินงานของโปรเจกต์และไลเซนส์
- GitHub repository เป็น mirror แบบอ่านอย่างเดียว ส่วน issue, pull request และกิจกรรมของโปรเจกต์จัดการบน 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 คือเพื่อนกับครอบครัวช่วยสร้างแรงจูงใจ ไม่ใช่เพราะอยากได้ค่าพาวเวอร์/อัตราการเต้นหัวใจที่สูงขึ้น
ในฐานะเว็บแอปมีฟีเจอร์หนึ่งที่ขาดไป และคิดว่า การติดตามกิจกรรมที่สมาร์ตวอทช์บันทึกโดยอัตโนมัติ น่าจะทำได้ยาก
วิธีอ้อมดูเหมือนจะเป็นการนำเข้าอัตโนมัติไปที่ Strava ก่อน แล้วค่อยเชื่อม Strava เข้ากับ Endurain
Garmin มีอินเทอร์เฟซ REST สำหรับ Connect เพื่อดึงกิจกรรม FIT
https://developer.garmin.com/gc-developer-program/activity-a...
ดังนั้นสิ่งที่ขาดน่าจะเป็นการเชื่อมต่อระหว่าง Endurain กับแพลตฟอร์มของผู้ผลิตรายหลัก ๆ มากกว่า ส่วนขาดจริงไหมผมยังไม่ได้ดูโค้ด
จำได้ว่า Garmin ก็น่าจะทำได้เหมือนกัน แต่เวอร์ชันล่าสุดไม่แน่ใจ
ถ้าไม่ใช่นักพัฒนาอาชีพ และมีพื้นฐานแนวคิดการพัฒนาที่เรียนจากมหาวิทยาลัยเมื่อ 10 ปีก่อนประมาณนั้น การทำระบบที่ดูสมบูรณ์ขนาดนี้ได้ถือว่าทำได้ดี
แต่ไม่รู้ว่าเป็นนักพัฒนาต้นฉบับหรือเปล่า แค่อยากรู้ว่าไม่กลัวว่าจะทำพลาดแบบที่จะย้อนมาขัดขาในภายหลังหรือ เช่น ปัญหาความปลอดภัย หรือข้อผิดพลาดที่แก้ยากในอนาคต
เป็นประเภทที่เสียเวลาเป็นชั่วโมงกับ typo เล็ก ๆ หรือบั๊กที่ควรหาเจอง่าย ๆ
ผมใช้ ChatGPT เป็นผู้ช่วยโครงการ ใช้สร้างโค้ด และช่วยชี้ปัญหาในโค้ด
โดยเฉพาะเวลาทำฟีเจอร์ทั่วไป มันมักดูแล edge cases ได้ดีกว่าตอนผมทำคนเดียว และถ้าขอให้ช่วยอุดช่องโหว่ความปลอดภัย ก็ทำได้ดีกว่าระดับของผม
เมื่อวานมันเสนอ 7 กลยุทธ์เพื่อกันบอตที่กรอกฟอร์ม และพอเอาบางข้อไปใช้ภายในไม่กี่นาที ปัญหาบอตก็หยุดทันที
ความผิดพลาดย่อมเกิดขึ้นได้อยู่แล้ว แต่เครื่องมือ AI เมื่อใช้ควบคู่กับการคิดเชิงวิพากษ์ของตัวเอง ก็ช่วยลดความผิดพลาดเหล่านั้นได้ ถ้าคอยแก้ AI บ่อย ๆ ขอให้ช่วยในมุมมองการป้องกันปัญหาบางประเภท หรือเขียนพรอมป์จากความรู้เดิมที่มี ก็จะได้คำตอบที่ดีกว่ามาก
สิ่งที่น่าประทับใจคือเขาสร้างระบบขึ้นมา และน่าจะเปิดรับฟีดแบ็กจากชุมชน ซึ่งอาจนำไปสู่ผลลัพธ์ที่ดีกว่านักพัฒนามีประสบการณ์ที่กังวลเรื่องความปลอดภัยแล้วทำคนเดียวอยู่หลายปี
ผมคิดว่าสิ่งที่สำคัญกว่าความผิดพลาดเองคือ ความเร็วในการค้นพบและแก้ไข และสิ่งสำคัญคือการสร้างระบบที่เสริมความแข็งแรงให้ตัวเอง เช่น linter, unit test, type system, CI/CD เพื่อไม่ให้เรื่องเดิมเกิดซ้ำ พูดเล่น ๆ ว่านี่คือการพัฒนาแบบตั้งอยู่บนความถ่อมตัว
นักพัฒนาที่มีประสบการณ์มากที่สุดก็ยังทำพลาดแบบนี้ ถ้าคิดว่าตัวเองพ้นขั้นนั้นไปแล้ว ก็ต้องมีประสบการณ์มากกว่านี้ถึงจะเห็นความจริง
วิธีเรียนรู้ที่ดีที่สุดคือสร้างโปรเจกต์ ทำพลาด แล้วหาวิธีแก้ ยิ่งแก้ยากเท่าไร โปรเจกต์ถัดไปก็จะยิ่งคิดเรื่องนั้นตั้งแต่การออกแบบแรกเริ่ม
ไม่ว่าจะเป็น AI หรือมือใหม่ สุดท้ายก็แค่ต่างกันที่ระดับว่าผิดมากแค่ไหนเท่านั้น
ชื่อนี้ยอดเยี่ยม ดูเหมือนเป็นการเล่นคำที่ผสม endurance กับชื่อของแชมป์จักรยานผู้ยิ่งใหญ่ชาวสเปน Miguel Induráin
https://en.m.wikipedia.org/wiki/Miguel_Indur%C3%A1in
เคยทำงานกับ Dr. Conconi ผู้บุกเบิก EPO และแม้ไม่เคยถูกจับได้ แต่ก็ดูไม่น่าเป็นไปได้ว่าจะสะอาด
นี่ไม่ใช่แค่ ฟรอนต์เอนด์ทางเลือก ที่มีฟีเจอร์สำรองข้อมูลติดมาด้วยมากกว่าเหรอ?
สุดท้ายดูเหมือนว่าต้องให้ข้อมูลกับ Strava ก่อน แล้วค่อยส่งมาที่เครื่องมือนี้
ผมก็มีทางเลือกที่ค่อนข้างหยาบ ๆ ที่ทำเองและไม่ต้องใช้ Strava เลย: https://github.com/cfe84/gpx-tools/blob/main/README.md
เป็น คำสั่ง CLI ที่รันในโฟลเดอร์ที่มีแทร็ก GPX และสามารถนิยามเซกเมนต์เองในไฟล์ JSON แล้วแสดงผลลัพธ์ตามแต่ละเซกเมนต์ได้
ผมบันทึกกิจกรรมด้วย OsmAnd ใช้ foldersync ซิงก์ผ่าน syncthing แล้วรันในโฟลเดอร์ปลายทาง
อาจเอา logic การคำนวณเซกเมนต์ไปอ้างอิงได้ ผมไม่ได้อ้างว่ามันยอดเยี่ยม แต่ก็อาจเป็นฟีเจอร์เสริมที่เหมาะจะใส่ในเซิร์ฟเวอร์
คิดว่าฟีเจอร์เด็ดของ 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