Compare commits

..

3 Commits

Author SHA1 Message Date
MickLesk
e008a79d85 oxicloud: install ffmpeg on update as well
The install gained it, the update did not, so a container created before
this change would never get it. The musl binary forks ffmpeg for video
thumbnails; without it that one feature stays silently unavailable.
2026-09-18 07:51:46 +02:00
MickLesk
adbf3f66b4 oxicloud: take the prebuilt binary in the update too
Upstream now attaches musl tarballs to every release (AtalayaLabs/
OxiCloud#533), so the update no longer has to install a Rust toolchain
and Node and compile for up to 35 minutes. That compile is also what
broke #16216: a release whose source did not build left users with a
failed install and no way forward.

The tarball carries one top-level directory, which the deploy helper
strips, so the binary lands at /opt/oxicloud/oxicloud. The frontend is
baked into it, so the SPA build and OXICLOUD_STATIC_PATH both go; the
variable is commented out rather than removed, since a stale ./static
path would otherwise point at a directory that no longer exists.

migrate-nfc-filenames is gone as a separate binary - it is now a
subcommand, oxicloud migrate nfc-filenames - so the update removes the
old one. ffmpeg replaces build-essential: the server forks it for video
thumbnails and it is the one runtime dependency the musl build still
needs from the system.

Defaults drop to 2 CPU and 2048 MB, which were sized for the compile.
2026-09-18 07:49:39 +02:00
MickLesk
c0f39ace87 refactor: streamline OxiCloud installation process by using prebuilt binaries 2026-09-18 07:47:51 +02:00
8 changed files with 38 additions and 110 deletions

View File

@@ -543,27 +543,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details>
## 2026-09-18
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- suggestarr: keep the data where the app actually reads it [@MickLesk](https://github.com/MickLesk) ([#17317](https://github.com/community-scripts/ProxmoxVE/pull/17317))
- immichframe: set the admin password the new admin UI requires [@MickLesk](https://github.com/MickLesk) ([#17315](https://github.com/community-scripts/ProxmoxVE/pull/17315))
- #### ✨ New Features
- pangolin: Bump to 1.23.0 [@MickLesk](https://github.com/MickLesk) ([#17343](https://github.com/community-scripts/ProxmoxVE/pull/17343))
- #### 🔧 Refactor
- Refactor: Oxicloud [@MickLesk](https://github.com/MickLesk) ([#17338](https://github.com/community-scripts/ProxmoxVE/pull/17338))
### 💾 Core
- github api: retry a 200 that is not a usable release payload [@MickLesk](https://github.com/MickLesk) ([core#45](https://github.com/community-scripts/core/pull/45))
## 2026-09-17
### 🆕 New Scripts

View File

@@ -79,17 +79,6 @@ function update_script() {
restore_backup
chown -R immichframe:immichframe /opt/immichframe
if ! grep -q '^Environment=IMMICHFRAME_ADMIN_PASSWORD=' /etc/systemd/system/immichframe.service; then
msg_info "Setting Admin Password"
ADMIN_PASSWORD=$(openssl rand -hex 16)
sed -i "/^Environment=DOTNET_CONTENTROOT=/a Environment=IMMICHFRAME_ADMIN_PASSWORD=${ADMIN_PASSWORD}" /etc/systemd/system/immichframe.service
cat <<EOF >>~/immichframe.creds
ImmichFrame Admin User: admin
ImmichFrame Admin Password: $ADMIN_PASSWORD
EOF
systemctl daemon-reload
msg_ok "Set Admin Password (see ~/immichframe.creds)"
fi
msg_info "Starting Service"
systemctl start immichframe

View File

@@ -8,7 +8,7 @@ source "$_cs_boot" 2>/dev/null || source <(curl -fsSL "${COMMUNITY_SCRIPTS_CORE_
# Source: https://pangolin.net/ | Github: https://github.com/fosrl/pangolin
APP="Pangolin"
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.23.0}"
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.21.0}"
var_tags="${var_tags:-proxy}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"

View File

@@ -37,19 +37,8 @@ function update_script() {
systemctl stop suggestarr
msg_ok "Stopped Service"
mkdir -p /opt/suggestarr_data
if [[ -d /opt/suggestarr/config/config_files && ! -L /opt/suggestarr/config/config_files ]]; then
msg_info "Migrating Configuration"
cp -an /opt/suggestarr/config/config_files/. /opt/suggestarr_data/
msg_ok "Migrated Configuration to /opt/suggestarr_data"
fi
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "suggestarr" "giuseppe99barchetta/SuggestArr" "tarball"
mkdir -p /opt/suggestarr/config
rm -rf /opt/suggestarr/config/config_files
ln -sfn /opt/suggestarr_data /opt/suggestarr/config/config_files
msg_info "Building Frontend"
cd /opt/suggestarr/client
$STD npm install

View File

@@ -60,11 +60,6 @@ chown -R immichframe:immichframe /opt/immichframe
msg_ok "Setup ImmichFrame"
msg_info "Creating Service"
ADMIN_PASSWORD=$(openssl rand -hex 16)
cat <<EOF >~/immichframe.creds
ImmichFrame Admin User: admin
ImmichFrame Admin Password: $ADMIN_PASSWORD
EOF
cat <<EOF >/etc/systemd/system/immichframe.service
[Unit]
Description=ImmichFrame Digital Photo Frame
@@ -79,7 +74,6 @@ ExecStart=/usr/bin/dotnet /opt/immichframe/ImmichFrame.WebApi.dll
Environment=ASPNETCORE_URLS=http://0.0.0.0:8080
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_CONTENTROOT=/opt/immichframe
Environment=IMMICHFRAME_ADMIN_PASSWORD=$ADMIN_PASSWORD
Restart=always
RestartSec=5
StandardOutput=journal

View File

@@ -22,7 +22,7 @@ msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
PG_VERSION="17" setup_postgresql
PG_DB_NAME="pangolin" PG_DB_USER="pangolin" setup_postgresql_db
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.23.0}"
PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.21.0}"
fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION"
fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)"
fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz"

View File

@@ -43,61 +43,34 @@ $STD rabbitmqctl add_user plane "${RABBITMQ_PASS}"
$STD rabbitmqctl set_permissions -p plane plane ".*" ".*" ".*"
msg_ok "Configured RabbitMQ"
msg_info "Installing Garage"
ensure_dependencies jq
GARAGE_RELEASE=$(curl -fsSL https://api.github.com/repos/deuxfleurs-org/garage/tags | jq -r '.[0].name')
curl -fsSL "https://garagehq.deuxfleurs.fr/_releases/${GARAGE_RELEASE}/$(arch_resolve "x86_64" "aarch64")-unknown-linux-musl/garage" -o /usr/local/bin/garage
chmod +x /usr/local/bin/garage
mkdir -p /var/lib/garage/{data,meta,snapshots}
S3_ACCESS_KEY="GK$(openssl rand -hex 16)"
S3_SECRET_KEY=$(openssl rand -hex 32)
GARAGE_RPC_SECRET=$(openssl rand -hex 32)
cat <<EOF >/etc/garage.toml
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "sqlite"
replication_factor = 1
rpc_bind_addr = "127.0.0.1:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "${GARAGE_RPC_SECRET}"
[s3_api]
s3_region = "us-east-1"
api_bind_addr = "127.0.0.1:3900"
msg_info "Installing MinIO"
curl -fsSL https://dl.min.io/server/minio/release/linux-$(arch_resolve)/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 <<EOF >/etc/default/minio
MINIO_ROOT_USER="${MINIO_ACCESS_KEY}"
MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}"
MINIO_VOLUMES="/opt/minio/data"
EOF
cat <<EOF >/etc/default/garage
GARAGE_DEFAULT_ACCESS_KEY=${S3_ACCESS_KEY}
GARAGE_DEFAULT_SECRET_KEY=${S3_SECRET_KEY}
GARAGE_DEFAULT_BUCKET=uploads
EOF
cat <<EOF >/etc/systemd/system/garage.service
cat <<EOF >/etc/systemd/system/minio.service
[Unit]
Description=Garage Object Storage
After=network-online.target
Wants=network-online.target
Description=MinIO Object Storage
After=network.target
[Service]
Type=simple
EnvironmentFile=/etc/default/garage
ExecStart=/usr/local/bin/garage -c /etc/garage.toml server --single-node --default-bucket
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server \$MINIO_VOLUMES --console-address ":9090"
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now garage
for i in {1..30}; do
curl -s -o /dev/null "http://127.0.0.1:3900" && break
if [[ $i -eq 30 ]]; then
msg_error "Garage did not become ready"
exit 1
fi
sleep 1
done
msg_ok "Installed Garage"
systemctl enable -q --now minio
msg_ok "Installed MinIO"
fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball"
@@ -156,9 +129,9 @@ RABBITMQ_VHOST=plane
AMQP_URL=amqp://plane:${RABBITMQ_PASS}@localhost:5672/plane
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=${S3_ACCESS_KEY}
AWS_SECRET_ACCESS_KEY=${S3_SECRET_KEY}
AWS_S3_ENDPOINT_URL=http://localhost:3900
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=104857600
@@ -202,11 +175,17 @@ $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 Services"
msg_info "Creating Services and MinIO Bucket"
curl -fsSL https://dl.min.io/client/mc/release/linux-$(arch_resolve)/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
$STD /usr/local/bin/mcli anonymous set download plane/uploads
cat <<EOF >/etc/systemd/system/plane-api.service
[Unit]
Description=Plane API
After=network.target postgresql.service redis-server.service rabbitmq-server.service garage.service
After=network.target postgresql.service redis-server.service rabbitmq-server.service minio.service
[Service]
Type=simple
@@ -295,12 +274,12 @@ systemctl enable -q --now plane-api plane-worker plane-beat plane-live plane-spa
cat <<EOF >~/plane.creds
RabbitMQ User: plane
RabbitMQ Password: ${RABBITMQ_PASS}
S3 Access Key: ${S3_ACCESS_KEY}
S3 Secret Key: ${S3_SECRET_KEY}
MinIO Access Key: ${MINIO_ACCESS_KEY}
MinIO Secret Key: ${MINIO_SECRET_KEY}
Secret Key: ${SECRET_KEY}
Config: /opt/plane/apps/api/.env
EOF
msg_ok "Created Services"
msg_ok "Created Services and MinIO Bucket"
msg_info "Configuring Nginx"
cat <<'EOF' >/etc/nginx/sites-available/plane.conf
@@ -316,8 +295,8 @@ upstream plane-space {
server 127.0.0.1:3002;
}
upstream plane-garage {
server 127.0.0.1:3900;
upstream plane-minio {
server 127.0.0.1:9000;
}
server {
@@ -357,14 +336,14 @@ server {
}
location = /uploads {
proxy_pass http://plane-garage;
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 /uploads/ {
proxy_pass http://plane-garage;
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;

View File

@@ -38,9 +38,7 @@ $STD uv pip install --python /opt/suggestarr/.venv -r /opt/suggestarr/api_servic
msg_ok "Set up Python Environment"
msg_info "Configuring SuggestArr"
mkdir -p /opt/suggestarr_data /opt/suggestarr/config
rm -rf /opt/suggestarr/config/config_files
ln -sfn /opt/suggestarr_data /opt/suggestarr/config/config_files
mkdir -p /opt/suggestarr_data
cat <<EOF >/opt/suggestarr.env
SUGGESTARR_PORT=5000
LOG_LEVEL=info