Compare commits

...

7 Commits

Author SHA1 Message Date
CanbiZ (MickLesk)
34e897def2 Update install/wger-install.sh
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2026-02-09 11:47:04 +01:00
CanbiZ (MickLesk)
ec3d7a3c31 Update wger.sh 2026-02-09 11:45:34 +01:00
CanbiZ (MickLesk)
24013fe87c Update ct/wger.sh
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2026-02-09 11:45:09 +01:00
CanbiZ (MickLesk)
7e2ede1508 add json 2026-02-09 11:40:49 +01:00
CanbiZ (MickLesk)
b590fb41fa Fix resource defaults and enhance update process
Updated default resource values and improved backup and restore process for wger installation.
2026-02-09 11:11:15 +01:00
CanbiZ (MickLesk)
c65d41e26d Fix license URL in wger-install.sh 2026-02-09 11:10:53 +01:00
CanbiZ (MickLesk)
fc2c191ced Refactor wger installation script for new services
Updated installation script for wger, changing dependencies and configuration for PostgreSQL, Gunicorn, and Celery. Adjusted paths and service configurations for better compatibility.
2026-02-09 11:10:15 +01:00
3 changed files with 179 additions and 98 deletions

View File

@@ -7,9 +7,9 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="wger" APP="wger"
var_tags="${var_tags:-management;fitness}" var_tags="${var_tags:-management;fitness}"
var_cpu="${var_cpu:-1}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}" var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}" var_disk="${var_disk:-8}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-13}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
@@ -23,38 +23,44 @@ function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /home/wger ]]; then
if [[ ! -d /opt/wger ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/wger-project/wger/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then if check_for_gh_release "wger" "wger-project/wger"; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop wger systemctl stop redis-server nginx celery celery-beat wger
msg_ok "Stopped Service" msg_ok "Stopped Service"
msg_info "Updating $APP to v${RELEASE}" msg_info "Backing up Data"
temp_file=$(mktemp) cp -r /opt/wger/media /opt/wger_media_backup
curl -fsSL "https://github.com/wger-project/wger/archive/refs/tags/$RELEASE.tar.gz" -o "$temp_file" cp /opt/wger/.env /opt/wger_env_backup
tar xzf "$temp_file" msg_ok "Backed up Data"
cp -rf wger-"$RELEASE"/* /home/wger/src
cd /home/wger/src
$STD pip install -r requirements_prod.txt --ignore-installed
$STD pip install -e .
$STD python3 manage.py migrate
$STD python3 manage.py collectstatic --no-input
$STD yarn install
$STD yarn build:css:sass
rm -rf "$temp_file"
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting Service" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wger" "wger-project/wger" "tarball"
systemctl start wger
msg_ok "Started Service" msg_info "Restoring Data"
msg_ok "Updated successfully!" cp -r /opt/wger_media_backup/. /opt/wger/media
else cp /opt/wger_env_backup /opt/wger/.env
msg_ok "No update required. ${APP} is already at v${RELEASE}" rm -rf /opt/wger_media_backup /opt/wger_env_backup
msg_ok "Restored Data"
msg_info "Updating wger"
cd /opt/wger
set -a && source /opt/wger/.env && set +a
export DJANGO_SETTINGS_MODULE=settings.main
$STD uv pip install .
$STD uv run python manage.py migrate
$STD uv run python manage.py collectstatic --no-input
msg_ok "Updated wger"
msg_info "Starting Services"
systemctl start redis-server nginx celery celery-beat wger
msg_ok "Started Services"
msg_ok "Updated Successfully"
fi fi
exit exit
} }
@@ -63,7 +69,7 @@ start
build_container build_container
description description
msg_ok "Completed successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

View File

@@ -19,9 +19,9 @@
"type": "default", "type": "default",
"script": "ct/wger.sh", "script": "ct/wger.sh",
"resources": { "resources": {
"cpu": 1, "cpu": 2,
"ram": 1024, "ram": 2048,
"hdd": 6, "hdd": 8,
"os": "debian", "os": "debian",
"version": "13" "version": "13"
} }
@@ -33,7 +33,7 @@
}, },
"notes": [ "notes": [
{ {
"text": "Enable proxy support by uncommenting this line in `/home/wger/src/settings.py` and pointing it to your URL: `# CSRF_TRUSTED_ORIGINS = ['http://127.0.0.1', 'https://my.domain.example.com']`, then restart the service `systemctl restart wger`.", "text": "This LXC also runs Celery and Redis to synchronize workouts and ingredients",
"type": "info" "type": "info"
} }
] ]

View File

@@ -15,92 +15,167 @@ update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt install -y \ $STD apt install -y \
git \ build-essential \
apache2 \ nginx \
libapache2-mod-wsgi-py3 redis-server \
libpq-dev
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Installing Python" NODE_VERSION="22" NODE_MODULE="sass" setup_nodejs
$STD apt install -y python3-pip setup_uv
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED PG_VERSION="16" setup_postgresql
msg_ok "Installed Python" PG_DB_NAME="wger" PG_DB_USER="wger" setup_postgresql_db
fetch_and_deploy_gh_release "wger" "wger-project/wger" "tarball"
NODE_VERSION="22" NODE_MODULE="yarn,sass" setup_nodejs
msg_info "Setting up wger" msg_info "Setting up wger"
$STD adduser wger --disabled-password --gecos "" mkdir -p /opt/wger/{static,media}
mkdir /home/wger/db chmod o+w /opt/wger/media
touch /home/wger/db/database.sqlite cd /opt/wger
chown :www-data -R /home/wger/db $STD corepack enable
chmod g+w /home/wger/db /home/wger/db/database.sqlite $STD npm install
mkdir /home/wger/{static,media} $STD npm run build:css:sass
chmod o+w /home/wger/media $STD uv venv
temp_dir=$(mktemp -d) $STD uv pip install . --group docker
cd "$temp_dir" SECRET_KEY=$(openssl rand -base64 40)
RELEASE=$(curl -fsSL https://api.github.com/repos/wger-project/wger/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}') cat <<EOF >/opt/wger/.env
curl -fsSL "https://github.com/wger-project/wger/archive/refs/tags/$RELEASE.tar.gz" -o "$RELEASE.tar.gz" DJANGO_SETTINGS_MODULE=settings.main
tar xzf "$RELEASE".tar.gz PYTHONPATH=/opt/wger
mv wger-"$RELEASE" /home/wger/src
cd /home/wger/src
$STD pip install -r requirements_prod.txt --ignore-installed
$STD pip install -e .
$STD wger create-settings --database-path /home/wger/db/database.sqlite
sed -i "s#home/wger/src/media#home/wger/media#g" /home/wger/src/settings.py
sed -i "/MEDIA_ROOT = '\/home\/wger\/media'/a STATIC_ROOT = '/home/wger/static'" /home/wger/src/settings.py
$STD wger bootstrap
$STD python3 manage.py collectstatic
rm -rf "$temp_dir"
echo "${RELEASE}" >/opt/wger_version.txt
msg_ok "Finished setting up wger"
msg_info "Creating Service" DJANGO_DB_ENGINE=django.db.backends.postgresql
cat <<EOF >/etc/apache2/sites-available/wger.conf DJANGO_DB_DATABASE=${PG_DB_NAME}
<Directory /home/wger/src> DJANGO_DB_USER=${PG_DB_USER}
<Files wsgi.py> DJANGO_DB_PASSWORD=${PG_DB_PASS}
Require all granted DJANGO_DB_HOST=localhost
</Files> DJANGO_DB_PORT=5432
</Directory> DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}
<VirtualHost *:80> DJANGO_MEDIA_ROOT=/opt/wger/media
WSGIApplicationGroup %{GLOBAL} DJANGO_STATIC_ROOT=/opt/wger/static
WSGIDaemonProcess wger python-path=/home/wger/src python-home=/home/wger DJANGO_STATIC_URL=/static/
WSGIProcessGroup wger
WSGIScriptAlias / /home/wger/src/wger/wsgi.py
WSGIPassAuthorization On
Alias /static/ /home/wger/static/ ALLOWED_HOSTS=${LOCAL_IP},localhost,127.0.0.1
<Directory /home/wger/static> CSRF_TRUSTED_ORIGINS=http://${LOCAL_IP}:3000
Require all granted
</Directory>
Alias /media/ /home/wger/media/ USE_X_FORWARDED_HOST=True
<Directory /home/wger/media> SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,http
Require all granted
</Directory>
ErrorLog /var/log/apache2/wger-error.log DJANGO_CACHE_BACKEND=django_redis.cache.RedisCache
CustomLog /var/log/apache2/wger-access.log combined DJANGO_CACHE_LOCATION=redis://127.0.0.1:6379/1
</VirtualHost> DJANGO_CACHE_TIMEOUT=300
DJANGO_CACHE_CLIENT_CLASS=django_redis.client.DefaultClient
AXES_CACHE_ALIAS=default
USE_CELERY=True
CELERY_BROKER=redis://127.0.0.1:6379/2
CELERY_BACKEND=redis://127.0.0.1:6379/2
SITE_URL=http://${LOCAL_IP}:3000
SECRET_KEY=${SECRET_KEY}
EOF EOF
$STD a2dissite 000-default.conf set -a && source /opt/wger/.env && set +a
$STD a2ensite wger $STD uv run wger bootstrap
systemctl restart apache2 $STD uv run python manage.py collectstatic --no-input
cat <<EOF | uv run python manage.py shell
from django.contrib.auth import get_user_model
User = get_user_model()
user, created = User.objects.get_or_create(
username="admin",
defaults={"email": "admin@localhost"},
)
if created:
user.set_password("${PG_DB_PASS}")
user.is_superuser = True
user.is_staff = True
user.save()
EOF
msg_ok "Set up wger"
msg_info "Creating Config and Services"
cat <<EOF >/etc/systemd/system/wger.service cat <<EOF >/etc/systemd/system/wger.service
[Unit] [Unit]
Description=wger Service Description=wger Gunicorn
After=network.target After=network.target
[Service] [Service]
Type=simple
User=root User=root
ExecStart=/usr/local/bin/wger start -a 0.0.0.0 -p 3000 WorkingDirectory=/opt/wger
EnvironmentFile=/opt/wger/.env
ExecStart=/opt/wger/.venv/bin/gunicorn \
--bind 127.0.0.1:8000 \
--workers 3 \
--threads 2 \
--timeout 120 \
wger.wsgi:application
Restart=always Restart=always
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl enable -q --now wger cat <<EOF >/etc/systemd/system/celery.service
msg_ok "Created Service" [Unit]
Description=wger Celery Worker
After=network.target redis-server.service
Requires=redis-server.service
[Service]
WorkingDirectory=/opt/wger
EnvironmentFile=/opt/wger/.env
ExecStart=/opt/wger/.venv/bin/celery -A wger worker -l info
Restart=always
[Install]
WantedBy=multi-user.target
EOF
mkdir -p /var/lib/wger/celery
chmod 700 /var/lib/wger/celery
cat <<EOF >/etc/systemd/system/celery-beat.service
[Unit]
Description=wger Celery Beat
After=network.target redis-server.service
Requires=redis-server.service
[Service]
WorkingDirectory=/opt/wger
EnvironmentFile=/opt/wger/.env
ExecStart=/opt/wger/.venv/bin/celery -A wger beat -l info \
--schedule /var/lib/wger/celery/celerybeat-schedule
Restart=always
[Install]
WantedBy=multi-user.target
EOF
cat <<'EOF' >/etc/nginx/sites-available/wger
server {
listen 3000;
server_name _;
client_max_body_size 20M;
location /static/ {
alias /opt/wger/static/;
expires 30d;
}
location /media/ {
alias /opt/wger/media/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
EOF
$STD rm -f /etc/nginx/sites-enabled/default
$STD ln -sf /etc/nginx/sites-available/wger /etc/nginx/sites-enabled/wger
systemctl enable -q --now redis-server nginx wger celery celery-beat
systemctl restart nginx
msg_ok "Created Config and Services"
motd_ssh motd_ssh
customize customize