Globnotes | scripts-underground Globnotes | scripts-underground
⚠️
WARNING: Executing scripts from the internet without understanding what they do can be dangerous. This is an open frontier — always review the code before running it.
←

Globnotes

CPU: cores ✕ RAM: MB ✕ Disk: GB ✕
bash -c "$(curl -fsSL https://raw.githubusercontent.com/scripts-underground/proxmox/main/scripts/lxc/globnotes.sh)"

Globnotes

Globnotes is a self-hosted Markdown note-taking app where a note’s title is its path. Browse, search, and edit Obsidian vaults and nested Markdown trees in a browser, using either Source or WYSIWYG editing. Notes are ordinary files; application settings and the SQLite search index live separately in persistent application state.

Getting started

The script installs the released application natively with its source-pinned Deno runtime on Debian 13. Open http://<LXC-IP>/ on port 80 and complete the first-run setup wizard to choose authentication. No default application password is provisioned. Plain HTTP works directly; a reverse proxy or TLS certificate is not an installation prerequisite.

The service runs as the dedicated globnotes account. Its source and runtime are in /opt/globnotes, while the notes vault is /var/lib/globnotes/notes. Configure the service through /etc/globnotes/env, then restart it with systemctl restart globnotes. This is a systemd EnvironmentFile, not a shell script. The installer-owned revision file in /opt/globnotes/runtime/release.env is separate from operator settings.

The released deno.lock stays root-owned and unchanged through the frozen build. The service uses a separate generated lock in /opt/globnotes/runtime/dependency-lock/deno.lock, inside a private directory owned by globnotes. Deno can record approved cached plugin imports there without making the application root writable. Each release seeds its own runtime lock from its released dependency metadata; plugin integrity entries are not merged between release generations. Code rollback restores that generation’s runtime lock along with its executable and source.

Choosing a persistent application-state directory

By default, state is stored in /var/lib/globnotes/notes/.globnotes, the application’s hidden directory inside the notes vault. To select a separate directory at installation, prefix the complete install command with GLOBNOTES_INDEX_PATH:

GLOBNOTES_INDEX_PATH=/var/lib/globnotes/state bash -c "$(curl -fsSL https://raw.githubusercontent.com/scripts-underground/proxmox/main/scripts/lxc/globnotes.sh)"

Paths with spaces can be quoted normally:

GLOBNOTES_INDEX_PATH='/var/lib/globnotes/app state' bash -c "$(curl -fsSL https://raw.githubusercontent.com/scripts-underground/proxmox/main/scripts/lxc/globnotes.sh)"

This is a path inside the LXC. It does not create a Proxmox host bind mount or map a NAS directory. Prepare any mounts separately and give the globnotes account read/write/traverse access inside the container. Missing directories are created for that account; existing notes, mounts and their ownership are preserved. Use an absolute state path disjoint from the notes vault (apart from the default .globnotes), code, configuration and Deno cache. The installer rejects overlapping locations before installation effects.

An explicit state location is saved in /etc/globnotes/env and retained through updates. Changing it later is an operator-managed relocation: the updater does not copy or relocate state. Apply persistent-root configuration changes to the service before running an update.

Persistence, backups and updates

Back up both the notes vault and the entire application-state directory. Despite its name, GLOBNOTES_INDEX_PATH contains persistent authentication and settings, SQLite database/WAL/SHM files, branding, custom plugins and their core state. It is not a disposable search cache. Preserve /etc/globnotes/env with your deployment configuration. Take consistent backups with the service stopped or an appropriate filesystem/database snapshot.

The built-in backup plugin also keeps vault-side history and ledger files. Moving core state does not move all plugin-related material out of the vault; include those vault-side files in backups as well.

Run update inside the LXC to install a newer published stable release. Updates preserve notes, state and operator environment, and replace the complete built code/runtime tree. Source and runtime downloads are validated first. The service then stops while an independent copy of the effective DENO_DIR cache is prepared and the new release is built. Cached plugin imports are retained; cache size can grow with plugin use. The default cache is /var/cache/globnotes.

A no-update check does not stop the service. A failed build or publication restores the prior code/cache and prior running state; persistent user data is never rolled back over new writes. The installed-version marker advances only after the new service reports the selected version and revision. Successful updates immediately remove their own retired code/cache trees. An incomplete recovery reports retained recovery paths for inspection.

This script creates fresh native-Deno installations and updates that layout. It does not migrate older Python-based installations or their data.