diff --git a/ct/wger.sh b/ct/wger.sh index 1542eabc1..7417e941e 100644 --- a/ct/wger.sh +++ b/ct/wger.sh @@ -7,9 +7,9 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV APP="wger" var_tags="${var_tags:-management;fitness}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-1024}" -var_disk="${var_disk:-6}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-8}" var_os="${var_os:-debian}" var_version="${var_version:-13}" var_unprivileged="${var_unprivileged:-1}" @@ -23,38 +23,44 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -d /home/wger ]]; then + + if [[ ! -d /opt/wger ]]; then msg_error "No ${APP} Installation Found!" exit 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" - systemctl stop wger + systemctl stop redis-server nginx celery celery-beat wger msg_ok "Stopped Service" - msg_info "Updating $APP to v${RELEASE}" - temp_file=$(mktemp) - curl -fsSL "https://github.com/wger-project/wger/archive/refs/tags/$RELEASE.tar.gz" -o "$temp_file" - tar xzf "$temp_file" - 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 "Backing up Data" + cp -r /opt/wger/media /opt/wger_media_backup + cp /opt/wger/.env /opt/wger_env_backup + msg_ok "Backed up Data" - msg_info "Starting Service" - systemctl start wger - msg_ok "Started Service" - msg_ok "Updated successfully!" - else - msg_ok "No update required. ${APP} is already at v${RELEASE}" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wger" "wger-project/wger" "tarball" + + msg_info "Restoring Data" + cp -r /opt/wger_media_backup/. /opt/wger/media + cp /opt/wger_env_backup /opt/wger/.env + 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 exit } @@ -63,7 +69,7 @@ start build_container description -msg_ok "Completed successfully!\n" +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}:3000${CL}" diff --git a/frontend/public/json/wger.json b/frontend/public/json/wger.json index 0a723d8de..3dc82bfb4 100644 --- a/frontend/public/json/wger.json +++ b/frontend/public/json/wger.json @@ -19,9 +19,9 @@ "type": "default", "script": "ct/wger.sh", "resources": { - "cpu": 1, - "ram": 1024, - "hdd": 6, + "cpu": 2, + "ram": 2048, + "hdd": 8, "os": "debian", "version": "13" } @@ -33,7 +33,7 @@ }, "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" } ] diff --git a/install/wger-install.sh b/install/wger-install.sh index ddc90a179..360167cc7 100644 --- a/install/wger-install.sh +++ b/install/wger-install.sh @@ -15,92 +15,167 @@ update_os msg_info "Installing Dependencies" $STD apt install -y \ - git \ - apache2 \ - libapache2-mod-wsgi-py3 + build-essential \ + nginx \ + redis-server \ + libpq-dev msg_ok "Installed Dependencies" -msg_info "Installing Python" -$STD apt install -y python3-pip -rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Installed Python" - -NODE_VERSION="22" NODE_MODULE="yarn,sass" setup_nodejs +NODE_VERSION="22" NODE_MODULE="sass" setup_nodejs +setup_uv +PG_VERSION="16" setup_postgresql +PG_DB_NAME="wger" PG_DB_USER="wger" setup_postgresql_db +fetch_and_deploy_gh_release "wger" "wger-project/wger" "tarball" msg_info "Setting up wger" -$STD adduser wger --disabled-password --gecos "" -mkdir /home/wger/db -touch /home/wger/db/database.sqlite -chown :www-data -R /home/wger/db -chmod g+w /home/wger/db /home/wger/db/database.sqlite -mkdir /home/wger/{static,media} -chmod o+w /home/wger/media -temp_dir=$(mktemp -d) -cd "$temp_dir" -RELEASE=$(curl -fsSL https://api.github.com/repos/wger-project/wger/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}') -curl -fsSL "https://github.com/wger-project/wger/archive/refs/tags/$RELEASE.tar.gz" -o "$RELEASE.tar.gz" -tar xzf "$RELEASE".tar.gz -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" +mkdir -p /opt/wger/{static,media} +chmod o+w /opt/wger/media +cd /opt/wger +$STD corepack enable +$STD npm install +$STD npm run build:css:sass +$STD uv venv +$STD uv pip install . --group docker +SECRET_KEY=$(openssl rand -base64 40) +cat </opt/wger/.env +DJANGO_SETTINGS_MODULE=settings.main +PYTHONPATH=/opt/wger -msg_info "Creating Service" -cat </etc/apache2/sites-available/wger.conf - - - Require all granted - - +DJANGO_DB_ENGINE=django.db.backends.postgresql +DJANGO_DB_DATABASE=${PG_DB_NAME} +DJANGO_DB_USER=${PG_DB_USER} +DJANGO_DB_PASSWORD=${PG_DB_PASS} +DJANGO_DB_HOST=localhost +DJANGO_DB_PORT=5432 +DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME} - - WSGIApplicationGroup %{GLOBAL} - WSGIDaemonProcess wger python-path=/home/wger/src python-home=/home/wger - WSGIProcessGroup wger - WSGIScriptAlias / /home/wger/src/wger/wsgi.py - WSGIPassAuthorization On +DJANGO_MEDIA_ROOT=/opt/wger/media +DJANGO_STATIC_ROOT=/opt/wger/static +DJANGO_STATIC_URL=/static/ - Alias /static/ /home/wger/static/ - - Require all granted - +ALLOWED_HOSTS=${LOCAL_IP},localhost,127.0.0.1 +CSRF_TRUSTED_ORIGINS=http://${LOCAL_IP}:3000 - Alias /media/ /home/wger/media/ - - Require all granted - +USE_X_FORWARDED_HOST=True +SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,http - ErrorLog /var/log/apache2/wger-error.log - CustomLog /var/log/apache2/wger-access.log combined - +DJANGO_CACHE_BACKEND=django_redis.cache.RedisCache +DJANGO_CACHE_LOCATION=redis://127.0.0.1:6379/1 +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 -$STD a2dissite 000-default.conf -$STD a2ensite wger -systemctl restart apache2 +set -a && source /opt/wger/.env && set +a +$STD uv run wger bootstrap +$STD uv run python manage.py collectstatic --no-input +cat </etc/systemd/system/wger.service [Unit] -Description=wger Service +Description=wger Gunicorn After=network.target [Service] -Type=simple 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 [Install] WantedBy=multi-user.target EOF -systemctl enable -q --now wger -msg_ok "Created Service" +cat </etc/systemd/system/celery.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 </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 customize