Compare commits

..

1 Commits

Author SHA1 Message Date
MickLesk 1bf0d43122 Arcane: write both env names, stop shipping the unused .env
The compose file from main now uses ARCANE_ENCRYPTION_KEY and
ARCANE_PROJECTS_DIRECTORY, which the latest image (2.17.3) does not read,
so it panicked on a missing ENCRYPTION_KEY. Arcane 3 in turn refuses to
start when only the old names are set. Install and update now keep both
names in compose.yaml, which also carries existing installs over to 3.

The .env was never referenced by the compose file, but compose parses it,
and the unanchored ENCRYPTION_KEY sed turned the renamed line into
ARCANE_#ENCRYPTION_KEY and broke every install. New installs no longer
download it; update repairs the broken line.
2026-11-05 09:21:48 +01:00
3 changed files with 40 additions and 36 deletions
+2 -14
View File
@@ -32,14 +32,7 @@ function update_script() {
NODE_VERSION="22" setup_nodejs
RELEASE=""
if ! grep -qs '^DATABASE_URL=' /opt/tududi/backend/.env; then
RELEASE="v1.15.0"
msg_warn "Tududi 2.0 runs on PostgreSQL only, so this SQLite install stays on 1.15.0"
msg_warn "To move to 2.0, export in Settings > Backups and import into a new Tududi LXC"
fi
if check_for_gh_release "tududi" "chrisvel/tududi" "${RELEASE}" "2.0 needs PostgreSQL"; then
if check_for_gh_release "tududi" "chrisvel/tududi"; then
msg_info "Stopping Service"
systemctl stop tududi
msg_ok "Stopped Service"
@@ -50,14 +43,9 @@ function update_script() {
else
cp /opt/tududi/.env /opt/tududi.env
fi
if ! grep -q '^TUDUDI_UPLOAD_PATH=' /opt/tududi.env; then
mkdir -p /opt/tududi-uploads
[[ -d /opt/tududi/backend/uploads ]] && cp -a /opt/tududi/backend/uploads/. /opt/tududi-uploads/
echo "TUDUDI_UPLOAD_PATH=/opt/tududi-uploads" >>/opt/tududi.env
fi
msg_ok "Backed up env file"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tududi" "chrisvel/tududi" "tarball" "${CHECK_UPDATE_RELEASE}" "/opt/tududi"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tududi" "chrisvel/tududi" "tarball" "latest" "/opt/tududi"
msg_info "Updating Tududi"
cd /opt/tududi
+21 -9
View File
@@ -13,9 +13,13 @@ setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
sqlite3 \
yq
msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs
PG_VERSION="17" setup_postgresql
PG_DB_NAME="tududi" PG_DB_USER="tududi" setup_postgresql_db
fetch_and_deploy_gh_release "tududi" "chrisvel/tududi" "tarball" "latest" "/opt/tududi"
msg_info "Configuring Tududi"
@@ -26,22 +30,30 @@ $STD npm run frontend:build
mv ./dist ./backend
msg_ok "Configured Tududi"
msg_info "Creating env"
mkdir -p /opt/tududi-uploads
msg_info "Creating env and database"
DB_LOCATION="/opt/tududi-db"
UPLOAD_DIR="/opt/tududi-uploads"
mkdir -p {"$DB_LOCATION","$UPLOAD_DIR"}
SECRET="$(openssl rand -hex 64)"
sed -e '/^NODE_ENV=/s/=.*$/=production/' \
-e 's/^TUDUDI_USER/# TUDUDI_USER/g' \
-e "s/^TUDUDI_SESSION_SECRET=.*/TUDUDI_SESSION_SECRET=${SECRET}/" \
-e "s|^DATABASE_URL=.*|DATABASE_URL=postgres://tududi:${PG_DB_PASS}@localhost:5432/tududi|" \
-e "/_SECRET=/s/=.*$/=${SECRET}/" \
-e '/^# DB_FILE=/s/^# //' \
-e "s|^DB_FILE=.*|DB_FILE=${DB_LOCATION}/production.sqlite3|" \
-e "/^# TUDUDI_ALLOWED/s/^# //; \
\|_ORIGINS=|s|=.*$|=<your tududi IP or FDQN>|" \
-e "/^# TUDUDI_UPLOAD/s/^# //; \
\|UPLOAD_PATH=|s|=.*$|=${UPLOAD_DIR}|" \
/opt/tududi/backend/.env.example >/opt/tududi/backend/.env
echo "TUDUDI_UPLOAD_PATH=/opt/tududi-uploads" >>/opt/tududi/backend/.env
msg_ok "Created env"
export DB_FILE="${DB_LOCATION}/production.sqlite3"
$STD npm run db:init
msg_ok "Created env and database"
msg_info "Creating service"
cat <<EOF >/etc/systemd/system/tududi.service
[Unit]
Description=Tududi Service
After=network.target postgresql.service
After=network.target
[Service]
Type=simple
+17 -13
View File
@@ -58,8 +58,21 @@ function uninstall() {
# ==============================================================================
# UPDATE
# ==============================================================================
# Arcane 3 needs the ARCANE_* names, the current latest image reads only the old ones.
function sync_env_names() {
local key
for key in ENCRYPTION_KEY PROJECTS_DIRECTORY; do
grep -q "^[[:space:]]*- ARCANE_${key}=" "$COMPOSE_FILE" || sed -i "/^[[:space:]]*- ${key}=/{p;s/- ${key}=/- ARCANE_${key}=/;}" "$COMPOSE_FILE"
grep -q "^[[:space:]]*- ${key}=" "$COMPOSE_FILE" || sed -i "/^[[:space:]]*- ARCANE_${key}=/{p;s/- ARCANE_${key}=/- ${key}=/;}" "$COMPOSE_FILE"
done
if [[ -f "$ENV_FILE" ]]; then
sed -i 's/^ARCANE_#/#ARCANE_/' "$ENV_FILE"
fi
}
function update() {
chown -R 65532:65532 /etc/arcane/projects /etc/arcane/builds 2>/dev/null || true
sync_env_names
msg_info "Pulling latest ${APP} image"
cd "$INSTALL_PATH"
@@ -85,9 +98,8 @@ function install() {
msg_ok "Created ${INSTALL_PATH}"
# Generate secrets and config values
local ENCRYPTION_KEY JWT_SECRET PROJ_DIR BUILDS_DIR
local ENCRYPTION_KEY PROJ_DIR BUILDS_DIR
ENCRYPTION_KEY=$(random_password 32)
JWT_SECRET=$(random_password 32)
PROJ_DIR="/etc/arcane/projects"
BUILDS_DIR="/etc/arcane/builds"
@@ -108,20 +120,12 @@ function install() {
curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/docker/examples/compose.basic.yaml" -o "$COMPOSE_FILE"
msg_ok "Downloaded Docker Compose file"
msg_info "Downloading .env file"
curl -fsSL "https://raw.githubusercontent.com/getarcaneapp/arcane/refs/heads/main/.env.example" -o "$ENV_FILE"
chmod 600 "$ENV_FILE"
msg_ok "Downloaded .env file"
msg_info "Configuring compose and env files"
msg_info "Configuring compose file"
sed -i '/^[[:space:]]*#/!s|/host/path/to/projects|'"$PROJ_DIR"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|/host/path/to/builds|'"$BUILDS_DIR"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|ENCRYPTION_KEY='"$ENCRYPTION_KEY"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|JWT_SECRET='"$JWT_SECRET"'|g' "$COMPOSE_FILE"
sed -i '/^[[:space:]]*#/!s|APP_URL=.*|APP_URL=http://localhost:'"$DEFAULT_PORT"'|g' "$ENV_FILE"
sed -i '/^[[:space:]]*#/!s|ENCRYPTION_KEY=.*|#&|g' "$ENV_FILE"
sed -i '/^[[:space:]]*#/!s|JWT_SECRET=.*|#&|g' "$ENV_FILE"
msg_ok "Configured compose and env files"
sync_env_names
msg_ok "Configured compose file"
msg_info "Starting ${APP}"
cd "$INSTALL_PATH"