From 3a02b43c0b8d15ebaba089a0e86c99e9080a88da Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Wed, 25 Feb 2026 21:06:55 -0700 Subject: [PATCH 01/34] feat: add Plane LXC helper script Add bare-metal LXC installation for Plane (plane.so), an open-source project management tool. Installs PostgreSQL, Redis, RabbitMQ, MinIO, Node.js 22, and Python API with Gunicorn/Uvicorn behind Nginx. --- ct/plane.sh | 101 +++++++++ frontend/public/json/plane.json | 44 ++++ install/plane-install.sh | 381 ++++++++++++++++++++++++++++++++ 3 files changed, 526 insertions(+) create mode 100644 ct/plane.sh create mode 100644 frontend/public/json/plane.json create mode 100644 install/plane-install.sh diff --git a/ct/plane.sh b/ct/plane.sh new file mode 100644 index 00000000..bda39e9f --- /dev/null +++ b/ct/plane.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/onionrings29/ProxmoxVE/feat/add-plane/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: onionrings29 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://plane.so + +APP="Plane" +var_tags="${var_tags:-project-management}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-8192}" +var_disk="${var_disk:-30}" +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/plane ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "plane" "makeplane/plane"; then + msg_info "Stopping Services" + systemctl stop plane-api plane-worker plane-beat plane-live + msg_ok "Stopped Services" + + msg_info "Backing up Data" + cp /opt/plane/apps/api/.env /opt/plane-env.bak + msg_ok "Backed up Data" + + msg_info "Downloading Update" + RELEASE=$(get_latest_github_release "makeplane/plane") + curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/v${RELEASE}.tar.gz" -o /tmp/plane.tar.gz + tar -xzf /tmp/plane.tar.gz -C /tmp + rm -rf /opt/plane/apps /opt/plane/packages /opt/plane/package.json /opt/plane/pnpm-lock.yaml /opt/plane/pnpm-workspace.yaml /opt/plane/turbo.json + cp -r /tmp/plane-*/apps /opt/plane/ + cp -r /tmp/plane-*/packages /opt/plane/ + cp /tmp/plane-*/package.json /opt/plane/ + cp /tmp/plane-*/pnpm-lock.yaml /opt/plane/ + cp /tmp/plane-*/pnpm-workspace.yaml /opt/plane/ + cp /tmp/plane-*/turbo.json /opt/plane/ + rm -rf /tmp/plane.tar.gz /tmp/plane-* + msg_ok "Downloaded Update" + + msg_info "Restoring Config" + cp /opt/plane-env.bak /opt/plane/apps/api/.env + rm /opt/plane-env.bak + msg_ok "Restored Config" + + msg_info "Rebuilding Frontend (Patience)" + cd /opt/plane + export NODE_OPTIONS="--max-old-space-size=4096" + export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 + $STD corepack enable pnpm + $STD pnpm install --frozen-lockfile + $STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live + msg_ok "Rebuilt Frontend" + + msg_info "Updating Python Dependencies" + cd /opt/plane/apps/api + $STD /opt/plane-venv/bin/pip install --upgrade -r requirements/production.txt + msg_ok "Updated Python Dependencies" + + msg_info "Running Migrations" + cd /opt/plane/apps/api + set -a + source /opt/plane/apps/api/.env + set +a + $STD /opt/plane-venv/bin/python manage.py migrate + $STD /opt/plane-venv/bin/python manage.py collectstatic --noinput + msg_ok "Ran Migrations" + + echo "${RELEASE}" >/opt/plane_version.txt + + msg_info "Starting Services" + systemctl start plane-api plane-worker plane-beat plane-live + msg_ok "Started Services" + + msg_ok "Updated 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}${CL}" diff --git a/frontend/public/json/plane.json b/frontend/public/json/plane.json new file mode 100644 index 00000000..c76ba00a --- /dev/null +++ b/frontend/public/json/plane.json @@ -0,0 +1,44 @@ +{ + "name": "Plane", + "slug": "plane", + "categories": [ + 25 + ], + "date_created": "2026-02-25", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://developers.plane.so/self-hosting/overview", + "website": "https://plane.so", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/plane.webp", + "config_path": "/opt/plane/apps/api/.env", + "description": "Open-source project tracking tool that helps teams plan, track, and manage their software projects with issues, cycles, and modules.", + "install_methods": [ + { + "type": "default", + "script": "ct/plane.sh", + "resources": { + "cpu": 4, + "ram": 8192, + "hdd": 30, + "os": "debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "First user to sign up becomes the instance admin. Initial build takes 10-15 minutes.", + "type": "info" + }, + { + "text": "Configuration file is at: `/opt/plane/apps/api/.env`. Credentials are saved to `~/plane.creds`.", + "type": "info" + } + ] +} diff --git a/install/plane-install.sh b/install/plane-install.sh new file mode 100644 index 00000000..da9ded7a --- /dev/null +++ b/install/plane-install.sh @@ -0,0 +1,381 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: onionrings29 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://plane.so + +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 \ + jq \ + nginx \ + build-essential \ + libpq-dev \ + libxml2-dev \ + libxslt1-dev \ + libxmlsec1-dev \ + libxmlsec1-openssl \ + pkg-config \ + python3-dev \ + python3-venv \ + redis-server \ + erlang-base \ + erlang-asn1 \ + erlang-crypto \ + erlang-eldap \ + erlang-ftp \ + erlang-inets \ + erlang-mnesia \ + erlang-os-mon \ + erlang-parsetools \ + erlang-public-key \ + erlang-runtime-tools \ + erlang-snmp \ + erlang-ssl \ + erlang-syntax-tools \ + erlang-tftp \ + erlang-tools \ + erlang-xmerl \ + rabbitmq-server +msg_ok "Installed Dependencies" + +NODE_VERSION="22" setup_nodejs +PG_VERSION="16" setup_postgresql +PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db +get_lxc_ip + +msg_info "Configuring RabbitMQ" +$STD rabbitmqctl add_vhost plane +$STD rabbitmqctl add_user plane plane +$STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*" +msg_ok "Configured RabbitMQ" + +msg_info "Installing MinIO" +curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio +chmod +x /usr/local/bin/minio +mkdir -p /opt/minio/data +MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) +MINIO_SECRET_KEY=$(openssl rand -base64 36 | tr -dc 'a-zA-Z0-9' | head -c32) +cat </etc/default/minio +MINIO_ROOT_USER="${MINIO_ACCESS_KEY}" +MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}" +MINIO_VOLUMES="/opt/minio/data" +EOF +cat </etc/systemd/system/minio.service +[Unit] +Description=MinIO Object Storage +After=network.target + +[Service] +Type=simple +EnvironmentFile=/etc/default/minio +ExecStart=/usr/local/bin/minio server \$MINIO_VOLUMES --console-address ":9090" +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now minio +msg_ok "Installed MinIO" + +msg_info "Downloading Plane (Patience)" +RELEASE=$(get_latest_github_release "makeplane/plane") +curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/v${RELEASE}.tar.gz" -o /tmp/plane.tar.gz +tar -xzf /tmp/plane.tar.gz -C /tmp +mv /tmp/plane-*/ /opt/plane +rm -f /tmp/plane.tar.gz +echo "${RELEASE}" >/opt/plane_version.txt +msg_ok "Downloaded Plane" + +msg_info "Building Frontend Apps (Patience)" +cd /opt/plane +FRONTEND_ENV="VITE_API_BASE_URL=http://${LOCAL_IP} +VITE_WEB_BASE_URL=http://${LOCAL_IP} +VITE_ADMIN_BASE_URL=http://${LOCAL_IP} +VITE_ADMIN_BASE_PATH=/god-mode +VITE_SPACE_BASE_URL=http://${LOCAL_IP} +VITE_SPACE_BASE_PATH=/spaces +VITE_LIVE_BASE_URL=http://${LOCAL_IP} +VITE_LIVE_BASE_PATH=/live" +echo "$FRONTEND_ENV" >/opt/plane/apps/web/.env +echo "$FRONTEND_ENV" >/opt/plane/apps/admin/.env +echo "$FRONTEND_ENV" >/opt/plane/apps/space/.env +export NODE_OPTIONS="--max-old-space-size=4096" +export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 +$STD corepack enable pnpm +$STD pnpm install --frozen-lockfile +$STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live +msg_ok "Built Frontend Apps" + +msg_info "Setting up Python API" +python3 -m venv /opt/plane-venv +$STD /opt/plane-venv/bin/pip install --upgrade pip +$STD /opt/plane-venv/bin/pip install -r /opt/plane/apps/api/requirements/production.txt +msg_ok "Set up Python API" + +msg_info "Configuring Plane" +SECRET_KEY=$(openssl rand -hex 32) +MACHINE_SIG=$(echo -n "$(hostname)-$(date +%s)" | sha256sum | head -c64) +LIVE_SECRET=$(openssl rand -hex 16) +cat </opt/plane/apps/api/.env +DEBUG=0 +CORS_ALLOWED_ORIGINS=http://${LOCAL_IP} + +POSTGRES_USER=plane +POSTGRES_PASSWORD=${PG_DB_PASS} +POSTGRES_HOST=localhost +POSTGRES_DB=plane +POSTGRES_PORT=5432 +DATABASE_URL=postgresql://plane:${PG_DB_PASS}@localhost:5432/plane + +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_URL=redis://localhost:6379/ + +RABBITMQ_HOST=localhost +RABBITMQ_PORT=5672 +RABBITMQ_USER=plane +RABBITMQ_PASSWORD=plane +RABBITMQ_VHOST=plane +AMQP_URL=amqp://plane:plane@localhost:5672/plane + +AWS_REGION=us-east-1 +AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} +AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_KEY} +AWS_S3_ENDPOINT_URL=http://localhost:9000 +AWS_S3_BUCKET_NAME=uploads +FILE_SIZE_LIMIT=5242880 + +USE_MINIO=1 +MINIO_ENDPOINT_SSL=0 +SECRET_KEY=${SECRET_KEY} +MACHINE_SIGNATURE=${MACHINE_SIG} + +WEB_URL=http://${LOCAL_IP} +ADMIN_BASE_URL=http://${LOCAL_IP} +ADMIN_BASE_PATH=/god-mode +SPACE_BASE_URL=http://${LOCAL_IP} +SPACE_BASE_PATH=/spaces +APP_BASE_URL=http://${LOCAL_IP} +APP_BASE_PATH= +LIVE_BASE_URL=http://${LOCAL_IP} +LIVE_BASE_PATH=/live + +GUNICORN_WORKERS=2 +LIVE_SERVER_SECRET_KEY=${LIVE_SECRET} +API_KEY_RATE_LIMIT=60/minute +EOF +cat </opt/plane/.env +API_BASE_URL=http://localhost:8000 +LIVE_SERVER_SECRET_KEY=${LIVE_SECRET} +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_URL=redis://localhost:6379/ +PORT=3100 +EOF +msg_ok "Configured Plane" + +msg_info "Running Database Migrations" +cd /opt/plane/apps/api +set -a +source /opt/plane/apps/api/.env +set +a +$STD /opt/plane-venv/bin/python manage.py migrate +$STD /opt/plane-venv/bin/python manage.py collectstatic --noinput +$STD /opt/plane-venv/bin/python manage.py configure_instance +$STD /opt/plane-venv/bin/python manage.py register_instance "${MACHINE_SIG}" +msg_ok "Ran Database Migrations" + +msg_info "Creating MinIO Bucket" +curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc +chmod +x /usr/local/bin/mc +$STD /usr/local/bin/mc alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" +$STD /usr/local/bin/mc mb plane/uploads --ignore-existing +msg_ok "Created MinIO Bucket" + +msg_info "Creating Services" +cat </etc/systemd/system/plane-api.service +[Unit] +Description=Plane API +After=network.target postgresql.service redis-server.service rabbitmq-server.service minio.service + +[Service] +Type=simple +WorkingDirectory=/opt/plane/apps/api +EnvironmentFile=/opt/plane/apps/api/.env +ExecStart=/opt/plane-venv/bin/gunicorn -w 2 -k uvicorn.workers.UvicornWorker plane.asgi:application --bind 0.0.0.0:8000 --max-requests 1200 --max-requests-jitter 1000 --access-logfile - +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/plane-worker.service +[Unit] +Description=Plane Celery Worker +After=plane-api.service + +[Service] +Type=simple +WorkingDirectory=/opt/plane/apps/api +EnvironmentFile=/opt/plane/apps/api/.env +ExecStart=/opt/plane-venv/bin/celery -A plane worker -l info +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/plane-beat.service +[Unit] +Description=Plane Celery Beat +After=plane-api.service + +[Service] +Type=simple +WorkingDirectory=/opt/plane/apps/api +EnvironmentFile=/opt/plane/apps/api/.env +ExecStart=/opt/plane-venv/bin/celery -A plane beat -l info +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/plane-live.service +[Unit] +Description=Plane Live Server +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/plane +EnvironmentFile=/opt/plane/apps/api/.env +ExecStart=/usr/bin/node apps/live/dist/start.mjs +Restart=on-failure +RestartSec=5 +Environment=PORT=3100 + +[Install] +WantedBy=multi-user.target +EOF + +systemctl enable -q --now plane-api +systemctl enable -q --now plane-worker +systemctl enable -q --now plane-beat +systemctl enable -q --now plane-live +msg_ok "Created Services" + +msg_info "Configuring Nginx" +cat <<'NGINXEOF' >/etc/nginx/conf.d/plane.conf +upstream plane-api { + server 127.0.0.1:8000; +} + +upstream plane-live { + server 127.0.0.1:3100; +} + +upstream plane-minio { + server 127.0.0.1:9000; +} + +server { + listen 80 default_server; + server_name _; + client_max_body_size 5M; + + location /api/ { + proxy_pass http://plane-api; + 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; + } + + location /auth/ { + proxy_pass http://plane-api; + 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; + } + + location /static/ { + alias /opt/plane/apps/api/static/; + } + + location /live/ { + proxy_pass http://plane-live; + 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; + } + + location /uploads/ { + proxy_pass http://plane-minio; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /spaces/ { + alias /opt/plane/apps/space/build/client/; + try_files $uri $uri/ /spaces/index.html; + } + + location /spaces { + return 301 /spaces/; + } + + location /god-mode/ { + alias /opt/plane/apps/admin/build/client/; + try_files $uri $uri/ /god-mode/index.html; + } + + location /god-mode { + return 301 /god-mode/; + } + + location / { + root /opt/plane/apps/web/build/client; + try_files $uri $uri/ /index.html; + } +} +NGINXEOF +rm -f /etc/nginx/sites-enabled/default +$STD systemctl reload nginx +msg_ok "Configured Nginx" + +msg_info "Saving Credentials" +{ + echo "Plane Credentials" + echo "================================" + echo "Database User: plane" + echo "Database Password: ${PG_DB_PASS}" + echo "MinIO Access Key: ${MINIO_ACCESS_KEY}" + echo "MinIO Secret Key: ${MINIO_SECRET_KEY}" + echo "Secret Key: ${SECRET_KEY}" + echo "Config: /opt/plane/apps/api/.env" +} >~/plane.creds +msg_ok "Saved Credentials" + +motd_ssh +customize +cleanup_lxc From 0a2605706b9eb1163e464a17384f0c92113455f8 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Wed, 25 Feb 2026 21:13:02 -0700 Subject: [PATCH 02/34] fix: plane space SSR, static path, live server config, update script - Add plane-space systemd service for SSR (react-router-serve on port 3002) - Fix nginx /spaces/ to proxy to plane-space instead of static files - Fix nginx /static/ alias to correct Django collectstatic path - Fix plane-live EnvironmentFile to /opt/plane/.env - Fix plane-live ExecStart to use start.mjs - Update script: backup/restore all .env files, include plane-space - Update script: add configure_instance after migrations - Split JSON notes for god-mode and credentials --- ct/plane.sh | 21 ++++++++++++++------ frontend/public/json/plane.json | 6 +++++- install/plane-install.sh | 35 ++++++++++++++++++++++++++++----- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index bda39e9f..3be1ce6c 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/onionrings29/ProxmoxVE/feat/add-plane/misc/build.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) # Copyright (c) 2021-2026 community-scripts ORG # Author: onionrings29 # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE @@ -31,11 +31,15 @@ function update_script() { if check_for_gh_release "plane" "makeplane/plane"; then msg_info "Stopping Services" - systemctl stop plane-api plane-worker plane-beat plane-live + systemctl stop plane-api plane-worker plane-beat plane-live plane-space msg_ok "Stopped Services" msg_info "Backing up Data" - cp /opt/plane/apps/api/.env /opt/plane-env.bak + cp /opt/plane/apps/api/.env /opt/plane-api-env.bak + cp /opt/plane/.env /opt/plane-live-env.bak + cp /opt/plane/apps/web/.env /opt/plane-web-env.bak + cp /opt/plane/apps/admin/.env /opt/plane-admin-env.bak + cp /opt/plane/apps/space/.env /opt/plane-space-env.bak msg_ok "Backed up Data" msg_info "Downloading Update" @@ -53,8 +57,12 @@ function update_script() { msg_ok "Downloaded Update" msg_info "Restoring Config" - cp /opt/plane-env.bak /opt/plane/apps/api/.env - rm /opt/plane-env.bak + cp /opt/plane-api-env.bak /opt/plane/apps/api/.env + cp /opt/plane-live-env.bak /opt/plane/.env + cp /opt/plane-web-env.bak /opt/plane/apps/web/.env + cp /opt/plane-admin-env.bak /opt/plane/apps/admin/.env + cp /opt/plane-space-env.bak /opt/plane/apps/space/.env + rm -f /opt/plane-api-env.bak /opt/plane-live-env.bak /opt/plane-web-env.bak /opt/plane-admin-env.bak /opt/plane-space-env.bak msg_ok "Restored Config" msg_info "Rebuilding Frontend (Patience)" @@ -78,12 +86,13 @@ function update_script() { set +a $STD /opt/plane-venv/bin/python manage.py migrate $STD /opt/plane-venv/bin/python manage.py collectstatic --noinput + $STD /opt/plane-venv/bin/python manage.py configure_instance msg_ok "Ran Migrations" echo "${RELEASE}" >/opt/plane_version.txt msg_info "Starting Services" - systemctl start plane-api plane-worker plane-beat plane-live + systemctl start plane-api plane-worker plane-beat plane-live plane-space msg_ok "Started Services" msg_ok "Updated successfully!" diff --git a/frontend/public/json/plane.json b/frontend/public/json/plane.json index c76ba00a..c0c0f05f 100644 --- a/frontend/public/json/plane.json +++ b/frontend/public/json/plane.json @@ -37,7 +37,11 @@ "type": "info" }, { - "text": "Configuration file is at: `/opt/plane/apps/api/.env`. Credentials are saved to `~/plane.creds`.", + "text": "Admin panel (God Mode) is available at `/god-mode/` for instance configuration.", + "type": "info" + }, + { + "text": "Credentials are saved to `~/plane.creds`.", "type": "info" } ] diff --git a/install/plane-install.sh b/install/plane-install.sh index da9ded7a..ca78834a 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -262,11 +262,28 @@ After=network.target [Service] Type=simple WorkingDirectory=/opt/plane -EnvironmentFile=/opt/plane/apps/api/.env +EnvironmentFile=/opt/plane/.env ExecStart=/usr/bin/node apps/live/dist/start.mjs Restart=on-failure RestartSec=5 -Environment=PORT=3100 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/plane-space.service +[Unit] +Description=Plane Space Server +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/plane/apps/space +Environment=PORT=3002 +Environment=NODE_ENV=production +ExecStart=/opt/plane/apps/space/node_modules/.bin/react-router-serve ./build/server/index.js +Restart=on-failure +RestartSec=5 [Install] WantedBy=multi-user.target @@ -276,6 +293,7 @@ systemctl enable -q --now plane-api systemctl enable -q --now plane-worker systemctl enable -q --now plane-beat systemctl enable -q --now plane-live +systemctl enable -q --now plane-space msg_ok "Created Services" msg_info "Configuring Nginx" @@ -288,6 +306,10 @@ upstream plane-live { server 127.0.0.1:3100; } +upstream plane-space { + server 127.0.0.1:3002; +} + upstream plane-minio { server 127.0.0.1:9000; } @@ -314,7 +336,7 @@ server { } location /static/ { - alias /opt/plane/apps/api/static/; + alias /opt/plane/apps/api/plane/static-assets/collected-static/; } location /live/ { @@ -336,8 +358,11 @@ server { } location /spaces/ { - alias /opt/plane/apps/space/build/client/; - try_files $uri $uri/ /spaces/index.html; + proxy_pass http://plane-space; + 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; } location /spaces { From 53896b14502064012e33ff423dada0ff9717538c Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Wed, 25 Feb 2026 23:14:53 -0700 Subject: [PATCH 03/34] fix: align with ProxmoxVED contribution guidelines - Point build.func URL to ProxmoxVED repo with curl -s - Update license URLs to ProxmoxVED - Add core dependencies (curl, sudo, mc) per template requirements --- ct/plane.sh | 4 ++-- install/plane-install.sh | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index 3be1ce6c..c76303a4 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) # Copyright (c) 2021-2026 community-scripts ORG # Author: onionrings29 -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://plane.so APP="Plane" diff --git a/install/plane-install.sh b/install/plane-install.sh index ca78834a..ccdd3501 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -2,7 +2,7 @@ # Copyright (c) 2021-2026 community-scripts ORG # Author: onionrings29 -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://plane.so source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" @@ -15,6 +15,9 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ + curl \ + sudo \ + mc \ jq \ nginx \ build-essential \ From 8acc57d31d6767c6dbaae5359ec3ab0f2edb95cd Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Thu, 26 Feb 2026 23:06:59 -0700 Subject: [PATCH 04/34] fix: address PR review feedback - Use fetch_and_deploy_gh_release instead of manual curl/tar/mv - Use apt instead of apt-get per project convention - Remove preinstalled deps (curl, sudo, jq) - Collapse erlang deps with brace expansion - Generate random RabbitMQ password instead of hardcoded - Rename MinIO client to mcli to avoid Midnight Commander conflict - Use nginx sites-available/sites-enabled convention - Add Requires=plane-api.service to worker and beat units - Add RabbitMQ credentials to ~/plane.creds - Add VITE rebuild warning note to JSON --- ct/plane.sh | 18 ++--------- frontend/public/json/plane.json | 4 +++ install/plane-install.sh | 53 +++++++++++---------------------- 3 files changed, 25 insertions(+), 50 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index c76303a4..aab28353 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -42,19 +42,9 @@ function update_script() { cp /opt/plane/apps/space/.env /opt/plane-space-env.bak msg_ok "Backed up Data" - msg_info "Downloading Update" - RELEASE=$(get_latest_github_release "makeplane/plane") - curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/v${RELEASE}.tar.gz" -o /tmp/plane.tar.gz - tar -xzf /tmp/plane.tar.gz -C /tmp - rm -rf /opt/plane/apps /opt/plane/packages /opt/plane/package.json /opt/plane/pnpm-lock.yaml /opt/plane/pnpm-workspace.yaml /opt/plane/turbo.json - cp -r /tmp/plane-*/apps /opt/plane/ - cp -r /tmp/plane-*/packages /opt/plane/ - cp /tmp/plane-*/package.json /opt/plane/ - cp /tmp/plane-*/pnpm-lock.yaml /opt/plane/ - cp /tmp/plane-*/pnpm-workspace.yaml /opt/plane/ - cp /tmp/plane-*/turbo.json /opt/plane/ - rm -rf /tmp/plane.tar.gz /tmp/plane-* - msg_ok "Downloaded Update" + msg_info "Updating ${APP}" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "plane" "makeplane/plane" + msg_ok "Updated ${APP}" msg_info "Restoring Config" cp /opt/plane-api-env.bak /opt/plane/apps/api/.env @@ -89,8 +79,6 @@ function update_script() { $STD /opt/plane-venv/bin/python manage.py configure_instance msg_ok "Ran Migrations" - echo "${RELEASE}" >/opt/plane_version.txt - msg_info "Starting Services" systemctl start plane-api plane-worker plane-beat plane-live plane-space msg_ok "Started Services" diff --git a/frontend/public/json/plane.json b/frontend/public/json/plane.json index c0c0f05f..0e526905 100644 --- a/frontend/public/json/plane.json +++ b/frontend/public/json/plane.json @@ -43,6 +43,10 @@ { "text": "Credentials are saved to `~/plane.creds`.", "type": "info" + }, + { + "text": "If the container IP changes, rebuild the frontend apps or run the update script to apply the new URL.", + "type": "warning" } ] } diff --git a/install/plane-install.sh b/install/plane-install.sh index ccdd3501..dff18142 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -14,11 +14,7 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - curl \ - sudo \ - mc \ - jq \ +$STD apt install -y \ nginx \ build-essential \ libpq-dev \ @@ -31,22 +27,8 @@ $STD apt-get install -y \ python3-venv \ redis-server \ erlang-base \ - erlang-asn1 \ - erlang-crypto \ - erlang-eldap \ - erlang-ftp \ - erlang-inets \ - erlang-mnesia \ - erlang-os-mon \ - erlang-parsetools \ - erlang-public-key \ - erlang-runtime-tools \ - erlang-snmp \ - erlang-ssl \ - erlang-syntax-tools \ - erlang-tftp \ - erlang-tools \ - erlang-xmerl \ + erlang-{asn1,crypto,eldap,ftp,inets,mnesia,os-mon,parsetools} \ + erlang-{public-key,runtime-tools,snmp,ssl,syntax-tools,tftp,tools,xmerl} \ rabbitmq-server msg_ok "Installed Dependencies" @@ -56,8 +38,9 @@ PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db get_lxc_ip msg_info "Configuring RabbitMQ" +RABBITMQ_PASS=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c16) $STD rabbitmqctl add_vhost plane -$STD rabbitmqctl add_user plane plane +$STD rabbitmqctl add_user plane "${RABBITMQ_PASS}" $STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*" msg_ok "Configured RabbitMQ" @@ -91,12 +74,7 @@ systemctl enable -q --now minio msg_ok "Installed MinIO" msg_info "Downloading Plane (Patience)" -RELEASE=$(get_latest_github_release "makeplane/plane") -curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/v${RELEASE}.tar.gz" -o /tmp/plane.tar.gz -tar -xzf /tmp/plane.tar.gz -C /tmp -mv /tmp/plane-*/ /opt/plane -rm -f /tmp/plane.tar.gz -echo "${RELEASE}" >/opt/plane_version.txt +fetch_and_deploy_gh_release "plane" "makeplane/plane" msg_ok "Downloaded Plane" msg_info "Building Frontend Apps (Patience)" @@ -147,9 +125,9 @@ REDIS_URL=redis://localhost:6379/ RABBITMQ_HOST=localhost RABBITMQ_PORT=5672 RABBITMQ_USER=plane -RABBITMQ_PASSWORD=plane +RABBITMQ_PASSWORD=${RABBITMQ_PASS} RABBITMQ_VHOST=plane -AMQP_URL=amqp://plane:plane@localhost:5672/plane +AMQP_URL=amqp://plane:${RABBITMQ_PASS}@localhost:5672/plane AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} @@ -199,10 +177,10 @@ $STD /opt/plane-venv/bin/python manage.py register_instance "${MACHINE_SIG}" msg_ok "Ran Database Migrations" msg_info "Creating MinIO Bucket" -curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc -chmod +x /usr/local/bin/mc -$STD /usr/local/bin/mc alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" -$STD /usr/local/bin/mc mb plane/uploads --ignore-existing +curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mcli +chmod +x /usr/local/bin/mcli +$STD /usr/local/bin/mcli alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" +$STD /usr/local/bin/mcli mb plane/uploads --ignore-existing msg_ok "Created MinIO Bucket" msg_info "Creating Services" @@ -227,6 +205,7 @@ cat </etc/systemd/system/plane-worker.service [Unit] Description=Plane Celery Worker After=plane-api.service +Requires=plane-api.service [Service] Type=simple @@ -244,6 +223,7 @@ cat </etc/systemd/system/plane-beat.service [Unit] Description=Plane Celery Beat After=plane-api.service +Requires=plane-api.service [Service] Type=simple @@ -300,7 +280,7 @@ systemctl enable -q --now plane-space msg_ok "Created Services" msg_info "Configuring Nginx" -cat <<'NGINXEOF' >/etc/nginx/conf.d/plane.conf +cat <<'NGINXEOF' >/etc/nginx/sites-available/plane.conf upstream plane-api { server 127.0.0.1:8000; } @@ -387,6 +367,7 @@ server { } } NGINXEOF +ln -sf /etc/nginx/sites-available/plane.conf /etc/nginx/sites-enabled/plane.conf rm -f /etc/nginx/sites-enabled/default $STD systemctl reload nginx msg_ok "Configured Nginx" @@ -397,6 +378,8 @@ msg_info "Saving Credentials" echo "================================" echo "Database User: plane" echo "Database Password: ${PG_DB_PASS}" + echo "RabbitMQ User: plane" + echo "RabbitMQ Password: ${RABBITMQ_PASS}" echo "MinIO Access Key: ${MINIO_ACCESS_KEY}" echo "MinIO Secret Key: ${MINIO_SECRET_KEY}" echo "Secret Key: ${SECRET_KEY}" From cbdce5de6c0da9abcd93e67ed6d56cda7bc8efaa Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Thu, 26 Feb 2026 23:31:07 -0700 Subject: [PATCH 05/34] fix: use COMMUNITY_SCRIPTS_URL, capitalize Successfully/Debian --- ct/plane.sh | 5 +++-- frontend/public/json/plane.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index aab28353..80c442cf 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash -source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main}" +source <(curl -fsSL "$COMMUNITY_SCRIPTS_URL/misc/build.func") # Copyright (c) 2021-2026 community-scripts ORG # Author: onionrings29 # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE @@ -92,7 +93,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}${CL}" diff --git a/frontend/public/json/plane.json b/frontend/public/json/plane.json index 0e526905..d6e51b7b 100644 --- a/frontend/public/json/plane.json +++ b/frontend/public/json/plane.json @@ -22,7 +22,7 @@ "cpu": 4, "ram": 8192, "hdd": 30, - "os": "debian", + "os": "Debian", "version": "13" } } From 7f53e3677cfd850e41d5cd22103188e961c9a041 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 00:14:36 -0700 Subject: [PATCH 06/34] fix: address CrazyWolf13 review feedback - Add GitHub URL to source line (ct/plane.sh) - Replace ${APP} with direct 'Plane' string in msg_* calls - Use fetch_and_deploy_from_url for MinIO server download - Add explicit 'tarball' mode to fetch_and_deploy_gh_release - Use setup_uv + uv venv + uv pip instead of python3 venv - Combine systemctl enable commands into single line - Use ${PG_DB_USER} var in credentials output - Merge MinIO bucket creation into service creation block --- ct/plane.sh | 8 ++++---- install/plane-install.sh | 23 +++++++++-------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index 80c442cf..b90d16e0 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -4,7 +4,7 @@ source <(curl -fsSL "$COMMUNITY_SCRIPTS_URL/misc/build.func") # Copyright (c) 2021-2026 community-scripts ORG # Author: onionrings29 # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://plane.so +# Source: https://plane.so | GitHub: https://github.com/makeplane/plane APP="Plane" var_tags="${var_tags:-project-management}" @@ -26,7 +26,7 @@ function update_script() { check_container_resources if [[ ! -d /opt/plane ]]; then - msg_error "No ${APP} Installation Found!" + msg_error "No Plane Installation Found!" exit fi @@ -43,9 +43,9 @@ function update_script() { cp /opt/plane/apps/space/.env /opt/plane-space-env.bak msg_ok "Backed up Data" - msg_info "Updating ${APP}" + msg_info "Updating Plane" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "plane" "makeplane/plane" - msg_ok "Updated ${APP}" + msg_ok "Updated Plane" msg_info "Restoring Config" cp /opt/plane-api-env.bak /opt/plane/apps/api/.env diff --git a/install/plane-install.sh b/install/plane-install.sh index dff18142..ffc94896 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -45,7 +45,7 @@ $STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*" msg_ok "Configured RabbitMQ" msg_info "Installing MinIO" -curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio +fetch_and_deploy_from_url "https://dl.min.io/server/minio/release/linux-amd64/minio" "" chmod +x /usr/local/bin/minio mkdir -p /opt/minio/data MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) @@ -74,7 +74,7 @@ systemctl enable -q --now minio msg_ok "Installed MinIO" msg_info "Downloading Plane (Patience)" -fetch_and_deploy_gh_release "plane" "makeplane/plane" +fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball" msg_ok "Downloaded Plane" msg_info "Building Frontend Apps (Patience)" @@ -98,9 +98,10 @@ $STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=li msg_ok "Built Frontend Apps" msg_info "Setting up Python API" -python3 -m venv /opt/plane-venv -$STD /opt/plane-venv/bin/pip install --upgrade pip -$STD /opt/plane-venv/bin/pip install -r /opt/plane/apps/api/requirements/production.txt +setup_uv +$STD uv venv /opt/plane-venv +$STD /opt/plane-venv/bin/uv pip install --upgrade pip +$STD /opt/plane-venv/bin/uv pip install -r /opt/plane/apps/api/requirements/production.txt msg_ok "Set up Python API" msg_info "Configuring Plane" @@ -176,14 +177,12 @@ $STD /opt/plane-venv/bin/python manage.py configure_instance $STD /opt/plane-venv/bin/python manage.py register_instance "${MACHINE_SIG}" msg_ok "Ran Database Migrations" -msg_info "Creating MinIO Bucket" +msg_info "Creating Services and MinIO Bucket" curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mcli chmod +x /usr/local/bin/mcli $STD /usr/local/bin/mcli alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" $STD /usr/local/bin/mcli mb plane/uploads --ignore-existing -msg_ok "Created MinIO Bucket" -msg_info "Creating Services" cat </etc/systemd/system/plane-api.service [Unit] Description=Plane API @@ -272,11 +271,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -systemctl enable -q --now plane-api -systemctl enable -q --now plane-worker -systemctl enable -q --now plane-beat -systemctl enable -q --now plane-live -systemctl enable -q --now plane-space +systemctl enable -q --now plane-api plane-worker plane-beat plane-live plane-space msg_ok "Created Services" msg_info "Configuring Nginx" @@ -376,7 +371,7 @@ msg_info "Saving Credentials" { echo "Plane Credentials" echo "================================" - echo "Database User: plane" + echo "Database User: ${PG_DB_USER}" echo "Database Password: ${PG_DB_PASS}" echo "RabbitMQ User: plane" echo "RabbitMQ Password: ${RABBITMQ_PASS}" From ff313ae0b7eeadc5a3cb93b8b64856f40dcf12ee Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 00:22:26 -0700 Subject: [PATCH 07/34] fix: use APPLICATION var and append to db creds file - Set APPLICATION before setup_postgresql_db so it creates ~/plane.creds - Append additional credentials to existing creds file instead of overwriting --- install/plane-install.sh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index ffc94896..6f09a789 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -34,7 +34,7 @@ msg_ok "Installed Dependencies" NODE_VERSION="22" setup_nodejs PG_VERSION="16" setup_postgresql -PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db +APPLICATION="Plane" PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db get_lxc_ip msg_info "Configuring RabbitMQ" @@ -369,17 +369,13 @@ msg_ok "Configured Nginx" msg_info "Saving Credentials" { - echo "Plane Credentials" - echo "================================" - echo "Database User: ${PG_DB_USER}" - echo "Database Password: ${PG_DB_PASS}" echo "RabbitMQ User: plane" echo "RabbitMQ Password: ${RABBITMQ_PASS}" echo "MinIO Access Key: ${MINIO_ACCESS_KEY}" echo "MinIO Secret Key: ${MINIO_SECRET_KEY}" echo "Secret Key: ${SECRET_KEY}" echo "Config: /opt/plane/apps/api/.env" -} >~/plane.creds +} >>~/plane.creds msg_ok "Saved Credentials" motd_ssh From 3a557bb599ce517cf95e8ea101b8011acd4205de Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 00:24:46 -0700 Subject: [PATCH 08/34] fix: revert MinIO server to curl (binary, not archive) --- install/plane-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 6f09a789..9b3964fc 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -45,7 +45,7 @@ $STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*" msg_ok "Configured RabbitMQ" msg_info "Installing MinIO" -fetch_and_deploy_from_url "https://dl.min.io/server/minio/release/linux-amd64/minio" "" +curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio chmod +x /usr/local/bin/minio mkdir -p /opt/minio/data MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) From ad62c9ef5c4d48f430f5e4f2e660b27f6e3466cf Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 01:11:42 -0700 Subject: [PATCH 09/34] fix: use uv pip directly (system uv, not in venv) --- install/plane-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 9b3964fc..fc5b82a8 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -100,8 +100,8 @@ msg_ok "Built Frontend Apps" msg_info "Setting up Python API" setup_uv $STD uv venv /opt/plane-venv -$STD /opt/plane-venv/bin/uv pip install --upgrade pip -$STD /opt/plane-venv/bin/uv pip install -r /opt/plane/apps/api/requirements/production.txt +$STD uv pip install --upgrade pip +$STD uv pip install -r /opt/plane/apps/api/requirements/production.txt msg_ok "Set up Python API" msg_info "Configuring Plane" From f05c1de0e632c3ba984c4c34810684f14c6770ce Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 01:13:31 -0700 Subject: [PATCH 10/34] fix: remove space in heredoc syntax --- install/plane-install.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index fc5b82a8..1058cab8 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -50,12 +50,12 @@ chmod +x /usr/local/bin/minio mkdir -p /opt/minio/data MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) MINIO_SECRET_KEY=$(openssl rand -base64 36 | tr -dc 'a-zA-Z0-9' | head -c32) -cat </etc/default/minio +cat </etc/default/minio MINIO_ROOT_USER="${MINIO_ACCESS_KEY}" MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}" MINIO_VOLUMES="/opt/minio/data" EOF -cat </etc/systemd/system/minio.service +cat </etc/systemd/system/minio.service [Unit] Description=MinIO Object Storage After=network.target @@ -108,7 +108,7 @@ msg_info "Configuring Plane" SECRET_KEY=$(openssl rand -hex 32) MACHINE_SIG=$(echo -n "$(hostname)-$(date +%s)" | sha256sum | head -c64) LIVE_SECRET=$(openssl rand -hex 16) -cat </opt/plane/apps/api/.env +cat </opt/plane/apps/api/.env DEBUG=0 CORS_ALLOWED_ORIGINS=http://${LOCAL_IP} @@ -156,7 +156,7 @@ GUNICORN_WORKERS=2 LIVE_SERVER_SECRET_KEY=${LIVE_SECRET} API_KEY_RATE_LIMIT=60/minute EOF -cat </opt/plane/.env +cat </opt/plane/.env API_BASE_URL=http://localhost:8000 LIVE_SERVER_SECRET_KEY=${LIVE_SECRET} REDIS_HOST=localhost @@ -183,7 +183,7 @@ chmod +x /usr/local/bin/mcli $STD /usr/local/bin/mcli alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" $STD /usr/local/bin/mcli mb plane/uploads --ignore-existing -cat </etc/systemd/system/plane-api.service +cat </etc/systemd/system/plane-api.service [Unit] Description=Plane API After=network.target postgresql.service redis-server.service rabbitmq-server.service minio.service @@ -200,7 +200,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-worker.service +cat </etc/systemd/system/plane-worker.service [Unit] Description=Plane Celery Worker After=plane-api.service @@ -218,7 +218,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-beat.service +cat </etc/systemd/system/plane-beat.service [Unit] Description=Plane Celery Beat After=plane-api.service @@ -236,7 +236,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-live.service +cat </etc/systemd/system/plane-live.service [Unit] Description=Plane Live Server After=network.target @@ -253,7 +253,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-space.service +cat </etc/systemd/system/plane-space.service [Unit] Description=Plane Space Server After=network.target From 75d52158af2d78cf45d3bad8da6ad25b120aad90 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 01:22:45 -0700 Subject: [PATCH 11/34] fix: add tarball mode, use uv pip in update script --- ct/plane.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index b90d16e0..54d745f9 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -44,7 +44,7 @@ function update_script() { msg_ok "Backed up Data" msg_info "Updating Plane" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "plane" "makeplane/plane" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball" msg_ok "Updated Plane" msg_info "Restoring Config" @@ -67,7 +67,7 @@ function update_script() { msg_info "Updating Python Dependencies" cd /opt/plane/apps/api - $STD /opt/plane-venv/bin/pip install --upgrade -r requirements/production.txt + $STD uv pip install --upgrade -r requirements/production.txt msg_ok "Updated Python Dependencies" msg_info "Running Migrations" From 394b8dac26d1d41f3a9fc6cfe50dd8517624f850 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 01:24:24 -0700 Subject: [PATCH 12/34] fix: remove unnecessary uv pip upgrade --- install/plane-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 1058cab8..b0e0fe71 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -100,7 +100,6 @@ msg_ok "Built Frontend Apps" msg_info "Setting up Python API" setup_uv $STD uv venv /opt/plane-venv -$STD uv pip install --upgrade pip $STD uv pip install -r /opt/plane/apps/api/requirements/production.txt msg_ok "Set up Python API" From 4abe05bbd9543aa7c4a1981cc29d32a66bfee940 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 01:45:48 -0700 Subject: [PATCH 13/34] fix: activate venv before uv pip install uv pip needs the venv to be activated (VIRTUAL_ENV set) to find it. Setting VIRTUAL_ENV and PATH ensures uv can locate the venv. --- ct/plane.sh | 2 + docs/plans/2026-02-25-plane-design.md | 622 ++++++++++++++++++++++++++ install/plane-install.sh | 2 + 3 files changed, 626 insertions(+) create mode 100644 docs/plans/2026-02-25-plane-design.md diff --git a/ct/plane.sh b/ct/plane.sh index 54d745f9..a6d8a1ac 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -67,6 +67,8 @@ function update_script() { msg_info "Updating Python Dependencies" cd /opt/plane/apps/api + export VIRTUAL_ENV=/opt/plane-venv + export PATH="/opt/plane-venv/bin:$PATH" $STD uv pip install --upgrade -r requirements/production.txt msg_ok "Updated Python Dependencies" diff --git a/docs/plans/2026-02-25-plane-design.md b/docs/plans/2026-02-25-plane-design.md new file mode 100644 index 00000000..f33ee723 --- /dev/null +++ b/docs/plans/2026-02-25-plane-design.md @@ -0,0 +1,622 @@ +# Plane.so Bare Metal LXC Helper Script — Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Create a ProxmoxVE community helper script that installs Plane.so v1.2.2 bare metal in an LXC container. + +**Architecture:** Reverse-engineer Plane's Docker Compose (12 services) into native systemd services. Frontends (web, admin, space) are static builds served by Nginx. Backend is Django/Gunicorn + Celery workers. Infrastructure: PostgreSQL 16, Redis, RabbitMQ, MinIO. + +**Tech Stack:** Python 3.12, Node.js 22, pnpm, turbo, Django, Celery, Gunicorn, Uvicorn, PostgreSQL, Redis, RabbitMQ, MinIO, Nginx + +--- + +## Pre-work: Setup Fork + +```bash +cd /Users/msaul/Documents/codes/proxmox/ProxmoxVE +git remote add fork https://github.com/onionrings29/ProxmoxVE.git 2>/dev/null || true +git checkout -b feat/add-plane +``` + +--- + +### Task 1: Create JSON Metadata (`frontend/public/json/plane.json`) + +**Files:** +- Create: `frontend/public/json/plane.json` + +**Step 1: Write the JSON file** + +```json +{ + "name": "Plane", + "slug": "plane", + "categories": [ + 25 + ], + "date_created": "2026-02-25", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://developers.plane.so/self-hosting/overview", + "website": "https://plane.so", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/plane.webp", + "config_path": "/opt/plane/apps/api/.env", + "description": "Open-source project tracking tool that helps teams plan, track, and manage their software projects with issues, cycles, and modules.", + "install_methods": [ + { + "type": "default", + "script": "ct/plane.sh", + "resources": { + "cpu": 4, + "ram": 8192, + "hdd": 30, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "First user to sign up becomes the instance admin. Initial build takes 10-15 minutes.", + "type": "info" + }, + { + "text": "Configuration file is at: `/opt/plane/apps/api/.env`. Credentials are saved to `~/plane.creds`.", + "type": "info" + } + ] +} +``` + +**Step 2: Commit** + +```bash +git add frontend/public/json/plane.json +git commit -m "feat: add Plane JSON metadata" +``` + +--- + +### Task 2: Create CT Script (`ct/plane.sh`) + +**Files:** +- Create: `ct/plane.sh` + +**Step 1: Write the CT script** + +```bash +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: onionrings29 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://plane.so + +APP="Plane" +var_tags="${var_tags:-project-management}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-8192}" +var_disk="${var_disk:-30}" +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/plane ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "plane" "makeplane/plane"; then + msg_info "Stopping Services" + systemctl stop plane-api plane-worker plane-beat plane-live + msg_ok "Stopped Services" + + msg_info "Backing up Data" + cp /opt/plane/apps/api/.env /opt/plane-env.bak + msg_ok "Backed up Data" + + msg_info "Downloading Update" + RELEASE=$(get_latest_github_release "makeplane/plane") + curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/${RELEASE}.tar.gz" -o /tmp/plane.tar.gz + tar -xzf /tmp/plane.tar.gz -C /tmp + rm -rf /opt/plane/apps /opt/plane/packages /opt/plane/package.json /opt/plane/pnpm-lock.yaml /opt/plane/pnpm-workspace.yaml /opt/plane/turbo.json + cp -r /tmp/plane-*/apps /opt/plane/ + cp -r /tmp/plane-*/packages /opt/plane/ + cp /tmp/plane-*/package.json /opt/plane/ + cp /tmp/plane-*/pnpm-lock.yaml /opt/plane/ + cp /tmp/plane-*/pnpm-workspace.yaml /opt/plane/ + cp /tmp/plane-*/turbo.json /opt/plane/ + rm -rf /tmp/plane.tar.gz /tmp/plane-* + msg_ok "Downloaded Update" + + msg_info "Restoring Config" + cp /opt/plane-env.bak /opt/plane/apps/api/.env + rm /opt/plane-env.bak + msg_ok "Restored Config" + + msg_info "Rebuilding Frontend (Patience)" + cd /opt/plane + export NODE_OPTIONS="--max-old-space-size=4096" + export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 + $STD corepack enable pnpm + $STD pnpm install --frozen-lockfile + $STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live + msg_ok "Rebuilt Frontend" + + msg_info "Updating Python Dependencies" + cd /opt/plane/apps/api + $STD /opt/plane-venv/bin/pip install --upgrade -r requirements/production.txt + msg_ok "Updated Python Dependencies" + + msg_info "Running Migrations" + cd /opt/plane/apps/api + $STD /opt/plane-venv/bin/python manage.py migrate + $STD /opt/plane-venv/bin/python manage.py collectstatic --noinput + msg_ok "Ran Migrations" + + echo "${RELEASE}" >/opt/plane_version.txt + + msg_info "Starting Services" + systemctl start plane-api plane-worker plane-beat plane-live + msg_ok "Started Services" + + msg_ok "Updated 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}${CL}" +``` + +**Step 2: Commit** + +```bash +git add ct/plane.sh +git commit -m "feat: add Plane CT script" +``` + +--- + +### Task 3: Create Install Script (`install/plane-install.sh`) + +**Files:** +- Create: `install/plane-install.sh` + +This is the largest file. The install script performs: + +1. Install system dependencies (build tools, libpq, xmlsec, etc.) +2. Install Node.js 22, PostgreSQL 16, Redis, RabbitMQ, MinIO +3. Clone Plane v1.2.2 source +4. Build frontends with pnpm + turbo +5. Setup Python venv + install API dependencies +6. Configure .env with generated secrets +7. Run Django migrations +8. Create MinIO uploads bucket +9. Create 5 systemd services (api, worker, beat, live, minio) +10. Configure Nginx reverse proxy +11. Cleanup + +**Step 1: Write the install script** + +```bash +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: onionrings29 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://plane.so + +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 \ + nginx \ + build-essential \ + libpq-dev \ + libxml2-dev \ + libxslt1-dev \ + libxmlsec1-dev \ + libxmlsec1-openssl \ + pkg-config \ + python3-dev \ + python3-venv \ + redis-server \ + erlang-base \ + erlang-asn1 \ + erlang-crypto \ + erlang-eldap \ + erlang-ftp \ + erlang-inets \ + erlang-mnesia \ + erlang-os-mon \ + erlang-parsetools \ + erlang-public-key \ + erlang-runtime-tools \ + erlang-snmp \ + erlang-ssl \ + erlang-syntax-tools \ + erlang-tftp \ + erlang-tools \ + erlang-xmerl \ + rabbitmq-server +msg_ok "Installed Dependencies" + +NODE_VERSION="22" setup_nodejs +PG_VERSION="16" setup_postgresql +PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db +get_lxc_ip + +msg_info "Configuring RabbitMQ" +$STD rabbitmqctl add_vhost plane +$STD rabbitmqctl add_user plane plane +$STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*" +msg_ok "Configured RabbitMQ" + +msg_info "Installing MinIO" +curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio +chmod +x /usr/local/bin/minio +mkdir -p /opt/minio/data +MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) +MINIO_SECRET_KEY=$(openssl rand -base64 36 | tr -dc 'a-zA-Z0-9' | head -c32) +cat </etc/default/minio +MINIO_ROOT_USER="${MINIO_ACCESS_KEY}" +MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}" +MINIO_VOLUMES="/opt/minio/data" +EOF +cat </etc/systemd/system/minio.service +[Unit] +Description=MinIO Object Storage +After=network.target + +[Service] +Type=simple +EnvironmentFile=/etc/default/minio +ExecStart=/usr/local/bin/minio server \$MINIO_VOLUMES --console-address ":9090" +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now minio +msg_ok "Installed MinIO" + +msg_info "Downloading Plane (Patience)" +RELEASE=$(get_latest_github_release "makeplane/plane") +curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/${RELEASE}.tar.gz" -o /tmp/plane.tar.gz +tar -xzf /tmp/plane.tar.gz -C /tmp +mv /tmp/plane-*/ /opt/plane +rm -f /tmp/plane.tar.gz +echo "${RELEASE}" >/opt/plane_version.txt +msg_ok "Downloaded Plane" + +msg_info "Building Frontend Apps (Patience)" +cd /opt/plane +export NODE_OPTIONS="--max-old-space-size=4096" +export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 +$STD corepack enable pnpm +$STD pnpm install --frozen-lockfile +$STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live +msg_ok "Built Frontend Apps" + +msg_info "Setting up Python API" +python3 -m venv /opt/plane-venv +$STD /opt/plane-venv/bin/pip install --upgrade pip +$STD /opt/plane-venv/bin/pip install -r /opt/plane/apps/api/requirements/production.txt +msg_ok "Set up Python API" + +msg_info "Configuring Plane" +SECRET_KEY=$(openssl rand -hex 32) +MACHINE_SIG=$(echo -n "$(hostname)-$(date +%s)" | sha256sum | head -c64) +cat </opt/plane/apps/api/.env +DEBUG=0 +CORS_ALLOWED_ORIGINS=http://${LOCAL_IP} + +POSTGRES_USER=plane +POSTGRES_PASSWORD=${PG_DB_PASS} +POSTGRES_HOST=localhost +POSTGRES_DB=plane +POSTGRES_PORT=5432 +DATABASE_URL=postgresql://plane:${PG_DB_PASS}@localhost:5432/plane + +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_URL=redis://localhost:6379/ + +RABBITMQ_HOST=localhost +RABBITMQ_PORT=5672 +RABBITMQ_USER=plane +RABBITMQ_PASSWORD=plane +RABBITMQ_VHOST=plane +AMQP_URL=amqp://plane:plane@localhost:5672/plane + +AWS_REGION=us-east-1 +AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} +AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_KEY} +AWS_S3_ENDPOINT_URL=http://localhost:9000 +AWS_S3_BUCKET_NAME=uploads +FILE_SIZE_LIMIT=5242880 + +USE_MINIO=1 +MINIO_ENDPOINT_SSL=0 +SECRET_KEY=${SECRET_KEY} +MACHINE_SIGNATURE=${MACHINE_SIG} + +WEB_URL=http://${LOCAL_IP} +ADMIN_BASE_URL=http://${LOCAL_IP} +ADMIN_BASE_PATH=/god-mode +SPACE_BASE_URL=http://${LOCAL_IP} +SPACE_BASE_PATH=/spaces +APP_BASE_URL=http://${LOCAL_IP} +APP_BASE_PATH= +LIVE_BASE_URL=http://${LOCAL_IP} +LIVE_BASE_PATH=/live + +GUNICORN_WORKERS=2 +LIVE_SERVER_SECRET_KEY=$(openssl rand -hex 16) +API_KEY_RATE_LIMIT=60/minute +EOF +msg_ok "Configured Plane" + +msg_info "Running Database Migrations" +cd /opt/plane/apps/api +set -a +source /opt/plane/apps/api/.env +set +a +$STD /opt/plane-venv/bin/python manage.py migrate +$STD /opt/plane-venv/bin/python manage.py collectstatic --noinput +msg_ok "Ran Database Migrations" + +msg_info "Creating MinIO Bucket" +curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc +chmod +x /usr/local/bin/mc +$STD /usr/local/bin/mc alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" +$STD /usr/local/bin/mc mb plane/uploads --ignore-existing +msg_ok "Created MinIO Bucket" + +msg_info "Creating Services" +cat </etc/systemd/system/plane-api.service +[Unit] +Description=Plane API +After=network.target postgresql.service redis-server.service rabbitmq-server.service minio.service + +[Service] +Type=simple +WorkingDirectory=/opt/plane/apps/api +EnvironmentFile=/opt/plane/apps/api/.env +ExecStart=/opt/plane-venv/bin/gunicorn -w 2 -k uvicorn.workers.UvicornWorker plane.asgi:application --bind 0.0.0.0:8000 --max-requests 1200 --max-requests-jitter 1000 --access-logfile - +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/plane-worker.service +[Unit] +Description=Plane Celery Worker +After=plane-api.service + +[Service] +Type=simple +WorkingDirectory=/opt/plane/apps/api +EnvironmentFile=/opt/plane/apps/api/.env +ExecStart=/opt/plane-venv/bin/celery -A plane worker -l info +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/plane-beat.service +[Unit] +Description=Plane Celery Beat +After=plane-api.service + +[Service] +Type=simple +WorkingDirectory=/opt/plane/apps/api +EnvironmentFile=/opt/plane/apps/api/.env +ExecStart=/opt/plane-venv/bin/celery -A plane beat -l info +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/plane-live.service +[Unit] +Description=Plane Live Server +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/plane +ExecStart=/usr/bin/node apps/live/dist/index.js +Restart=on-failure +RestartSec=5 +Environment=PORT=3100 + +[Install] +WantedBy=multi-user.target +EOF + +systemctl enable -q --now plane-api +systemctl enable -q --now plane-worker +systemctl enable -q --now plane-beat +systemctl enable -q --now plane-live +msg_ok "Created Services" + +msg_info "Configuring Nginx" +cat </etc/nginx/conf.d/plane.conf +upstream plane-api { + server 127.0.0.1:8000; +} + +upstream plane-live { + server 127.0.0.1:3100; +} + +upstream plane-minio { + server 127.0.0.1:9000; +} + +server { + listen 80 default_server; + server_name _; + client_max_body_size 5M; + + # API and auth + location /api/ { + proxy_pass http://plane-api; + 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; + } + + location /auth/ { + proxy_pass http://plane-api; + 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; + } + + # Django static files + location /static/ { + alias /opt/plane/apps/api/static/; + } + + # Live (WebSocket) + location /live/ { + proxy_pass http://plane-live; + 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; + } + + # MinIO uploads + location /uploads/ { + proxy_pass http://plane-minio; + proxy_set_header Host \$host; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + } + + # Spaces frontend (static) + location /spaces/ { + alias /opt/plane/apps/space/build/client/; + try_files \$uri \$uri/ /spaces/index.html; + } + + location /spaces { + return 301 /spaces/; + } + + # Admin frontend (static) + location /god-mode/ { + alias /opt/plane/apps/admin/build/client/; + try_files \$uri \$uri/ /god-mode/index.html; + } + + location /god-mode { + return 301 /god-mode/; + } + + # Default: web frontend (static) + location / { + root /opt/plane/apps/web/build/client; + try_files \$uri \$uri/ /index.html; + } +} +EOF +rm -f /etc/nginx/sites-enabled/default +$STD systemctl reload nginx +msg_ok "Configured Nginx" + +msg_info "Saving Credentials" +{ + echo "Plane Credentials" + echo "================================" + echo "Database User: plane" + echo "Database Password: ${PG_DB_PASS}" + echo "MinIO Access Key: ${MINIO_ACCESS_KEY}" + echo "MinIO Secret Key: ${MINIO_SECRET_KEY}" + echo "Secret Key: ${SECRET_KEY}" + echo "Config: /opt/plane/apps/api/.env" +} >~/plane.creds +msg_ok "Saved Credentials" + +motd_ssh +customize +cleanup_lxc +``` + +**Step 2: Commit** + +```bash +git add install/plane-install.sh +git commit -m "feat: add Plane install script" +``` + +--- + +### Task 4: Push to Fork + +**Step 1: Push branch to onionrings29/ProxmoxVE** + +```bash +git push fork feat/add-plane +``` + +--- + +### Task 5: Test (manual, on Proxmox) + +After pushing, test on the actual Proxmox host: + +```bash +bash -c "$(curl -fsSL https://raw.githubusercontent.com/onionrings29/ProxmoxVE/feat/add-plane/ct/plane.sh)" +``` + +Verify: +- Container creates successfully +- All services start (systemctl status plane-api plane-worker plane-beat plane-live minio) +- Web UI accessible at http://CONTAINER_IP +- Can sign up and create a workspace diff --git a/install/plane-install.sh b/install/plane-install.sh index b0e0fe71..3086380b 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -100,6 +100,8 @@ msg_ok "Built Frontend Apps" msg_info "Setting up Python API" setup_uv $STD uv venv /opt/plane-venv +export VIRTUAL_ENV=/opt/plane-venv +export PATH="/opt/plane-venv/bin:$PATH" $STD uv pip install -r /opt/plane/apps/api/requirements/production.txt msg_ok "Set up Python API" From 2cc9d252a5d21117f934591a179e92c5b3890d2c Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 01:56:01 -0700 Subject: [PATCH 14/34] fix: use --python flag for uv pip install Follows profilarr-install.sh pattern: uv venv then uv pip install --python /path/to/venv/bin/python --- ct/plane.sh | 4 +--- install/plane-install.sh | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index a6d8a1ac..6f689387 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -67,9 +67,7 @@ function update_script() { msg_info "Updating Python Dependencies" cd /opt/plane/apps/api - export VIRTUAL_ENV=/opt/plane-venv - export PATH="/opt/plane-venv/bin:$PATH" - $STD uv pip install --upgrade -r requirements/production.txt + $STD uv pip install --python /opt/plane-venv/bin/python --upgrade -r requirements/production.txt msg_ok "Updated Python Dependencies" msg_info "Running Migrations" diff --git a/install/plane-install.sh b/install/plane-install.sh index 3086380b..36d46491 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -100,9 +100,7 @@ msg_ok "Built Frontend Apps" msg_info "Setting up Python API" setup_uv $STD uv venv /opt/plane-venv -export VIRTUAL_ENV=/opt/plane-venv -export PATH="/opt/plane-venv/bin:$PATH" -$STD uv pip install -r /opt/plane/apps/api/requirements/production.txt +$STD uv pip install --python /opt/plane-venv/bin/python -r /opt/plane/apps/api/requirements/production.txt msg_ok "Set up Python API" msg_info "Configuring Plane" From 23bdd48c4686d913be2332d079dc699d5114deb2 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 02:36:01 -0700 Subject: [PATCH 15/34] Delete docs/plans directory --- docs/plans/2026-02-25-plane-design.md | 622 -------------------------- 1 file changed, 622 deletions(-) delete mode 100644 docs/plans/2026-02-25-plane-design.md diff --git a/docs/plans/2026-02-25-plane-design.md b/docs/plans/2026-02-25-plane-design.md deleted file mode 100644 index f33ee723..00000000 --- a/docs/plans/2026-02-25-plane-design.md +++ /dev/null @@ -1,622 +0,0 @@ -# Plane.so Bare Metal LXC Helper Script — Implementation Plan - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** Create a ProxmoxVE community helper script that installs Plane.so v1.2.2 bare metal in an LXC container. - -**Architecture:** Reverse-engineer Plane's Docker Compose (12 services) into native systemd services. Frontends (web, admin, space) are static builds served by Nginx. Backend is Django/Gunicorn + Celery workers. Infrastructure: PostgreSQL 16, Redis, RabbitMQ, MinIO. - -**Tech Stack:** Python 3.12, Node.js 22, pnpm, turbo, Django, Celery, Gunicorn, Uvicorn, PostgreSQL, Redis, RabbitMQ, MinIO, Nginx - ---- - -## Pre-work: Setup Fork - -```bash -cd /Users/msaul/Documents/codes/proxmox/ProxmoxVE -git remote add fork https://github.com/onionrings29/ProxmoxVE.git 2>/dev/null || true -git checkout -b feat/add-plane -``` - ---- - -### Task 1: Create JSON Metadata (`frontend/public/json/plane.json`) - -**Files:** -- Create: `frontend/public/json/plane.json` - -**Step 1: Write the JSON file** - -```json -{ - "name": "Plane", - "slug": "plane", - "categories": [ - 25 - ], - "date_created": "2026-02-25", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 80, - "documentation": "https://developers.plane.so/self-hosting/overview", - "website": "https://plane.so", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/plane.webp", - "config_path": "/opt/plane/apps/api/.env", - "description": "Open-source project tracking tool that helps teams plan, track, and manage their software projects with issues, cycles, and modules.", - "install_methods": [ - { - "type": "default", - "script": "ct/plane.sh", - "resources": { - "cpu": 4, - "ram": 8192, - "hdd": 30, - "os": "Debian", - "version": "13" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "First user to sign up becomes the instance admin. Initial build takes 10-15 minutes.", - "type": "info" - }, - { - "text": "Configuration file is at: `/opt/plane/apps/api/.env`. Credentials are saved to `~/plane.creds`.", - "type": "info" - } - ] -} -``` - -**Step 2: Commit** - -```bash -git add frontend/public/json/plane.json -git commit -m "feat: add Plane JSON metadata" -``` - ---- - -### Task 2: Create CT Script (`ct/plane.sh`) - -**Files:** -- Create: `ct/plane.sh` - -**Step 1: Write the CT script** - -```bash -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: onionrings29 -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://plane.so - -APP="Plane" -var_tags="${var_tags:-project-management}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-8192}" -var_disk="${var_disk:-30}" -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/plane ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "plane" "makeplane/plane"; then - msg_info "Stopping Services" - systemctl stop plane-api plane-worker plane-beat plane-live - msg_ok "Stopped Services" - - msg_info "Backing up Data" - cp /opt/plane/apps/api/.env /opt/plane-env.bak - msg_ok "Backed up Data" - - msg_info "Downloading Update" - RELEASE=$(get_latest_github_release "makeplane/plane") - curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/${RELEASE}.tar.gz" -o /tmp/plane.tar.gz - tar -xzf /tmp/plane.tar.gz -C /tmp - rm -rf /opt/plane/apps /opt/plane/packages /opt/plane/package.json /opt/plane/pnpm-lock.yaml /opt/plane/pnpm-workspace.yaml /opt/plane/turbo.json - cp -r /tmp/plane-*/apps /opt/plane/ - cp -r /tmp/plane-*/packages /opt/plane/ - cp /tmp/plane-*/package.json /opt/plane/ - cp /tmp/plane-*/pnpm-lock.yaml /opt/plane/ - cp /tmp/plane-*/pnpm-workspace.yaml /opt/plane/ - cp /tmp/plane-*/turbo.json /opt/plane/ - rm -rf /tmp/plane.tar.gz /tmp/plane-* - msg_ok "Downloaded Update" - - msg_info "Restoring Config" - cp /opt/plane-env.bak /opt/plane/apps/api/.env - rm /opt/plane-env.bak - msg_ok "Restored Config" - - msg_info "Rebuilding Frontend (Patience)" - cd /opt/plane - export NODE_OPTIONS="--max-old-space-size=4096" - export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 - $STD corepack enable pnpm - $STD pnpm install --frozen-lockfile - $STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live - msg_ok "Rebuilt Frontend" - - msg_info "Updating Python Dependencies" - cd /opt/plane/apps/api - $STD /opt/plane-venv/bin/pip install --upgrade -r requirements/production.txt - msg_ok "Updated Python Dependencies" - - msg_info "Running Migrations" - cd /opt/plane/apps/api - $STD /opt/plane-venv/bin/python manage.py migrate - $STD /opt/plane-venv/bin/python manage.py collectstatic --noinput - msg_ok "Ran Migrations" - - echo "${RELEASE}" >/opt/plane_version.txt - - msg_info "Starting Services" - systemctl start plane-api plane-worker plane-beat plane-live - msg_ok "Started Services" - - msg_ok "Updated 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}${CL}" -``` - -**Step 2: Commit** - -```bash -git add ct/plane.sh -git commit -m "feat: add Plane CT script" -``` - ---- - -### Task 3: Create Install Script (`install/plane-install.sh`) - -**Files:** -- Create: `install/plane-install.sh` - -This is the largest file. The install script performs: - -1. Install system dependencies (build tools, libpq, xmlsec, etc.) -2. Install Node.js 22, PostgreSQL 16, Redis, RabbitMQ, MinIO -3. Clone Plane v1.2.2 source -4. Build frontends with pnpm + turbo -5. Setup Python venv + install API dependencies -6. Configure .env with generated secrets -7. Run Django migrations -8. Create MinIO uploads bucket -9. Create 5 systemd services (api, worker, beat, live, minio) -10. Configure Nginx reverse proxy -11. Cleanup - -**Step 1: Write the install script** - -```bash -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: onionrings29 -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://plane.so - -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 \ - nginx \ - build-essential \ - libpq-dev \ - libxml2-dev \ - libxslt1-dev \ - libxmlsec1-dev \ - libxmlsec1-openssl \ - pkg-config \ - python3-dev \ - python3-venv \ - redis-server \ - erlang-base \ - erlang-asn1 \ - erlang-crypto \ - erlang-eldap \ - erlang-ftp \ - erlang-inets \ - erlang-mnesia \ - erlang-os-mon \ - erlang-parsetools \ - erlang-public-key \ - erlang-runtime-tools \ - erlang-snmp \ - erlang-ssl \ - erlang-syntax-tools \ - erlang-tftp \ - erlang-tools \ - erlang-xmerl \ - rabbitmq-server -msg_ok "Installed Dependencies" - -NODE_VERSION="22" setup_nodejs -PG_VERSION="16" setup_postgresql -PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db -get_lxc_ip - -msg_info "Configuring RabbitMQ" -$STD rabbitmqctl add_vhost plane -$STD rabbitmqctl add_user plane plane -$STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*" -msg_ok "Configured RabbitMQ" - -msg_info "Installing MinIO" -curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio -chmod +x /usr/local/bin/minio -mkdir -p /opt/minio/data -MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) -MINIO_SECRET_KEY=$(openssl rand -base64 36 | tr -dc 'a-zA-Z0-9' | head -c32) -cat </etc/default/minio -MINIO_ROOT_USER="${MINIO_ACCESS_KEY}" -MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}" -MINIO_VOLUMES="/opt/minio/data" -EOF -cat </etc/systemd/system/minio.service -[Unit] -Description=MinIO Object Storage -After=network.target - -[Service] -Type=simple -EnvironmentFile=/etc/default/minio -ExecStart=/usr/local/bin/minio server \$MINIO_VOLUMES --console-address ":9090" -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now minio -msg_ok "Installed MinIO" - -msg_info "Downloading Plane (Patience)" -RELEASE=$(get_latest_github_release "makeplane/plane") -curl -fsSL "https://github.com/makeplane/plane/archive/refs/tags/${RELEASE}.tar.gz" -o /tmp/plane.tar.gz -tar -xzf /tmp/plane.tar.gz -C /tmp -mv /tmp/plane-*/ /opt/plane -rm -f /tmp/plane.tar.gz -echo "${RELEASE}" >/opt/plane_version.txt -msg_ok "Downloaded Plane" - -msg_info "Building Frontend Apps (Patience)" -cd /opt/plane -export NODE_OPTIONS="--max-old-space-size=4096" -export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 -$STD corepack enable pnpm -$STD pnpm install --frozen-lockfile -$STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live -msg_ok "Built Frontend Apps" - -msg_info "Setting up Python API" -python3 -m venv /opt/plane-venv -$STD /opt/plane-venv/bin/pip install --upgrade pip -$STD /opt/plane-venv/bin/pip install -r /opt/plane/apps/api/requirements/production.txt -msg_ok "Set up Python API" - -msg_info "Configuring Plane" -SECRET_KEY=$(openssl rand -hex 32) -MACHINE_SIG=$(echo -n "$(hostname)-$(date +%s)" | sha256sum | head -c64) -cat </opt/plane/apps/api/.env -DEBUG=0 -CORS_ALLOWED_ORIGINS=http://${LOCAL_IP} - -POSTGRES_USER=plane -POSTGRES_PASSWORD=${PG_DB_PASS} -POSTGRES_HOST=localhost -POSTGRES_DB=plane -POSTGRES_PORT=5432 -DATABASE_URL=postgresql://plane:${PG_DB_PASS}@localhost:5432/plane - -REDIS_HOST=localhost -REDIS_PORT=6379 -REDIS_URL=redis://localhost:6379/ - -RABBITMQ_HOST=localhost -RABBITMQ_PORT=5672 -RABBITMQ_USER=plane -RABBITMQ_PASSWORD=plane -RABBITMQ_VHOST=plane -AMQP_URL=amqp://plane:plane@localhost:5672/plane - -AWS_REGION=us-east-1 -AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} -AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_KEY} -AWS_S3_ENDPOINT_URL=http://localhost:9000 -AWS_S3_BUCKET_NAME=uploads -FILE_SIZE_LIMIT=5242880 - -USE_MINIO=1 -MINIO_ENDPOINT_SSL=0 -SECRET_KEY=${SECRET_KEY} -MACHINE_SIGNATURE=${MACHINE_SIG} - -WEB_URL=http://${LOCAL_IP} -ADMIN_BASE_URL=http://${LOCAL_IP} -ADMIN_BASE_PATH=/god-mode -SPACE_BASE_URL=http://${LOCAL_IP} -SPACE_BASE_PATH=/spaces -APP_BASE_URL=http://${LOCAL_IP} -APP_BASE_PATH= -LIVE_BASE_URL=http://${LOCAL_IP} -LIVE_BASE_PATH=/live - -GUNICORN_WORKERS=2 -LIVE_SERVER_SECRET_KEY=$(openssl rand -hex 16) -API_KEY_RATE_LIMIT=60/minute -EOF -msg_ok "Configured Plane" - -msg_info "Running Database Migrations" -cd /opt/plane/apps/api -set -a -source /opt/plane/apps/api/.env -set +a -$STD /opt/plane-venv/bin/python manage.py migrate -$STD /opt/plane-venv/bin/python manage.py collectstatic --noinput -msg_ok "Ran Database Migrations" - -msg_info "Creating MinIO Bucket" -curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc -chmod +x /usr/local/bin/mc -$STD /usr/local/bin/mc alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" -$STD /usr/local/bin/mc mb plane/uploads --ignore-existing -msg_ok "Created MinIO Bucket" - -msg_info "Creating Services" -cat </etc/systemd/system/plane-api.service -[Unit] -Description=Plane API -After=network.target postgresql.service redis-server.service rabbitmq-server.service minio.service - -[Service] -Type=simple -WorkingDirectory=/opt/plane/apps/api -EnvironmentFile=/opt/plane/apps/api/.env -ExecStart=/opt/plane-venv/bin/gunicorn -w 2 -k uvicorn.workers.UvicornWorker plane.asgi:application --bind 0.0.0.0:8000 --max-requests 1200 --max-requests-jitter 1000 --access-logfile - -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/plane-worker.service -[Unit] -Description=Plane Celery Worker -After=plane-api.service - -[Service] -Type=simple -WorkingDirectory=/opt/plane/apps/api -EnvironmentFile=/opt/plane/apps/api/.env -ExecStart=/opt/plane-venv/bin/celery -A plane worker -l info -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/plane-beat.service -[Unit] -Description=Plane Celery Beat -After=plane-api.service - -[Service] -Type=simple -WorkingDirectory=/opt/plane/apps/api -EnvironmentFile=/opt/plane/apps/api/.env -ExecStart=/opt/plane-venv/bin/celery -A plane beat -l info -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/plane-live.service -[Unit] -Description=Plane Live Server -After=network.target - -[Service] -Type=simple -WorkingDirectory=/opt/plane -ExecStart=/usr/bin/node apps/live/dist/index.js -Restart=on-failure -RestartSec=5 -Environment=PORT=3100 - -[Install] -WantedBy=multi-user.target -EOF - -systemctl enable -q --now plane-api -systemctl enable -q --now plane-worker -systemctl enable -q --now plane-beat -systemctl enable -q --now plane-live -msg_ok "Created Services" - -msg_info "Configuring Nginx" -cat </etc/nginx/conf.d/plane.conf -upstream plane-api { - server 127.0.0.1:8000; -} - -upstream plane-live { - server 127.0.0.1:3100; -} - -upstream plane-minio { - server 127.0.0.1:9000; -} - -server { - listen 80 default_server; - server_name _; - client_max_body_size 5M; - - # API and auth - location /api/ { - proxy_pass http://plane-api; - 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; - } - - location /auth/ { - proxy_pass http://plane-api; - 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; - } - - # Django static files - location /static/ { - alias /opt/plane/apps/api/static/; - } - - # Live (WebSocket) - location /live/ { - proxy_pass http://plane-live; - 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; - } - - # MinIO uploads - location /uploads/ { - proxy_pass http://plane-minio; - proxy_set_header Host \$host; - proxy_set_header X-Real-IP \$remote_addr; - proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; - } - - # Spaces frontend (static) - location /spaces/ { - alias /opt/plane/apps/space/build/client/; - try_files \$uri \$uri/ /spaces/index.html; - } - - location /spaces { - return 301 /spaces/; - } - - # Admin frontend (static) - location /god-mode/ { - alias /opt/plane/apps/admin/build/client/; - try_files \$uri \$uri/ /god-mode/index.html; - } - - location /god-mode { - return 301 /god-mode/; - } - - # Default: web frontend (static) - location / { - root /opt/plane/apps/web/build/client; - try_files \$uri \$uri/ /index.html; - } -} -EOF -rm -f /etc/nginx/sites-enabled/default -$STD systemctl reload nginx -msg_ok "Configured Nginx" - -msg_info "Saving Credentials" -{ - echo "Plane Credentials" - echo "================================" - echo "Database User: plane" - echo "Database Password: ${PG_DB_PASS}" - echo "MinIO Access Key: ${MINIO_ACCESS_KEY}" - echo "MinIO Secret Key: ${MINIO_SECRET_KEY}" - echo "Secret Key: ${SECRET_KEY}" - echo "Config: /opt/plane/apps/api/.env" -} >~/plane.creds -msg_ok "Saved Credentials" - -motd_ssh -customize -cleanup_lxc -``` - -**Step 2: Commit** - -```bash -git add install/plane-install.sh -git commit -m "feat: add Plane install script" -``` - ---- - -### Task 4: Push to Fork - -**Step 1: Push branch to onionrings29/ProxmoxVE** - -```bash -git push fork feat/add-plane -``` - ---- - -### Task 5: Test (manual, on Proxmox) - -After pushing, test on the actual Proxmox host: - -```bash -bash -c "$(curl -fsSL https://raw.githubusercontent.com/onionrings29/ProxmoxVE/feat/add-plane/ct/plane.sh)" -``` - -Verify: -- Container creates successfully -- All services start (systemctl status plane-api plane-worker plane-beat plane-live minio) -- Web UI accessible at http://CONTAINER_IP -- Can sign up and create a workspace From 507f68e4442a7c0dd3a74d91953eb4a4999fde45 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 15:39:44 -0700 Subject: [PATCH 16/34] fix: address review feedback and fix uv pip install - Fix uv pip install by setting VIRTUAL_ENV instead of --python flag - Remove redundant get_lxc_ip (already called by framework bootstrap) - Merge "Saving Credentials" block into "Creating Services" section - Use loop for writing frontend env to each Vite app --- ct/plane.sh | 3 ++- install/plane-install.sh | 32 +++++++++++++++----------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index 6f689387..086b75a2 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -67,7 +67,8 @@ function update_script() { msg_info "Updating Python Dependencies" cd /opt/plane/apps/api - $STD uv pip install --python /opt/plane-venv/bin/python --upgrade -r requirements/production.txt + export VIRTUAL_ENV=/opt/plane-venv + $STD uv pip install --upgrade -r requirements/production.txt msg_ok "Updated Python Dependencies" msg_info "Running Migrations" diff --git a/install/plane-install.sh b/install/plane-install.sh index 36d46491..70560468 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -35,7 +35,6 @@ msg_ok "Installed Dependencies" NODE_VERSION="22" setup_nodejs PG_VERSION="16" setup_postgresql APPLICATION="Plane" PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db -get_lxc_ip msg_info "Configuring RabbitMQ" RABBITMQ_PASS=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c16) @@ -87,9 +86,10 @@ VITE_SPACE_BASE_URL=http://${LOCAL_IP} VITE_SPACE_BASE_PATH=/spaces VITE_LIVE_BASE_URL=http://${LOCAL_IP} VITE_LIVE_BASE_PATH=/live" -echo "$FRONTEND_ENV" >/opt/plane/apps/web/.env -echo "$FRONTEND_ENV" >/opt/plane/apps/admin/.env -echo "$FRONTEND_ENV" >/opt/plane/apps/space/.env +# Each Vite app needs its own .env for the build +for app in web admin space; do + echo "$FRONTEND_ENV" >/opt/plane/apps/${app}/.env +done export NODE_OPTIONS="--max-old-space-size=4096" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 $STD corepack enable pnpm @@ -100,7 +100,8 @@ msg_ok "Built Frontend Apps" msg_info "Setting up Python API" setup_uv $STD uv venv /opt/plane-venv -$STD uv pip install --python /opt/plane-venv/bin/python -r /opt/plane/apps/api/requirements/production.txt +export VIRTUAL_ENV=/opt/plane-venv +$STD uv pip install -r /opt/plane/apps/api/requirements/production.txt msg_ok "Set up Python API" msg_info "Configuring Plane" @@ -271,7 +272,15 @@ WantedBy=multi-user.target EOF systemctl enable -q --now plane-api plane-worker plane-beat plane-live plane-space -msg_ok "Created Services" +{ + echo "RabbitMQ User: plane" + echo "RabbitMQ Password: ${RABBITMQ_PASS}" + echo "MinIO Access Key: ${MINIO_ACCESS_KEY}" + echo "MinIO Secret Key: ${MINIO_SECRET_KEY}" + echo "Secret Key: ${SECRET_KEY}" + echo "Config: /opt/plane/apps/api/.env" +} >>~/plane.creds +msg_ok "Created Services and MinIO Bucket" msg_info "Configuring Nginx" cat <<'NGINXEOF' >/etc/nginx/sites-available/plane.conf @@ -366,17 +375,6 @@ rm -f /etc/nginx/sites-enabled/default $STD systemctl reload nginx msg_ok "Configured Nginx" -msg_info "Saving Credentials" -{ - echo "RabbitMQ User: plane" - echo "RabbitMQ Password: ${RABBITMQ_PASS}" - echo "MinIO Access Key: ${MINIO_ACCESS_KEY}" - echo "MinIO Secret Key: ${MINIO_SECRET_KEY}" - echo "Secret Key: ${SECRET_KEY}" - echo "Config: /opt/plane/apps/api/.env" -} >>~/plane.creds -msg_ok "Saved Credentials" - motd_ssh customize cleanup_lxc From 69c79d8c58e41002304e7d9985abc16f2008039d Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Fri, 27 Feb 2026 17:49:15 -0700 Subject: [PATCH 17/34] fix: use default source URL per template --- ct/plane.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index 086b75a2..bc545ed6 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -1,6 +1,5 @@ #!/usr/bin/env bash -COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main}" -source <(curl -fsSL "$COMMUNITY_SCRIPTS_URL/misc/build.func") +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) # Copyright (c) 2021-2026 community-scripts ORG # Author: onionrings29 # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE From 92d39d0fe986c123092316bfac708cde4ef54453 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 12:13:46 -0600 Subject: [PATCH 18/34] fix: add systemctl daemon-reload before enabling services --- install/plane-install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/install/plane-install.sh b/install/plane-install.sh index 70560468..d2bebba7 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -271,6 +271,7 @@ RestartSec=5 WantedBy=multi-user.target EOF +systemctl daemon-reload systemctl enable -q --now plane-api plane-worker plane-beat plane-live plane-space { echo "RabbitMQ User: plane" From 00fbb362bef7c06691a6920f5e2a91992e0e00b3 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:12:34 -0600 Subject: [PATCH 19/34] Update ct/plane.sh - Removed empty line Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- ct/plane.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/ct/plane.sh b/ct/plane.sh index bc545ed6..55d54d57 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -83,7 +83,6 @@ function update_script() { msg_info "Starting Services" systemctl start plane-api plane-worker plane-beat plane-live plane-space msg_ok "Started Services" - msg_ok "Updated successfully!" fi exit From 40f071ded290317b266a5b1486a2545198b92cb6 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:14:59 -0600 Subject: [PATCH 20/34] Update install/plane-install.sh - changed NGINXEOF to EOF Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index d2bebba7..98966e95 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -370,7 +370,7 @@ server { try_files $uri $uri/ /index.html; } } -NGINXEOF +EOF ln -sf /etc/nginx/sites-available/plane.conf /etc/nginx/sites-enabled/plane.conf rm -f /etc/nginx/sites-enabled/default $STD systemctl reload nginx From 1aa94aac20e56f62b9106e62cf39717edb67c1cd Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:15:14 -0600 Subject: [PATCH 21/34] Update install/plane-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 98966e95..5e963856 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -284,7 +284,7 @@ systemctl enable -q --now plane-api plane-worker plane-beat plane-live plane-spa msg_ok "Created Services and MinIO Bucket" msg_info "Configuring Nginx" -cat <<'NGINXEOF' >/etc/nginx/sites-available/plane.conf +cat <<'EOF' >/etc/nginx/sites-available/plane.conf upstream plane-api { server 127.0.0.1:8000; } From 38e9d3fde0621d8e811d557dafb2df2c3782d298 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:34:18 -0600 Subject: [PATCH 22/34] Update ct/plane.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- ct/plane.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/plane.sh b/ct/plane.sh index 55d54d57..52af7385 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -92,7 +92,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}${CL}" From c5d29b14683596d37904b8073ca3e318e7a9212b Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:36:32 -0600 Subject: [PATCH 23/34] Update install/plane-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 5e963856..7fd1d77f 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -49,7 +49,7 @@ chmod +x /usr/local/bin/minio mkdir -p /opt/minio/data MINIO_ACCESS_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16) MINIO_SECRET_KEY=$(openssl rand -base64 36 | tr -dc 'a-zA-Z0-9' | head -c32) -cat </etc/default/minio +cat </etc/default/minio MINIO_ROOT_USER="${MINIO_ACCESS_KEY}" MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}" MINIO_VOLUMES="/opt/minio/data" From 65326bde86ba773df8e4055485546ce94431f271 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:36:53 -0600 Subject: [PATCH 24/34] Update install/plane-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 7fd1d77f..1543cb96 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -270,7 +270,6 @@ RestartSec=5 [Install] WantedBy=multi-user.target EOF - systemctl daemon-reload systemctl enable -q --now plane-api plane-worker plane-beat plane-live plane-space { From 89dcf5d2ed9a566e9ee1b68233784787ecbea41c Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:37:39 -0600 Subject: [PATCH 25/34] fix: update resource defaults to official minimum requirements --- ct/plane.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index 52af7385..27f2f9bc 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -7,8 +7,8 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVED/ APP="Plane" var_tags="${var_tags:-project-management}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-8192}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-4096}" var_disk="${var_disk:-30}" var_os="${var_os:-debian}" var_version="${var_version:-13}" From 49262aae1de70d3a6c52861b99f04eec3cd492c6 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:38:10 -0600 Subject: [PATCH 26/34] Update install/plane-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 1543cb96..9e59e7c6 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -54,7 +54,7 @@ MINIO_ROOT_USER="${MINIO_ACCESS_KEY}" MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}" MINIO_VOLUMES="/opt/minio/data" EOF -cat </etc/systemd/system/minio.service +cat </etc/systemd/system/minio.service [Unit] Description=MinIO Object Storage After=network.target From b755bf4092d3d54fa228984b0533b808c13bd472 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:38:44 -0600 Subject: [PATCH 27/34] Update install/plane-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 9e59e7c6..83e2a617 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -253,7 +253,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-space.service +cat </etc/systemd/system/plane-space.service [Unit] Description=Plane Space Server After=network.target From 2d63f35b3ba56c11964769828aa56cd4286e099a Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:39:14 -0600 Subject: [PATCH 28/34] Update install/plane-install.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 83e2a617..3f8a9072 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -72,9 +72,7 @@ EOF systemctl enable -q --now minio msg_ok "Installed MinIO" -msg_info "Downloading Plane (Patience)" fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball" -msg_ok "Downloaded Plane" msg_info "Building Frontend Apps (Patience)" cd /opt/plane From 100af0487e281d7189ae5fd79dcda2b35625302e Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 14:41:22 -0600 Subject: [PATCH 29/34] Apply suggestions from code review Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- install/plane-install.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index 3f8a9072..f2aef034 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -106,7 +106,7 @@ msg_info "Configuring Plane" SECRET_KEY=$(openssl rand -hex 32) MACHINE_SIG=$(echo -n "$(hostname)-$(date +%s)" | sha256sum | head -c64) LIVE_SECRET=$(openssl rand -hex 16) -cat </opt/plane/apps/api/.env +cat </opt/plane/apps/api/.env DEBUG=0 CORS_ALLOWED_ORIGINS=http://${LOCAL_IP} @@ -181,7 +181,7 @@ chmod +x /usr/local/bin/mcli $STD /usr/local/bin/mcli alias set plane http://localhost:9000 "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" $STD /usr/local/bin/mcli mb plane/uploads --ignore-existing -cat </etc/systemd/system/plane-api.service +cat </etc/systemd/system/plane-api.service [Unit] Description=Plane API After=network.target postgresql.service redis-server.service rabbitmq-server.service minio.service @@ -198,7 +198,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-worker.service +cat </etc/systemd/system/plane-worker.service [Unit] Description=Plane Celery Worker After=plane-api.service @@ -216,7 +216,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-beat.service +cat </etc/systemd/system/plane-beat.service [Unit] Description=Plane Celery Beat After=plane-api.service @@ -234,7 +234,7 @@ RestartSec=5 WantedBy=multi-user.target EOF -cat </etc/systemd/system/plane-live.service +cat </etc/systemd/system/plane-live.service [Unit] Description=Plane Live Server After=network.target From 6c2df5a74fb41001c13518bbb6fd78bfe5b950e7 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 15:00:16 -0600 Subject: [PATCH 30/34] fix: format json with 2-space indentation and update resource defaults --- frontend/public/json/plane.json | 98 ++++++++++++++++----------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/frontend/public/json/plane.json b/frontend/public/json/plane.json index d6e51b7b..360fe1bc 100644 --- a/frontend/public/json/plane.json +++ b/frontend/public/json/plane.json @@ -1,52 +1,52 @@ { - "name": "Plane", - "slug": "plane", - "categories": [ - 25 - ], - "date_created": "2026-02-25", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 80, - "documentation": "https://developers.plane.so/self-hosting/overview", - "website": "https://plane.so", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/plane.webp", - "config_path": "/opt/plane/apps/api/.env", - "description": "Open-source project tracking tool that helps teams plan, track, and manage their software projects with issues, cycles, and modules.", - "install_methods": [ - { - "type": "default", - "script": "ct/plane.sh", - "resources": { - "cpu": 4, - "ram": 8192, - "hdd": 30, - "os": "Debian", - "version": "13" - } - } - ], - "default_credentials": { - "username": null, - "password": null + "name": "Plane", + "slug": "plane", + "categories": [ + 25 + ], + "date_created": "2026-02-25", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://developers.plane.so/self-hosting/overview", + "website": "https://plane.so", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/plane.webp", + "config_path": "/opt/plane/apps/api/.env", + "description": "Open-source project tracking tool that helps teams plan, track, and manage their software projects with issues, cycles, and modules.", + "install_methods": [ + { + "type": "default", + "script": "ct/plane.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 30, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "First user to sign up becomes the instance admin. Initial build takes 10-15 minutes.", + "type": "info" }, - "notes": [ - { - "text": "First user to sign up becomes the instance admin. Initial build takes 10-15 minutes.", - "type": "info" - }, - { - "text": "Admin panel (God Mode) is available at `/god-mode/` for instance configuration.", - "type": "info" - }, - { - "text": "Credentials are saved to `~/plane.creds`.", - "type": "info" - }, - { - "text": "If the container IP changes, rebuild the frontend apps or run the update script to apply the new URL.", - "type": "warning" - } - ] + { + "text": "Admin panel (God Mode) is available at `/god-mode/` for instance configuration.", + "type": "info" + }, + { + "text": "Credentials are saved to `~/plane.creds`.", + "type": "info" + }, + { + "text": "If the container IP changes, rebuild the frontend apps or run the update script to apply the new URL.", + "type": "warning" + } + ] } From 5233dbd16bc5cd46ff88a73838f55121a7ef5a8a Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 15:01:34 -0600 Subject: [PATCH 31/34] Update ct/plane.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com> --- ct/plane.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index 27f2f9bc..3d7e00d4 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -42,9 +42,7 @@ function update_script() { cp /opt/plane/apps/space/.env /opt/plane-space-env.bak msg_ok "Backed up Data" - msg_info "Updating Plane" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball" - msg_ok "Updated Plane" msg_info "Restoring Config" cp /opt/plane-api-env.bak /opt/plane/apps/api/.env From 13418b80b6600add1b15f0ba5b2c13acea14e985 Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 15:10:03 -0600 Subject: [PATCH 32/34] fix: exit with non-zero status when Plane installation not found --- ct/plane.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/plane.sh b/ct/plane.sh index 3d7e00d4..8f9fd773 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -26,7 +26,7 @@ function update_script() { if [[ ! -d /opt/plane ]]; then msg_error "No Plane Installation Found!" - exit + exit 1 fi if check_for_gh_release "plane" "makeplane/plane"; then From afc00974329034781579bff25784d122d952794c Mon Sep 17 00:00:00 2001 From: Michael Joshua Saul Date: Sun, 8 Mar 2026 15:17:38 -0600 Subject: [PATCH 33/34] fix: reduce disk requirement to 8GB based on actual install size --- ct/plane.sh | 2 +- frontend/public/json/plane.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/plane.sh b/ct/plane.sh index 8f9fd773..f747c2c4 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -9,7 +9,7 @@ APP="Plane" var_tags="${var_tags:-project-management}" var_cpu="${var_cpu:-2}" var_ram="${var_ram:-4096}" -var_disk="${var_disk:-30}" +var_disk="${var_disk:-8}" var_os="${var_os:-debian}" var_version="${var_version:-13}" var_unprivileged="${var_unprivileged:-1}" diff --git a/frontend/public/json/plane.json b/frontend/public/json/plane.json index 360fe1bc..5819f4ad 100644 --- a/frontend/public/json/plane.json +++ b/frontend/public/json/plane.json @@ -21,7 +21,7 @@ "resources": { "cpu": 2, "ram": 4096, - "hdd": 30, + "hdd": 8, "os": "Debian", "version": "13" } From c5177f0e374a295da2414cbc3f77e26de5826004 Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Sun, 22 Mar 2026 13:53:41 +0100 Subject: [PATCH 34/34] remove $application --- install/plane-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/plane-install.sh b/install/plane-install.sh index f2aef034..caac1b4e 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -34,7 +34,7 @@ msg_ok "Installed Dependencies" NODE_VERSION="22" setup_nodejs PG_VERSION="16" setup_postgresql -APPLICATION="Plane" PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db +PG_DB_NAME="plane" PG_DB_USER="plane" setup_postgresql_db msg_info "Configuring RabbitMQ" RABBITMQ_PASS=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c16)