2026-06-24 23:29:42 +02:00
#!/usr/bin/env bash
2026-09-02 13:37:36 +02:00
_cs_boot = " ${ COMMUNITY_SCRIPTS_CORE_DIR :-$( dirname " ${ BASH_SOURCE [0] } " ) /../../core } /core/build.func"
source " $_cs_boot " 2>/dev/null || source <( curl -fsSL " ${ COMMUNITY_SCRIPTS_CORE_URL :- https ://raw.githubusercontent.com/community-scripts/core/main } /core/build.func" )
2026-06-24 23:29:42 +02:00
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://snapotter.com
APP = "SnapOtter"
var_tags = " ${ var_tags :- media ;image } "
var_cpu = " ${ var_cpu :- 2 } "
2026-06-29 22:26:09 +10:00
var_ram = " ${ var_ram :- 4096 } "
2026-06-24 23:29:42 +02:00
var_disk = " ${ var_disk :- 20 } "
var_os = " ${ var_os :- debian } "
var_version = " ${ var_version :- 13 } "
var_unprivileged = " ${ var_unprivileged :- 1 } "
var_arm64 = " ${ var_arm64 :- no } "
header_info " $APP "
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/snapotter ]] ; then
msg_error "No ${ APP } Installation Found!"
exit
fi
2026-07-16 09:01:53 +02:00
NEEDS_V2_MIGRATION = false
grep -q '^DB_PATH=' /opt/snapotter_data/.env 2>/dev/null && NEEDS_V2_MIGRATION = true
UPDATE_AVAILABLE = false
check_for_gh_release "snapotter" "snapotter-hq/SnapOtter" && UPDATE_AVAILABLE = true
if [[ " $NEEDS_V2_MIGRATION " == true || " $UPDATE_AVAILABLE " == true ]] ; then
2026-06-24 23:29:42 +02:00
msg_info "Stopping Service"
systemctl stop snapotter
msg_ok "Stopped Service"
2026-07-16 09:01:53 +02:00
PG_VERSION = "17" setup_postgresql
if ! sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname = 'snapotter'" | grep -qx '1' ; then
PG_DB_NAME = "snapotter" PG_DB_USER = "snapotter" setup_postgresql_db
else
PG_DB_NAME = "snapotter"
PG_DB_USER = "snapotter"
PG_DB_PASS = $( sed -n 's|^DATABASE_URL=postgres://snapotter:\([^@]*\)@.*|\1|p' /opt/snapotter_data/.env | head -n1)
if [[ -z " $PG_DB_PASS " ]] ; then
msg_error "SnapOtter's PostgreSQL database exists, but its password is not available in /opt/snapotter_data/.env"
exit 1
fi
fi
msg_info "Installing Redis"
$STD apt install -y redis-server
if grep -q '^appendonly ' /etc/redis/redis.conf; then
sed -i 's/^appendonly .*/appendonly yes/' /etc/redis/redis.conf
else
echo 'appendonly yes' >>/etc/redis/redis.conf
fi
$STD systemctl enable --now redis-server
msg_ok "Installed Redis"
msg_info "Migrating SnapOtter Configuration"
sed -i '/^DB_PATH=/d; /^DATABASE_URL=/d; /^REDIS_URL=/d; /^SQLITE_MIGRATE_PATH=/d' /opt/snapotter_data/.env
cat <<EOF >>/opt/snapotter_data/.env
DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}
REDIS_URL=redis://127.0.0.1:6379
EOF
if [[ -f /opt/snapotter_data/snapotter.db ]] ; then
echo 'SQLITE_MIGRATE_PATH=/opt/snapotter_data/snapotter.db' >>/opt/snapotter_data/.env
fi
if ! grep -q '^Requires=postgresql.service redis-server.service$' /etc/systemd/system/snapotter.service; then
sed -i '/^After=/c\After=network-online.target postgresql.service redis-server.service' /etc/systemd/system/snapotter.service
sed -i '/^\[Unit\]/a Wants=network-online.target\nRequires=postgresql.service redis-server.service' /etc/systemd/system/snapotter.service
fi
systemctl daemon-reload
msg_ok "Migrated SnapOtter Configuration"
if [[ " $UPDATE_AVAILABLE " == true ]] ; then
CLEAN_INSTALL = 1 fetch_and_deploy_gh_release "snapotter" "snapotter-hq/SnapOtter" "prebuild" "latest" "/opt/snapotter" "snapotter-*-linux-amd64.tar.gz"
fi
2026-06-24 23:29:42 +02:00
msg_info "Updating SnapOtter"
2026-07-15 21:35:28 +02:00
$STD uv python install 3.11
$STD uv venv --seed --python 3.11 /opt/snapotter_data/ai/venv
2026-09-05 05:04:53 +02:00
if [[ " $( arch_resolve) " == "arm64" ]] ; then
$STD uv pip install --python /opt/snapotter_data/ai/venv/bin/python \
numpy == 1.26.4 Pillow == 12.3.0 opencv-python-headless== 4.10.0.84 fonttools \
'huggingface-hub[hf_xet,hf_transfer]==0.36.2'
else
msg_warn "SnapOtter AI Features have no working CPU-only bundle for amd64 upstream (published bundle is Python 3.12/GPU-CUDA only). Use the official Docker image instead: https://docs.snapotter.com"
fi
2026-07-15 21:35:28 +02:00
ln -sfn /opt/snapotter /app
2026-06-24 23:29:42 +02:00
msg_ok "Updated SnapOtter"
msg_info "Starting Service"
systemctl start snapotter
msg_ok "Started Service"
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 } "
2026-07-06 21:15:04 +02:00
echo -e " ${ INFO }${ YW } Access it using the following URL: ${ CL } "
echo -e " ${ GATEWAY }${ BGN } http:// ${ IP } :1349 ${ CL } "