Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
0dd4243
add endurain scripts
Nov 23, 2025
15db062
Update install/endurain-install.sh
johanngrobe Nov 23, 2025
f3b25f2
Update install/endurain-install.sh
johanngrobe Nov 23, 2025
cead5c3
Update install/endurain-install.sh
johanngrobe Nov 23, 2025
390d748
Update install/endurain-install.sh
johanngrobe Nov 23, 2025
84bf44a
Update ct/endurain.sh
johanngrobe Nov 23, 2025
043c23d
Update ct/endurain.sh
johanngrobe Nov 23, 2025
1e06be2
Update ct/endurain.sh
johanngrobe Nov 23, 2025
e07b79d
Update ct/endurain.sh
johanngrobe Nov 23, 2025
057d7e8
Update ct/endurain.sh
johanngrobe Nov 23, 2025
1b88704
Update ct/endurain.sh
johanngrobe Nov 23, 2025
76fff5d
Update ct/endurain.sh
johanngrobe Nov 23, 2025
c976d30
Update ct/endurain.sh
johanngrobe Nov 23, 2025
88f45ee
setup_postgressql_db and cp instead of mv
Nov 23, 2025
c905fe3
cp instead of mv
Nov 23, 2025
3188c2a
Update ct/endurain.sh
johanngrobe Nov 23, 2025
cf51ea8
Update ct/endurain.sh
johanngrobe Nov 23, 2025
2ed2e7e
Update ct/endurain.sh
johanngrobe Nov 23, 2025
42e8506
Update ct/endurain.sh
johanngrobe Nov 23, 2025
622de96
Update ct/endurain.sh
johanngrobe Nov 23, 2025
6042ba1
Update ct/endurain.sh
johanngrobe Nov 23, 2025
f5a1dd4
Update ct/endurain.sh
johanngrobe Nov 23, 2025
b16d688
Update install/endurain-install.sh
johanngrobe Nov 23, 2025
4d4df28
Update install/endurain-install.sh
johanngrobe Nov 23, 2025
0336d27
Update ct/endurain.sh
johanngrobe Nov 23, 2025
72eef4d
update naming of backup files
Nov 23, 2025
23d4954
script improvements
Nov 24, 2025
a9a9445
fix endurain.service because the app kept freezing
Nov 27, 2025
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
89 changes: 89 additions & 0 deletions ct/endurain.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/johanngrobe/ProxmoxVE/endurain/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 Defaults
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"
mv /opt/endurain/.env /opt/env.backup
mv /opt/endurain/frontend/app/dist/env.js /opt/env.js.backup
msg_ok "Backup Created"

msg_info "Fetching Latest Release"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "endurain" "joaovitoriasilva/endurain" "tarball" "latest" "/opt/endurain"
msg_ok "Release Updated"

msg_info "Preparing Update"
cd /opt/endurain || exit
rm -rf \
/opt/endurain/{docs,example.env,screenshot_01.png} \
/opt/endurain/docker* \
/opt/endurain/*.yml
mv /opt/env.backup /opt/endurain/.env
msg_ok "Update prepared"

msg_info "Updating Frontend"
cd /opt/endurain/frontend/app || exit 1
$STD npm ci
$STD npm run build
mv /opt/env.js.backup /opt/endurain/frontend/app/dist/env.js
msg_ok "Frontend Updated"

msg_info "Updating Backend"
cd /opt/endurain/backend || exit
$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 "Endurain Service Started"

msg_ok "Update Completed Successfully!"

fi

exit 0
}

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/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"
}
]
}
129 changes: 129 additions & 0 deletions install/endurain-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#!/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-get install -y default-libmysqlclient-dev build-essential pkg-config
msg_ok "Installed Dependencies"

PYTHON_VERSION="3.13" setup_uv
NODE_VERSION="22" NODE_MODULE="npm@latest" setup_nodejs
PG_VERSION="17" PG_MODULES="postgis,contrib" setup_postgresql

fetch_and_deploy_gh_release "endurain" "joaovitoriasilva/endurain" "tarball" "latest" "/opt/endurain"

msg_info "Setting up Endurain"
DB_NAME=enduraindb
DB_USER=endurain
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
DB_PORT=5432
DB_HOST=localhost

$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;"
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';"
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';"
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';"

cd /opt/endurain || exit
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)
IP=$(hostname -I | awk '{print $1}')
ENDURAIN_HOST=http://${IP}:8080
cat <<EOF > /opt/endurain/.env

DB_PASSWORD=${DB_PASS}

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

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

POSTGRES_DB=${DB_NAME}
POSTGRES_USER=${DB_USER}
PGDATA=/var/lib/postgresql/${DB_NAME}

DB_DATABASE=${DB_NAME}
DB_USER=${DB_USER}
DB_PORT=${DB_PORT}
DB_HOST=${DB_HOST}

DATABASE_URL=postgresql+psycopg://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${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
#SMTP_USERNAME=your-email@example.com
#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 || exit
$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 "Build Frontend"

msg_info "Setting up Backend"
cd /opt/endurain/backend || exit
$STD uv tool install poetry
$STD uv tool update-shell
$STD 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

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

motd_ssh
customize
cleanup_lxc