From 2ac90a4a9f38a427a0ccdacb760b9693e1eafb44 Mon Sep 17 00:00:00 2001 From: Jan Wiebe Klijnsma Date: Sun, 1 Nov 2026 13:34:24 +0100 Subject: [PATCH] AliasVault: rework for 0.31.x (React web client, upstream nginx templates) - 0.31.0 removed the Blazor AliasVault.Client and split the core build flag --browser into --web; build apps/web (React/Vite) instead - render nginx.conf from upstream nginx-443/nginx-80-443 templates via the upstream entrypoint on every nginx start/reload, so TRUSTED_PROXIES, FORCE_HTTPS_REDIRECT, ADMIN_IP_ALLOWLIST, MAX_UPLOAD_SIZE_MB and HOSTNAME in .env work like the Docker setup - quote .env secrets (connection string contains ';') - add aliasvault.target to restart everything after .env changes - admin credentials in ~/aliasvault.creds, shown in the final output - random_password for the admin password, var_arm64=no, no custom functions Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01SZrFpm4auP7MM23XW7SwQJ --- ct/aliasvault.sh | 69 ++++---- install/aliasvault-install.sh | 302 +++++++++++++++------------------- json/aliasvault.json | 20 ++- 3 files changed, 178 insertions(+), 213 deletions(-) diff --git a/ct/aliasvault.sh b/ct/aliasvault.sh index e8484119dc..98534439cc 100644 --- a/ct/aliasvault.sh +++ b/ct/aliasvault.sh @@ -3,7 +3,7 @@ _CS_DEFAULT_URL="https://raw.githubusercontent.com/community-scripts/DevScripts/ _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") # Copyright (c) 2021-2026 community-scripts ORG -# Author: community-scripts ORG +# Author: MickLesk (CanbiZ) | Co-Author: Jan Wiebe Klijnsma (jwklijnsma) # License: MIT | https://github.com/community-scripts/DevScripts/raw/main/LICENSE # Source: https://aliasvault.net @@ -14,7 +14,7 @@ var_ram="${var_ram:-6144}" var_disk="${var_disk:-24}" var_os="${var_os:-debian}" var_version="${var_version:-13}" -#var_arm64="${var_arm64:-no}" # unset = ask the user; set yes/no only when verified +var_arm64="${var_arm64:-no}" # wasm-pack prebuild and the Microsoft .NET apt repo are pinned to amd64 var_unprivileged="${var_unprivileged:-1}" var_testurl="${var_testurl:-https://github.com/community-scripts/DevScripts/issues/1827}" @@ -32,52 +32,51 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + if [[ ! -x /usr/local/bin/aliasvault-configure ]]; then + msg_error "This container was created by the pre-0.31 AliasVault script (Blazor client). Export your vaults and recreate the container." + exit + fi if check_for_gh_release "aliasvault" "aliasvault/aliasvault"; then - RELEASE=$(get_latest_github_release "aliasvault/aliasvault") - - msg_info "Stopping Services" + msg_info "Stopping AliasVault" systemctl stop aliasvault-api aliasvault-admin aliasvault-smtp aliasvault-taskrunner - msg_ok "Stopped Services" + msg_ok "Stopped AliasVault" - create_backup /opt/aliasvault/.env /opt/aliasvault/certificates + create_backup /opt/aliasvault/.env CLEAN_INSTALL=1 fetch_and_deploy_gh_release "aliasvault" "aliasvault/aliasvault" "tarball" - msg_info "Building Core Libraries (Patience)" + restore_backup + + msg_info "Building AliasVault Core Libraries" source "$HOME/.cargo/env" $STD rustup target add wasm32-unknown-unknown cd /opt/aliasvault/core - $STD bash build-and-distribute.sh --browser - msg_ok "Built Core Libraries" + $STD bash build-and-distribute.sh --web + msg_ok "Built AliasVault Core Libraries" + + msg_info "Building AliasVault Web Client" + cd /opt/aliasvault/apps/web + $STD npm ci --no-audit --no-fund + $STD npm run build + cp -r /opt/aliasvault/apps/web/dist /opt/aliasvault/www + msg_ok "Built AliasVault Web Client" - msg_info "Building AliasVault Applications (Patience)" + msg_info "Building AliasVault Server" cd /opt/aliasvault/apps/server - $STD dotnet workload install wasm-tools $STD dotnet restore aliasvault.sln - $STD dotnet publish AliasVault.Api/AliasVault.Api.csproj -c Release -o /opt/aliasvault/api --no-restore - $STD dotnet build AliasVault.Client/AliasVault.Client.csproj -c Release --no-restore - $STD dotnet publish AliasVault.Client/AliasVault.Client.csproj -c Release -o /opt/aliasvault/client --no-restore - python3 -c " -import json, pathlib -p = pathlib.Path('/opt/aliasvault/client/wwwroot/appsettings.json') -c = json.loads(p.read_text()); c['ApiUrl'] = ''; p.write_text(json.dumps(c, indent=2)) -for ext in ['.gz', '.br']: - q = pathlib.Path(str(p) + ext) - if q.exists(): q.unlink() -" - mkdir -p /opt/certificates/app - $STD dotnet publish AliasVault.Admin/AliasVault.Admin.csproj -c Release -o /opt/aliasvault/admin --no-restore - $STD dotnet publish Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj -c Release -o /opt/aliasvault/smtp --no-restore - $STD dotnet publish Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj -c Release -o /opt/aliasvault/taskrunner --no-restore - msg_ok "Built AliasVault Applications" - - restore_backup + $STD dotnet publish AliasVault.Api/AliasVault.Api.csproj -c Release -o /opt/aliasvault/api --no-restore /p:UseAppHost=false + $STD dotnet publish AliasVault.Admin/AliasVault.Admin.csproj -c Release -o /opt/aliasvault/admin --no-restore /p:UseAppHost=false + $STD dotnet publish AliasVault.SmtpService/AliasVault.SmtpService.csproj -c Release -o /opt/aliasvault/smtp --no-restore /p:UseAppHost=false + $STD dotnet publish AliasVault.TaskRunner/AliasVault.TaskRunner.csproj -c Release -o /opt/aliasvault/taskrunner --no-restore /p:UseAppHost=false + $STD dotnet publish Utilities/AliasVault.InstallCli/AliasVault.InstallCli.csproj -c Release -o /opt/aliasvault/installcli --no-restore /p:UseAppHost=false + msg_ok "Built AliasVault Server" - msg_info "Starting Services" - systemctl start aliasvault-api aliasvault-admin aliasvault-smtp aliasvault-taskrunner - msg_ok "Started Services" - msg_ok "Updated successfully to ${RELEASE}!" + msg_info "Starting AliasVault" + systemctl restart nginx + systemctl start aliasvault.target + msg_ok "Started AliasVault" + msg_ok "Updated successfully!" fi exit } @@ -91,4 +90,4 @@ echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${INFO}${YW}Access it using the following URL:${CL}" echo -e "${GATEWAY}${BGN}https://${IP}${CL}" echo -e "${INFO}${YW} Admin Panel:${CL} ${GATEWAY}${BGN}https://${IP}/admin${CL}" -echo -e "${INFO}${YW} Admin credentials were shown in the installation output above.${CL}" +echo -e "${INFO}${YW} Admin credentials:${CL} ${BGN}cat ~/aliasvault.creds${CL}" diff --git a/install/aliasvault-install.sh b/install/aliasvault-install.sh index c1c101b684..efad4d7ebd 100644 --- a/install/aliasvault-install.sh +++ b/install/aliasvault-install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Copyright (c) 2021-2026 community-scripts ORG -# Author: community-scripts ORG +# Author: MickLesk (CanbiZ) | Co-Author: Jan Wiebe Klijnsma (jwklijnsma) # License: MIT | https://github.com/community-scripts/DevScripts/raw/main/LICENSE # Source: https://aliasvault.net @@ -16,13 +16,12 @@ update_os msg_info "Installing Dependencies" $STD apt install -y \ nginx \ - python3 \ build-essential \ - gettext-base \ - inotify-tools \ + clang \ + llvm \ + pkg-config \ libkrb5-3 \ - libgssapi-krb5-2 \ - openssl + libgssapi-krb5-2 # Ensure cc linker is available — update-alternatives may not run in minimal LXC [[ ! -e /usr/bin/cc ]] && ln -sf /usr/bin/gcc /usr/local/bin/cc msg_ok "Installed Dependencies" @@ -30,7 +29,7 @@ msg_ok "Installed Dependencies" setup_rust fetch_and_deploy_gh_release "wasm-pack" "rustwasm/wasm-pack" "prebuild" "latest" "/usr/local/bin" "wasm-pack-v*-x86_64-unknown-linux-musl.tar.gz" -NODE_VERSION="24" setup_nodejs +NODE_VERSION="22" setup_nodejs msg_info "Installing .NET SDK 10.0" setup_deb822_repo "microsoft-prod" \ @@ -47,182 +46,149 @@ PG_DB_NAME="aliasvault" PG_DB_USER="aliasvault" setup_postgresql_db fetch_and_deploy_gh_release "aliasvault" "aliasvault/aliasvault" "tarball" -msg_info "Building Core Libraries (Patience)" +# 0.31.0 replaced the Blazor client with a React app in apps/web, and split the +# core build flag --browser into --web / --browser-extension. +msg_info "Building AliasVault Core Libraries" source "$HOME/.cargo/env" $STD rustup target add wasm32-unknown-unknown cd /opt/aliasvault/core -$STD bash build-and-distribute.sh --browser -msg_ok "Built Core Libraries" +$STD bash build-and-distribute.sh --web +msg_ok "Built AliasVault Core Libraries" -msg_info "Building AliasVault Applications (Patience)" +msg_info "Building AliasVault Web Client" +cd /opt/aliasvault/apps/web +$STD npm ci --no-audit --no-fund +$STD npm run build +cp -r /opt/aliasvault/apps/web/dist /opt/aliasvault/www +msg_ok "Built AliasVault Web Client" + +msg_info "Building AliasVault Server" cd /opt/aliasvault/apps/server -$STD dotnet workload install wasm-tools $STD dotnet restore aliasvault.sln -$STD dotnet publish AliasVault.Api/AliasVault.Api.csproj \ - -c Release -o /opt/aliasvault/api --no-restore -$STD dotnet build AliasVault.Client/AliasVault.Client.csproj \ - -c Release --no-restore -$STD dotnet publish AliasVault.Client/AliasVault.Client.csproj \ - -c Release -o /opt/aliasvault/client --no-restore -# Clear the hardcoded localhost:5092 API URL so the client uses its own origin + /api/ -# Also remove pre-compressed copies so nginx (gzip_static on) serves the patched file -python3 -c " -import json, pathlib -p = pathlib.Path('/opt/aliasvault/client/wwwroot/appsettings.json') -c = json.loads(p.read_text()); c['ApiUrl'] = ''; p.write_text(json.dumps(c, indent=2)) -for ext in ['.gz', '.br']: - q = pathlib.Path(str(p) + ext) - if q.exists(): q.unlink() -" -$STD dotnet publish AliasVault.Admin/AliasVault.Admin.csproj \ - -c Release -o /opt/aliasvault/admin --no-restore -$STD dotnet publish Services/AliasVault.SmtpService/AliasVault.SmtpService.csproj \ - -c Release -o /opt/aliasvault/smtp --no-restore -$STD dotnet publish Services/AliasVault.TaskRunner/AliasVault.TaskRunner.csproj \ - -c Release -o /opt/aliasvault/taskrunner --no-restore -$STD dotnet publish Utilities/AliasVault.InstallCli/AliasVault.InstallCli.csproj \ - -c Release -o /opt/aliasvault/installcli --no-restore -msg_ok "Built AliasVault Applications" - -msg_info "Generating Secrets and Configuration" -ADMIN_PASS=$(openssl rand -base64 12 | tr -dc 'a-zA-Z0-9' | head -c 16) +$STD dotnet publish AliasVault.Api/AliasVault.Api.csproj -c Release -o /opt/aliasvault/api --no-restore /p:UseAppHost=false +$STD dotnet publish AliasVault.Admin/AliasVault.Admin.csproj -c Release -o /opt/aliasvault/admin --no-restore /p:UseAppHost=false +$STD dotnet publish AliasVault.SmtpService/AliasVault.SmtpService.csproj -c Release -o /opt/aliasvault/smtp --no-restore /p:UseAppHost=false +$STD dotnet publish AliasVault.TaskRunner/AliasVault.TaskRunner.csproj -c Release -o /opt/aliasvault/taskrunner --no-restore /p:UseAppHost=false +$STD dotnet publish Utilities/AliasVault.InstallCli/AliasVault.InstallCli.csproj -c Release -o /opt/aliasvault/installcli --no-restore /p:UseAppHost=false +msg_ok "Built AliasVault Server" + +msg_info "Configuring AliasVault" +ADMIN_PASS=$(random_password 16) +# Hashed outside the heredoc so a failing InstallCli aborts instead of writing an empty hash. ADMIN_HASH=$(dotnet /opt/aliasvault/installcli/AliasVault.InstallCli.dll hash-password "$ADMIN_PASS") -ADMIN_GENERATED=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -JWT_KEY=$(openssl rand -base64 32) -DATA_PROTECTION_CERT_PASS=$(openssl rand -base64 32) -DB_CONN="Host=localhost;Port=5432;Database=aliasvault;Username=aliasvault;Password=${PG_DB_PASS};Maximum Pool Size=80;Minimum Pool Size=5" +# Secrets with ';' are quoted so the file works as systemd EnvironmentFile and when sourced by bash. cat </opt/aliasvault/.env -ConnectionStrings__AliasServerDbContext=${DB_CONN} -JWT_KEY=${JWT_KEY} -DATA_PROTECTION_CERT_PASS=${DATA_PROTECTION_CERT_PASS} -ADMIN_PASSWORD_HASH=${ADMIN_HASH} -ADMIN_PASSWORD_GENERATED=${ADMIN_GENERATED} +ConnectionStrings__AliasServerDbContext="Host=localhost;Port=5432;Database=aliasvault;Username=aliasvault;Password=${PG_DB_PASS};Maximum Pool Size=80;Minimum Pool Size=5" +JWT_KEY="$(openssl rand -base64 32)" +DATA_PROTECTION_CERT_PASS="$(openssl rand -base64 32)" +ABUSE_METRICS_SALT="$(openssl rand -hex 32)" +ADMIN_PASSWORD_HASH="${ADMIN_HASH}" +ADMIN_PASSWORD_GENERATED="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" +HOSTNAME="${LOCAL_IP}" +FORCE_HTTPS_REDIRECT=true +TRUSTED_PROXIES= +ADMIN_IP_ALLOWLIST= +MAX_UPLOAD_SIZE_MB=100 PUBLIC_REGISTRATION_ENABLED=true -IP_LOGGING_ENABLED=true +SUPPORT_EMAIL= +TERMS_URL= PRIVATE_EMAIL_DOMAINS= HIDDEN_PRIVATE_EMAIL_DOMAINS= -MAX_UPLOAD_SIZE_MB=100 +SMTP_ADVERTISED_HOSTNAME= SMTP_TLS_ENABLED=false +IP_LOGGING_ENABLED=true Logging__LogLevel__Default=Error Logging__LogLevel__Microsoft__Hosting__Lifetime=Error Logging__LogLevel__Microsoft=Error EOF chmod 600 /opt/aliasvault/.env -msg_ok "Generated Secrets and Configuration" - -msg_info "Generating SSL Certificate" -mkdir -p /opt/aliasvault/certificates/ssl -openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ - -keyout /opt/aliasvault/certificates/ssl/key.pem \ - -out /opt/aliasvault/certificates/ssl/cert.pem \ - -subj "/C=US/ST=State/L=City/O=AliasVault/CN=${LOCAL_IP}" \ - -addext "subjectAltName=IP:${LOCAL_IP},DNS:localhost,IP:127.0.0.1" \ - 2>/dev/null -chmod 600 /opt/aliasvault/certificates/ssl/key.pem -chmod 644 /opt/aliasvault/certificates/ssl/cert.pem -msg_ok "Generated SSL Certificate" +mkdir -p /opt/certificates/app +cat <~/aliasvault.creds +AliasVault Admin + URL: https://${LOCAL_IP}/admin + Username: admin + Password: ${ADMIN_PASS} +EOF +chmod 600 ~/aliasvault.creds +msg_ok "Configured AliasVault" msg_info "Configuring Nginx" -rm -f /etc/nginx/sites-enabled/default -cat <<'NGINXEOF' >/etc/nginx/sites-available/aliasvault -map $http_upgrade $connection_upgrade { - default upgrade; - '' close; -} - -upstream aliasvault_api { server 127.0.0.1:3001 max_fails=1 fail_timeout=5s; } -upstream aliasvault_admin { server 127.0.0.1:3002 max_fails=1 fail_timeout=5s; } - -server { - listen 80; - listen [::]:80; - server_name _; - return 301 https://$host$request_uri; -} - -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name _; - - ssl_certificate /opt/aliasvault/certificates/ssl/cert.pem; - ssl_certificate_key /opt/aliasvault/certificates/ssl/key.pem; - ssl_protocols TLSv1.2 TLSv1.3; - - client_max_body_size 100M; - - add_header Referrer-Policy "strict-origin-when-cross-origin" always; - add_header X-Content-Type-Options "nosniff" always; - add_header X-Frame-Options "SAMEORIGIN" always; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - # .mjs files must be served as text/javascript for dynamic import() to work - types { - application/javascript mjs; - } - - gzip on; - gzip_vary on; - gzip_proxied any; - gzip_comp_level 6; - gzip_types text/plain text/css application/json application/javascript - text/xml application/xml application/wasm; - - # API - location /api { - proxy_pass http://aliasvault_api; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_intercept_errors on; - error_page 502 503 504 =503 @unavailable; - } - - # Admin (Blazor Server — needs WebSocket) - location /admin { - proxy_pass http://aliasvault_admin; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Prefix /admin/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_read_timeout 86400; - proxy_intercept_errors on; - error_page 502 503 504 =503 @unavailable; - } - - # Blazor WASM client (static files) - root /opt/aliasvault/client/wwwroot; - location / { - gzip_static on; - try_files $uri $uri/ /index.html =404; - } +# Renders nginx.conf on every nginx start/reload from the upstream templates +# (apps/server/nginx-443.conf, nginx-80-443.conf) with the upstream +# apps/server/entrypoint.sh, so TRUSTED_PROXIES, FORCE_HTTPS_REDIRECT, +# ADMIN_IP_ALLOWLIST, MAX_UPLOAD_SIZE_MB and HOSTNAME in .env behave as in Docker. +cat <<'EOF' >/usr/local/bin/aliasvault-configure +#!/usr/bin/env bash +set -euo pipefail +set -a +source /opt/aliasvault/.env +set +a +export LETSENCRYPT_ENABLED=false + +tmp=$(mktemp) +jq --arg reg "${PUBLIC_REGISTRATION_ENABLED:-true}" \ + --arg mail "${SUPPORT_EMAIL:-}" \ + --arg terms "${TERMS_URL:-}" \ + --arg mode "${DEPLOYMENT_MODE:-}" \ + 'del(.ApiUrl) | .PublicRegistrationEnabled=$reg | .SupportEmail=$mail | .TermsUrl=$terms | .DeploymentMode=$mode' \ + /opt/aliasvault/www/appsettings.json >"$tmp" +install -m 644 "$tmp" /opt/aliasvault/www/appsettings.json +rm -f "$tmp" + +cp /opt/aliasvault/apps/server/nginx-443.conf /etc/nginx/nginx-443.conf +cp /opt/aliasvault/apps/server/nginx-80-443.conf /etc/nginx/nginx-80-443.conf +sed -n '1,/^# Start nginx and check/p' /opt/aliasvault/apps/server/entrypoint.sh >/run/aliasvault-entrypoint.sh +sh /run/aliasvault-entrypoint.sh +rm -f /run/aliasvault-entrypoint.sh + +sed -i \ + -e 's|server client:3000|server 127.0.0.1:3000|' \ + -e 's|server api:3001|server 127.0.0.1:3001|' \ + -e 's|server admin:3002|server 127.0.0.1:3002|' \ + -e 's|root /usr/share/nginx/html;|root /opt/aliasvault/apps/server;|' \ + -e 's|^\(\s*\)include /etc/nginx/mime.types;|&\n\1types { application/javascript mjs; }\n\1include /etc/nginx/aliasvault-client.conf;|' \ + /etc/nginx/nginx.conf + +awk '/^[[:space:]]*server[[:space:]]*\{/ {f=1} f {print; n+=gsub(/\{/,"{"); n-=gsub(/\}/,"}"); if (n==0) exit}' \ + /opt/aliasvault/apps/web/nginx.conf | + sed -e 's|listen 3000;|listen 127.0.0.1:3000;|' -e 's|root /usr/share/nginx/html;|root /opt/aliasvault/www;|' \ + >/etc/nginx/aliasvault-client.conf +EOF +chmod 755 /usr/local/bin/aliasvault-configure +mkdir -p /etc/systemd/system/nginx.service.d +cat <<'EOF' >/etc/systemd/system/nginx.service.d/aliasvault.conf +[Unit] +PartOf=aliasvault.target - location @unavailable { - return 503 "Service temporarily unavailable"; - } -} -NGINXEOF -ln -sf /etc/nginx/sites-available/aliasvault /etc/nginx/sites-enabled/aliasvault -$STD nginx -t -systemctl enable -q --now nginx -$STD nginx -s reload +[Service] +ExecStartPre= +ExecStartPre=/usr/local/bin/aliasvault-configure +ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' +ExecReload= +ExecReload=/usr/local/bin/aliasvault-configure +ExecReload=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' +ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload +EOF +rm -f /etc/nginx/sites-enabled/default +systemctl daemon-reload +$STD systemctl restart nginx msg_ok "Configured Nginx" -mkdir -p /opt/certificates/app - msg_info "Creating Services" +cat </etc/systemd/system/aliasvault.target +[Unit] +Description=AliasVault +Wants=nginx.service aliasvault-api.service aliasvault-admin.service aliasvault-smtp.service aliasvault-taskrunner.service + +[Install] +WantedBy=multi-user.target +EOF cat </etc/systemd/system/aliasvault-api.service [Unit] Description=AliasVault API After=network.target postgresql.service Requires=postgresql.service +PartOf=aliasvault.target [Service] Type=simple @@ -236,14 +202,14 @@ Restart=on-failure RestartSec=5 [Install] -WantedBy=multi-user.target +WantedBy=aliasvault.target EOF - cat </etc/systemd/system/aliasvault-admin.service [Unit] Description=AliasVault Admin After=network.target aliasvault-api.service Wants=aliasvault-api.service +PartOf=aliasvault.target [Service] Type=simple @@ -255,17 +221,16 @@ Environment=ASPNETCORE_PATHBASE=/admin ExecStart=/usr/bin/dotnet AliasVault.Admin.dll Restart=on-failure RestartSec=5 -StartLimitIntervalSec=0 [Install] -WantedBy=multi-user.target +WantedBy=aliasvault.target EOF - cat </etc/systemd/system/aliasvault-smtp.service [Unit] Description=AliasVault SMTP Service After=network.target aliasvault-api.service Requires=aliasvault-api.service +PartOf=aliasvault.target [Service] Type=simple @@ -277,14 +242,14 @@ Restart=on-failure RestartSec=5 [Install] -WantedBy=multi-user.target +WantedBy=aliasvault.target EOF - cat </etc/systemd/system/aliasvault-taskrunner.service [Unit] Description=AliasVault Task Runner After=network.target aliasvault-api.service Requires=aliasvault-api.service +PartOf=aliasvault.target [Service] Type=simple @@ -296,19 +261,12 @@ Restart=on-failure RestartSec=5 [Install] -WantedBy=multi-user.target +WantedBy=aliasvault.target EOF - -systemctl enable -q --now aliasvault-api aliasvault-admin aliasvault-smtp aliasvault-taskrunner +systemctl enable -q aliasvault-api aliasvault-admin aliasvault-smtp aliasvault-taskrunner +systemctl enable -q --now aliasvault.target msg_ok "Created Services" -{ - echo "" - echo "AliasVault Admin Credentials:" - echo " Username: admin" - echo " Password: ${ADMIN_PASS}" -} >>~/aliasvault.creds - motd_ssh customize cleanup_lxc diff --git a/json/aliasvault.json b/json/aliasvault.json index caefb6dc03..1d841e5fd6 100644 --- a/json/aliasvault.json +++ b/json/aliasvault.json @@ -23,7 +23,7 @@ "resources": { "cpu": 4, "ram": 6144, - "hdd": 12, + "hdd": 24, "os": "Debian", "version": "13" } @@ -35,16 +35,24 @@ }, "notes": [ { - "text": "The initial installation builds AliasVault from source and takes 15–30 minutes. Do not interrupt the process.", + "text": "The installation builds AliasVault from source (Rust core, React web client, .NET services) and takes 15–30 minutes. Do not interrupt the process.", "type": "warning" }, { - "text": "The admin password is auto-generated during installation and displayed in the installation output. Save it immediately.", - "type": "warning" + "text": "The admin password is auto-generated during installation. Show it with: cat ~/aliasvault.creds", + "type": "info" + }, + { + "text": "All settings live in /opt/aliasvault/.env (same option names as upstream .env.example). Apply changes with: systemctl restart aliasvault.target", + "type": "info" + }, + { + "text": "Behind a reverse proxy with TLS termination: set FORCE_HTTPS_REDIRECT=false and TRUSTED_PROXIES= in /opt/aliasvault/.env, then point the proxy at http://:80.", + "type": "info" }, { - "text": "To receive alias emails, configure your domain's MX record to point to this server and update PRIVATE_EMAIL_DOMAINS in /opt/aliasvault/.env.", + "text": "To receive alias emails, point your domain MX record to this server (ports 25/587) and set PRIVATE_EMAIL_DOMAINS in /opt/aliasvault/.env.", "type": "info" } ] -} \ No newline at end of file +}