Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 83 additions & 0 deletions ct/endurain.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: johanngrobe
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/joaovitoriasilva/endurain

APP="Endurain"
var_tags="${var_tags:-sport;social-media}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"

header_info "$APP"
variables
color
catch_errors

function update_script() {
header_info
check_container_storage
check_container_resources

if [[ ! -d /opt/endurain ]]; then
msg_error "No ${APP} installation found!"
exit 1
fi
if check_for_gh_release "endurain" "joaovitoriasilva/endurain"; then
msg_info "Stopping Service"
systemctl stop endurain
msg_ok "Stopped Service"

msg_info "Creating Backup"
cp /opt/endurain/.env /opt/endurain.env
cp /opt/endurain/frontend/app/dist/env.js /opt/endurain.env.js
msg_ok "Created Backup"

CLEAN_INSTALL=1 fetch_and_deploy_gh_release "endurain" "joaovitoriasilva/endurain" "tarball" "latest" "/opt/endurain"

msg_info "Preparing Update"
cd /opt/endurain
rm -rf \
/opt/endurain/{docs,example.env,screenshot_01.png} \
/opt/endurain/docker* \
/opt/endurain/*.yml
cp /opt/endurain.env /opt/endurain/.env
rm /opt/endurain.env
msg_ok "Prepared Update"

msg_info "Updating Frontend"
cd /opt/endurain/frontend/app
$STD npm ci
$STD npm run build
cp /opt/endurain.env.js /opt/endurain/frontend/app/dist/env.js
rm /opt/endurain.env.js
msg_ok "Updated Frontend"

msg_info "Updating Backend"
cd /opt/endurain/backend
$STD poetry export -f requirements.txt --output requirements.txt --without-hashes
$STD uv venv
$STD uv pip install -r requirements.txt
msg_ok "Backend Updated"

msg_info "Starting Service"
systemctl start endurain
msg_ok "Started Service"
msg_ok "Update Completed Successfully!"
fi
exit
}

start
build_container
description

msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
40 changes: 40 additions & 0 deletions frontend/public/json/endurain.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"name": "Endurain",
"slug": "endurain",
"categories": [
24
],
"date_created": "2025-11-23",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8080,
"documentation": "https://docs.endurain.com/",
"website": "https://github.com/joaovitoriasilva/endurain",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/endurain.webp",
"config_path": "/opt/endurain/.env",
"description": "Endurain is a self-hosted fitness tracking service designed to give users full control over their data and hosting environment. It's similar to Strava but focused on privacy and customization",
"install_methods": [
{
"type": "default",
"script": "ct/endurain.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 5,
"os": "debian",
"version": "13"
}
}
],
"default_credentials": {
"username": "admin",
"password": "admin"
},
"notes": [
{
"text": "When using a reverse proxy, edit `/opt/endurain/frontend/app/dist/env.js`.",
"type": "info"
}
]
}
121 changes: 121 additions & 0 deletions install/endurain-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#!/usr/bin/env bash

# Copyright (c) 2021-2025 community-scripts ORG
# Author: johanngrobe
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/joaovitoriasilva/endurain

source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os

msg_info "Installing Dependencies"
$STD apt install -y \
default-libmysqlclient-dev \
build-essential \
pkg-config
msg_ok "Installed Dependencies"

PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="24" setup_nodejs
PG_VERSION="17" PG_MODULES="postgis" setup_postgresql
PG_DB_NAME="enduraindb" PG_DB_USER="endurain" setup_postgresql_db
import_local_ip
fetch_and_deploy_gh_release "endurain" "joaovitoriasilva/endurain" "tarball" "latest" "/opt/endurain"

msg_info "Setting up Endurain"
cd /opt/endurain
rm -rf \
/opt/endurain/{docs,example.env,screenshot_01.png} \
/opt/endurain/docker* \
/opt/endurain/*.yml
mkdir -p /opt/endurain_data/{data,logs}
SECRET_KEY=$(openssl rand -hex 32)
FERNET_KEY=$(openssl rand -base64 32)
ENDURAIN_HOST=http://${LOCAL_IP}:8080
cat <<EOF >/opt/endurain/.env
DB_PASSWORD=${PG_DB_PASS}

SECRET_KEY=${SECRET_KEY}
FERNET_KEY=${FERNET_KEY}

TZ=Europe/Berlin
ENDURAIN_HOST=${ENDURAIN_HOST}
BEHIND_PROXY=false

POSTGRES_DB=${PG_DB_NAME}
POSTGRES_USER=${PG_DB_USER}
PGDATA=/var/lib/postgresql/${PG_DB_NAME}

DB_DATABASE=${PG_DB_NAME}
DB_USER=${PG_DB_USER}
DB_PORT=5432
DB_HOST=localhost

DATABASE_URL=postgresql+psycopg://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}

BACKEND_DIR="/opt/endurain/backend/app"
FRONTEND_DIR="/opt/endurain/frontend/app/dist"
DATA_DIR="/opt/endurain_data/data"
LOGS_DIR="/opt/endurain_data/logs"

#SMTP_HOST=smtp.protonmail.ch
#SMTP_PORT=587
#[email protected]
#SMTP_PASSWORD=your-app-password
#SMTP_SECURE=true
#SMTP_SECURE_TYPE=starttls
EOF
msg_ok "Setup Endurain"

msg_info "Building Frontend"
cd /opt/endurain/frontend/app
$STD npm ci --prefer-offline
$STD npm run build
cat <<EOF >/opt/endurain/frontend/app/dist/env.js
window.env = {
ENDURAIN_HOST: "${ENDURAIN_HOST}"
}
EOF
msg_ok "Built Frontend"

msg_info "Setting up Backend"
cd /opt/endurain/backend
$STD uv tool install poetry
$STD uv tool update-shell
export PATH="/root/.local/bin:$PATH"
$STD poetry self add poetry-plugin-export
$STD poetry export -f requirements.txt --output requirements.txt --without-hashes
$STD uv venv
$STD uv pip install -r requirements.txt
msg_ok "Setup Backend"

msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/endurain.service
[Unit]
Description=Endurain FastAPI Backend
After=network.target postgresql.service

[Service]
WorkingDirectory=/opt/endurain/backend/app
EnvironmentFile=/opt/endurain/.env
ExecStart=/opt/endurain/backend/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 8080
Restart=always
RestartSec=5
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now endurain
msg_ok "Created Service"

motd_ssh
customize
cleanup_lxc