Compare commits
12
Commits
670cfb9acd
...
v1.0.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
991c790816 | ||
|
|
a343afffaa | ||
|
|
eeef81ffc7 | ||
|
|
bc6b3f0843 | ||
|
|
f01e776f34 | ||
|
|
a19fa53468 | ||
|
|
baefca0c68 | ||
|
|
9ed6040425 | ||
|
|
ca17b381f6 | ||
|
|
3f74388359 | ||
|
|
a814ed332f | ||
|
|
94e4412e67 |
No files matched your search
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **Manual Backup now matches the system role**: on the Desktop Only role the Hub's
|
||||||
|
"What gets backed up" list no longer shows Node / Server + Desktop items
|
||||||
|
(nix-bitcoin secrets, `/var/lib` system service data, and the database/blockchain
|
||||||
|
caveats), and the backup script skips those stages entirely — Desktop Only backups
|
||||||
|
now mirror only the NixOS configuration (`/etc/nixos`) and home directory (`/home`).
|
||||||
|
The free-space estimate, stage numbering, backup manifest, and completion message
|
||||||
|
are all role-aware; Node and Server + Desktop backups are unchanged.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [1.0.4] - 2026-07-29
|
## [1.0.4] - 2026-07-29
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -3,10 +3,18 @@
|
|||||||
# Backs up Sovran_SystemsOS data to an external USB hard drive using rsync.
|
# Backs up Sovran_SystemsOS data to an external USB hard drive using rsync.
|
||||||
# Designed for the Hub web UI (no GUI dependencies).
|
# Designed for the Hub web UI (no GUI dependencies).
|
||||||
#
|
#
|
||||||
# Your Sovran Pro already backs up your data automatically to its
|
# On Server + Desktop and Node systems, your Sovran Pro already backs up
|
||||||
# internal second drive (BTCEcoandBackup at /run/media/Second_Drive).
|
# your data automatically to its internal second drive (BTCEcoandBackup at
|
||||||
# This script creates an additional copy on an external USB drive —
|
# /run/media/Second_Drive); this script stores a copy in a third location.
|
||||||
# storing your data in a third location for maximum protection.
|
# Desktop Only systems have no internal second drive, so the external copy
|
||||||
|
# is the second location.
|
||||||
|
#
|
||||||
|
# What gets mirrored depends on the system role:
|
||||||
|
# - Node / Server + Desktop: /etc/nixos, /etc/nix-bitcoin-secrets,
|
||||||
|
# /home, and /var/lib (minus databases, blockchain data, logs, caches).
|
||||||
|
# - Desktop Only: /etc/nixos and /home. Desktop Only runs no server or
|
||||||
|
# Bitcoin services, so there are no nix-bitcoin secrets or system
|
||||||
|
# service data to back up.
|
||||||
#
|
#
|
||||||
# The external drive must be formatted as ext4. Files are stored as
|
# The external drive must be formatted as ext4. Files are stored as
|
||||||
# directly browsable files under Sovran_SystemsOS_Backup/current/.
|
# directly browsable files under Sovran_SystemsOS_Backup/current/.
|
||||||
@@ -344,6 +352,19 @@ case "$ROLE" in
|
|||||||
esac
|
esac
|
||||||
log "Detected role: $ROLE_LABEL"
|
log "Detected role: $ROLE_LABEL"
|
||||||
|
|
||||||
|
# Backup scope depends on the role. Desktop Only systems run no server or
|
||||||
|
# Bitcoin services, so only the NixOS configuration and home directory are
|
||||||
|
# mirrored (2 stages). Node and Server + Desktop systems also mirror the
|
||||||
|
# nix-bitcoin secrets and /var/lib system service data (4 stages).
|
||||||
|
if [[ "$ROLE" == "desktop" ]]; then
|
||||||
|
TOTAL_STAGES=2
|
||||||
|
HOME_STAGE_NUM=2
|
||||||
|
log "Desktop Only role: backing up the NixOS configuration (/etc/nixos) and home directory (/home) only."
|
||||||
|
else
|
||||||
|
TOTAL_STAGES=4
|
||||||
|
HOME_STAGE_NUM=3
|
||||||
|
fi
|
||||||
|
|
||||||
# ── Detect target drive ──────────────────────────────────────────
|
# ── Detect target drive ──────────────────────────────────────────
|
||||||
|
|
||||||
if [[ -n "${BACKUP_TARGET:-}" ]]; then
|
if [[ -n "${BACKUP_TARGET:-}" ]]; then
|
||||||
@@ -385,12 +406,14 @@ log "Backup destination: $BACKUP_DIR"
|
|||||||
|
|
||||||
ETC_NIXOS_BYTES=$(estimate_path_bytes /etc/nixos)
|
ETC_NIXOS_BYTES=$(estimate_path_bytes /etc/nixos)
|
||||||
HOME_BYTES=$(estimate_path_bytes /home --exclude='*/.cache' --exclude='*/.local/share/Trash' --exclude='*/Trash')
|
HOME_BYTES=$(estimate_path_bytes /home --exclude='*/.cache' --exclude='*/.local/share/Trash' --exclude='*/Trash')
|
||||||
|
|
||||||
|
# nix-bitcoin secrets and /var/lib system service data exist only on the
|
||||||
|
# Node and Server + Desktop roles — they are skipped entirely on Desktop Only.
|
||||||
SECRETS_BYTES=0
|
SECRETS_BYTES=0
|
||||||
|
VAR_LIB_BYTES=0
|
||||||
if [[ "$ROLE" != "desktop" ]]; then
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
SECRETS_BYTES=$(estimate_path_bytes /etc/nix-bitcoin-secrets)
|
SECRETS_BYTES=$(estimate_path_bytes /etc/nix-bitcoin-secrets)
|
||||||
fi
|
VAR_LIB_BYTES=$(estimate_path_bytes /var/lib \
|
||||||
|
|
||||||
VAR_LIB_BYTES=$(estimate_path_bytes /var/lib \
|
|
||||||
--exclude='postgresql' \
|
--exclude='postgresql' \
|
||||||
--exclude='mysql' \
|
--exclude='mysql' \
|
||||||
--exclude='mariadb' \
|
--exclude='mariadb' \
|
||||||
@@ -400,6 +423,7 @@ VAR_LIB_BYTES=$(estimate_path_bytes /var/lib \
|
|||||||
--exclude='*/logs' \
|
--exclude='*/logs' \
|
||||||
--exclude='*/cache' \
|
--exclude='*/cache' \
|
||||||
--exclude='*/tmp')
|
--exclude='*/tmp')
|
||||||
|
fi
|
||||||
|
|
||||||
ESTIMATED_BYTES=$(( ETC_NIXOS_BYTES + HOME_BYTES + SECRETS_BYTES + VAR_LIB_BYTES ))
|
ESTIMATED_BYTES=$(( ETC_NIXOS_BYTES + HOME_BYTES + SECRETS_BYTES + VAR_LIB_BYTES ))
|
||||||
# Require 20% growth headroom plus a fixed 1 GiB safety margin.
|
# Require 20% growth headroom plus a fixed 1 GiB safety margin.
|
||||||
@@ -418,10 +442,10 @@ log "Free space on drive: ${FREE_GB} GB"
|
|||||||
(( FREE_BYTES >= REQUIRED_BYTES )) || \
|
(( FREE_BYTES >= REQUIRED_BYTES )) || \
|
||||||
fail "Not enough free space on drive (${FREE_GB} GB available, ${REQUIRED_GB} GB required)."
|
fail "Not enough free space on drive (${FREE_GB} GB available, ${REQUIRED_GB} GB required)."
|
||||||
|
|
||||||
# ── Stage 1/4: NixOS configuration ──────────────────────────────
|
# ── Stage 1: NixOS configuration ────────────────────────────────
|
||||||
|
|
||||||
log ""
|
log ""
|
||||||
log "── Stage 1/4: NixOS configuration (/etc/nixos) ──────────────"
|
log "── Stage 1/${TOTAL_STAGES}: NixOS configuration (/etc/nixos) ──────────────"
|
||||||
if [[ -d /etc/nixos ]]; then
|
if [[ -d /etc/nixos ]]; then
|
||||||
sync_tree "/etc/nixos" no /etc/nixos/ "$BACKUP_DIR/etc/nixos/"
|
sync_tree "/etc/nixos" no /etc/nixos/ "$BACKUP_DIR/etc/nixos/"
|
||||||
log "Stage 1 complete."
|
log "Stage 1 complete."
|
||||||
@@ -429,26 +453,30 @@ else
|
|||||||
log "WARNING: /etc/nixos not found — skipping."
|
log "WARNING: /etc/nixos not found — skipping."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Stage 2/4: Secrets ──────────────────────────────────────────
|
# ── Stage 2: Secrets ────────────────────────────────────────────
|
||||||
|
# Only applies to the Node and Server + Desktop roles. Desktop Only systems
|
||||||
|
# run no nix-bitcoin services, so there are no secrets to back up and this
|
||||||
|
# stage does not exist for them.
|
||||||
|
|
||||||
log ""
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
log "── Stage 2/4: Secrets (/etc/nix-bitcoin-secrets) ───────────"
|
log ""
|
||||||
if [[ "$ROLE" == "desktop" ]]; then
|
log "── Stage 2/${TOTAL_STAGES}: Secrets (/etc/nix-bitcoin-secrets) ───────────"
|
||||||
log "Skipping /etc/nix-bitcoin-secrets — not applicable for Desktop Only role."
|
if [[ -e /etc/nix-bitcoin-secrets ]]; then
|
||||||
elif [[ -e /etc/nix-bitcoin-secrets ]]; then
|
|
||||||
sync_tree "/etc/nix-bitcoin-secrets" no /etc/nix-bitcoin-secrets/ "$BACKUP_DIR/etc/nix-bitcoin-secrets/"
|
sync_tree "/etc/nix-bitcoin-secrets" no /etc/nix-bitcoin-secrets/ "$BACKUP_DIR/etc/nix-bitcoin-secrets/"
|
||||||
else
|
else
|
||||||
log "(not found: /etc/nix-bitcoin-secrets — skipping)"
|
log "(not found: /etc/nix-bitcoin-secrets — skipping)"
|
||||||
|
fi
|
||||||
|
log "Stage 2 complete."
|
||||||
fi
|
fi
|
||||||
log "Stage 2 complete."
|
|
||||||
|
|
||||||
# ── Stage 3/4: Home directory ───────────────────────────────────
|
# ── Home directory ──────────────────────────────────────────────
|
||||||
|
# Stage 2/2 on Desktop Only, stage 3/4 on Node and Server + Desktop.
|
||||||
# Rsync exit code 24 (vanished source files) is treated as nonfatal here
|
# Rsync exit code 24 (vanished source files) is treated as nonfatal here
|
||||||
# because the desktop may be active and files can disappear between the
|
# because the desktop may be active and files can disappear between the
|
||||||
# directory scan and the copy. All other nonzero exit codes remain fatal.
|
# directory scan and the copy. All other nonzero exit codes remain fatal.
|
||||||
|
|
||||||
log ""
|
log ""
|
||||||
log "── Stage 3/4: Home directory (/home) ───────────────────────"
|
log "── Stage ${HOME_STAGE_NUM}/${TOTAL_STAGES}: Home directory (/home) ───────────────────────"
|
||||||
if [[ -d /home ]]; then
|
if [[ -d /home ]]; then
|
||||||
sync_tree "/home" yes /home/ "$BACKUP_DIR/home/" \
|
sync_tree "/home" yes /home/ "$BACKUP_DIR/home/" \
|
||||||
--exclude='.cache/' \
|
--exclude='.cache/' \
|
||||||
@@ -467,19 +495,22 @@ if [[ -d /home ]]; then
|
|||||||
--exclude='.thumbnails/' \
|
--exclude='.thumbnails/' \
|
||||||
--exclude='.xsession-errors' \
|
--exclude='.xsession-errors' \
|
||||||
--exclude='.xsession-errors.old'
|
--exclude='.xsession-errors.old'
|
||||||
log "Stage 3 complete."
|
log "Stage ${HOME_STAGE_NUM} complete."
|
||||||
else
|
else
|
||||||
log "WARNING: /home not found — skipping."
|
log "WARNING: /home not found — skipping."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Stage 4/4: System data ──────────────────────────────────────
|
# ── Stage 4: System data ────────────────────────────────────────
|
||||||
|
# Only applies to the Node and Server + Desktop roles — Desktop Only systems
|
||||||
|
# run no server services, so /var/lib holds no service data worth mirroring.
|
||||||
# PostgreSQL/MariaDB raw database directories are excluded. Application
|
# PostgreSQL/MariaDB raw database directories are excluded. Application
|
||||||
# databases must be backed up separately with native database tools.
|
# databases must be backed up separately with native database tools.
|
||||||
# Bitcoin/Electrs data are excluded; they live on the internal second drive.
|
# Bitcoin/Electrs data are excluded; they live on the internal second drive.
|
||||||
|
|
||||||
log ""
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
log "── Stage 4/4: System data (/var/lib) ───────────────────────"
|
log ""
|
||||||
if [[ -d /var/lib ]]; then
|
log "── Stage 4/${TOTAL_STAGES}: System data (/var/lib) ───────────────────────"
|
||||||
|
if [[ -d /var/lib ]]; then
|
||||||
sync_tree "/var/lib" no /var/lib/ "$BACKUP_DIR/var/lib/" \
|
sync_tree "/var/lib" no /var/lib/ "$BACKUP_DIR/var/lib/" \
|
||||||
--exclude='postgresql/' \
|
--exclude='postgresql/' \
|
||||||
--exclude='mysql/' \
|
--exclude='mysql/' \
|
||||||
@@ -491,8 +522,9 @@ if [[ -d /var/lib ]]; then
|
|||||||
--exclude='*/cache/' \
|
--exclude='*/cache/' \
|
||||||
--exclude='*/tmp/'
|
--exclude='*/tmp/'
|
||||||
log "Stage 4 complete."
|
log "Stage 4 complete."
|
||||||
else
|
else
|
||||||
log "WARNING: /var/lib not found — skipping."
|
log "WARNING: /var/lib not found — skipping."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Generate manifest ────────────────────────────────────────────
|
# ── Generate manifest ────────────────────────────────────────────
|
||||||
@@ -517,23 +549,29 @@ MANIFEST_FILE="$BACKUP_DIR/BACKUP_MANIFEST.txt"
|
|||||||
echo "- /etc/nix-bitcoin-secrets (when present) → current/etc/nix-bitcoin-secrets/"
|
echo "- /etc/nix-bitcoin-secrets (when present) → current/etc/nix-bitcoin-secrets/"
|
||||||
fi
|
fi
|
||||||
echo "- /home → current/home/"
|
echo "- /home → current/home/"
|
||||||
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
echo "- /var/lib → current/var/lib/"
|
echo "- /var/lib → current/var/lib/"
|
||||||
|
fi
|
||||||
echo ""
|
echo ""
|
||||||
echo "Exclusions:"
|
echo "Exclusions:"
|
||||||
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
echo "- /var/lib/postgresql (PostgreSQL raw database files — not included)"
|
echo "- /var/lib/postgresql (PostgreSQL raw database files — not included)"
|
||||||
echo "- /var/lib/mysql, /var/lib/mariadb (MariaDB raw database files — not included)"
|
echo "- /var/lib/mysql, /var/lib/mariadb (MariaDB raw database files — not included)"
|
||||||
echo "- /var/lib/bitcoind (Bitcoin blockchain — excluded; lives on internal second drive)"
|
echo "- /var/lib/bitcoind (Bitcoin blockchain — excluded; lives on internal second drive)"
|
||||||
echo "- /var/lib/electrs (Electrs index — excluded; lives on internal second drive)"
|
echo "- /var/lib/electrs (Electrs index — excluded; lives on internal second drive)"
|
||||||
echo "- /run/media/Second_Drive (internal second drive — never traversed)"
|
echo "- /run/media/Second_Drive (internal second drive — never traversed)"
|
||||||
echo "- /var/lib/*/log, /var/lib/*/logs, /var/lib/*/cache, /var/lib/*/tmp"
|
echo "- /var/lib/*/log, /var/lib/*/logs, /var/lib/*/cache, /var/lib/*/tmp"
|
||||||
|
fi
|
||||||
echo "- Browser disk caches, thumbnail caches, trash directories, X session error logs"
|
echo "- Browser disk caches, thumbnail caches, trash directories, X session error logs"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Important limitations:"
|
echo "Important limitations:"
|
||||||
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
echo "- PostgreSQL and MariaDB/MySQL application databases are NOT included in this"
|
echo "- PostgreSQL and MariaDB/MySQL application databases are NOT included in this"
|
||||||
echo " backup. If you use Nextcloud, Matrix/Synapse, or other database-backed"
|
echo " backup. If you use Nextcloud, Matrix/Synapse, or other database-backed"
|
||||||
echo " applications, their data must be backed up separately using native tools."
|
echo " applications, their data must be backed up separately using native tools."
|
||||||
echo "- Bitcoin blockchain data and Electrs indexes are NOT included; they are"
|
echo "- Bitcoin blockchain data and Electrs indexes are NOT included; they are"
|
||||||
echo " reconstructable or stored on the internal second drive."
|
echo " reconstructable or stored on the internal second drive."
|
||||||
|
fi
|
||||||
echo "- This is a live file-level mirror, not a transactional database backup."
|
echo "- This is a live file-level mirror, not a transactional database backup."
|
||||||
echo " Files being written during the backup may be in an inconsistent state."
|
echo " Files being written during the backup may be in an inconsistent state."
|
||||||
echo ""
|
echo ""
|
||||||
@@ -542,7 +580,9 @@ MANIFEST_FILE="$BACKUP_DIR/BACKUP_MANIFEST.txt"
|
|||||||
echo "- To restore a directory:"
|
echo "- To restore a directory:"
|
||||||
echo " sudo rsync -aAXH --numeric-ids current/etc/nixos/ /etc/nixos/"
|
echo " sudo rsync -aAXH --numeric-ids current/etc/nixos/ /etc/nixos/"
|
||||||
echo " sudo rsync -aAXH --numeric-ids current/home/ /home/"
|
echo " sudo rsync -aAXH --numeric-ids current/home/ /home/"
|
||||||
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
echo " sudo rsync -aAXH --numeric-ids current/var/lib/ /var/lib/"
|
echo " sudo rsync -aAXH --numeric-ids current/var/lib/ /var/lib/"
|
||||||
|
fi
|
||||||
echo "- To copy individual files:"
|
echo "- To copy individual files:"
|
||||||
echo " sudo cp -a current/home/username/ /home/username/"
|
echo " sudo cp -a current/home/username/ /home/username/"
|
||||||
echo "- When restoring /etc/nixos to replacement hardware, regenerate"
|
echo "- When restoring /etc/nixos to replacement hardware, regenerate"
|
||||||
@@ -556,10 +596,12 @@ MANIFEST_FILE="$BACKUP_DIR/BACKUP_MANIFEST.txt"
|
|||||||
echo "- $warning"
|
echo "- $warning"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
if [[ "$ROLE" != "desktop" ]]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo "Note: Bitcoin blockchain and Electrs index data are intentionally excluded"
|
echo "Note: Bitcoin blockchain and Electrs index data are intentionally excluded"
|
||||||
echo "from manual external backup because they already live on the internal second drive"
|
echo "from manual external backup because they already live on the internal second drive"
|
||||||
echo "(/run/media/Second_Drive) and are reconstructable/internal-backup data."
|
echo "(/run/media/Second_Drive) and are reconstructable/internal-backup data."
|
||||||
|
fi
|
||||||
} > "$MANIFEST_FILE"
|
} > "$MANIFEST_FILE"
|
||||||
|
|
||||||
log "Manifest written to $MANIFEST_FILE"
|
log "Manifest written to $MANIFEST_FILE"
|
||||||
@@ -576,7 +618,11 @@ if [[ "${#RSYNC_WARNINGS[@]}" -gt 0 ]]; then
|
|||||||
log "vanished during backup, which is normal on an active desktop."
|
log "vanished during backup, which is normal on an active desktop."
|
||||||
log ""
|
log ""
|
||||||
fi
|
fi
|
||||||
log "All Finished! Your data is now backed up to a third location."
|
if [[ "$ROLE" == "desktop" ]]; then
|
||||||
|
log "All Finished! Your data is now backed up to a second, external location."
|
||||||
|
else
|
||||||
|
log "All Finished! Your data is now backed up to a third location."
|
||||||
|
fi
|
||||||
log "Files are directly browsable on the drive under: ${BACKUP_DIR}"
|
log "Files are directly browsable on the drive under: ${BACKUP_DIR}"
|
||||||
log "Please eject the drive safely before removing it from your Sovran Pro."
|
log "Please eject the drive safely before removing it from your Sovran Pro."
|
||||||
|
|
||||||
|
|||||||
@@ -403,8 +403,8 @@ SERVICE_DESCRIPTIONS: dict[str, str] = {
|
|||||||
),
|
),
|
||||||
"lnd.service": (
|
"lnd.service": (
|
||||||
"Your Lightning Network node for instant, low-fee Bitcoin payments. "
|
"Your Lightning Network node for instant, low-fee Bitcoin payments. "
|
||||||
"LND powers your Zeus wallet, Ride The Lightning dashboard, and BTCPayServer's "
|
"LND powers your Zeus wallet (via direct LND REST or Tor), Ride The Lightning dashboard, and BTCPayServer's "
|
||||||
"Lightning capabilities. With Sovran_SystemsOS, it's always connected and ready."
|
"Lightning capabilities. For mobile spending with sandboxed wallets, use Lightning Wallet Connections (NWC) instead."
|
||||||
),
|
),
|
||||||
"rtl.service": (
|
"rtl.service": (
|
||||||
"Your personal Lightning Network command center. Open channels, manage liquidity, "
|
"Your personal Lightning Network command center. Open channels, manage liquidity, "
|
||||||
@@ -417,9 +417,9 @@ SERVICE_DESCRIPTIONS: dict[str, str] = {
|
|||||||
"Sovran_SystemsOS makes running a production-grade payment gateway as simple as flipping a switch."
|
"Sovran_SystemsOS makes running a production-grade payment gateway as simple as flipping a switch."
|
||||||
),
|
),
|
||||||
"zeus-connect-setup.service": (
|
"zeus-connect-setup.service": (
|
||||||
"Connect the Zeus mobile wallet to your Lightning node. Send and receive "
|
"Connect the Zeus mobile wallet to your Lightning node via LND REST. Send and receive "
|
||||||
"Lightning payments from your phone, backed by your own infrastructure. "
|
"Lightning payments from your phone using a direct node connection. "
|
||||||
"Scan the QR code and your phone becomes a sovereign wallet."
|
"Scan the QR code to add your node to Zeus — this gives full node admin access."
|
||||||
),
|
),
|
||||||
"mempool.service": (
|
"mempool.service": (
|
||||||
"Your own blockchain explorer and mempool visualizer. Monitor transactions, "
|
"Your own blockchain explorer and mempool visualizer. Monitor transactions, "
|
||||||
|
|||||||
@@ -1035,6 +1035,74 @@ button.btn-reboot:hover:not(:disabled) {
|
|||||||
background: #1c2a24;
|
background: #1c2a24;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── NWC Connect Guide (shown after wallet creation) ────────────── */
|
||||||
|
|
||||||
|
.nwc-connect-guide {
|
||||||
|
margin-top: 16px;
|
||||||
|
padding: 16px;
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-radius: 12px;
|
||||||
|
background: rgba(109, 191, 139, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nwc-connect-guide-title {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nwc-connect-guide-intro {
|
||||||
|
margin: 0 0 14px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
line-height: 1.55;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nwc-connect-steps {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nwc-connect-step {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: flex-start;
|
||||||
|
font-size: 0.86rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nwc-step-num {
|
||||||
|
background: var(--accent-color);
|
||||||
|
color: #0A1A10;
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nwc-connect-note {
|
||||||
|
background: rgba(245, 158, 11, 0.08);
|
||||||
|
border-left: 3px solid #f59e0b;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-radius: 0 8px 8px 0;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nwc-connect-note strong {
|
||||||
|
color: #fbbf24;
|
||||||
|
}
|
||||||
|
|
||||||
/* ── Narrow screens ─────────────────────────────────────────────── */
|
/* ── Narrow screens ─────────────────────────────────────────────── */
|
||||||
|
|
||||||
@media (max-width: 720px) {
|
@media (max-width: 720px) {
|
||||||
|
|||||||
@@ -2,6 +2,21 @@
|
|||||||
|
|
||||||
// ── Service detail modal ──────────────────────────────────────────
|
// ── Service detail modal ──────────────────────────────────────────
|
||||||
|
|
||||||
|
function _getZeusConnectGuideHtml() {
|
||||||
|
return '<div class="nwc-connect-guide">' +
|
||||||
|
'<div class="nwc-connect-guide-title">📱 Connect to Zeus</div>' +
|
||||||
|
'<p class="nwc-connect-guide-intro">This connection URL is an <strong>LND REST</strong> connection — the direct way to use Zeus with your node for full admin access. It connects securely through Tor, allowing you to manage channels, balances, and your full node on the go.</p>' +
|
||||||
|
'<div class="nwc-connect-steps">' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">1</div><div><strong>Download Zeus</strong> from the App Store or Google Play.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">2</div><div>Open Zeus and open the <strong>Wallets</strong> screen.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">3</div><div>Tap the <strong>+ (Add Wallet)</strong> button in the top-right corner.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">4</div><div>On <strong>Wallet Configuration</strong>, tap the <strong>scan icon</strong> in the top-right corner, then scan the QR code above.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">5</div><div>Zeus detects the LND REST QR and fills in the connection details. Review them, then tap <strong>Save Wallet Config</strong>.</div></div>' +
|
||||||
|
'</div>' +
|
||||||
|
'<div class="nwc-connect-note"><strong>💡 Note:</strong> This is <em>not</em> the same as the NWC pairing QR shown in Lightning Wallet Connections — that gives your wallet sandboxed, limited access for everyday spending. LND REST connects Zeus directly to your node for full admin control.</div>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
function _renderCredsHtml(credentials, unit) {
|
function _renderCredsHtml(credentials, unit) {
|
||||||
var html = "";
|
var html = "";
|
||||||
for (var i = 0; i < credentials.length; i++) {
|
for (var i = 0; i < credentials.length; i++) {
|
||||||
@@ -9,7 +24,10 @@ function _renderCredsHtml(credentials, unit) {
|
|||||||
var id = "cred-" + Math.random().toString(36).substring(2, 8);
|
var id = "cred-" + Math.random().toString(36).substring(2, 8);
|
||||||
var qrBlock = "";
|
var qrBlock = "";
|
||||||
if (cred.qrcode) {
|
if (cred.qrcode) {
|
||||||
qrBlock = '<div class="creds-qr-wrap"><img class="creds-qr-img" src="' + cred.qrcode + '" alt="QR Code for ' + escHtml(cred.label) + '"><div class="creds-qr-hint">Scan with Zeus app on your phone</div></div>';
|
var qrHint = (unit === "zeus-connect-setup.service")
|
||||||
|
? "This is an <strong>LND REST</strong> connection QR — in Zeus, add a wallet and use the scan icon (see steps below)."
|
||||||
|
: "In Zeus: <em>Wallets → + → scan icon</em>. This is an <strong>LND REST</strong> QR for direct node access.";
|
||||||
|
qrBlock = '<div class="creds-qr-wrap"><img class="creds-qr-img" src="' + cred.qrcode + '" alt="QR Code for ' + escHtml(cred.label) + '"><div class="creds-qr-hint">' + qrHint + '</div></div>';
|
||||||
}
|
}
|
||||||
// If qronly, render the label + QR block only — skip value and copy button
|
// If qronly, render the label + QR block only — skip value and copy button
|
||||||
if (cred.qronly) {
|
if (cred.qronly) {
|
||||||
@@ -218,7 +236,8 @@ function _nwcRenderWalletState() {
|
|||||||
var pairId = "nwc-pairing-uri-" + Math.random().toString(36).substring(2, 8);
|
var pairId = "nwc-pairing-uri-" + Math.random().toString(36).substring(2, 8);
|
||||||
html += '<div class="nwc-secret-warning">⚠ One-time pairing secret. Save it now — it will not be shown again.</div>';
|
html += '<div class="nwc-secret-warning">⚠ One-time pairing secret. Save it now — it will not be shown again.</div>';
|
||||||
if (created.pairing_qrcode) {
|
if (created.pairing_qrcode) {
|
||||||
html += '<div class="creds-qr-wrap"><img class="creds-qr-img" src="' + created.pairing_qrcode + '" alt="QR code for Lightning Wallet Connections pairing secret"><div class="creds-qr-hint">Scan now in Zeus or copy the URI below.</div></div>';
|
html += '<div class="creds-row"><div class="creds-label">QR Code</div>' +
|
||||||
|
'<div class="creds-qr-wrap"><img class="creds-qr-img" src="' + created.pairing_qrcode + '" alt="QR code for Lightning Wallet Connections pairing secret"><div class="creds-qr-hint">This is an <strong>NWC</strong> pairing QR — in Zeus, add a wallet and use the scan icon (see steps below).</div></div></div>';
|
||||||
}
|
}
|
||||||
html += '<div class="creds-row"><div class="creds-label">Pairing URI</div>' +
|
html += '<div class="creds-row"><div class="creds-label">Pairing URI</div>' +
|
||||||
'<div class="creds-value-wrap"><div class="creds-value" id="' + pairId + '">' + escHtml(created.pairing_uri || "Unavailable") + '</div><button class="creds-copy-btn" data-target="' + pairId + '">Copy</button></div></div>';
|
'<div class="creds-value-wrap"><div class="creds-value" id="' + pairId + '">' + escHtml(created.pairing_uri || "Unavailable") + '</div><button class="creds-copy-btn" data-target="' + pairId + '">Copy</button></div></div>';
|
||||||
@@ -226,6 +245,18 @@ function _nwcRenderWalletState() {
|
|||||||
html += '<div class="creds-row"><div class="creds-label">Lightning Address</div>' +
|
html += '<div class="creds-row"><div class="creds-label">Lightning Address</div>' +
|
||||||
'<div class="creds-value-wrap"><div class="creds-value">' + escHtml(created.wallet.lightning_address) + '</div></div></div>';
|
'<div class="creds-value-wrap"><div class="creds-value">' + escHtml(created.wallet.lightning_address) + '</div></div></div>';
|
||||||
}
|
}
|
||||||
|
html += '<div class="nwc-connect-guide">' +
|
||||||
|
'<div class="nwc-connect-guide-title">📱 Connect to Zeus</div>' +
|
||||||
|
'<p class="nwc-connect-guide-intro">This pairing URI is an <strong>NWC (Nostr Wallet Connect)</strong> connection — the modern, mobile-friendly way to use Zeus with your node. It connects directly through your Lightning domain, so no Tor or port forwarding is needed on your phone.</p>' +
|
||||||
|
'<div class="nwc-connect-steps">' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">1</div><div><strong>Download Zeus</strong> from the App Store or Google Play.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">2</div><div>Open Zeus and open the <strong>Wallets</strong> screen.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">3</div><div>Tap the <strong>+ (Add Wallet)</strong> button in the top-right corner.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">4</div><div>On <strong>Wallet Configuration</strong>, tap the <strong>scan icon</strong> in the top-right corner, then scan the QR code above.</div></div>' +
|
||||||
|
'<div class="nwc-connect-step"><div class="nwc-step-num">5</div><div>Zeus detects the NWC QR and fills in <strong>Nostr Wallet Connect</strong>. Review it, then tap <strong>Save Wallet Config</strong>.</div></div>' +
|
||||||
|
'</div>' +
|
||||||
|
'<div class="nwc-connect-note"><strong>💡 Note:</strong> This is <em>not</em> the same as the LND REST / Tor QR shown on your LND tile — that connects Zeus directly to your Lightning node for full admin control. NWC gives your wallet sandboxed, limited access for everyday spending.</div>' +
|
||||||
|
'</div>';
|
||||||
html += '<div class="matrix-form-actions">' +
|
html += '<div class="matrix-form-actions">' +
|
||||||
'<button class="matrix-form-back" id="nwc-created-another-btn"' + (state.busy ? " disabled" : "") + '>Create Another Wallet</button>' +
|
'<button class="matrix-form-back" id="nwc-created-another-btn"' + (state.busy ? " disabled" : "") + '>Create Another Wallet</button>' +
|
||||||
'<button class="matrix-form-submit" id="nwc-created-continue-btn"' + (state.busy ? " disabled" : "") + '>I Saved This Secret</button>' +
|
'<button class="matrix-form-submit" id="nwc-created-continue-btn"' + (state.busy ? " disabled" : "") + '>I Saved This Secret</button>' +
|
||||||
@@ -332,7 +363,7 @@ function _nwcRenderWalletState() {
|
|||||||
html += '<div class="nwc-empty-state">' +
|
html += '<div class="nwc-empty-state">' +
|
||||||
'<div class="nwc-empty-icon">⚡</div>' +
|
'<div class="nwc-empty-icon">⚡</div>' +
|
||||||
'<div class="nwc-empty-title">Ready to start spending</div>' +
|
'<div class="nwc-empty-title">Ready to start spending</div>' +
|
||||||
'<p class="nwc-empty-desc">Create your first isolated wallet to connect to apps like Zeus or Nostr. Experience faster, more secure Lightning payments today.</p>' +
|
'<p class="nwc-empty-desc">Create your first isolated wallet to connect to apps like Zeus (via NWC) or Nostr. Experience faster, more secure Lightning payments today.</p>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
host.innerHTML = html;
|
host.innerHTML = html;
|
||||||
_nwcWireDomainLink();
|
_nwcWireDomainLink();
|
||||||
@@ -783,8 +814,8 @@ async function openServiceDetailModal(unit, name, icon) {
|
|||||||
'<div class="nwc-benefit-item">' +
|
'<div class="nwc-benefit-item">' +
|
||||||
'<div class="nwc-benefit-icon">📱</div>' +
|
'<div class="nwc-benefit-icon">📱</div>' +
|
||||||
'<div class="nwc-benefit-content">' +
|
'<div class="nwc-benefit-content">' +
|
||||||
'<strong>Zeus on the Go</strong>' +
|
'<strong>Zeus on the Go (via NWC)</strong>' +
|
||||||
'<p>Connect instantly to Zeus via NWC. Manage your spending and receive payments right from your phone, wherever you are.</p>' +
|
'<p>Connect Zeus to your wallet using NWC — no Tor, no port forwarding. Create a wallet below, scan the pairing QR, and start spending from your phone.</p>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
@@ -836,6 +867,7 @@ async function openServiceDetailModal(unit, name, icon) {
|
|||||||
html += '<div class="svc-detail-section">' +
|
html += '<div class="svc-detail-section">' +
|
||||||
'<div class="svc-detail-section-title">Credentials & Access</div>' +
|
'<div class="svc-detail-section-title">Credentials & Access</div>' +
|
||||||
_renderCredsHtml(data.credentials, unit) +
|
_renderCredsHtml(data.credentials, unit) +
|
||||||
|
(unit === "zeus-connect-setup.service" ? _getZeusConnectGuideHtml() : "") +
|
||||||
(unit === "matrix-synapse.service" ?
|
(unit === "matrix-synapse.service" ?
|
||||||
'<hr class="matrix-actions-divider"><div class="matrix-actions-row">' +
|
'<hr class="matrix-actions-divider"><div class="matrix-actions-row">' +
|
||||||
'<button class="matrix-action-btn" id="matrix-add-user-btn">➕ Add New User</button>' +
|
'<button class="matrix-action-btn" id="matrix-add-user-btn">➕ Add New User</button>' +
|
||||||
@@ -1053,6 +1085,9 @@ async function openCredsModal(unit, name, icon) {
|
|||||||
'<button class="matrix-action-btn" id="matrix-change-pw-btn">🔑 Change Password</button>' +
|
'<button class="matrix-action-btn" id="matrix-change-pw-btn">🔑 Change Password</button>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
}
|
}
|
||||||
|
if (unit === "zeus-connect-setup.service") {
|
||||||
|
html += _getZeusConnectGuideHtml();
|
||||||
|
}
|
||||||
$credsBody.innerHTML = html;
|
$credsBody.innerHTML = html;
|
||||||
_attachCopyHandlers($credsBody);
|
_attachCopyHandlers($credsBody);
|
||||||
if (unit === "matrix-synapse.service") {
|
if (unit === "matrix-synapse.service") {
|
||||||
|
|||||||
@@ -473,11 +473,27 @@ function renderBackupReady(drives) {
|
|||||||
].join("");
|
].join("");
|
||||||
}
|
}
|
||||||
|
|
||||||
$supportBody.innerHTML = [
|
// ── Role-aware backup description ─────────────────────────────
|
||||||
'<div class="support-section">',
|
// Desktop Only systems run no server or Bitcoin services and have no
|
||||||
'<div class="support-icon-big">\ud83d\udcbe</div>',
|
// internal second drive, so the backup mirrors only the NixOS configuration
|
||||||
'<h3 class="support-heading">Manual Backup</h3>',
|
// and home directory. nix-bitcoin secrets, /var/lib system service data,
|
||||||
|
// and the database/blockchain caveats apply only to the Node and
|
||||||
|
// Server + Desktop roles.
|
||||||
|
var isDesktopOnly = (_currentRole === "desktop");
|
||||||
|
|
||||||
|
var introHtml;
|
||||||
|
if (isDesktopOnly) {
|
||||||
|
introHtml = [
|
||||||
|
'<div class="support-wallet-box support-wallet-protected" style="margin-bottom:16px;">',
|
||||||
|
'<p class="support-wallet-desc">',
|
||||||
|
'This manual backup lets you create a copy of your system on an external USB drive \u2014 ',
|
||||||
|
'storing your data in a second location, outside the computer, for maximum protection ',
|
||||||
|
'against hardware failure or physical damage.',
|
||||||
|
'</p>',
|
||||||
|
'</div>',
|
||||||
|
].join("");
|
||||||
|
} else {
|
||||||
|
introHtml = [
|
||||||
'<div class="support-wallet-box support-wallet-protected" style="margin-bottom:16px;">',
|
'<div class="support-wallet-box support-wallet-protected" style="margin-bottom:16px;">',
|
||||||
'<p class="support-wallet-desc">',
|
'<p class="support-wallet-desc">',
|
||||||
'Your Sovran Pro already backs up your data automatically to its internal second drive. ',
|
'Your Sovran Pro already backs up your data automatically to its internal second drive. ',
|
||||||
@@ -486,6 +502,44 @@ function renderBackupReady(drives) {
|
|||||||
'against hardware failure or physical damage.',
|
'against hardware failure or physical damage.',
|
||||||
'</p>',
|
'</p>',
|
||||||
'</div>',
|
'</div>',
|
||||||
|
].join("");
|
||||||
|
}
|
||||||
|
|
||||||
|
var backupItemsHtml;
|
||||||
|
if (isDesktopOnly) {
|
||||||
|
backupItemsHtml = [
|
||||||
|
'<li>NixOS configuration (<code>/etc/nixos</code>)</li>',
|
||||||
|
'<li>Home directory (<code>/home</code>)</li>',
|
||||||
|
].join("");
|
||||||
|
} else {
|
||||||
|
backupItemsHtml = [
|
||||||
|
'<li>NixOS configuration (<code>/etc/nixos</code>)</li>',
|
||||||
|
'<li>nix-bitcoin secrets (<code>/etc/nix-bitcoin-secrets</code>)</li>',
|
||||||
|
'<li>System service data (<code>/var/lib</code>) — excluding databases and blockchain data (see note below)</li>',
|
||||||
|
'<li>Home directory (<code>/home</code>)</li>',
|
||||||
|
].join("");
|
||||||
|
}
|
||||||
|
|
||||||
|
// The database/blockchain caveat is only relevant when server services exist.
|
||||||
|
var dbNoteHtml = "";
|
||||||
|
if (!isDesktopOnly) {
|
||||||
|
dbNoteHtml = [
|
||||||
|
'<div class="support-wallet-box support-wallet-warning">',
|
||||||
|
'<div class="support-wallet-header">',
|
||||||
|
'<span class="support-wallet-icon">\u2139\ufe0f</span>',
|
||||||
|
'<span class="support-wallet-title">Database and Blockchain Data</span>',
|
||||||
|
'</div>',
|
||||||
|
'<p class="support-wallet-desc">Application databases stored in PostgreSQL or MariaDB/MySQL are <strong>not included</strong> in Manual Backup. Bitcoin blockchain and Electrs index data are also excluded (they are stored on the internal second drive). If you use Nextcloud, Matrix, or other database-backed applications, back up those databases separately with their native tools.</p>',
|
||||||
|
'</div>',
|
||||||
|
].join("");
|
||||||
|
}
|
||||||
|
|
||||||
|
$supportBody.innerHTML = [
|
||||||
|
'<div class="support-section">',
|
||||||
|
'<div class="support-icon-big">\ud83d\udcbe</div>',
|
||||||
|
'<h3 class="support-heading">Manual Backup</h3>',
|
||||||
|
|
||||||
|
introHtml,
|
||||||
|
|
||||||
'<div class="support-steps">',
|
'<div class="support-steps">',
|
||||||
'<div class="support-steps-title">Requirements</div>',
|
'<div class="support-steps-title">Requirements</div>',
|
||||||
@@ -500,20 +554,11 @@ function renderBackupReady(drives) {
|
|||||||
'<div class="support-steps">',
|
'<div class="support-steps">',
|
||||||
'<div class="support-steps-title">What gets backed up</div>',
|
'<div class="support-steps-title">What gets backed up</div>',
|
||||||
'<ol class="support-backup-steps">',
|
'<ol class="support-backup-steps">',
|
||||||
'<li>NixOS configuration (<code>/etc/nixos</code>)</li>',
|
backupItemsHtml,
|
||||||
'<li>nix-bitcoin secrets (<code>/etc/nix-bitcoin-secrets</code>)</li>',
|
|
||||||
'<li>System service data (<code>/var/lib</code>) — excluding databases and blockchain data (see note below)</li>',
|
|
||||||
'<li>Home directory (<code>/home</code>)</li>',
|
|
||||||
'</ol>',
|
'</ol>',
|
||||||
'</div>',
|
'</div>',
|
||||||
|
|
||||||
'<div class="support-wallet-box support-wallet-warning">',
|
dbNoteHtml,
|
||||||
'<div class="support-wallet-header">',
|
|
||||||
'<span class="support-wallet-icon">\u2139\ufe0f</span>',
|
|
||||||
'<span class="support-wallet-title">Database and Blockchain Data</span>',
|
|
||||||
'</div>',
|
|
||||||
'<p class="support-wallet-desc">Application databases stored in PostgreSQL or MariaDB/MySQL are <strong>not included</strong> in Manual Backup. Bitcoin blockchain and Electrs index data are also excluded (they are stored on the internal second drive). If you use Nextcloud, Matrix, or other database-backed applications, back up those databases separately with their native tools.</p>',
|
|
||||||
'</div>',
|
|
||||||
|
|
||||||
'<div class="support-wallet-box support-wallet-protected">',
|
'<div class="support-wallet-box support-wallet-protected">',
|
||||||
'<div class="support-wallet-header">',
|
'<div class="support-wallet-header">',
|
||||||
|
|||||||
Generated
+24
-24
@@ -5,11 +5,11 @@
|
|||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1784932759,
|
"lastModified": 1785778881,
|
||||||
"narHash": "sha256-44/iCx+wiYukHGhvPm65ppJZ3FZZbp6f9JE5isz8TsA=",
|
"narHash": "sha256-yHJJTm3o7ZhiVp68G+hh+dz1GKV+ACOT6mQj+eYvJLQ=",
|
||||||
"owner": "emmanuelrosa",
|
"owner": "emmanuelrosa",
|
||||||
"repo": "btc-clients-nix",
|
"repo": "btc-clients-nix",
|
||||||
"rev": "8aab86c245ab9a2bea0d72175d6fd663a892af9f",
|
"rev": "fc1aca94d839f82e7501fe0d01279d5c1fba6e63",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -92,11 +92,11 @@
|
|||||||
"nixpkgs-unstable": "nixpkgs-unstable"
|
"nixpkgs-unstable": "nixpkgs-unstable"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1779253922,
|
"lastModified": 1785177868,
|
||||||
"narHash": "sha256-k5DpYVfyy27ELuEiV+51EfVg7B6vKUW63NWeA6eKGd0=",
|
"narHash": "sha256-zlAZZkokXpeHHBP8Nt4MvLXOn1Js1qVi81VPjtVbRV8=",
|
||||||
"owner": "fort-nix",
|
"owner": "fort-nix",
|
||||||
"repo": "nix-bitcoin",
|
"repo": "nix-bitcoin",
|
||||||
"rev": "1496f842477976c085cd96f1837ea12444014088",
|
"rev": "360e30fee5ba32f9fecc89bc35628195d9d2dbbe",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -108,11 +108,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1782911660,
|
"lastModified": 1785590095,
|
||||||
"narHash": "sha256-PbR+tJ5E/Ux+01UtdFKqblccVA4/FgWbkym4ev3VHHQ=",
|
"narHash": "sha256-CNO2szJbdLjVN/Hi1BML9MSALz1GM2fIdwnzs404QO8=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "cf720c15e108d432d29041cc5a185630809acefb",
|
"rev": "e568f3b19d54b08f48bfae9b12b3e124d1a28002",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -139,11 +139,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-stable": {
|
"nixpkgs-stable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1784856561,
|
"lastModified": 1785734586,
|
||||||
"narHash": "sha256-J+Bx1Z6Oeoj2FgnBhRMKyUhhtDoOpTgXYaVLZpDjW4A=",
|
"narHash": "sha256-ODZkEK9Gy50yg6h98u7KkitZ3oc/uuTFK00bh1CRdNA=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "597283ad8aa0b331c788e97c4c262d58877074ef",
|
"rev": "531670d871c0e29724a02f3cbcac170adc65b58c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -155,11 +155,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs-unstable": {
|
"nixpkgs-unstable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778869304,
|
"lastModified": 1784453100,
|
||||||
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
|
"narHash": "sha256-zpGZb8FYui+i8KLtC0nlcmb0voR2zB80Qn8pe7lzIbk=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
|
"rev": "b471514bed69eff5255c8e63c1f80e5fe56c616f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -171,11 +171,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1778737229,
|
"lastModified": 1782847189,
|
||||||
"narHash": "sha256-6xWoytx8jFW4PF1GjRm/i/53trbpKGfz6zjzQGBr4cI=",
|
"narHash": "sha256-twXPFqFsrrY5r28Zh7Homgcp2gUMBgQ6WDS98Q/3xFI=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "d7a713c0b7e47c908258e71cba7a2d77cc8d71d5",
|
"rev": "b6018f87da91d19d0ab4cf979885689b469cdd41",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -187,11 +187,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_3": {
|
"nixpkgs_3": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1784796856,
|
"lastModified": 1785828668,
|
||||||
"narHash": "sha256-wWFrV5/Qbm+lyt5x20E/bSbfJiGKMo4RCxZV8cl/WZI=",
|
"narHash": "sha256-8fsyqeO+mJqvIzeO4xIpgJe/f7MTbbVTEC6RT6WSXNs=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "e2587caef70cea85dd97d7daab492899902dbf5d",
|
"rev": "e72e4f299401a3689d4b3d5fc6496b11db7064eb",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -224,11 +224,11 @@
|
|||||||
"systems": "systems_2"
|
"systems": "systems_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1784814601,
|
"lastModified": 1785763201,
|
||||||
"narHash": "sha256-T32JXjZ7kIbhBn8/Har171yGg6IBdl97cxAWameqZDE=",
|
"narHash": "sha256-wA373y/B9orM3HatLu9oS+Ke5lmdZyBl/bdjd2gLMq4=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "nixvim",
|
"repo": "nixvim",
|
||||||
"rev": "f316e949e0ed9df0e1e0bf645c6dce721d4e230e",
|
"rev": "c7be49306b23a952c0151cf4bbeacd944ed82f2a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ let
|
|||||||
]; }
|
]; }
|
||||||
{ name = "Zeus Connect"; unit = "zeus-connect-setup.service"; type = "system"; icon = "zeus"; enabled = cfg.services.bitcoin; category = "bitcoin-apps"; credentials = [
|
{ name = "Zeus Connect"; unit = "zeus-connect-setup.service"; type = "system"; icon = "zeus"; enabled = cfg.services.bitcoin; category = "bitcoin-apps"; credentials = [
|
||||||
{ label = "QR Code"; file = "/var/lib/secrets/zeus-connect-url"; qrcode = true; qronly = true; }
|
{ label = "QR Code"; file = "/var/lib/secrets/zeus-connect-url"; qrcode = true; qronly = true; }
|
||||||
{ label = "How to Connect"; value = "1. Download Zeus from App Store or Google Play\n2. Open Zeus → Scan Node Config\n3. Scan the QR code above"; }
|
|
||||||
]; }
|
]; }
|
||||||
{ name = "Sparrow Auto-Link"; unit = "sparrow-autoconnect.service"; type = "system"; icon = "sparrow"; enabled = cfg.services.bitcoin; category = "bitcoin-apps"; credentials = [
|
{ name = "Sparrow Auto-Link"; unit = "sparrow-autoconnect.service"; type = "system"; icon = "sparrow"; enabled = cfg.services.bitcoin; category = "bitcoin-apps"; credentials = [
|
||||||
{ label = "Server"; value = "tcp://127.0.0.1:50001 (Electrs)"; }
|
{ label = "Server"; value = "tcp://127.0.0.1:50001 (Electrs)"; }
|
||||||
|
|||||||
Reference in new issue
Block a user