
Updates Dispatcharr install script to use uv venv and pip for Python dependency management, adds explicit installation of key packages, and centralizes environment variables in a .env file for service scripts. Also updates Node and Python versions, improves service startup scripts to source environment variables, and enhances overall reliability and maintainability of the deployment process.
259 lines
6.2 KiB
Bash
259 lines
6.2 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Copyright (c) 2021-2025 community-scripts ORG
|
|
# Author: ekke85
|
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
# Source: https://github.com/Dispatcharr/Dispatcharr
|
|
|
|
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 \
|
|
build-essential \
|
|
git \
|
|
gcc \
|
|
python3-dev \
|
|
libpq-dev \
|
|
nginx \
|
|
redis-server \
|
|
ffmpeg \
|
|
procps \
|
|
streamlink
|
|
msg_ok "Installed Dependencies"
|
|
|
|
setup_uv
|
|
NODE_VERSION="24" setup_nodejs
|
|
PG_VERSION="16" setup_postgresql
|
|
|
|
msg_info "Creating PostgreSQL Database"
|
|
DB_NAME=dispatcharr_db
|
|
DB_USER=dispatcharr_usr
|
|
DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)"
|
|
$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';"
|
|
|
|
cat <<EOF >~/dispatcharr.creds
|
|
Dispatcharr-Credentials
|
|
Dispatcharr Database Name: $DB_NAME
|
|
Dispatcharr Database User: $DB_USER
|
|
Dispatcharr Database Password: $DB_PASS
|
|
EOF
|
|
msg_ok "Created PostgreSQL Database"
|
|
|
|
fetch_and_deploy_gh_release "dispatcharr" "Dispatcharr/Dispatcharr"
|
|
|
|
msg_info "Installing Python Dependencies with uv"
|
|
cd /opt/dispatcharr || exit
|
|
|
|
$STD uv venv
|
|
$STD uv pip install -r requirements.txt --index-strategy unsafe-best-match
|
|
$STD uv pip install gunicorn gevent celery redis daphne
|
|
msg_ok "Installed Python Dependencies"
|
|
|
|
msg_info "Configuring Dispatcharr"
|
|
export DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}"
|
|
export POSTGRES_DB=$DB_NAME
|
|
export POSTGRES_USER=$DB_USER
|
|
export POSTGRES_PASSWORD=$DB_PASS
|
|
export POSTGRES_HOST=localhost
|
|
|
|
$STD uv run python manage.py migrate --noinput
|
|
$STD uv run python manage.py collectstatic --noinput
|
|
|
|
cd /opt/dispatcharr/frontend || exit
|
|
$STD npm install --legacy-peer-deps
|
|
$STD npm run build
|
|
msg_ok "Configured Dispatcharr"
|
|
|
|
msg_info "Configuring Nginx"
|
|
cat <<EOF >/etc/nginx/sites-available/dispatcharr.conf
|
|
server {
|
|
listen 9191;
|
|
server_name _;
|
|
|
|
location / {
|
|
include proxy_params;
|
|
proxy_pass http://127.0.0.1:5656;
|
|
}
|
|
|
|
location /static/ {
|
|
alias /opt/dispatcharr/static/;
|
|
}
|
|
|
|
location /assets/ {
|
|
alias /opt/dispatcharr/frontend/dist/assets/;
|
|
}
|
|
|
|
location /media/ {
|
|
alias /opt/dispatcharr/media/;
|
|
}
|
|
|
|
location /ws/ {
|
|
proxy_pass http://127.0.0.1:8001;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade \$http_upgrade;
|
|
proxy_set_header Connection "Upgrade";
|
|
proxy_set_header Host \$host;
|
|
proxy_set_header X-Real-IP \$remote_addr;
|
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
|
}
|
|
}
|
|
EOF
|
|
|
|
ln -sf /etc/nginx/sites-available/dispatcharr.conf /etc/nginx/sites-enabled/dispatcharr.conf
|
|
rm -f /etc/nginx/sites-enabled/default
|
|
$STD nginx -t
|
|
systemctl enable -q --now nginx
|
|
msg_ok "Configured Nginx"
|
|
|
|
msg_info "Creating Services"
|
|
|
|
# Create environment file for services
|
|
cat <<EOF >/opt/dispatcharr/.env
|
|
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}
|
|
POSTGRES_DB=$DB_NAME
|
|
POSTGRES_USER=$DB_USER
|
|
POSTGRES_PASSWORD=$DB_PASS
|
|
POSTGRES_HOST=localhost
|
|
CELERY_BROKER_URL=redis://localhost:6379/0
|
|
EOF
|
|
|
|
cat <<EOF >/opt/dispatcharr/start-gunicorn.sh
|
|
#!/usr/bin/env bash
|
|
cd /opt/dispatcharr
|
|
set -a
|
|
source .env
|
|
set +a
|
|
exec uv run gunicorn \\
|
|
--workers=4 \\
|
|
--worker-class=gevent \\
|
|
--timeout=300 \\
|
|
--bind 0.0.0.0:5656 \\
|
|
dispatcharr.wsgi:application
|
|
EOF
|
|
chmod +x /opt/dispatcharr/start-gunicorn.sh
|
|
|
|
cat <<EOF >/opt/dispatcharr/start-celery.sh
|
|
#!/usr/bin/env bash
|
|
cd /opt/dispatcharr
|
|
set -a
|
|
source .env
|
|
set +a
|
|
exec uv run celery -A dispatcharr worker -l info -c 4
|
|
EOF
|
|
chmod +x /opt/dispatcharr/start-celery.sh
|
|
|
|
cat <<EOF >/opt/dispatcharr/start-celerybeat.sh
|
|
#!/usr/bin/env bash
|
|
cd /opt/dispatcharr
|
|
set -a
|
|
source .env
|
|
set +a
|
|
exec uv run celery -A dispatcharr beat -l info
|
|
EOF
|
|
chmod +x /opt/dispatcharr/start-celerybeat.sh
|
|
|
|
cat <<EOF >/opt/dispatcharr/start-daphne.sh
|
|
#!/usr/bin/env bash
|
|
cd /opt/dispatcharr
|
|
set -a
|
|
source .env
|
|
set +a
|
|
exec uv run daphne -b 0.0.0.0 -p 8001 dispatcharr.asgi:application
|
|
EOF
|
|
chmod +x /opt/dispatcharr/start-daphne.sh
|
|
|
|
cat <<EOF >/etc/systemd/system/dispatcharr.service
|
|
[Unit]
|
|
Description=Dispatcharr Web Server
|
|
After=network.target postgresql.service redis-server.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=/opt/dispatcharr
|
|
ExecStart=/opt/dispatcharr/start-gunicorn.sh
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
User=root
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
cat <<EOF >/etc/systemd/system/dispatcharr-celery.service
|
|
[Unit]
|
|
Description=Dispatcharr Celery Worker
|
|
After=network.target redis-server.service
|
|
Requires=dispatcharr.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=/opt/dispatcharr
|
|
ExecStart=/opt/dispatcharr/start-celery.sh
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
User=root
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
cat <<EOF >/etc/systemd/system/dispatcharr-celerybeat.service
|
|
[Unit]
|
|
Description=Dispatcharr Celery Beat Scheduler
|
|
After=network.target redis-server.service
|
|
Requires=dispatcharr.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=/opt/dispatcharr
|
|
ExecStart=/opt/dispatcharr/start-celerybeat.sh
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
User=root
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
cat <<EOF >/etc/systemd/system/dispatcharr-daphne.service
|
|
[Unit]
|
|
Description=Dispatcharr WebSocket Server (Daphne)
|
|
After=network.target
|
|
Requires=dispatcharr.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=/opt/dispatcharr
|
|
ExecStart=/opt/dispatcharr/start-daphne.sh
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
User=root
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable -q --now dispatcharr dispatcharr-celery dispatcharr-celerybeat dispatcharr-daphne
|
|
msg_ok "Created Services"
|
|
|
|
motd_ssh
|
|
customize
|
|
|
|
msg_info "Cleaning up"
|
|
$STD apt -y autoremove
|
|
$STD apt -y autoclean
|
|
$STD apt -y clean
|
|
msg_ok "Cleaned"
|