Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a67874b6ae | ||
|
|
9402e9f357 | ||
|
|
b75bb5434e | ||
|
|
ec44c3113b | ||
|
|
cb21bf7454 | ||
|
|
a1cffef503 | ||
|
|
9b00099ead | ||
|
|
d2351f1a81 | ||
|
|
869e4601b4 | ||
|
|
238e5b573e | ||
|
|
996680a336 | ||
|
|
94f6127711 | ||
|
|
3841301ee9 | ||
|
|
f406202825 | ||
|
|
ba50f57e93 | ||
|
|
61a758f67d | ||
|
|
847c27fbee | ||
|
|
7d79f3d5f7 | ||
|
|
fa3fdea590 | ||
|
|
aa2cd76c58 | ||
|
|
e2d82c7d4d | ||
|
|
e9c2a34def | ||
|
|
0fad95f032 | ||
|
|
683595940b | ||
|
|
40060c1fed | ||
|
|
2abee30fdd | ||
|
|
7cdc53bbf7 | ||
|
|
dac877252b | ||
|
|
dd749b0e47 | ||
|
|
f98c02cbc6 | ||
|
|
218d7e3ec6 | ||
|
|
acefa2bb6e | ||
|
|
36551172f3 | ||
|
|
c26f4ef385 | ||
|
|
60816a8a82 | ||
|
|
d7d09712ef | ||
|
|
825f019226 | ||
|
|
ca5e5bb67f | ||
|
|
8191ff150e | ||
|
|
f2aeb13c68 | ||
|
|
ce76b4b3c2 | ||
|
|
44b9d6f162 | ||
|
|
53e80e8aa2 | ||
|
|
f94aa5ceb1 | ||
|
|
3e4b9868a0 | ||
|
|
4d86df04a0 |
@ -3,6 +3,3 @@
|
||||
directory = "/usr/share/cargo/registry"
|
||||
[source.crates-io]
|
||||
replace-with = "debian-packages"
|
||||
|
||||
[profile.release]
|
||||
debug=true
|
||||
30
.gitignore
vendored
@ -1,32 +1,16 @@
|
||||
local.mak
|
||||
/target
|
||||
**/*.rs.bk
|
||||
*.5
|
||||
*.7
|
||||
*~
|
||||
*.backup
|
||||
*.backup[0-9]
|
||||
*.backup[0-9][0-9]
|
||||
*.old
|
||||
*.old[0-9]
|
||||
*.old[0-9][0-9]
|
||||
*~
|
||||
/*.build
|
||||
/*.buildinfo
|
||||
/*.changes
|
||||
/*.deb
|
||||
/*.dsc
|
||||
/*.tar*
|
||||
/.do-cargo-build
|
||||
/Cargo.lock
|
||||
/docs/*/synopsis.rst
|
||||
/docs/config/*/config.rst
|
||||
/docs/config/acl/roles.rst
|
||||
/docs/output
|
||||
/docs/proxmox-backup-client/catalog-shell-synopsis.rst
|
||||
# all services are generated from a .in file to set the libexec path
|
||||
/etc/*.service
|
||||
/proxmox-backup-server-dpkg-contents.txt
|
||||
/www/.lint-incremental
|
||||
/www/js/
|
||||
*.5
|
||||
*.7
|
||||
__pycache__/
|
||||
/etc/proxmox-backup.service
|
||||
/etc/proxmox-backup-proxy.service
|
||||
build/
|
||||
local.mak
|
||||
target/
|
||||
|
||||
298
Cargo.toml
@ -1,5 +1,6 @@
|
||||
[workspace.package]
|
||||
version = "4.0.6"
|
||||
[package]
|
||||
name = "proxmox-backup"
|
||||
version = "1.1.14"
|
||||
authors = [
|
||||
"Dietmar Maurer <dietmar@proxmox.com>",
|
||||
"Dominik Csapak <d.csapak@proxmox.com>",
|
||||
@ -10,295 +11,82 @@ authors = [
|
||||
"Wolfgang Bumiller <w.bumiller@proxmox.com>",
|
||||
"Proxmox Support Team <support@proxmox.com>",
|
||||
]
|
||||
edition = "2021"
|
||||
edition = "2018"
|
||||
license = "AGPL-3"
|
||||
repository = "https://git.proxmox.com/?p=proxmox-backup.git"
|
||||
rust-version = "1.81"
|
||||
|
||||
[package]
|
||||
name = "proxmox-backup"
|
||||
description = "Proxmox Backup"
|
||||
homepage = "https://www.proxmox.com"
|
||||
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
repository.workspace = true
|
||||
build = "build.rs"
|
||||
|
||||
exclude = [ "build", "debian", "tests/catar_data/test_symlink/symlink1"]
|
||||
|
||||
[workspace]
|
||||
members = [
|
||||
"pbs-buildcfg",
|
||||
"pbs-client",
|
||||
"pbs-config",
|
||||
"pbs-datastore",
|
||||
"pbs-fuse-loop",
|
||||
"pbs-key-config",
|
||||
"pbs-pxar-fuse",
|
||||
"pbs-tape",
|
||||
"pbs-tools",
|
||||
|
||||
"proxmox-backup-banner",
|
||||
"proxmox-backup-client",
|
||||
"proxmox-file-restore",
|
||||
"proxmox-restore-daemon",
|
||||
|
||||
"pxar-bin",
|
||||
]
|
||||
|
||||
[lib]
|
||||
name = "proxmox_backup"
|
||||
path = "src/lib.rs"
|
||||
|
||||
[workspace.dependencies]
|
||||
# proxmox workspace
|
||||
proxmox-apt = { version = "0.99", features = [ "cache" ] }
|
||||
proxmox-apt-api-types = "2"
|
||||
proxmox-async = "0.5"
|
||||
proxmox-auth-api = "1.0.2"
|
||||
proxmox-base64 = "1"
|
||||
proxmox-borrow = "1"
|
||||
proxmox-compression = "1"
|
||||
proxmox-config-digest = "1"
|
||||
proxmox-daemon = "1"
|
||||
proxmox-fuse = "1"
|
||||
proxmox-http = { version = "1", features = [ "client", "http-helpers", "websocket" ] } # see below
|
||||
proxmox-human-byte = "1"
|
||||
proxmox-io = "1.0.1" # tools and client use "tokio" feature
|
||||
proxmox-lang = "1.1"
|
||||
proxmox-log = "1"
|
||||
proxmox-ldap = "1"
|
||||
proxmox-metrics = "1"
|
||||
proxmox-notify = "1"
|
||||
proxmox-openid = "1"
|
||||
proxmox-rest-server = { version = "1.0.1", features = [ "templates" ] }
|
||||
# some use "cli", some use "cli" and "server", pbs-config uses nothing
|
||||
proxmox-router = { version = "3.2.2", default-features = false }
|
||||
proxmox-rrd = "1"
|
||||
proxmox-rrd-api-types = "1.0.2"
|
||||
proxmox-s3-client = { version = "1.0.5", features = [ "impl" ] }
|
||||
# everything but pbs-config and pbs-client use "api-macro"
|
||||
proxmox-schema = "4"
|
||||
proxmox-section-config = "3"
|
||||
proxmox-serde = "1"
|
||||
proxmox-shared-cache = "1"
|
||||
proxmox-shared-memory = "1"
|
||||
proxmox-sortable-macro = "1"
|
||||
proxmox-subscription = { version = "1", features = [ "api-types" ] }
|
||||
proxmox-sys = "1"
|
||||
proxmox-systemd = "1"
|
||||
proxmox-tfa = { version = "6", features = [ "api", "api-types" ] }
|
||||
proxmox-time = "2"
|
||||
proxmox-uuid = { version = "1", features = [ "serde" ] }
|
||||
proxmox-worker-task = "1"
|
||||
pbs-api-types = "1.0.2"
|
||||
|
||||
# other proxmox crates
|
||||
pathpatterns = "1"
|
||||
proxmox-acme = "1"
|
||||
pxar = "1"
|
||||
|
||||
# PBS workspace
|
||||
pbs-buildcfg = { path = "pbs-buildcfg" }
|
||||
pbs-client = { path = "pbs-client" }
|
||||
pbs-config = { path = "pbs-config" }
|
||||
pbs-datastore = { path = "pbs-datastore" }
|
||||
pbs-fuse-loop = { path = "pbs-fuse-loop" }
|
||||
pbs-key-config = { path = "pbs-key-config" }
|
||||
pbs-pxar-fuse = { path = "pbs-pxar-fuse" }
|
||||
pbs-tape = { path = "pbs-tape" }
|
||||
pbs-tools = { path = "pbs-tools" }
|
||||
|
||||
# regular crates
|
||||
anyhow = "1.0"
|
||||
async-trait = "0.1.56"
|
||||
[dependencies]
|
||||
apt-pkg-native = "0.3.2"
|
||||
bitflags = "2.4"
|
||||
base64 = "0.12"
|
||||
bitflags = "1.2.1"
|
||||
bytes = "1.0"
|
||||
cidr = "0.3"
|
||||
crc32fast = "1"
|
||||
const_format = "0.2"
|
||||
crossbeam-channel = "0.5"
|
||||
endian_trait = { version = "0.6", features = ["arrays"] }
|
||||
env_logger = "0.11"
|
||||
env_logger = "0.7"
|
||||
flate2 = "1.0"
|
||||
anyhow = "1.0"
|
||||
foreign-types = "0.3"
|
||||
thiserror = "1.0"
|
||||
futures = "0.3"
|
||||
h2 = { version = "0.4", features = [ "stream" ] }
|
||||
h2 = { version = "0.3", features = [ "stream" ] }
|
||||
handlebars = "3.0"
|
||||
hex = "0.4.3"
|
||||
hickory-resolver = { version = "0.24.1", default-features = false, features = [ "system-config", "tokio-runtime" ] }
|
||||
http-body-util = "0.1"
|
||||
hyper-util = "0.1"
|
||||
hyper = { version = "1", features = [ "full" ] }
|
||||
http = "0.2"
|
||||
hyper = { version = "0.14", features = [ "full" ] }
|
||||
lazy_static = "1.4"
|
||||
libc = "0.2"
|
||||
log = "0.4.17"
|
||||
nix = "0.29"
|
||||
nom = "7"
|
||||
log = "0.4"
|
||||
nix = "0.19.1"
|
||||
num-traits = "0.2"
|
||||
once_cell = "1.3.1"
|
||||
openssl = "0.10.40"
|
||||
openssl = "0.10"
|
||||
pam = "0.7"
|
||||
pam-sys = "0.5"
|
||||
percent-encoding = "2.1"
|
||||
pin-project-lite = "0.2"
|
||||
regex = "1.5.5"
|
||||
rustyline = "14"
|
||||
pin-utils = "0.1.0"
|
||||
pin-project = "1.0"
|
||||
regex = "1.2"
|
||||
rustyline = "7"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
siphasher = "0.3"
|
||||
syslog = "6"
|
||||
tar = "0.4"
|
||||
termcolor = "1.1.2"
|
||||
thiserror = "2"
|
||||
tokio = "1.6"
|
||||
syslog = "4.0"
|
||||
tokio = { version = "1.6", features = [ "fs", "io-util", "io-std", "macros", "net", "parking_lot", "process", "rt", "rt-multi-thread", "signal", "time" ] }
|
||||
tokio-openssl = "0.6.1"
|
||||
tokio-stream = "0.1.0"
|
||||
tokio-util = { version = "0.7", features = [ "io" ] }
|
||||
tracing = "0.1"
|
||||
tokio-util = { version = "0.6", features = [ "codec", "io" ] }
|
||||
tower-service = "0.3.0"
|
||||
udev = "0.9"
|
||||
udev = ">= 0.3, <0.5"
|
||||
url = "2.1"
|
||||
walkdir = "2"
|
||||
xdg = "2.2"
|
||||
zstd = "0.13"
|
||||
zstd-safe = "7"
|
||||
|
||||
[dependencies]
|
||||
anyhow.workspace = true
|
||||
async-trait.workspace = true
|
||||
bytes.workspace = true
|
||||
cidr.workspace = true
|
||||
const_format.workspace = true
|
||||
crc32fast.workspace = true
|
||||
crossbeam-channel.workspace = true
|
||||
endian_trait.workspace = true
|
||||
futures.workspace = true
|
||||
h2.workspace = true
|
||||
hex.workspace = true
|
||||
http-body-util.workspace = true
|
||||
hyper.workspace = true
|
||||
hyper-util = { workspace = true, features = ["server", "server-auto", "server-graceful"] }
|
||||
libc.workspace = true
|
||||
log.workspace = true
|
||||
nix.workspace = true
|
||||
nom.workspace = true
|
||||
num-traits.workspace = true
|
||||
once_cell.workspace = true
|
||||
openssl.workspace = true
|
||||
percent-encoding.workspace = true
|
||||
regex.workspace = true
|
||||
rustyline.workspace = true
|
||||
serde.workspace = true
|
||||
serde_json.workspace = true
|
||||
syslog.workspace = true
|
||||
termcolor.workspace = true
|
||||
thiserror.workspace = true
|
||||
tokio = { workspace = true, features = [ "fs", "io-util", "io-std", "macros", "net", "parking_lot", "process", "rt", "rt-multi-thread", "signal", "time" ] }
|
||||
tokio-openssl.workspace = true
|
||||
tokio-stream.workspace = true
|
||||
tokio-util = { workspace = true, features = [ "codec" ] }
|
||||
tracing.workspace = true
|
||||
udev.workspace = true
|
||||
url.workspace = true
|
||||
walkdir.workspace = true
|
||||
zstd.workspace = true
|
||||
|
||||
#valgrind_request = { git = "https://github.com/edef1c/libvalgrind_request", version = "1.1.0", optional = true }
|
||||
walkdir = "2"
|
||||
webauthn-rs = "0.2.5"
|
||||
xdg = "2.2"
|
||||
zstd = { version = "0.4", features = [ "bindgen" ] }
|
||||
nom = "5.1"
|
||||
crossbeam-channel = "0.5"
|
||||
|
||||
# proxmox workspace
|
||||
proxmox-apt.workspace = true
|
||||
proxmox-apt-api-types.workspace = true
|
||||
proxmox-async.workspace = true
|
||||
proxmox-auth-api = { workspace = true, features = [ "api", "pam-authenticator" ] }
|
||||
proxmox-base64.workspace = true
|
||||
proxmox-compression.workspace = true
|
||||
proxmox-config-digest.workspace = true
|
||||
proxmox-daemon.workspace = true
|
||||
proxmox-http = { workspace = true, features = [ "body", "client-trait", "proxmox-async", "rate-limited-stream" ] } # pbs-client doesn't use these
|
||||
proxmox-human-byte.workspace = true
|
||||
proxmox-io.workspace = true
|
||||
proxmox-lang.workspace = true
|
||||
proxmox-log.workspace = true
|
||||
proxmox-ldap.workspace = true
|
||||
proxmox-metrics.workspace = true
|
||||
proxmox-notify = { workspace = true, features = [ "pbs-context" ] }
|
||||
proxmox-openid.workspace = true
|
||||
proxmox-rest-server = { workspace = true, features = [ "rate-limited-stream" ] }
|
||||
proxmox-router = { workspace = true, features = [ "cli", "server"] }
|
||||
proxmox-s3-client.workspace = true
|
||||
proxmox-schema = { workspace = true, features = [ "api-macro" ] }
|
||||
proxmox-section-config.workspace = true
|
||||
proxmox-serde = { workspace = true, features = [ "serde_json" ] }
|
||||
proxmox-shared-cache.workspace = true
|
||||
proxmox-shared-memory.workspace = true
|
||||
proxmox-sortable-macro.workspace = true
|
||||
proxmox-subscription.workspace = true
|
||||
proxmox-sys = { workspace = true, features = [ "timer" ] }
|
||||
proxmox-systemd.workspace = true
|
||||
proxmox-tfa.workspace = true
|
||||
proxmox-time.workspace = true
|
||||
proxmox-uuid.workspace = true
|
||||
proxmox-worker-task.workspace = true
|
||||
pbs-api-types.workspace = true
|
||||
pathpatterns = "0.1.2"
|
||||
pxar = { version = "0.10.1", features = [ "tokio-io" ] }
|
||||
|
||||
# in their respective repo
|
||||
proxmox-acme.workspace = true
|
||||
pxar.workspace = true
|
||||
|
||||
# proxmox-backup workspace/internal crates
|
||||
pbs-buildcfg.workspace = true
|
||||
pbs-client.workspace = true
|
||||
pbs-config.workspace = true
|
||||
pbs-datastore.workspace = true
|
||||
pbs-key-config.workspace = true
|
||||
pbs-tape.workspace = true
|
||||
pbs-tools.workspace = true
|
||||
proxmox-rrd.workspace = true
|
||||
proxmox-rrd-api-types.workspace = true
|
||||
proxmox = { version = "0.11.6", features = [ "sortable-macro", "api-macro", "cli", "router", "tfa" ] }
|
||||
proxmox-acme-rs = "0.3"
|
||||
proxmox-fuse = "0.1.1"
|
||||
proxmox-http = { version = "0.2.1", features = [ "client", "http-helpers", "websocket" ] }
|
||||
|
||||
# Local path overrides
|
||||
# NOTE: You must run `cargo update` after changing this for it to take effect!
|
||||
[patch.crates-io]
|
||||
#pbs-api-types = { path = "../proxmox/pbs-api-types" }
|
||||
#proxmox-acme = { path = "../proxmox/proxmox-acme" }
|
||||
#proxmox-apt = { path = "../proxmox/proxmox-apt" }
|
||||
#proxmox-apt-api-types = { path = "../proxmox/proxmox-apt-api-types" }
|
||||
#proxmox-async = { path = "../proxmox/proxmox-async" }
|
||||
#proxmox-auth-api = { path = "../proxmox/proxmox-auth-api" }
|
||||
#proxmox-base64 = { path = "../proxmox/proxmox-base64" }
|
||||
#proxmox-borrow = { path = "../proxmox/proxmox-borrow" }
|
||||
#proxmox-compression = { path = "../proxmox/proxmox-compression" }
|
||||
#proxmox-config-digest = { path = "../proxmox/proxmox-config-digest" }
|
||||
#proxmox-daemon = { path = "../proxmox/proxmox-daemon" }
|
||||
#proxmox-fuse = { path = "../proxmox-fuse" }
|
||||
#proxmox-http = { path = "../proxmox/proxmox-http" }
|
||||
#proxmox-human-byte = { path = "../proxmox/proxmox-human-byte" }
|
||||
#proxmox-io = { path = "../proxmox/proxmox-io" }
|
||||
#proxmox-lang = { path = "../proxmox/proxmox-lang" }
|
||||
#proxmox-log = { path = "../proxmox/proxmox-log" }
|
||||
#proxmox-ldap = { path = "../proxmox/proxmox-ldap" }
|
||||
#proxmox-metrics = { path = "../proxmox/proxmox-metrics" }
|
||||
#proxmox-notify = { path = "../proxmox/proxmox-notify" }
|
||||
#proxmox-openid = { path = "../proxmox/proxmox-openid" }
|
||||
#proxmox-rest-server = { path = "../proxmox/proxmox-rest-server" }
|
||||
#proxmox-router = { path = "../proxmox/proxmox-router" }
|
||||
#proxmox-rrd = { path = "../proxmox/proxmox-rrd" }
|
||||
#proxmox-rrd-api-types = { path = "../proxmox/proxmox-rrd-api-types" }
|
||||
#proxmox-schema = { path = "../proxmox/proxmox-schema" }
|
||||
#proxmox-section-config = { path = "../proxmox/proxmox-section-config" }
|
||||
#proxmox-serde = { path = "../proxmox/proxmox-serde" }
|
||||
#proxmox-shared-memory = { path = "../proxmox/proxmox-shared-memory" }
|
||||
#proxmox-sortable-macro = { path = "../proxmox/proxmox-sortable-macro" }
|
||||
#proxmox-subscription = { path = "../proxmox/proxmox-subscription" }
|
||||
#proxmox-sys = { path = "../proxmox/proxmox-sys" }
|
||||
#proxmox-systemd = { path = "../proxmox/proxmox-systemd" }
|
||||
#proxmox-tfa = { path = "../proxmox/proxmox-tfa" }
|
||||
#proxmox-time = { path = "../proxmox/proxmox-time" }
|
||||
#proxmox-uuid = { path = "../proxmox/proxmox-uuid" }
|
||||
#proxmox-worker-task = { path = "../proxmox/proxmox-worker-task" }
|
||||
|
||||
#pathpatterns = {path = "../pathpatterns" }
|
||||
#pxar = { path = "../pxar" }
|
||||
#proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro", "cli", "router", "tfa" ] }
|
||||
#proxmox-http = { path = "../proxmox/proxmox-http", features = [ "client", "http-helpers", "websocket" ] }
|
||||
#pxar = { path = "../pxar", features = [ "tokio-io" ] }
|
||||
|
||||
[features]
|
||||
default = []
|
||||
|
||||
188
Makefile
@ -1,12 +1,10 @@
|
||||
include /usr/share/dpkg/default.mk
|
||||
include /usr/share/rustc/architecture.mk
|
||||
include defines.mk
|
||||
|
||||
PACKAGE := proxmox-backup
|
||||
ARCH := $(DEB_BUILD_ARCH)
|
||||
export DEB_HOST_RUST_TYPE
|
||||
|
||||
SUBDIRS := etc www docs templates
|
||||
SUBDIRS := etc www docs
|
||||
|
||||
# Binaries usable by users
|
||||
USR_BIN := \
|
||||
@ -19,8 +17,7 @@ USR_BIN := \
|
||||
|
||||
# Binaries usable by admins
|
||||
USR_SBIN := \
|
||||
proxmox-backup-manager \
|
||||
proxmox-backup-debug
|
||||
proxmox-backup-manager
|
||||
|
||||
# Binaries for services:
|
||||
SERVICE_BIN := \
|
||||
@ -33,29 +30,13 @@ SERVICE_BIN := \
|
||||
RESTORE_BIN := \
|
||||
proxmox-restore-daemon
|
||||
|
||||
SUBCRATES != cargo metadata --no-deps --format-version=1 \
|
||||
| jq -r .workspace_members'[]' \
|
||||
| grep "$$PWD/" \
|
||||
| sed -e "s!.*$$PWD/!!g" -e 's/\#.*$$//g' -e 's/)$$//g'
|
||||
|
||||
# sync with debian/rules!
|
||||
STATIC_TARGET_DIR := target/static-build
|
||||
ifeq ($(BUILD_MODE), release)
|
||||
CARGO_BUILD_ARGS += --release --target $(DEB_HOST_RUST_TYPE)
|
||||
CARGO_STATIC_CONFIG ?= --config debian/cargo_home/config.static.toml
|
||||
CARGO_STATIC_BUILD_ARGS += $(CARGO_STATIC_CONFIG) --release --target $(DEB_HOST_RUST_TYPE) --target-dir $(STATIC_TARGET_DIR)
|
||||
COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/release
|
||||
STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/release
|
||||
CARGO_BUILD_ARGS += --release
|
||||
COMPILEDIR := target/release
|
||||
else
|
||||
CARGO_BUILD_ARGS += --target $(DEB_HOST_RUST_TYPE)
|
||||
CARGO_STATIC_BUILD_ARGS += --target $(DEB_HOST_RUST_TYPE) --target-dir $(STATIC_TARGET_DIR)
|
||||
COMPILEDIR := target/$(DEB_HOST_RUST_TYPE)/debug
|
||||
STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug
|
||||
COMPILEDIR := target/debug
|
||||
endif
|
||||
|
||||
STATIC_RUSTC_FLAGS := -C target-feature=+crt-static -L $(STATIC_COMPILEDIR)/deps-stubs/
|
||||
# end sync with debian/rules
|
||||
|
||||
ifeq ($(valgrind), yes)
|
||||
CARGO_BUILD_ARGS += --features valgrind
|
||||
endif
|
||||
@ -65,31 +46,24 @@ CARGO ?= cargo
|
||||
COMPILED_BINS := \
|
||||
$(addprefix $(COMPILEDIR)/,$(USR_BIN) $(USR_SBIN) $(SERVICE_BIN) $(RESTORE_BIN))
|
||||
|
||||
STATIC_BINS := \
|
||||
$(addprefix $(STATIC_COMPILEDIR)/,proxmox-backup-client-static pxar-static)
|
||||
|
||||
export DEB_VERSION DEB_VERSION_UPSTREAM
|
||||
|
||||
SERVER_DEB=$(PACKAGE)-server_$(DEB_VERSION)_$(ARCH).deb
|
||||
SERVER_DBG_DEB=$(PACKAGE)-server-dbgsym_$(DEB_VERSION)_$(ARCH).deb
|
||||
CLIENT_DEB=$(PACKAGE)-client_$(DEB_VERSION)_$(ARCH).deb
|
||||
CLIENT_DBG_DEB=$(PACKAGE)-client-dbgsym_$(DEB_VERSION)_$(ARCH).deb
|
||||
RESTORE_DEB=proxmox-backup-file-restore_$(DEB_VERSION)_$(ARCH).deb
|
||||
RESTORE_DBG_DEB=proxmox-backup-file-restore-dbgsym_$(DEB_VERSION)_$(ARCH).deb
|
||||
STATIC_CLIENT_DEB=$(PACKAGE)-client-static_$(DEB_VERSION)_$(ARCH).deb
|
||||
STATIC_CLIENT_DBG_DEB=$(PACKAGE)-client-static-dbgsym_$(DEB_VERSION)_$(ARCH).deb
|
||||
DOC_DEB=$(PACKAGE)-docs_$(DEB_VERSION)_all.deb
|
||||
SERVER_DEB=${PACKAGE}-server_${DEB_VERSION}_${ARCH}.deb
|
||||
SERVER_DBG_DEB=${PACKAGE}-server-dbgsym_${DEB_VERSION}_${ARCH}.deb
|
||||
CLIENT_DEB=${PACKAGE}-client_${DEB_VERSION}_${ARCH}.deb
|
||||
CLIENT_DBG_DEB=${PACKAGE}-client-dbgsym_${DEB_VERSION}_${ARCH}.deb
|
||||
RESTORE_DEB=proxmox-backup-file-restore_${DEB_VERSION}_${ARCH}.deb
|
||||
RESTORE_DBG_DEB=proxmox-backup-file-restore-dbgsym_${DEB_VERSION}_${ARCH}.deb
|
||||
DOC_DEB=${PACKAGE}-docs_${DEB_VERSION}_all.deb
|
||||
|
||||
DEBS=$(SERVER_DEB) $(SERVER_DBG_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB) \
|
||||
$(RESTORE_DEB) $(RESTORE_DBG_DEB) $(STATIC_CLIENT_DEB) $(STATIC_CLIENT_DBG_DEB)
|
||||
DEBS=${SERVER_DEB} ${SERVER_DBG_DEB} ${CLIENT_DEB} ${CLIENT_DBG_DEB} \
|
||||
${RESTORE_DEB} ${RESTORE_DBG_DEB}
|
||||
|
||||
DSC = rust-$(PACKAGE)_$(DEB_VERSION).dsc
|
||||
DSC = rust-${PACKAGE}_${DEB_VERSION}.dsc
|
||||
|
||||
DESTDIR=
|
||||
|
||||
tests ?= --workspace
|
||||
|
||||
all: proxmox-backup-client-static $(SUBDIRS)
|
||||
all: cargo-build $(SUBDIRS)
|
||||
|
||||
.PHONY: $(SUBDIRS)
|
||||
$(SUBDIRS):
|
||||
@ -101,21 +75,25 @@ test:
|
||||
$(CARGO) test $(tests) $(CARGO_BUILD_ARGS)
|
||||
|
||||
doc:
|
||||
$(CARGO) doc --workspace --no-deps $(CARGO_BUILD_ARGS)
|
||||
$(CARGO) doc --no-deps $(CARGO_BUILD_ARGS)
|
||||
|
||||
# always re-create this dir
|
||||
.PHONY: build
|
||||
build:
|
||||
rm -rf build
|
||||
mkdir build
|
||||
git rev-parse HEAD > build/.repoid
|
||||
cp -a debian \
|
||||
Cargo.toml src \
|
||||
$(SUBCRATES) \
|
||||
docs etc examples tests www zsh-completions templates \
|
||||
defines.mk Makefile \
|
||||
./build/
|
||||
rm -f build/Cargo.lock
|
||||
rm -f debian/control
|
||||
debcargo package \
|
||||
--config debian/debcargo.toml \
|
||||
--changelog-ready \
|
||||
--no-overlay-write-back \
|
||||
--directory build \
|
||||
proxmox-backup \
|
||||
$(shell dpkg-parsechangelog -l debian/changelog -SVersion | sed -e 's/-.*//')
|
||||
sed -e '1,/^$$/ ! d' build/debian/control > build/debian/control.src
|
||||
cat build/debian/control.src build/debian/control.in > build/debian/control
|
||||
rm build/debian/control.in build/debian/control.src
|
||||
cp build/debian/control debian/control
|
||||
rm build/Cargo.lock
|
||||
find build/debian -name "*.hint" -delete
|
||||
$(foreach i,$(SUBDIRS), \
|
||||
$(MAKE) -C build/$(i) clean ;)
|
||||
@ -127,103 +105,51 @@ proxmox-backup-docs: build
|
||||
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean
|
||||
lintian $(DOC_DEB)
|
||||
|
||||
.PHONY: deb dsc deb-nodoc deb-nostrip
|
||||
deb-nodoc: build
|
||||
# copy the local target/ dir as a build-cache
|
||||
.PHONY: deb
|
||||
$(DEBS): deb
|
||||
deb: build
|
||||
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean --build-profiles=nodoc
|
||||
lintian $(DEBS)
|
||||
|
||||
deb-nostrip: build
|
||||
cd build; DEB_BUILD_OPTIONS=nostrip dpkg-buildpackage -b -us -uc
|
||||
lintian $(DEBS) $(DOC_DEB)
|
||||
|
||||
$(DEBS): deb
|
||||
deb: build
|
||||
cd build; dpkg-buildpackage -b -us -uc
|
||||
.PHONY: deb-all
|
||||
deb-all: build
|
||||
cd build; dpkg-buildpackage -b -us -uc --no-pre-clean
|
||||
lintian $(DEBS) $(DOC_DEB)
|
||||
|
||||
.PHONY: dsc
|
||||
dsc:
|
||||
rm -rf $(DSC) build/
|
||||
$(MAKE) $(DSC)
|
||||
dsc: $(DSC)
|
||||
$(DSC): build
|
||||
cd build; dpkg-buildpackage -S -us -uc -d -nc
|
||||
lintian $(DSC)
|
||||
|
||||
$(DSC): build
|
||||
cd build; dpkg-buildpackage -S -us -uc -d
|
||||
|
||||
sbuild: $(DSC)
|
||||
sbuild $<
|
||||
|
||||
.PHONY: clean distclean deb clean
|
||||
distclean: clean
|
||||
clean: clean-deb
|
||||
|
||||
clean:
|
||||
$(foreach i,$(SUBDIRS), \
|
||||
$(MAKE) -C $(i) clean ;)
|
||||
$(CARGO) clean
|
||||
|
||||
# allows one to avoid running cargo clean when one just wants to tidy up after a package build
|
||||
clean-deb:
|
||||
rm -rf build/
|
||||
rm -f *.deb *.dsc *.tar.* *.buildinfo *.build *.changes
|
||||
rm -rf *.deb *.dsc *.tar.gz *.buildinfo *.changes build
|
||||
find . -name '*~' -exec rm {} ';'
|
||||
|
||||
.PHONY: dinstall
|
||||
dinstall: $(SERVER_DEB) $(SERVER_DBG_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB)
|
||||
dinstall: ${SERVER_DEB} ${SERVER_DBG_DEB} ${CLIENT_DEB} ${CLIENT_DBG_DEB}
|
||||
dpkg -i $^
|
||||
|
||||
# make sure we build binaries before docs
|
||||
docs: $(COMPILEDIR)/dump-catalog-shell-cli $(COMPILEDIR)/docgen
|
||||
docs: cargo-build
|
||||
|
||||
.PHONY: cargo-build
|
||||
cargo-build:
|
||||
$(MAKE) $(COMPILED_BINS)
|
||||
$(CARGO) build $(CARGO_BUILD_ARGS)
|
||||
|
||||
$(COMPILED_BINS) $(COMPILEDIR)/dump-catalog-shell-cli $(COMPILEDIR)/docgen &:
|
||||
$(CARGO) build $(CARGO_BUILD_ARGS) \
|
||||
--package proxmox-backup-banner \
|
||||
--bin proxmox-backup-banner \
|
||||
--package proxmox-backup-client \
|
||||
--bin proxmox-backup-client \
|
||||
--bin dump-catalog-shell-cli \
|
||||
--bin proxmox-backup-debug \
|
||||
--package proxmox-file-restore \
|
||||
--bin proxmox-file-restore \
|
||||
--package pxar-bin \
|
||||
--bin pxar \
|
||||
--package pbs-tape \
|
||||
--bin pmt \
|
||||
--bin pmtx \
|
||||
--package proxmox-restore-daemon \
|
||||
--bin proxmox-restore-daemon \
|
||||
--package proxmox-backup \
|
||||
--bin docgen \
|
||||
--bin pbs3to4 \
|
||||
--bin proxmox-backup-api \
|
||||
--bin proxmox-backup-manager \
|
||||
--bin proxmox-backup-proxy \
|
||||
--bin proxmox-daily-update \
|
||||
--bin proxmox-file-restore \
|
||||
--bin proxmox-tape \
|
||||
--bin sg-tape-cmd
|
||||
touch "$@"
|
||||
|
||||
.PHONY: proxmox-backup-client-static
|
||||
proxmox-backup-client-static:
|
||||
$(MAKE) $(STATIC_BINS)
|
||||
|
||||
$(STATIC_BINS) &:
|
||||
mkdir -p $(STATIC_COMPILEDIR)/deps-stubs/ && \
|
||||
echo '!<arch>' > $(STATIC_COMPILEDIR)/deps-stubs/libsystemd.a # workaround for to greedy linkage and proxmox-systemd
|
||||
OPENSSL_STATIC=1 \
|
||||
RUSTFLAGS="$(STATIC_RUSTC_FLAGS)" \
|
||||
$(CARGO) build $(CARGO_STATIC_BUILD_ARGS) --package pxar-bin --bin pxar
|
||||
OPENSSL_STATIC=1 \
|
||||
RUSTFLAGS="$(STATIC_RUSTC_FLAGS)" \
|
||||
$(CARGO) build $(CARGO_STATIC_BUILD_ARGS) --package proxmox-backup-client --bin proxmox-backup-client
|
||||
$(COMPILED_BINS): cargo-build
|
||||
|
||||
.PHONY: lint
|
||||
lint:
|
||||
cargo clippy -- -A clippy::all -D clippy::correctness
|
||||
|
||||
install: $(COMPILED_BINS) $(STATIC_BINS)
|
||||
install: $(COMPILED_BINS)
|
||||
install -dm755 $(DESTDIR)$(BINDIR)
|
||||
install -dm755 $(DESTDIR)$(ZSH_COMPL_DEST)
|
||||
$(foreach i,$(USR_BIN), \
|
||||
@ -233,7 +159,6 @@ install: $(COMPILED_BINS) $(STATIC_BINS)
|
||||
$(foreach i,$(USR_SBIN), \
|
||||
install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(SBINDIR)/ ; \
|
||||
install -m644 zsh-completions/_$(i) $(DESTDIR)$(ZSH_COMPL_DEST)/ ;)
|
||||
install -m755 $(COMPILEDIR)/pbs3to4 $(DESTDIR)$(SBINDIR)/
|
||||
install -dm755 $(DESTDIR)$(LIBEXECDIR)/proxmox-backup
|
||||
install -dm755 $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/file-restore
|
||||
$(foreach i,$(RESTORE_BIN), \
|
||||
@ -242,19 +167,14 @@ install: $(COMPILED_BINS) $(STATIC_BINS)
|
||||
install -m4755 -o root -g root $(COMPILEDIR)/sg-tape-cmd $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/sg-tape-cmd
|
||||
$(foreach i,$(SERVICE_BIN), \
|
||||
install -m755 $(COMPILEDIR)/$(i) $(DESTDIR)$(LIBEXECDIR)/proxmox-backup/ ;)
|
||||
install -m755 $(STATIC_COMPILEDIR)/proxmox-backup-client $(DESTDIR)$(BINDIR)/proxmox-backup-client-static
|
||||
install -m755 $(STATIC_COMPILEDIR)/pxar $(DESTDIR)$(BINDIR)/pxar-static
|
||||
$(MAKE) -C www install
|
||||
$(MAKE) -C docs install
|
||||
$(MAKE) -C templates install
|
||||
|
||||
.PHONY: upload
|
||||
upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION)
|
||||
upload: $(SERVER_DEB) $(CLIENT_DEB) $(RESTORE_DEB) $(DOC_DEB) $(STATIC_CLIENT_DEB)
|
||||
upload: ${SERVER_DEB} ${CLIENT_DEB} ${RESTORE_DEB} ${DOC_DEB}
|
||||
# check if working directory is clean
|
||||
git diff --exit-code --stat && git diff --exit-code --stat --staged
|
||||
tar cf - $(SERVER_DEB) $(SERVER_DBG_DEB) $(DOC_DEB) $(CLIENT_DEB) $(CLIENT_DBG_DEB) \
|
||||
| ssh -X repoman@repo.proxmox.com upload --product pbs --dist $(UPLOAD_DIST)
|
||||
tar cf - $(CLIENT_DEB) $(CLIENT_DBG_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pve,pmg,pbs-client" --dist $(UPLOAD_DIST)
|
||||
tar cf - $(STATIC_CLIENT_DEB) $(STATIC_CLIENT_DBG_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pbs-client" --dist $(UPLOAD_DIST)
|
||||
tar cf - $(RESTORE_DEB) $(RESTORE_DBG_DEB) | ssh -X repoman@repo.proxmox.com upload --product "pve" --dist $(UPLOAD_DIST)
|
||||
tar cf - ${SERVER_DEB} ${SERVER_DBG_DEB} ${DOC_DEB} ${CLIENT_DEB} ${CLIENT_DBG_DEB} | \
|
||||
ssh -X repoman@repo.proxmox.com upload --product pbs --dist buster
|
||||
tar cf - ${CLIENT_DEB} ${CLIENT_DBG_DEB} | ssh -X repoman@repo.proxmox.com upload --product "pve,pmg,pbs-client" --dist buster
|
||||
tar cf - ${RESTORE_DEB} ${RESTORE_DBG_DEB} | ssh -X repoman@repo.proxmox.com upload --product "pve" --dist buster
|
||||
|
||||
46
README.rst
@ -1,15 +1,8 @@
|
||||
|
||||
Build & Release Notes
|
||||
*********************
|
||||
|
||||
``rustup`` Toolchain
|
||||
====================
|
||||
|
||||
We normally want to build with the ``rustc`` Debian package (see below). If you
|
||||
still want to use ``rustup`` for other reasons (e.g. to easily switch between
|
||||
the official stable, beta, and nightly compilers), you should set the following
|
||||
``rustup`` configuration to use the Debian-provided ``rustc`` compiler
|
||||
by default:
|
||||
We normally want to build with the ``rustc`` Debian package. To do that
|
||||
you can set the following ``rustup`` configuration:
|
||||
|
||||
# rustup toolchain link system /usr
|
||||
# rustup default system
|
||||
@ -33,7 +26,7 @@ pre-release version number (e.g., "0.1.1-dev.1" instead of "0.1.0").
|
||||
Local cargo config
|
||||
==================
|
||||
|
||||
This repository ships with a ``.cargo/config.toml`` that replaces the crates.io
|
||||
This repository ships with a ``.cargo/config`` that replaces the crates.io
|
||||
registry with packaged crates located in ``/usr/share/cargo/registry``.
|
||||
|
||||
A similar config is also applied building with dh_cargo. Cargo.lock needs to be
|
||||
@ -47,44 +40,41 @@ example for proxmox crate above).
|
||||
|
||||
Build
|
||||
=====
|
||||
on Debian 12 Bookworm
|
||||
on Debian Buster
|
||||
|
||||
Setup:
|
||||
1. # echo 'deb http://download.proxmox.com/debian/devel/ bookworm main' | sudo tee /etc/apt/sources.list.d/proxmox-devel.list
|
||||
2. # sudo wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
|
||||
1. # echo 'deb http://download.proxmox.com/debian/devel/ buster main' >> /etc/apt/sources.list.d/proxmox-devel.list
|
||||
2. # sudo wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
|
||||
3. # sudo apt update
|
||||
4. # sudo apt install devscripts debcargo clang
|
||||
5. # git clone git://git.proxmox.com/git/proxmox-backup.git
|
||||
6. # cd proxmox-backup; sudo mk-build-deps -ir
|
||||
6. # sudo mk-build-deps -ir
|
||||
|
||||
Note: 2. may be skipped if you already added the PVE or PBS package repository
|
||||
|
||||
You are now able to build using the Makefile or cargo itself, e.g.::
|
||||
You are now able to build using the Makefile or cargo itself.
|
||||
|
||||
# make deb
|
||||
# # or for a non-package build
|
||||
# cargo build --all --release
|
||||
|
||||
Design Notes
|
||||
************
|
||||
============
|
||||
|
||||
Here are some random thought about the software design (unless I find a better place).
|
||||
|
||||
|
||||
Large chunk sizes
|
||||
=================
|
||||
-----------------
|
||||
|
||||
It is important to notice that large chunk sizes are crucial for performance.
|
||||
We have a multi-user system, where different people can do different operations
|
||||
on a datastore at the same time, and most operation involves reading a series
|
||||
of chunks.
|
||||
It is important to notice that large chunk sizes are crucial for
|
||||
performance. We have a multi-user system, where different people can do
|
||||
different operations on a datastore at the same time, and most operation
|
||||
involves reading a series of chunks.
|
||||
|
||||
So what is the maximal theoretical speed we can get when reading a series of
|
||||
chunks? Reading a chunk sequence need the following steps:
|
||||
So what is the maximal theoretical speed we can get when reading a
|
||||
series of chunks? Reading a chunk sequence need the following steps:
|
||||
|
||||
- seek to the first chunk's start location
|
||||
- seek to the first chunk start location
|
||||
- read the chunk data
|
||||
- seek to the next chunk's start location
|
||||
- seek to the first chunk start location
|
||||
- read the chunk data
|
||||
- ...
|
||||
|
||||
|
||||
23
build.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// build.rs
|
||||
use std::env;
|
||||
use std::process::Command;
|
||||
|
||||
fn git_command(args: &[&str]) -> String {
|
||||
match Command::new("git").args(args).output() {
|
||||
Ok(output) => String::from_utf8(output.stdout).unwrap().trim_end().to_string(),
|
||||
Err(err) => {
|
||||
panic!("git {:?} failed: {}", args, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let repo_path = git_command(&["rev-parse", "--show-toplevel"]);
|
||||
let repoid = match env::var("REPOID") {
|
||||
Ok(repoid) => repoid,
|
||||
Err(_) => git_command(&["rev-parse", "HEAD"]),
|
||||
};
|
||||
|
||||
println!("cargo:rustc-env=REPOID={}", repoid);
|
||||
println!("cargo:rerun-if-changed={}/.git/HEAD", repo_path);
|
||||
}
|
||||
2460
debian/changelog
vendored
1
debian/compat
vendored
Normal file
@ -0,0 +1 @@
|
||||
12
|
||||
321
debian/control
vendored
@ -1,196 +1,126 @@
|
||||
Source: rust-proxmox-backup
|
||||
Section: admin
|
||||
Priority: optional
|
||||
Build-Depends: bash-completion,
|
||||
cargo:native (>= 0.65.0~),
|
||||
debhelper (>= 12~),
|
||||
debhelper-compat (= 13),
|
||||
dh-cargo (>= 24),
|
||||
fonts-dejavu-core <!nodoc>,
|
||||
fonts-lato <!nodoc>,
|
||||
fonts-open-sans <!nodoc>,
|
||||
graphviz <!nodoc>,
|
||||
jq,
|
||||
latexmk <!nodoc>,
|
||||
libacl1-dev,
|
||||
libfuse3-dev,
|
||||
librust-anyhow-1+default-dev,
|
||||
librust-async-trait-0.1+default-dev (>= 0.1.56-~~),
|
||||
librust-bitflags-2+default-dev (>= 2.4-~~),
|
||||
librust-bytes-1+default-dev,
|
||||
librust-cidr-0.3+default-dev,
|
||||
librust-const-format-0.2+default-dev,
|
||||
librust-crc32fast-1+default-dev,
|
||||
librust-crossbeam-channel-0.5+default-dev,
|
||||
librust-endian-trait-0.6+arrays-dev,
|
||||
librust-endian-trait-0.6+default-dev,
|
||||
librust-env-logger-0.11+default-dev,
|
||||
librust-foreign-types-0.3+default-dev,
|
||||
librust-futures-0.3+default-dev,
|
||||
librust-h2-0.4+default-dev,
|
||||
librust-h2-0.4+stream-dev,
|
||||
librust-hex-0.4+default-dev (>= 0.4.3-~~),
|
||||
librust-hex-0.4+serde-dev (>= 0.4.3-~~),
|
||||
librust-hickory-resolver-0.24+system-config-dev (>= 0.24.1-~~),
|
||||
librust-hickory-resolver-0.24+tokio-runtime-dev (>= 0.24.1-~~),
|
||||
librust-http-body-util-0.1+default-dev,
|
||||
librust-hyper-1+default-dev,
|
||||
librust-hyper-1+full-dev,
|
||||
librust-hyper-util-0.1+client-dev,
|
||||
librust-hyper-util-0.1+client-legacy-dev,
|
||||
librust-hyper-util-0.1+default-dev,
|
||||
librust-hyper-util-0.1+http1-dev,
|
||||
librust-hyper-util-0.1+http2-dev,
|
||||
librust-hyper-util-0.1+server-auto-dev,
|
||||
librust-hyper-util-0.1+server-dev,
|
||||
librust-hyper-util-0.1+server-graceful-dev,
|
||||
librust-hyper-util-0.1+service-dev,
|
||||
librust-hyper-util-0.1+tokio-dev,
|
||||
librust-libc-0.2+default-dev,
|
||||
librust-log-0.4+default-dev (>= 0.4.17-~~),
|
||||
librust-nix-0.29+default-dev,
|
||||
librust-nix-0.29+feature-dev,
|
||||
librust-nix-0.29+mount-dev,
|
||||
librust-nix-0.29+reboot-dev,
|
||||
librust-nom-7+default-dev,
|
||||
librust-num-traits-0.2+default-dev,
|
||||
librust-once-cell-1+default-dev (>= 1.3.1-~~),
|
||||
librust-openssl-0.10+default-dev (>= 0.10.40-~~),
|
||||
librust-pathpatterns-1+default-dev,
|
||||
librust-pbs-api-types-1+default-dev (>= 1.0.2~~),
|
||||
librust-percent-encoding-2+default-dev (>= 2.1-~~),
|
||||
librust-pin-project-lite-0.2+default-dev,
|
||||
librust-proxmox-acme-1+default-dev,
|
||||
librust-proxmox-apt-0.99+cache-dev,
|
||||
librust-proxmox-apt-0.99+default-dev,
|
||||
librust-proxmox-apt-api-types-2+default-dev,
|
||||
librust-proxmox-async-0.5+default-dev,
|
||||
librust-proxmox-auth-api-1+api-dev (>= 1.0.2),
|
||||
librust-proxmox-auth-api-1+default-dev,
|
||||
librust-proxmox-auth-api-1+pam-authenticator-dev,
|
||||
librust-proxmox-base64-1+default-dev,
|
||||
librust-proxmox-borrow-1+default-dev,
|
||||
librust-proxmox-compression-1+default-dev,
|
||||
librust-proxmox-config-digest-1+default-dev,
|
||||
librust-proxmox-daemon-1+default-dev,
|
||||
librust-proxmox-fuse-1+default-dev,
|
||||
librust-proxmox-http-1+body-dev,
|
||||
librust-proxmox-http-1+client-dev,
|
||||
librust-proxmox-http-1+client-trait-dev,
|
||||
librust-proxmox-http-1+default-dev,
|
||||
librust-proxmox-http-1+http-helpers-dev,
|
||||
librust-proxmox-http-1+proxmox-async-dev,
|
||||
librust-proxmox-http-1+rate-limited-stream-dev,
|
||||
librust-proxmox-http-1+rate-limiter-dev,
|
||||
librust-proxmox-http-1+websocket-dev,
|
||||
librust-proxmox-human-byte-1+default-dev,
|
||||
librust-proxmox-io-1+default-dev (>= 1.0.1-~~),
|
||||
librust-proxmox-io-1+tokio-dev (>= 1.0.1-~~),
|
||||
librust-proxmox-lang-1+default-dev (>= 1.1-~~),
|
||||
librust-proxmox-ldap-1+default-dev,
|
||||
librust-proxmox-log-1+default-dev,
|
||||
librust-proxmox-metrics-1+default-dev,
|
||||
librust-proxmox-notify-1+default-dev,
|
||||
librust-proxmox-notify-1+pbs-context-dev,
|
||||
librust-proxmox-openid-1+default-dev,
|
||||
librust-proxmox-rest-server-1+default-dev (>= 1.0.1),
|
||||
librust-proxmox-rest-server-1+rate-limited-stream-dev,
|
||||
librust-proxmox-rest-server-1+templates-dev,
|
||||
librust-proxmox-router-3+cli-dev (>= 3.2.2-~),
|
||||
librust-proxmox-router-3+server-dev,
|
||||
librust-proxmox-rrd-1+default-dev,
|
||||
librust-proxmox-rrd-api-types-1+default-dev (>= 1.0.2-~~),
|
||||
librust-proxmox-s3-client-1-dev (>= 1.0.5),
|
||||
librust-proxmox-schema-4+api-macro-dev,
|
||||
librust-proxmox-schema-4+default-dev,
|
||||
librust-proxmox-section-config-3+default-dev,
|
||||
librust-proxmox-serde-1+default-dev,
|
||||
librust-proxmox-serde-1+serde-json-dev,
|
||||
librust-proxmox-shared-cache-1+default-dev,
|
||||
librust-proxmox-shared-memory-1+default-dev,
|
||||
librust-proxmox-sortable-macro-1+default-dev,
|
||||
librust-proxmox-subscription-1+api-types-dev,
|
||||
librust-proxmox-subscription-1+default-dev,
|
||||
librust-proxmox-sys-1+acl-dev,
|
||||
librust-proxmox-sys-1+crypt-dev,
|
||||
librust-proxmox-sys-1+default-dev,
|
||||
librust-proxmox-sys-1+logrotate-dev,
|
||||
librust-proxmox-sys-1+timer-dev,
|
||||
librust-proxmox-systemd-1+default-dev,
|
||||
librust-proxmox-tfa-6+api-dev,
|
||||
librust-proxmox-tfa-6+api-types-dev,
|
||||
librust-proxmox-tfa-6+default-dev,
|
||||
librust-proxmox-time-2+default-dev,
|
||||
librust-proxmox-uuid-1+default-dev,
|
||||
librust-proxmox-uuid-1+serde-dev,
|
||||
librust-proxmox-worker-task-1+default-dev,
|
||||
librust-pxar-1+default-dev,
|
||||
librust-regex-1+default-dev (>= 1.5.5-~~),
|
||||
librust-rustyline-14+default-dev,
|
||||
librust-serde-1+default-dev,
|
||||
librust-serde-1+derive-dev,
|
||||
librust-serde-json-1+default-dev,
|
||||
librust-syslog-6+default-dev,
|
||||
librust-tar-0.4+default-dev,
|
||||
librust-termcolor-1+default-dev (>= 1.1.2-~~),
|
||||
librust-thiserror-2+default-dev,
|
||||
librust-tokio-1+default-dev (>= 1.6-~~),
|
||||
librust-tokio-1+fs-dev (>= 1.6-~~),
|
||||
librust-tokio-1+io-std-dev (>= 1.6-~~),
|
||||
librust-tokio-1+io-util-dev (>= 1.6-~~),
|
||||
librust-tokio-1+macros-dev (>= 1.6-~~),
|
||||
librust-tokio-1+net-dev (>= 1.6-~~),
|
||||
librust-tokio-1+parking-lot-dev (>= 1.6-~~),
|
||||
librust-tokio-1+process-dev (>= 1.6-~~),
|
||||
librust-tokio-1+rt-dev (>= 1.6-~~),
|
||||
librust-tokio-1+rt-multi-thread-dev (>= 1.6-~~),
|
||||
librust-tokio-1+signal-dev (>= 1.6-~~),
|
||||
librust-tokio-1+sync-dev (>= 1.6-~~),
|
||||
librust-tokio-1+time-dev (>= 1.6-~~),
|
||||
librust-tokio-openssl-0.6+default-dev (>= 0.6.1-~~),
|
||||
librust-tokio-stream-0.1+default-dev,
|
||||
librust-tokio-util-0.7+codec-dev,
|
||||
librust-tokio-util-0.7+default-dev,
|
||||
librust-tokio-util-0.7+io-dev,
|
||||
librust-tower-service-0.3+default-dev,
|
||||
librust-tracing-0.1+default-dev,
|
||||
librust-udev-0.9+default-dev,
|
||||
librust-url-2+default-dev (>= 2.1-~~),
|
||||
librust-walkdir-2+default-dev,
|
||||
librust-xdg-2+default-dev (>= 2.2-~~),
|
||||
librust-zstd-0.13+default-dev,
|
||||
librust-zstd-safe-7+default-dev,
|
||||
libsgutils2-dev,
|
||||
libstd-rust-dev,
|
||||
libsystemd-dev (>= 246-~~),
|
||||
patchelf,
|
||||
proxmox-widget-toolkit-dev <!nodoc>,
|
||||
proxmox-biome,
|
||||
python3-docutils,
|
||||
python3-pygments,
|
||||
python3-sphinx <!nodoc>,
|
||||
rsync,
|
||||
rustc:native,
|
||||
texlive-fonts-extra <!nodoc>,
|
||||
texlive-fonts-recommended <!nodoc>,
|
||||
texlive-xetex <!nodoc>,
|
||||
uuid-dev,
|
||||
xindy <!nodoc>,
|
||||
Build-Depends: debhelper (>= 11),
|
||||
dh-cargo (>= 18),
|
||||
cargo:native,
|
||||
rustc:native,
|
||||
libstd-rust-dev,
|
||||
librust-anyhow-1+default-dev,
|
||||
librust-apt-pkg-native-0.3+default-dev (>= 0.3.2-~~),
|
||||
librust-base64-0.12+default-dev,
|
||||
librust-bitflags-1+default-dev (>= 1.2.1-~~),
|
||||
librust-bytes-1+default-dev,
|
||||
librust-crc32fast-1+default-dev,
|
||||
librust-crossbeam-channel-0.5+default-dev,
|
||||
librust-endian-trait-0.6+arrays-dev,
|
||||
librust-endian-trait-0.6+default-dev,
|
||||
librust-env-logger-0.7+default-dev,
|
||||
librust-flate2-1+default-dev,
|
||||
librust-foreign-types-0.3+default-dev,
|
||||
librust-futures-0.3+default-dev,
|
||||
librust-h2-0.3+default-dev,
|
||||
librust-h2-0.3+stream-dev,
|
||||
librust-handlebars-3+default-dev,
|
||||
librust-http-0.2+default-dev,
|
||||
librust-hyper-0.14+default-dev,
|
||||
librust-hyper-0.14+full-dev,
|
||||
librust-lazy-static-1+default-dev (>= 1.4-~~),
|
||||
librust-libc-0.2+default-dev,
|
||||
librust-log-0.4+default-dev,
|
||||
librust-nix-0.19+default-dev (>= 0.19.1-~~),
|
||||
librust-nom-5+default-dev (>= 5.1-~~),
|
||||
librust-num-traits-0.2+default-dev,
|
||||
librust-once-cell-1+default-dev (>= 1.3.1-~~),
|
||||
librust-openssl-0.10+default-dev,
|
||||
librust-pam-0.7+default-dev,
|
||||
librust-pam-sys-0.5+default-dev,
|
||||
librust-pathpatterns-0.1+default-dev (>= 0.1.2-~~),
|
||||
librust-percent-encoding-2+default-dev (>= 2.1-~~),
|
||||
librust-pin-project-1+default-dev,
|
||||
librust-pin-utils-0.1+default-dev,
|
||||
librust-proxmox-0.11+api-macro-dev (>= 0.11.6-~~),
|
||||
librust-proxmox-0.11+cli-dev (>= 0.11.6-~~),
|
||||
librust-proxmox-0.11+default-dev (>= 0.11.6-~~),
|
||||
librust-proxmox-0.11+router-dev (>= 0.11.6-~~),
|
||||
librust-proxmox-0.11+sortable-macro-dev (>= 0.11.6-~~),
|
||||
librust-proxmox-0.11+tfa-dev (>= 0.11.6-~~),
|
||||
librust-proxmox-acme-rs-0.3+default-dev,
|
||||
librust-proxmox-fuse-0.1+default-dev (>= 0.1.1-~~),
|
||||
librust-proxmox-http-0.2+client-dev (>= 0.2.1-~~),
|
||||
librust-proxmox-http-0.2+default-dev (>= 0.2.1-~~),
|
||||
librust-proxmox-http-0.2+http-helpers-dev (>= 0.2.1-~~),
|
||||
librust-proxmox-http-0.2+websocket-dev (>= 0.2.1-~~),
|
||||
librust-pxar-0.10+default-dev (>= 0.10.1-~~),
|
||||
librust-pxar-0.10+tokio-io-dev (>= 0.10.1-~~),
|
||||
librust-regex-1+default-dev (>= 1.2-~~),
|
||||
librust-rustyline-7+default-dev,
|
||||
librust-serde-1+default-dev,
|
||||
librust-serde-1+derive-dev,
|
||||
librust-serde-json-1+default-dev,
|
||||
librust-siphasher-0.3+default-dev,
|
||||
librust-syslog-4+default-dev,
|
||||
librust-thiserror-1+default-dev,
|
||||
librust-tokio-1+default-dev (>= 1.6-~~),
|
||||
librust-tokio-1+fs-dev (>= 1.6-~~),
|
||||
librust-tokio-1+io-std-dev (>= 1.6-~~),
|
||||
librust-tokio-1+io-util-dev (>= 1.6-~~),
|
||||
librust-tokio-1+macros-dev (>= 1.6-~~),
|
||||
librust-tokio-1+net-dev (>= 1.6-~~),
|
||||
librust-tokio-1+parking-lot-dev (>= 1.6-~~),
|
||||
librust-tokio-1+process-dev (>= 1.6-~~),
|
||||
librust-tokio-1+rt-dev (>= 1.6-~~),
|
||||
librust-tokio-1+rt-multi-thread-dev (>= 1.6-~~),
|
||||
librust-tokio-1+signal-dev (>= 1.6-~~),
|
||||
librust-tokio-1+time-dev (>= 1.6-~~),
|
||||
librust-tokio-openssl-0.6+default-dev (>= 0.6.1-~~),
|
||||
librust-tokio-stream-0.1+default-dev,
|
||||
librust-tokio-util-0.6+codec-dev,
|
||||
librust-tokio-util-0.6+default-dev,
|
||||
librust-tokio-util-0.6+io-dev,
|
||||
librust-tower-service-0.3+default-dev,
|
||||
librust-udev-0.4+default-dev | librust-udev-0.3+default-dev,
|
||||
librust-url-2+default-dev (>= 2.1-~~),
|
||||
librust-walkdir-2+default-dev,
|
||||
librust-webauthn-rs-0.2+default-dev (>= 0.2.5-~~),
|
||||
librust-xdg-2+default-dev (>= 2.2-~~),
|
||||
librust-zstd-0.4+bindgen-dev,
|
||||
librust-zstd-0.4+default-dev,
|
||||
libacl1-dev,
|
||||
libfuse3-dev,
|
||||
libsystemd-dev,
|
||||
uuid-dev,
|
||||
libsgutils2-dev,
|
||||
bash-completion,
|
||||
debhelper (>= 12~),
|
||||
fonts-dejavu-core <!nodoc>,
|
||||
fonts-lato <!nodoc>,
|
||||
fonts-open-sans <!nodoc>,
|
||||
graphviz <!nodoc>,
|
||||
latexmk <!nodoc>,
|
||||
patchelf,
|
||||
pve-eslint (>= 7.18.0-1),
|
||||
python3-docutils,
|
||||
python3-pygments,
|
||||
python3-sphinx <!nodoc>,
|
||||
rsync,
|
||||
texlive-fonts-extra <!nodoc>,
|
||||
texlive-fonts-recommended <!nodoc>,
|
||||
texlive-xetex <!nodoc>,
|
||||
xindy <!nodoc>
|
||||
Maintainer: Proxmox Support Team <support@proxmox.com>
|
||||
Standards-Version: 4.5.1
|
||||
Standards-Version: 4.4.1
|
||||
Vcs-Git: git://git.proxmox.com/git/proxmox-backup.git
|
||||
Vcs-Browser: https://git.proxmox.com/?p=proxmox-backup.git;a=summary
|
||||
Homepage: https://www.proxmox.com
|
||||
Rules-Requires-Root: binary-targets
|
||||
|
||||
Package: proxmox-backup-server
|
||||
Architecture: any
|
||||
Depends: fonts-font-awesome,
|
||||
gdisk,
|
||||
libjs-extjs (>= 7~),
|
||||
libjs-extjs (>= 6.0.1),
|
||||
libjs-qrcodejs (>= 1.20201119),
|
||||
libproxmox-acme-plugins,
|
||||
libsgutils2-1.48,
|
||||
libsgutils2-2,
|
||||
libzstd1 (>= 1.3.8),
|
||||
lvm2,
|
||||
openssh-server,
|
||||
@ -198,48 +128,43 @@ Depends: fonts-font-awesome,
|
||||
postfix | mail-transport-agent,
|
||||
proxmox-backup-docs,
|
||||
proxmox-mini-journalreader,
|
||||
proxmox-widget-toolkit (>= 4.3.3),
|
||||
proxmox-widget-toolkit (>= 2.6-2),
|
||||
pve-xtermjs (>= 4.7.0-1),
|
||||
sg3-utils,
|
||||
smartmontools,
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Recommends: ifupdown2,
|
||||
proxmox-mail-forward,
|
||||
proxmox-offline-mirror-helper,
|
||||
zfsutils-linux,
|
||||
Recommends: zfsutils-linux,
|
||||
ifupdown2,
|
||||
Description: Proxmox Backup Server daemon with tools and GUI
|
||||
This package contains the Proxmox Backup Server daemons and related
|
||||
tools. This includes a web-based graphical user interface.
|
||||
|
||||
Package: proxmox-backup-client
|
||||
Architecture: any
|
||||
Depends: qrencode, ${misc:Depends}, ${shlibs:Depends},
|
||||
Depends: qrencode,
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Description: Proxmox Backup Client tools
|
||||
This package contains the Proxmox Backup client, which provides a
|
||||
simple command line tool to create and restore backups.
|
||||
|
||||
Package: proxmox-backup-client-static
|
||||
Architecture: any
|
||||
Depends: qrencode, ${misc:Depends},
|
||||
Conflicts: proxmox-backup-client,
|
||||
Description: Proxmox Backup Client tools (statically linked)
|
||||
This package contains the Proxmox Backup client, which provides a
|
||||
simple command line tool to create and restore backups.
|
||||
|
||||
Package: proxmox-backup-docs
|
||||
Build-Profiles: <!nodoc>
|
||||
Section: doc
|
||||
Depends: fonts-font-awesome, libjs-extjs, libjs-mathjax, ${misc:Depends},
|
||||
Depends: libjs-extjs,
|
||||
libjs-mathjax,
|
||||
${misc:Depends},
|
||||
Architecture: all
|
||||
Description: Proxmox Backup Documentation
|
||||
This package contains the Proxmox Backup Documentation files.
|
||||
|
||||
Package: proxmox-backup-file-restore
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends},
|
||||
Recommends: proxmox-backup-restore-image, pve-qemu-kvm (>= 5.0.0-9),
|
||||
Breaks: proxmox-backup-restore-image (<< 0.3.1),
|
||||
Depends: ${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Recommends: pve-qemu-kvm (>= 5.0.0-9),
|
||||
proxmox-backup-restore-image,
|
||||
Description: Proxmox Backup single file restore tools for pxar and block device backups
|
||||
This package contains the Proxmox Backup single file restore client for
|
||||
restoring individual files and folders from both host/container and VM/block
|
||||
|
||||
55
debian/control.in
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
Package: proxmox-backup-server
|
||||
Architecture: any
|
||||
Depends: fonts-font-awesome,
|
||||
libjs-extjs (>= 6.0.1),
|
||||
libjs-qrcodejs (>= 1.20201119),
|
||||
libproxmox-acme-plugins,
|
||||
libsgutils2-2,
|
||||
libzstd1 (>= 1.3.8),
|
||||
lvm2,
|
||||
openssh-server,
|
||||
pbs-i18n,
|
||||
postfix | mail-transport-agent,
|
||||
proxmox-backup-docs,
|
||||
proxmox-mini-journalreader,
|
||||
proxmox-widget-toolkit (>= 2.6-2),
|
||||
pve-xtermjs (>= 4.7.0-1),
|
||||
sg3-utils,
|
||||
smartmontools,
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Recommends: zfsutils-linux,
|
||||
ifupdown2,
|
||||
Description: Proxmox Backup Server daemon with tools and GUI
|
||||
This package contains the Proxmox Backup Server daemons and related
|
||||
tools. This includes a web-based graphical user interface.
|
||||
|
||||
Package: proxmox-backup-client
|
||||
Architecture: any
|
||||
Depends: qrencode,
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Description: Proxmox Backup Client tools
|
||||
This package contains the Proxmox Backup client, which provides a
|
||||
simple command line tool to create and restore backups.
|
||||
|
||||
Package: proxmox-backup-docs
|
||||
Build-Profiles: <!nodoc>
|
||||
Section: doc
|
||||
Depends: libjs-extjs,
|
||||
libjs-mathjax,
|
||||
${misc:Depends},
|
||||
Architecture: all
|
||||
Description: Proxmox Backup Documentation
|
||||
This package contains the Proxmox Backup Documentation files.
|
||||
|
||||
Package: proxmox-backup-file-restore
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Recommends: pve-qemu-kvm (>= 5.0.0-9),
|
||||
proxmox-backup-restore-image,
|
||||
Description: Proxmox Backup single file restore tools for pxar and block device backups
|
||||
This package contains the Proxmox Backup single file restore client for
|
||||
restoring individual files and folders from both host/container and VM/block
|
||||
device backups. It includes a block device restore driver using QEMU.
|
||||
2
debian/copyright
vendored
@ -1,4 +1,4 @@
|
||||
Copyright (C) 2019 - 2025 Proxmox Server Solutions GmbH
|
||||
Copyright (C) 2019 - 2021 Proxmox Server Solutions GmbH
|
||||
|
||||
This software is written by Proxmox Server Solutions GmbH <support@proxmox.com>
|
||||
|
||||
|
||||
42
debian/debcargo.toml
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
overlay = "."
|
||||
crate_src_path = ".."
|
||||
whitelist = ["tests/*.c"]
|
||||
|
||||
maintainer = "Proxmox Support Team <support@proxmox.com>"
|
||||
|
||||
[source]
|
||||
vcs_git = "git://git.proxmox.com/git/proxmox-backup.git"
|
||||
vcs_browser = "https://git.proxmox.com/?p=proxmox-backup.git;a=summary"
|
||||
section = "admin"
|
||||
build_depends = [
|
||||
"bash-completion",
|
||||
"debhelper (>= 12~)",
|
||||
"fonts-dejavu-core <!nodoc>",
|
||||
"fonts-lato <!nodoc>",
|
||||
"fonts-open-sans <!nodoc>",
|
||||
"graphviz <!nodoc>",
|
||||
"latexmk <!nodoc>",
|
||||
"patchelf",
|
||||
"pve-eslint (>= 7.18.0-1)",
|
||||
"python3-docutils",
|
||||
"python3-pygments",
|
||||
"python3-sphinx <!nodoc>",
|
||||
"rsync",
|
||||
"texlive-fonts-extra <!nodoc>",
|
||||
"texlive-fonts-recommended <!nodoc>",
|
||||
"texlive-xetex <!nodoc>",
|
||||
"xindy <!nodoc>",
|
||||
]
|
||||
|
||||
build_depends_excludes = [
|
||||
"debhelper (>=11)",
|
||||
]
|
||||
|
||||
[packages.lib]
|
||||
depends = [
|
||||
"libacl1-dev",
|
||||
"libfuse3-dev",
|
||||
"libsystemd-dev",
|
||||
"uuid-dev",
|
||||
"libsgutils2-dev",
|
||||
]
|
||||
10
debian/lintian-overrides
vendored
@ -1,8 +1,2 @@
|
||||
proxmox-backup-server: elevated-privileges 4755 root/root [usr/lib/x86_64-linux-gnu/proxmox-backup/sg-tape-cmd]
|
||||
proxmox-backup-server: mail-transport-agent-dependency-does-not-specify-default-mta
|
||||
proxmox-backup-server: package-installs-apt-sources [etc/apt/sources.list.d/pbs-enterprise.sources]
|
||||
proxmox-backup-server: systemd-service-file-refers-to-unusual-wantedby-target getty.target [usr/lib/systemd/system/proxmox-backup-banner.service]
|
||||
proxmox-backup-server: uses-dpkg-database-directly [usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-api]
|
||||
proxmox-backup-server: uses-dpkg-database-directly [usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-proxy]
|
||||
proxmox-backup-server: uses-dpkg-database-directly [usr/sbin/pbs3to4]
|
||||
proxmox-backup-server: uses-dpkg-database-directly [usr/sbin/proxmox-backup-debug]
|
||||
proxmox-backup-server: package-installs-apt-sources etc/apt/sources.list.d/pbs-enterprise.list
|
||||
proxmox-backup-server: systemd-service-file-refers-to-unusual-wantedby-target lib/systemd/system/proxmox-backup-banner.service getty.target
|
||||
|
||||
74
debian/postinst
vendored
@ -9,49 +9,65 @@ case "$1" in
|
||||
# need to have user backup in the tape group
|
||||
usermod -a -G tape backup
|
||||
|
||||
# FIXME: remove after beta is over and add hunk to actively remove the repo
|
||||
BETA_SOURCES="/etc/apt/sources.list.d/pbs-test-for-beta.sources"
|
||||
if test -e /proxmox_install_mode && ! test -f "$BETA_SOURCES"; then
|
||||
echo "Adding pbs-test repo to '$BETA_SOURCES' to enable updates during Proxmox Backup Server 4.0 BETA"
|
||||
printf 'Types: deb\nURIs: http://download.proxmox.com/debian/pbs\nSuites: trixie\nComponents: pbs-test\nSigned-By: /usr/share/keyrings/proxmox-archive-keyring.gpg\n' \
|
||||
| tee "$BETA_SOURCES"
|
||||
fi
|
||||
|
||||
# modeled after dh_systemd_start output
|
||||
systemctl --system daemon-reload >/dev/null || true
|
||||
if [ -n "$2" ]; then
|
||||
_dh_action=try-reload-or-restart
|
||||
if dpkg --compare-versions "$2" 'lt' '1.0.7-1'; then
|
||||
# there was an issue with reloading and systemd being confused in older daemon versions
|
||||
# so restart instead of reload if upgrading from there, see commit 0ec79339f7aebf9
|
||||
# FIXME: remove with PBS 2.1
|
||||
echo "Upgrading from older proxmox-backup-server: restart (not reload) daemons"
|
||||
_dh_action=try-restart
|
||||
else
|
||||
_dh_action=try-reload-or-restart
|
||||
fi
|
||||
else
|
||||
_dh_action=start
|
||||
fi
|
||||
deb-systemd-invoke $_dh_action proxmox-backup.service proxmox-backup-proxy.service >/dev/null || true
|
||||
|
||||
# FIXME: Remove with 1.1
|
||||
if test -n "$2"; then
|
||||
if dpkg --compare-versions "$2" 'lt' '0.9.4-1'; then
|
||||
if grep -s -q -P -e '^\s+verify-schedule ' /etc/proxmox-backup/datastore.cfg; then
|
||||
echo "NOTE: drop all verify schedules from datastore config."
|
||||
echo "You can now add more flexible verify jobs"
|
||||
flock -w 30 /etc/proxmox-backup/.datastore.lck \
|
||||
sed -i '/^\s\+verify-schedule /d' /etc/proxmox-backup/datastore.cfg || true
|
||||
fi
|
||||
fi
|
||||
if dpkg --compare-versions "$2" 'le' '0.9.5-1'; then
|
||||
chown --quiet backup:backup /var/log/proxmox-backup/api/auth.log || true
|
||||
fi
|
||||
if dpkg --compare-versions "$2" 'le' '0.9.7-1'; then
|
||||
if [ -e /etc/proxmox-backup/remote.cfg ]; then
|
||||
echo "NOTE: Switching over remote.cfg to new field names.."
|
||||
flock -w 30 /etc/proxmox-backup/.remote.lck \
|
||||
sed -i \
|
||||
-e 's/^\s\+userid /\tauth-id /g' \
|
||||
/etc/proxmox-backup/remote.cfg || true
|
||||
fi
|
||||
fi
|
||||
if dpkg --compare-versions "$2" 'le' '1.0.14-1'; then
|
||||
# FIXME: Remove with 2.0
|
||||
if grep -s -q -P -e '^linux:' /etc/proxmox-backup/tape.cfg; then
|
||||
echo "========="
|
||||
echo "= NOTE: You have now unsupported 'linux' tape drives configured."
|
||||
echo "= * Execute 'udevadm control --reload-rules && udevadm trigger' to update /dev"
|
||||
echo "= * Edit '/etc/proxmox-backup/tape.cfg', remove 'linux' entries and re-add over CLI/GUI"
|
||||
echo "========="
|
||||
fi
|
||||
fi
|
||||
# FIXME: remove with 2.0
|
||||
if [ -d "/var/lib/proxmox-backup/tape" ] &&
|
||||
[ "$(stat --printf '%a' '/var/lib/proxmox-backup/tape')" != "750" ]; then
|
||||
chmod 0750 /var/lib/proxmox-backup/tape || true
|
||||
fi
|
||||
# FIXME: Remove in future version once we're sure no broken entries remain in anyone's files
|
||||
if grep -q -e ':termproxy::[^@]\+: ' /var/log/proxmox-backup/tasks/active; then
|
||||
echo "Fixing up termproxy user id in task log..."
|
||||
flock -w 30 /var/log/proxmox-backup/tasks/active.lock sed -i 's/:termproxy::\([^@]\+\): /:termproxy::\1@pam: /' /var/log/proxmox-backup/tasks/active || true
|
||||
fi
|
||||
|
||||
# TODO: remove with 4.1+, this was just exposed on internal testing.
|
||||
if dpkg --compare-versions "$2" 'lt' '4.0.5~'; then
|
||||
if [ -e /etc/proxmox-backup/s3.cfg ]; then
|
||||
sed -i 's/^s3client:/s3-endpoint:/' /etc/proxmox-backup/s3.cfg \
|
||||
|| echo "Failed to rename 's3client' config section-type to 's3-endpoint' in /etc/proxmox-backup/s3.cfg."
|
||||
fi
|
||||
fi
|
||||
|
||||
# TODO: remove with PBS 5+
|
||||
if dpkg --compare-versions "$2" 'lt' '4.0.2~'; then
|
||||
proxmox-backup-manager migrate-config default-notification-mode \
|
||||
|| echo "Failed migrate tape-job/datastore notification mode, please check manually"
|
||||
fi
|
||||
|
||||
if dpkg --compare-versions "$2" 'lt' '3.3.5~'; then
|
||||
# ensure old locking is used by the daemon until a reboot happened
|
||||
touch "/run/proxmox-backup/old-locking"
|
||||
fi
|
||||
|
||||
fi
|
||||
;;
|
||||
|
||||
|
||||
@ -1,2 +0,0 @@
|
||||
debian/proxmox-backup-client.bc proxmox-backup-client
|
||||
debian/pxar.bc pxar
|
||||
4
debian/proxmox-backup-client-static.install
vendored
@ -1,4 +0,0 @@
|
||||
usr/share/man/man1/proxmox-backup-client.1
|
||||
usr/share/man/man1/pxar.1
|
||||
usr/share/zsh/vendor-completions/_proxmox-backup-client
|
||||
usr/share/zsh/vendor-completions/_pxar
|
||||
@ -1,2 +0,0 @@
|
||||
proxmox-backup-client-static: embedded-library zlib [usr/bin/proxmox-backup-client]
|
||||
proxmox-backup-client-static: embedded-library zlib [usr/bin/pxar]
|
||||
8
debian/proxmox-backup-debug.bc
vendored
@ -1,8 +0,0 @@
|
||||
# proxmox-backup-debug bash completion
|
||||
|
||||
# see http://tiswww.case.edu/php/chet/bash/FAQ
|
||||
# and __ltrim_colon_completions() in /usr/share/bash-completion/bash_completion
|
||||
# this modifies global var, but I found no better way
|
||||
COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
|
||||
|
||||
complete -C 'proxmox-backup-debug bashcomplete' proxmox-backup-debug
|
||||
5
debian/proxmox-backup-docs.links
vendored
@ -1,6 +1,5 @@
|
||||
/usr/share/doc/proxmox-backup/proxmox-backup.pdf /usr/share/doc/proxmox-backup/html/proxmox-backup.pdf
|
||||
/usr/share/fonts-font-awesome/ /usr/share/doc/proxmox-backup/html/lto-barcode/font-awesome
|
||||
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/api-viewer/extjs
|
||||
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/lto-barcode/extjs
|
||||
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/prune-simulator/extjs
|
||||
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/lto-barcode/extjs
|
||||
/usr/share/javascript/extjs /usr/share/doc/proxmox-backup/html/api-viewer/extjs
|
||||
/usr/share/javascript/mathjax /usr/share/doc/proxmox-backup/html/_static/mathjax
|
||||
|
||||
1
debian/proxmox-backup-docs.lintian-overrides
vendored
@ -1 +0,0 @@
|
||||
proxmox-backup-docs: embedded-javascript-library please use * [usr/share/doc/proxmox-backup/html/_static/*.js]
|
||||
2
debian/proxmox-backup-file-restore.install
vendored
@ -1,4 +1,4 @@
|
||||
usr/bin/proxmox-file-restore
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/file-restore/proxmox-restore-daemon
|
||||
usr/share/man/man1/proxmox-file-restore.1
|
||||
usr/share/zsh/vendor-completions/_proxmox-file-restore
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/file-restore/proxmox-restore-daemon
|
||||
|
||||
4
debian/proxmox-backup-file-restore.postinst
vendored
@ -9,7 +9,7 @@ update_initramfs() {
|
||||
CACHE_PATH_DBG="/var/cache/proxmox-backup/file-restore-initramfs-debug.img"
|
||||
|
||||
# cleanup first, in case proxmox-file-restore was uninstalled since we do
|
||||
# not want an unusable image lying around
|
||||
# not want an unuseable image lying around
|
||||
rm -f "$CACHE_PATH"
|
||||
|
||||
if [ ! -f "$INST_PATH/initramfs.img" ]; then
|
||||
@ -71,6 +71,4 @@ case "$1" in
|
||||
;;
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
|
||||
1
debian/proxmox-backup-server.bash-completion
vendored
@ -1,5 +1,4 @@
|
||||
debian/proxmox-backup-manager.bc proxmox-backup-manager
|
||||
debian/proxmox-backup-debug.bc proxmox-backup-debug
|
||||
debian/proxmox-tape.bc proxmox-tape
|
||||
debian/pmtx.bc pmtx
|
||||
debian/pmt.bc pmt
|
||||
|
||||
77
debian/proxmox-backup-server.install
vendored
@ -1,76 +1,37 @@
|
||||
etc/pbs-enterprise.sources /etc/apt/sources.list.d/
|
||||
etc/proxmox-backup-banner.service /usr/lib/systemd/system/
|
||||
etc/proxmox-backup-daily-update.service /usr/lib/systemd/system/
|
||||
etc/proxmox-backup-daily-update.timer /usr/lib/systemd/system/
|
||||
etc/proxmox-backup-proxy.service /usr/lib/systemd/system/
|
||||
etc/proxmox-backup.service /usr/lib/systemd/system/
|
||||
etc/removable-device-attach@.service /usr/lib/systemd/system/
|
||||
usr/bin/pmt
|
||||
usr/bin/pmtx
|
||||
usr/bin/proxmox-tape
|
||||
etc/proxmox-backup-proxy.service /lib/systemd/system/
|
||||
etc/proxmox-backup.service /lib/systemd/system/
|
||||
etc/proxmox-backup-banner.service /lib/systemd/system/
|
||||
etc/proxmox-backup-daily-update.service /lib/systemd/system/
|
||||
etc/proxmox-backup-daily-update.timer /lib/systemd/system/
|
||||
etc/pbs-enterprise.list /etc/apt/sources.list.d/
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-api
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-banner
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-proxy
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-banner
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-daily-update
|
||||
usr/lib/x86_64-linux-gnu/proxmox-backup/sg-tape-cmd
|
||||
usr/sbin/pbs3to4
|
||||
usr/sbin/proxmox-backup-debug
|
||||
usr/sbin/proxmox-backup-manager
|
||||
usr/bin/pmtx
|
||||
usr/bin/pmt
|
||||
usr/bin/proxmox-tape
|
||||
usr/share/javascript/proxmox-backup/index.hbs
|
||||
usr/share/javascript/proxmox-backup/css/ext6-pbs.css
|
||||
usr/share/javascript/proxmox-backup/images
|
||||
usr/share/javascript/proxmox-backup/index.hbs
|
||||
usr/share/javascript/proxmox-backup/js/proxmox-backup-gui.js
|
||||
usr/share/man/man1/pbs3to4.1
|
||||
usr/share/man/man1/pmt.1
|
||||
usr/share/man/man1/pmtx.1
|
||||
usr/share/man/man1/proxmox-backup-debug.1
|
||||
usr/share/man/man1/proxmox-backup-manager.1
|
||||
usr/share/man/man1/proxmox-backup-proxy.1
|
||||
usr/share/man/man1/proxmox-tape.1
|
||||
usr/share/man/man1/pmtx.1
|
||||
usr/share/man/man1/pmt.1
|
||||
usr/share/man/man5/acl.cfg.5
|
||||
usr/share/man/man5/datastore.cfg.5
|
||||
usr/share/man/man5/domains.cfg.5
|
||||
usr/share/man/man5/media-pool.cfg.5
|
||||
usr/share/man/man5/notifications-priv.cfg.5
|
||||
usr/share/man/man5/notifications.cfg.5
|
||||
usr/share/man/man5/proxmox-backup.node.cfg.5
|
||||
usr/share/man/man5/prune.cfg.5
|
||||
usr/share/man/man5/user.cfg.5
|
||||
usr/share/man/man5/remote.cfg.5
|
||||
usr/share/man/man5/sync.cfg.5
|
||||
usr/share/man/man5/tape-job.cfg.5
|
||||
usr/share/man/man5/tape.cfg.5
|
||||
usr/share/man/man5/user.cfg.5
|
||||
usr/share/man/man5/verification.cfg.5
|
||||
usr/share/proxmox-backup/templates/default/acme-err-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/acme-err-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/gc-err-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/gc-err-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/gc-ok-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/gc-ok-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/package-updates-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/package-updates-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/prune-err-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/prune-err-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/prune-ok-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/prune-ok-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/sync-err-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/sync-err-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/sync-ok-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/sync-ok-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/tape-backup-err-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/tape-backup-err-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/tape-backup-ok-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/tape-backup-ok-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/tape-load-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/tape-load-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/test-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/test-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/verify-err-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/verify-err-subject.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/verify-ok-body.txt.hbs
|
||||
usr/share/proxmox-backup/templates/default/verify-ok-subject.txt.hbs
|
||||
usr/share/zsh/vendor-completions/_pmt
|
||||
usr/share/zsh/vendor-completions/_pmtx
|
||||
usr/share/zsh/vendor-completions/_proxmox-backup-debug
|
||||
usr/share/man/man5/media-pool.cfg.5
|
||||
usr/share/man/man5/tape.cfg.5
|
||||
usr/share/man/man5/tape-job.cfg.5
|
||||
usr/share/zsh/vendor-completions/_proxmox-backup-manager
|
||||
usr/share/zsh/vendor-completions/_proxmox-tape
|
||||
usr/share/zsh/vendor-completions/_pmtx
|
||||
usr/share/zsh/vendor-completions/_pmt
|
||||
|
||||
5
debian/proxmox-backup-server.udev
vendored
@ -5,7 +5,7 @@
|
||||
ACTION=="remove", GOTO="persistent_storage_tape_end"
|
||||
ENV{UDEV_DISABLE_PERSISTENT_STORAGE_RULES_FLAG}=="1", GOTO="persistent_storage_tape_end"
|
||||
|
||||
# also see: /usr/lib/udev/rules.d/60-persistent-storage-tape.rules
|
||||
# also see: /lib/udev/rules.d/60-persistent-storage-tape.rules
|
||||
|
||||
SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="1", IMPORT{program}="scsi_id --sg-version=3 --export --whitelisted -d $devnode", \
|
||||
SYMLINK+="tape/by-id/scsi-$env{ID_SERIAL}-sg"
|
||||
@ -16,6 +16,3 @@ SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="1", ENV{ID_SCSI_SER
|
||||
SYMLINK+="tape/by-id/scsi-$env{ID_SCSI_SERIAL}-sg"
|
||||
|
||||
LABEL="persistent_storage_tape_end"
|
||||
|
||||
# triggers the mounting of a removable device
|
||||
ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}!="", TAG+="systemd", ENV{SYSTEMD_WANTS}="removable-device-attach@$env{ID_FS_UUID}"
|
||||
|
||||
36
debian/rules
vendored
@ -7,18 +7,8 @@ include /usr/share/dpkg/pkg-info.mk
|
||||
include /usr/share/rustc/architecture.mk
|
||||
|
||||
export BUILD_MODE=release
|
||||
export CARGO_STATIC_CONFIG=--config debian/cargo_home/config.static.toml
|
||||
|
||||
# sync with Makefile!
|
||||
STATIC_TARGET_DIR := target/static-build
|
||||
ifeq ($(BUILD_MODE), release)
|
||||
STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/release
|
||||
else
|
||||
STATIC_COMPILEDIR := $(STATIC_TARGET_DIR)/$(DEB_HOST_RUST_TYPE)/debug
|
||||
endif
|
||||
# end sync with Makefile!
|
||||
|
||||
export CARGO=/usr/share/cargo/bin/cargo
|
||||
CARGO=/usr/share/cargo/bin/cargo
|
||||
|
||||
export CFLAGS CXXFLAGS CPPFLAGS LDFLAGS
|
||||
export DEB_HOST_RUST_TYPE DEB_HOST_GNU_TYPE
|
||||
@ -27,25 +17,11 @@ export CARGO_HOME = $(CURDIR)/debian/cargo_home
|
||||
export DEB_CARGO_CRATE=proxmox-backup_$(DEB_VERSION_UPSTREAM)
|
||||
export DEB_CARGO_PACKAGE=proxmox-backup
|
||||
|
||||
ifneq ("$(wildcard .repoid)","")
|
||||
export REPOID=$(shell cat .repoid)
|
||||
endif
|
||||
|
||||
%:
|
||||
dh $@ --with=bash-completion
|
||||
|
||||
override_dh_auto_configure:
|
||||
@perl -ne 'if (/^version\s*=\s*"(\d+(?:\.\d+)+)"/) { my $$v_cargo = $$1; my $$v_deb = "$(DEB_VERSION_UPSTREAM)"; \
|
||||
die "ERROR: d/changelog <-> Cargo.toml version mismatch: $$v_cargo != $$v_deb\n" if $$v_cargo ne $$v_deb; exit(0); }' Cargo.toml
|
||||
$(CARGO) prepare-debian $(CURDIR)/debian/cargo_registry --link-from-system
|
||||
# add a new config for static building, sync with Makefile!
|
||||
cp debian/cargo_home/config.toml debian/cargo_home/config.static.toml
|
||||
sed -ri -e 's!^(rustflags = .*)\]$$!\1, "-C", "target-feature=+crt-static", "-L", "$(STATIC_COMPILEDIR)/deps-stubs/"\]!' debian/cargo_home/config.static.toml
|
||||
# `cargo build` and `cargo install` have different config precedence, symlink
|
||||
# the wrapper config into a place where `build` picks it up as well..
|
||||
# https://doc.rust-lang.org/cargo/commands/cargo-install.html#configuration-discovery
|
||||
mkdir -p .cargo
|
||||
ln -s $(CARGO_HOME)/config.toml $(CURDIR)/.cargo/config.toml
|
||||
dh_auto_configure
|
||||
|
||||
override_dh_auto_build:
|
||||
@ -60,18 +36,20 @@ override_dh_auto_install:
|
||||
dh_auto_install -- \
|
||||
PROXY_USER=backup \
|
||||
LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH)
|
||||
mkdir -p debian/proxmox-backup-client-static/usr/bin
|
||||
mv debian/tmp/usr/bin/proxmox-backup-client-static debian/proxmox-backup-client-static/usr/bin/proxmox-backup-client
|
||||
mv debian/tmp/usr/bin/pxar-static debian/proxmox-backup-client-static/usr/bin/pxar
|
||||
|
||||
override_dh_installsystemd:
|
||||
dh_installsystemd -pproxmox-backup-server proxmox-backup-daily-update.timer
|
||||
# note: we start/try-reload-restart services manually in postinst
|
||||
dh_installsystemd --no-start --no-restart-after-upgrade --no-stop-on-upgrade
|
||||
dh_installsystemd --no-start --no-restart-after-upgrade
|
||||
|
||||
override_dh_fixperms:
|
||||
dh_fixperms --exclude sg-tape-cmd
|
||||
|
||||
# workaround https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=933541
|
||||
# TODO: remove once available (Debian 11 ?)
|
||||
override_dh_dwz:
|
||||
dh_dwz --no-dwz-multifile
|
||||
|
||||
override_dh_strip:
|
||||
dh_strip
|
||||
for exe in $$(find \
|
||||
|
||||
2
debian/source/lintian-overrides
vendored
@ -1,2 +0,0 @@
|
||||
rust-proxmox-backup source: field-too-long Build-Depends (* chars > 5000)
|
||||
rust-proxmox-backup source: absolute-symbolic-link-target-in-source /link/to/somewhere [tests/catar_data/test_symlink/symlink1]
|
||||
237
docs/Makefile
@ -1,105 +1,78 @@
|
||||
include ../defines.mk
|
||||
|
||||
GENERATED_SYNOPSIS := \
|
||||
config/acl/roles.rst \
|
||||
config/datastore/config.rst \
|
||||
config/domains/config.rst \
|
||||
config/media-pool/config.rst \
|
||||
config/notifications-priv/config.rst \
|
||||
config/notifications/config.rst \
|
||||
config/remote/config.rst \
|
||||
config/sync/config.rst \
|
||||
config/tape-job/config.rst \
|
||||
config/tape/config.rst \
|
||||
config/user/config.rst \
|
||||
config/verification/config.rst \
|
||||
config/prune/config.rst \
|
||||
pmt/synopsis.rst \
|
||||
pmtx/synopsis.rst \
|
||||
proxmox-backup-client/catalog-shell-synopsis.rst \
|
||||
proxmox-tape/synopsis.rst \
|
||||
proxmox-backup-client/synopsis.rst \
|
||||
proxmox-backup-debug/synopsis.rst \
|
||||
proxmox-backup-client/catalog-shell-synopsis.rst \
|
||||
proxmox-backup-manager/synopsis.rst \
|
||||
proxmox-file-restore/synopsis.rst \
|
||||
proxmox-tape/synopsis.rst \
|
||||
pxar/synopsis.rst \
|
||||
pmtx/synopsis.rst \
|
||||
pmt/synopsis.rst \
|
||||
config/media-pool/config.rst \
|
||||
config/tape/config.rst \
|
||||
config/tape-job/config.rst \
|
||||
config/user/config.rst \
|
||||
config/remote/config.rst \
|
||||
config/sync/config.rst \
|
||||
config/verification/config.rst \
|
||||
config/acl/roles.rst \
|
||||
config/datastore/config.rst
|
||||
|
||||
MAN1_PAGES := \
|
||||
pbs3to4.1 \
|
||||
pmt.1 \
|
||||
pmtx.1 \
|
||||
proxmox-backup-client.1 \
|
||||
proxmox-backup-debug.1 \
|
||||
proxmox-backup-manager.1 \
|
||||
proxmox-backup-proxy.1 \
|
||||
proxmox-file-restore.1 \
|
||||
proxmox-tape.1 \
|
||||
pxar.1 \
|
||||
pmtx.1 \
|
||||
pmt.1 \
|
||||
proxmox-tape.1 \
|
||||
proxmox-backup-proxy.1 \
|
||||
proxmox-backup-client.1 \
|
||||
proxmox-backup-manager.1 \
|
||||
proxmox-file-restore.1
|
||||
|
||||
# FIXME: prefix all man pages that are not directly relating to an existing executable with
|
||||
# `proxmox-backup.`, like the newer added proxmox-backup.node.cfg but add backwards compatible
|
||||
# symlinks, e.g. with a "5pbs" man page "suffix section".
|
||||
MAN5_PAGES := \
|
||||
acl.cfg.5 \
|
||||
datastore.cfg.5 \
|
||||
domains.cfg.5 \
|
||||
media-pool.cfg.5 \
|
||||
proxmox-backup.node.cfg.5 \
|
||||
notifications-priv.cfg.5 \
|
||||
notifications.cfg.5 \
|
||||
tape.cfg.5 \
|
||||
tape-job.cfg.5 \
|
||||
acl.cfg.5 \
|
||||
user.cfg.5 \
|
||||
remote.cfg.5 \
|
||||
sync.cfg.5 \
|
||||
tape-job.cfg.5 \
|
||||
tape.cfg.5 \
|
||||
user.cfg.5 \
|
||||
verification.cfg.5 \
|
||||
prune.cfg.5 \
|
||||
datastore.cfg.5
|
||||
|
||||
PRUNE_SIMULATOR_FILES := \
|
||||
prune-simulator/index.html \
|
||||
prune-simulator/clear-trigger.png \
|
||||
prune-simulator/documentation.html \
|
||||
prune-simulator/prune-simulator.js \
|
||||
|
||||
PRUNE_SIMULATOR_JS_SOURCE := \
|
||||
/usr/share/javascript/proxmox-widget-toolkit-dev/Toolkit.js \
|
||||
prune-simulator/prune-simulator_source.js
|
||||
|
||||
LTO_BARCODE_JS_SOURCE := \
|
||||
/usr/share/javascript/proxmox-widget-toolkit-dev/Toolkit.js \
|
||||
lto-barcode/code39.js \
|
||||
lto-barcode/prefix-field.js \
|
||||
lto-barcode/label-style.js \
|
||||
lto-barcode/tape-type.js \
|
||||
lto-barcode/paper-size.js \
|
||||
lto-barcode/page-layout.js \
|
||||
lto-barcode/page-calibration.js \
|
||||
lto-barcode/label-list.js \
|
||||
lto-barcode/label-setup.js \
|
||||
lto-barcode/lto-barcode.js
|
||||
prune-simulator/clear-trigger.png \
|
||||
prune-simulator/prune-simulator.js
|
||||
|
||||
LTO_BARCODE_FILES := \
|
||||
lto-barcode/index.html \
|
||||
lto-barcode/lto-barcode-generator.js
|
||||
lto-barcode/code39.js \
|
||||
lto-barcode/prefix-field.js \
|
||||
lto-barcode/label-style.js \
|
||||
lto-barcode/tape-type.js \
|
||||
lto-barcode/paper-size.js \
|
||||
lto-barcode/page-layout.js \
|
||||
lto-barcode/page-calibration.js \
|
||||
lto-barcode/label-list.js \
|
||||
lto-barcode/label-setup.js \
|
||||
lto-barcode/lto-barcode.js
|
||||
|
||||
API_VIEWER_SOURCES= \
|
||||
api-viewer/index.html \
|
||||
api-viewer/apidoc.js
|
||||
|
||||
API_VIEWER_FILES := \
|
||||
api-viewer/apidata.js \
|
||||
/usr/share/javascript/proxmox-widget-toolkit-dev/APIViewer.js \
|
||||
|
||||
# Sphinx documentation setup
|
||||
SPHINXOPTS = -E
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
BUILDDIR = output
|
||||
|
||||
ifeq ($(BUILD_MODE), release)
|
||||
COMPILEDIR := ../target/$(DEB_HOST_RUST_TYPE)/release
|
||||
COMPILEDIR := ../target/release
|
||||
SPHINXOPTS += -t release
|
||||
else
|
||||
COMPILEDIR := ../target/$(DEB_HOST_RUST_TYPE)/debug
|
||||
COMPILEDIR := ../target/debug
|
||||
SPHINXOPTS += -t devbuild
|
||||
endif
|
||||
|
||||
@ -108,23 +81,111 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(SPHINXOPTS) .
|
||||
|
||||
all: ${MAN1_PAGES} ${MAN5_PAGES}
|
||||
|
||||
config/%/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen $*.cfg >$@
|
||||
# Build manual pages using rst2man
|
||||
|
||||
pxar/synopsis.rst: ${COMPILEDIR}/pxar
|
||||
${COMPILEDIR}/pxar printdoc > pxar/synopsis.rst
|
||||
|
||||
pxar.1: pxar/man1.rst pxar/description.rst pxar/synopsis.rst
|
||||
rst2man $< >$@
|
||||
|
||||
|
||||
pmtx/synopsis.rst: ${COMPILEDIR}/pmtx
|
||||
${COMPILEDIR}/pmtx printdoc > pmtx/synopsis.rst
|
||||
|
||||
pmtx.1: pmtx/man1.rst pmtx/description.rst pmtx/synopsis.rst
|
||||
rst2man $< >$@
|
||||
|
||||
|
||||
pmt/synopsis.rst: ${COMPILEDIR}/pmt
|
||||
${COMPILEDIR}/pmt printdoc > pmt/synopsis.rst
|
||||
|
||||
pmt.1: pmt/man1.rst pmt/description.rst pmt/options.rst pmt/synopsis.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/datastore/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen datastore.cfg >$@
|
||||
|
||||
datastore.cfg.5: config/datastore/man5.rst config/datastore/config.rst config/datastore/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/user/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen user.cfg >$@
|
||||
|
||||
user.cfg.5: config/user/man5.rst config/user/config.rst config/user/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/remote/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen remote.cfg >$@
|
||||
|
||||
remote.cfg.5: config/remote/man5.rst config/remote/config.rst config/remote/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/sync/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen sync.cfg >$@
|
||||
|
||||
sync.cfg.5: config/sync/man5.rst config/sync/config.rst config/sync/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/verification/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen verification.cfg >$@
|
||||
|
||||
verification.cfg.5: config/verification/man5.rst config/verification/config.rst config/verification/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/acl/roles.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen "config::acl::Role" >$@
|
||||
|
||||
%/synopsis.rst: ${COMPILEDIR}/%
|
||||
$< printdoc > $@
|
||||
acl.cfg.5: config/acl/man5.rst config/acl/roles.rst config/acl/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/media-pool/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen media-pool.cfg >$@
|
||||
|
||||
media-pool.cfg.5: config/media-pool/man5.rst config/media-pool/config.rst config/media-pool/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/tape/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen tape.cfg >$@
|
||||
|
||||
tape.cfg.5: config/tape/man5.rst config/tape/config.rst config/tape/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
config/tape-job/config.rst: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen tape-job.cfg >$@
|
||||
|
||||
tape-job.cfg.5: config/tape-job/man5.rst config/tape-job/config.rst config/tape-job/format.rst
|
||||
rst2man $< >$@
|
||||
|
||||
proxmox-tape/synopsis.rst: ${COMPILEDIR}/proxmox-tape
|
||||
${COMPILEDIR}/proxmox-tape printdoc > proxmox-tape/synopsis.rst
|
||||
|
||||
proxmox-tape.1: proxmox-tape/man1.rst proxmox-tape/description.rst proxmox-tape/synopsis.rst
|
||||
rst2man $< >$@
|
||||
|
||||
proxmox-backup-client/synopsis.rst: ${COMPILEDIR}/proxmox-backup-client
|
||||
${COMPILEDIR}/proxmox-backup-client printdoc > proxmox-backup-client/synopsis.rst
|
||||
|
||||
proxmox-backup-client/catalog-shell-synopsis.rst: ${COMPILEDIR}/dump-catalog-shell-cli
|
||||
${COMPILEDIR}/dump-catalog-shell-cli > proxmox-backup-client/catalog-shell-synopsis.rst
|
||||
|
||||
${MAN1_PAGES} ${MAN5_PAGES}: man-pages
|
||||
proxmox-backup-client.1: proxmox-backup-client/man1.rst proxmox-backup-client/description.rst proxmox-backup-client/synopsis.rst proxmox-backup-client/catalog-shell-synopsis.rst
|
||||
rst2man $< >$@
|
||||
|
||||
.PHONY: man-pages
|
||||
man-pages: ${GENERATED_SYNOPSIS}
|
||||
${SPHINXBUILD} ${SPHINXOPTS} -b man ./ ${BUILDDIR}/man
|
||||
proxmox-backup-manager/synopsis.rst: ${COMPILEDIR}/proxmox-backup-manager
|
||||
${COMPILEDIR}/proxmox-backup-manager printdoc > proxmox-backup-manager/synopsis.rst
|
||||
|
||||
proxmox-backup-manager.1: proxmox-backup-manager/man1.rst proxmox-backup-manager/description.rst proxmox-backup-manager/synopsis.rst
|
||||
rst2man $< >$@
|
||||
|
||||
proxmox-backup-proxy.1: proxmox-backup-proxy/man1.rst proxmox-backup-proxy/description.rst
|
||||
rst2man $< >$@
|
||||
|
||||
proxmox-file-restore/synopsis.rst: ${COMPILEDIR}/proxmox-file-restore
|
||||
${COMPILEDIR}/proxmox-file-restore printdoc > proxmox-file-restore/synopsis.rst
|
||||
|
||||
proxmox-file-restore.1: proxmox-file-restore/man1.rst proxmox-file-restore/description.rst proxmox-file-restore/synopsis.rst
|
||||
rst2man $< >$@
|
||||
|
||||
.PHONY: onlinehelpinfo
|
||||
onlinehelpinfo:
|
||||
@ -135,22 +196,13 @@ onlinehelpinfo:
|
||||
api-viewer/apidata.js: ${COMPILEDIR}/docgen
|
||||
${COMPILEDIR}/docgen apidata.js >$@
|
||||
|
||||
api-viewer/apidoc.js: ${API_VIEWER_FILES}
|
||||
cat ${API_VIEWER_FILES} >$@.tmp
|
||||
mv $@.tmp $@
|
||||
|
||||
prune-simulator/prune-simulator.js: ${PRUNE_SIMULATOR_JS_SOURCE}
|
||||
cat ${PRUNE_SIMULATOR_JS_SOURCE} >$@.tmp
|
||||
mv $@.tmp $@
|
||||
|
||||
lto-barcode/lto-barcode-generator.js: ${LTO_BARCODE_JS_SOURCE}
|
||||
cat ${LTO_BARCODE_JS_SOURCE} >$@.tmp
|
||||
mv $@.tmp $@
|
||||
api-viewer/apidoc.js: api-viewer/apidata.js api-viewer/PBSAPI.js
|
||||
cat api-viewer/apidata.js api-viewer/PBSAPI.js >$@
|
||||
|
||||
.PHONY: html
|
||||
html: ${GENERATED_SYNOPSIS} images/proxmox-logo.svg _static/custom.css conf.py ${PRUNE_SIMULATOR_FILES} ${LTO_BARCODE_FILES} ${API_VIEWER_SOURCES}
|
||||
html: ${GENERATED_SYNOPSIS} images/proxmox-logo.svg custom.css conf.py ${PRUNE_SIMULATOR_FILES} ${LTO_BARCODE_FILES} ${API_VIEWER_SOURCES}
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
install -m 0644 _static/custom.js _static/custom.css images/proxmox-logo.svg $(BUILDDIR)/html/_static/
|
||||
install -m 0644 custom.js custom.css images/proxmox-logo.svg $(BUILDDIR)/html/_static/
|
||||
install -dm 0755 $(BUILDDIR)/html/prune-simulator
|
||||
install -m 0644 ${PRUNE_SIMULATOR_FILES} $(BUILDDIR)/html/prune-simulator
|
||||
install -dm 0755 $(BUILDDIR)/html/lto-barcode
|
||||
@ -176,13 +228,14 @@ epub3: ${GENERATED_SYNOPSIS}
|
||||
|
||||
clean:
|
||||
rm -r -f *~ *.1 ${BUILDDIR} ${GENERATED_SYNOPSIS} api-viewer/apidata.js
|
||||
rm -f api-viewer/apidoc.js lto-barcode/lto-barcode-generator.js prune-simulator/prune-simulator.js
|
||||
rm -f api-viewer/apidoc.js lto-barcode/lto-barcode-generator.js
|
||||
|
||||
install_manual_pages: man-pages
|
||||
|
||||
install_manual_pages: ${MAN1_PAGES} ${MAN5_PAGES}
|
||||
install -dm755 $(DESTDIR)$(MAN1DIR)
|
||||
for i in ${MAN1_PAGES}; do install -m755 ${BUILDDIR}/man/$$i $(DESTDIR)$(MAN1DIR)/ ; done
|
||||
for i in ${MAN1_PAGES}; do install -m755 $$i $(DESTDIR)$(MAN1DIR)/ ; done
|
||||
install -dm755 $(DESTDIR)$(MAN5DIR)
|
||||
for i in ${MAN5_PAGES}; do install -m755 ${BUILDDIR}/man/$$i $(DESTDIR)$(MAN5DIR)/ ; done
|
||||
for i in ${MAN5_PAGES}; do install -m755 $$i $(DESTDIR)$(MAN5DIR)/ ; done
|
||||
|
||||
install_html: html
|
||||
install -dm755 $(DESTDIR)$(DOCDIR)
|
||||
|
||||
@ -88,7 +88,7 @@ class ReflabelMapper(Builder):
|
||||
#pprint(vars(node))
|
||||
|
||||
if hasattr(node, 'expect_referenced_by_id') and len(node['ids']) > 1: # explicit labels
|
||||
filename = str(self.env.doc2path(docname))
|
||||
filename = self.env.doc2path(docname)
|
||||
filename_html = re.sub('.rst', '.html', filename)
|
||||
|
||||
# node['ids'][0] contains a normalized version of the
|
||||
|
||||
245
docs/_static/custom.css
vendored
@ -1,245 +0,0 @@
|
||||
div.sphinxsidebar {
|
||||
height: calc(100% - 20px);
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
h1.logo-name {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
div.body img {
|
||||
width: 250px;
|
||||
}
|
||||
pre {
|
||||
padding: 5px 10px;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
background-color: #FAFAFA;
|
||||
}
|
||||
|
||||
li a.current {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid #000;
|
||||
}
|
||||
ul li.toctree-l1 {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
ul li.toctree-l1 > a {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul {
|
||||
color: #444;
|
||||
}
|
||||
div.sphinxsidebar ul ul {
|
||||
list-style: circle;
|
||||
}
|
||||
div.sphinxsidebar ul ul ul {
|
||||
list-style: square;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul a code {
|
||||
font-weight: normal;
|
||||
}
|
||||
div.sphinxsidebar ul ul a {
|
||||
border-bottom: 1px dotted #CCC;
|
||||
}
|
||||
|
||||
div.sphinxsidebar form.search {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3 {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h1.logo-name {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.document, div.footer {
|
||||
width: min(100%, 1320px);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 875px) {
|
||||
div.sphinxsidebar p.logo {
|
||||
display: initial;
|
||||
}
|
||||
div.sphinxsidebar h1.logo-name {
|
||||
display: block;
|
||||
}
|
||||
div.sphinxsidebar span {
|
||||
color: #EEE;
|
||||
}
|
||||
.sphinxsidebar ul li.toctree-l1 > a, div.sphinxsidebar a {
|
||||
color: #FFF;
|
||||
}
|
||||
div.sphinxsidebar {
|
||||
background-color: #555;
|
||||
}
|
||||
div.body {
|
||||
min-width: 300px;
|
||||
}
|
||||
div.footer {
|
||||
display: block;
|
||||
margin: 15px auto 0px auto;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
color-scheme: dark;
|
||||
--pdt-grey-850: hsl(0deg, 0%, 85%);
|
||||
--pdt-grey-500: hsl(0deg, 0%, 50%);
|
||||
--pdt-grey-250: hsl(0deg, 0%, 25%);
|
||||
--pdt-grey-200: hsl(0deg, 0%, 20%);
|
||||
--pdt-grey-150: hsl(0deg, 0%, 15%);
|
||||
--pdt-grey-100: hsl(0deg, 0%, 10%);
|
||||
--pdt-primary-800: hsl(205deg, 100%, 80%);
|
||||
--pdt-primary-700: hsl(205deg, 100%, 70%);
|
||||
--pdt-red-200: hsl(360deg, 30%, 20%);
|
||||
--pdt-red-350: hsl(360deg, 30%, 35%);
|
||||
--pdt-yellow-250: hsl(40deg, 100%, 25%);
|
||||
--pdt-body-background: var(--pdt-grey-150);
|
||||
--pdt-text: var(--pdt-grey-850);
|
||||
--pdt-border: var(--pdt-grey-500);
|
||||
--pdt-shadow: var(--pdt-grey-100);
|
||||
--pdt-headline: var(--pdt-primary-800);
|
||||
--pdt-link: var(--pdt-primary-700);
|
||||
--pdt-admonition-background: var(--pdt-grey-250);
|
||||
--pdt-topic-background: var(--pdt-grey-200);
|
||||
--pdt-warn: var(--pdt-yellow-250);
|
||||
--pdt-crit: var(--pdt-red-200);
|
||||
--pdt-crit-border: var(--pdt-red-350);
|
||||
}
|
||||
|
||||
/* body and links */
|
||||
body, div.body {
|
||||
color: var(--pdt-text);
|
||||
background-color: var(--pdt-body-background);
|
||||
}
|
||||
|
||||
a,
|
||||
a:hover,
|
||||
a.reference:hover {
|
||||
color: var(--pdt-link);
|
||||
border-bottom-color: var(--pdt-link);
|
||||
}
|
||||
|
||||
a.reference {
|
||||
border-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
a.headerlink:hover {
|
||||
color: var(--pdt-text);
|
||||
background-color: var(--pdt-admonition-background)
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul ul a {
|
||||
color: var(--pdt-text);
|
||||
border-bottom-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
div.sphinxsidebar a,
|
||||
ul li.toctree-l1 > a,
|
||||
div.sphinxsidebar ul,
|
||||
div.sphinxsidebar a:hover {
|
||||
color: var(--pdt-text);
|
||||
border-bottom-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
/* highlighting backgrounds */
|
||||
div.admonition,
|
||||
div.highlight,
|
||||
a:hover code,
|
||||
pre {
|
||||
background-color: var(--pdt-admonition-background);
|
||||
}
|
||||
|
||||
div.caution, div.warning {
|
||||
background-color: var(--pdt-crit);
|
||||
border-color: var(--pdt-crit-border);
|
||||
}
|
||||
|
||||
div.topic {
|
||||
background-color: var(--pdt-topic-background);
|
||||
border-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
div.tip,
|
||||
div.note,
|
||||
div.important {
|
||||
border-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
img.logo {
|
||||
filter: invert(100%) hue-rotate(180deg) brightness(90%);
|
||||
}
|
||||
|
||||
table.docutils {
|
||||
box-shadow: 2px 2px 4px var(--pdt-shadow);
|
||||
}
|
||||
|
||||
hr.docutils {
|
||||
border-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
/* style headlines, titles etc. */
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
span.caption-text,
|
||||
div.sphinxsidebar h3,
|
||||
div.sphinxsidebar h4 {
|
||||
color: var(--pdt-headline);
|
||||
}
|
||||
|
||||
/* code */
|
||||
code {
|
||||
color: var(--pdt-text);
|
||||
background-color: var(--pdt-admonition-background);
|
||||
}
|
||||
|
||||
|
||||
.highlight span {
|
||||
filter: brightness(1.5);
|
||||
}
|
||||
|
||||
.highlight .gh,
|
||||
.highlight .nt {
|
||||
color: var(--pdt-headline);
|
||||
filter: none;
|
||||
}
|
||||
|
||||
.highlight .go {
|
||||
color: var(--pdt-text);
|
||||
filter: none;
|
||||
}
|
||||
|
||||
span.highlighted {
|
||||
background-color: var(--pdt-warn);
|
||||
}
|
||||
|
||||
.related.bottom {
|
||||
border-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
/* sidebar */
|
||||
div.sphinxsidebar hr {
|
||||
border-color: var(--pdt-border);
|
||||
}
|
||||
|
||||
div.sphinxsidebar input {
|
||||
border-color: var(--pdt-border);
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 875px) and (prefers-color-scheme: dark) {
|
||||
div.documentwrapper {
|
||||
background: initial;
|
||||
}
|
||||
}
|
||||
6
docs/_templates/sidebar-header.html
vendored
@ -1,7 +1,7 @@
|
||||
<p class="logo">
|
||||
<a href="/docs/index.html">
|
||||
<img class="logo" src="/docs/_static/proxmox-logo.svg" alt="Logo">
|
||||
<a href="index.html">
|
||||
<img class="logo" src="_static/proxmox-logo.svg" alt="Logo">
|
||||
</a>
|
||||
</p>
|
||||
<h1 class="logo logo-name"><a href="/docs/index.html">Proxmox Backup</a></h1>
|
||||
<h1 class="logo logo-name"><a href="index.html">Proxmox Backup</a></h1>
|
||||
<hr style="width:100%;">
|
||||
|
||||
526
docs/api-viewer/PBSAPI.js
Normal file
@ -0,0 +1,526 @@
|
||||
// avoid errors when running without development tools
|
||||
if (!Ext.isDefined(Ext.global.console)) {
|
||||
var console = {
|
||||
dir: function() {},
|
||||
log: function() {}
|
||||
};
|
||||
}
|
||||
|
||||
Ext.onReady(function() {
|
||||
|
||||
Ext.define('pve-param-schema', {
|
||||
extend: 'Ext.data.Model',
|
||||
fields: [
|
||||
'name', 'type', 'typetext', 'description', 'verbose_description',
|
||||
'enum', 'minimum', 'maximum', 'minLength', 'maxLength',
|
||||
'pattern', 'title', 'requires', 'format', 'default',
|
||||
'disallow', 'extends', 'links',
|
||||
{
|
||||
name: 'optional',
|
||||
type: 'boolean'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
var store = Ext.define('pve-updated-treestore', {
|
||||
extend: 'Ext.data.TreeStore',
|
||||
model: Ext.define('pve-api-doc', {
|
||||
extend: 'Ext.data.Model',
|
||||
fields: [
|
||||
'path', 'info', 'text',
|
||||
]
|
||||
}),
|
||||
proxy: {
|
||||
type: 'memory',
|
||||
data: pbsapi
|
||||
},
|
||||
sorters: [{
|
||||
property: 'leaf',
|
||||
direction: 'ASC'
|
||||
}, {
|
||||
property: 'text',
|
||||
direction: 'ASC'
|
||||
}],
|
||||
filterer: 'bottomup',
|
||||
doFilter: function(node) {
|
||||
this.filterNodes(node, this.getFilters().getFilterFn(), true);
|
||||
},
|
||||
|
||||
filterNodes: function(node, filterFn, parentVisible) {
|
||||
var me = this,
|
||||
bottomUpFiltering = me.filterer === 'bottomup',
|
||||
match = filterFn(node) && parentVisible || (node.isRoot() && !me.getRootVisible()),
|
||||
childNodes = node.childNodes,
|
||||
len = childNodes && childNodes.length, i, matchingChildren;
|
||||
|
||||
if (len) {
|
||||
for (i = 0; i < len; ++i) {
|
||||
matchingChildren = me.filterNodes(childNodes[i], filterFn, match || bottomUpFiltering) || matchingChildren;
|
||||
}
|
||||
if (bottomUpFiltering) {
|
||||
match = matchingChildren || match;
|
||||
}
|
||||
}
|
||||
|
||||
node.set("visible", match, me._silentOptions);
|
||||
return match;
|
||||
},
|
||||
|
||||
}).create();
|
||||
|
||||
var render_description = function(value, metaData, record) {
|
||||
var pdef = record.data;
|
||||
|
||||
value = pdef.verbose_description || value;
|
||||
|
||||
// TODO: try to render asciidoc correctly
|
||||
|
||||
metaData.style = 'white-space:pre-wrap;'
|
||||
|
||||
return Ext.htmlEncode(value);
|
||||
};
|
||||
|
||||
var render_type = function(value, metaData, record) {
|
||||
var pdef = record.data;
|
||||
|
||||
return pdef['enum'] ? 'enum' : (pdef.type || 'string');
|
||||
};
|
||||
|
||||
let render_simple_format = function(pdef, type_fallback) {
|
||||
if (pdef.typetext)
|
||||
return pdef.typetext;
|
||||
|
||||
if (pdef['enum'])
|
||||
return pdef['enum'].join(' | ');
|
||||
|
||||
if (pdef.format)
|
||||
return pdef.format;
|
||||
|
||||
if (pdef.pattern)
|
||||
return pdef.pattern;
|
||||
|
||||
if (pdef.type === 'boolean')
|
||||
return `<true|false>`;
|
||||
|
||||
if (type_fallback && pdef.type)
|
||||
return `<${pdef.type}>`;
|
||||
|
||||
return;
|
||||
};
|
||||
|
||||
let render_format = function(value, metaData, record) {
|
||||
let pdef = record.data;
|
||||
|
||||
metaData.style = 'white-space:normal;'
|
||||
|
||||
if (pdef.type === 'array' && pdef.items) {
|
||||
let format = render_simple_format(pdef.items, true);
|
||||
return `[${Ext.htmlEncode(format)}, ...]`;
|
||||
}
|
||||
|
||||
return Ext.htmlEncode(render_simple_format(pdef) || '');
|
||||
};
|
||||
|
||||
var real_path = function(path) {
|
||||
return path.replace(/^.*\/_upgrade_(\/)?/, "/");
|
||||
};
|
||||
|
||||
var permission_text = function(permission) {
|
||||
let permhtml = "";
|
||||
|
||||
if (permission.user) {
|
||||
if (!permission.description) {
|
||||
if (permission.user === 'world') {
|
||||
permhtml += "Accessible without any authentication.";
|
||||
} else if (permission.user === 'all') {
|
||||
permhtml += "Accessible by all authenticated users.";
|
||||
} else {
|
||||
permhtml += 'Onyl accessible by user "' +
|
||||
permission.user + '"';
|
||||
}
|
||||
}
|
||||
} else if (permission.check) {
|
||||
permhtml += "<pre>Check: " +
|
||||
Ext.htmlEncode(Ext.JSON.encode(permission.check)) + "</pre>";
|
||||
} else if (permission.userParam) {
|
||||
permhtml += `<div>Check if user matches parameter '${permission.userParam}'`;
|
||||
} else if (permission.or) {
|
||||
permhtml += "<div>Or<div style='padding-left: 10px;'>";
|
||||
Ext.Array.each(permission.or, function(sub_permission) {
|
||||
permhtml += permission_text(sub_permission);
|
||||
})
|
||||
permhtml += "</div></div>";
|
||||
} else if (permission.and) {
|
||||
permhtml += "<div>And<div style='padding-left: 10px;'>";
|
||||
Ext.Array.each(permission.and, function(sub_permission) {
|
||||
permhtml += permission_text(sub_permission);
|
||||
})
|
||||
permhtml += "</div></div>";
|
||||
} else {
|
||||
//console.log(permission);
|
||||
permhtml += "Unknown syntax!";
|
||||
}
|
||||
|
||||
return permhtml;
|
||||
};
|
||||
|
||||
var render_docu = function(data) {
|
||||
var md = data.info;
|
||||
|
||||
// console.dir(data);
|
||||
|
||||
var items = [];
|
||||
|
||||
var clicmdhash = {
|
||||
GET: 'get',
|
||||
POST: 'create',
|
||||
PUT: 'set',
|
||||
DELETE: 'delete'
|
||||
};
|
||||
|
||||
Ext.Array.each(['GET', 'POST', 'PUT', 'DELETE'], function(method) {
|
||||
var info = md[method];
|
||||
if (info) {
|
||||
|
||||
var usage = "";
|
||||
|
||||
usage += "<table><tr><td>HTTP: </td><td>"
|
||||
+ method + " " + real_path("/api2/json" + data.path) + "</td></tr>";
|
||||
|
||||
var sections = [
|
||||
{
|
||||
title: 'Description',
|
||||
html: Ext.htmlEncode(info.description),
|
||||
bodyPadding: 10
|
||||
},
|
||||
{
|
||||
title: 'Usage',
|
||||
html: usage,
|
||||
bodyPadding: 10
|
||||
}
|
||||
];
|
||||
|
||||
if (info.parameters && info.parameters.properties) {
|
||||
|
||||
var pstore = Ext.create('Ext.data.Store', {
|
||||
model: 'pve-param-schema',
|
||||
proxy: {
|
||||
type: 'memory'
|
||||
},
|
||||
groupField: 'optional',
|
||||
sorters: [
|
||||
{
|
||||
property: 'name',
|
||||
direction: 'ASC'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
Ext.Object.each(info.parameters.properties, function(name, pdef) {
|
||||
pdef.name = name;
|
||||
pstore.add(pdef);
|
||||
});
|
||||
|
||||
pstore.sort();
|
||||
|
||||
var groupingFeature = Ext.create('Ext.grid.feature.Grouping',{
|
||||
enableGroupingMenu: false,
|
||||
groupHeaderTpl: '<tpl if="groupValue">Optional</tpl><tpl if="!groupValue">Required</tpl>'
|
||||
});
|
||||
|
||||
sections.push({
|
||||
xtype: 'gridpanel',
|
||||
title: 'Parameters',
|
||||
features: [groupingFeature],
|
||||
store: pstore,
|
||||
viewConfig: {
|
||||
trackOver: false,
|
||||
stripeRows: true
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
header: 'Name',
|
||||
dataIndex: 'name',
|
||||
flex: 1
|
||||
},
|
||||
{
|
||||
header: 'Type',
|
||||
dataIndex: 'type',
|
||||
renderer: render_type,
|
||||
flex: 1
|
||||
},
|
||||
{
|
||||
header: 'Default',
|
||||
dataIndex: 'default',
|
||||
flex: 1
|
||||
},
|
||||
{
|
||||
header: 'Format',
|
||||
dataIndex: 'type',
|
||||
renderer: render_format,
|
||||
flex: 2
|
||||
},
|
||||
{
|
||||
header: 'Description',
|
||||
dataIndex: 'description',
|
||||
renderer: render_description,
|
||||
flex: 6
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if (info.returns) {
|
||||
|
||||
var retinf = info.returns;
|
||||
var rtype = retinf.type;
|
||||
if (!rtype && retinf.items)
|
||||
rtype = 'array';
|
||||
if (!rtype)
|
||||
rtype = 'object';
|
||||
|
||||
var rpstore = Ext.create('Ext.data.Store', {
|
||||
model: 'pve-param-schema',
|
||||
proxy: {
|
||||
type: 'memory'
|
||||
},
|
||||
groupField: 'optional',
|
||||
sorters: [
|
||||
{
|
||||
property: 'name',
|
||||
direction: 'ASC'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
var properties;
|
||||
if (rtype === 'array' && retinf.items.properties) {
|
||||
properties = retinf.items.properties;
|
||||
}
|
||||
|
||||
if (rtype === 'object' && retinf.properties) {
|
||||
properties = retinf.properties;
|
||||
}
|
||||
|
||||
Ext.Object.each(properties, function(name, pdef) {
|
||||
pdef.name = name;
|
||||
rpstore.add(pdef);
|
||||
});
|
||||
|
||||
rpstore.sort();
|
||||
|
||||
var groupingFeature = Ext.create('Ext.grid.feature.Grouping',{
|
||||
enableGroupingMenu: false,
|
||||
groupHeaderTpl: '<tpl if="groupValue">Optional</tpl><tpl if="!groupValue">Obligatory</tpl>'
|
||||
});
|
||||
var returnhtml;
|
||||
if (retinf.items) {
|
||||
returnhtml = '<pre>items: ' + Ext.htmlEncode(JSON.stringify(retinf.items, null, 4)) + '</pre>';
|
||||
}
|
||||
|
||||
if (retinf.properties) {
|
||||
returnhtml = returnhtml || '';
|
||||
returnhtml += '<pre>properties:' + Ext.htmlEncode(JSON.stringify(retinf.properties, null, 4)) + '</pre>';
|
||||
}
|
||||
|
||||
var rawSection = Ext.create('Ext.panel.Panel', {
|
||||
bodyPadding: '0px 10px 10px 10px',
|
||||
html: returnhtml,
|
||||
hidden: true
|
||||
});
|
||||
|
||||
sections.push({
|
||||
xtype: 'gridpanel',
|
||||
title: 'Returns: ' + rtype,
|
||||
features: [groupingFeature],
|
||||
store: rpstore,
|
||||
viewConfig: {
|
||||
trackOver: false,
|
||||
stripeRows: true
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
header: 'Name',
|
||||
dataIndex: 'name',
|
||||
flex: 1
|
||||
},
|
||||
{
|
||||
header: 'Type',
|
||||
dataIndex: 'type',
|
||||
renderer: render_type,
|
||||
flex: 1
|
||||
},
|
||||
{
|
||||
header: 'Default',
|
||||
dataIndex: 'default',
|
||||
flex: 1
|
||||
},
|
||||
{
|
||||
header: 'Format',
|
||||
dataIndex: 'type',
|
||||
renderer: render_format,
|
||||
flex: 2
|
||||
},
|
||||
{
|
||||
header: 'Description',
|
||||
dataIndex: 'description',
|
||||
renderer: render_description,
|
||||
flex: 6
|
||||
}
|
||||
],
|
||||
bbar: [
|
||||
{
|
||||
xtype: 'button',
|
||||
text: 'Show RAW',
|
||||
handler: function(btn) {
|
||||
rawSection.setVisible(!rawSection.isVisible());
|
||||
btn.setText(rawSection.isVisible() ? 'Hide RAW' : 'Show RAW');
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
sections.push(rawSection);
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (!data.path.match(/\/_upgrade_/)) {
|
||||
var permhtml = '';
|
||||
|
||||
if (!info.permissions) {
|
||||
permhtml = "Root only.";
|
||||
} else {
|
||||
if (info.permissions.description) {
|
||||
permhtml += "<div style='white-space:pre-wrap;padding-bottom:10px;'>" +
|
||||
Ext.htmlEncode(info.permissions.description) + "</div>";
|
||||
}
|
||||
permhtml += permission_text(info.permissions);
|
||||
}
|
||||
|
||||
// we do not have this information for PBS api
|
||||
//if (!info.allowtoken) {
|
||||
// permhtml += "<br />This API endpoint is not available for API tokens."
|
||||
//}
|
||||
|
||||
sections.push({
|
||||
title: 'Required permissions',
|
||||
bodyPadding: 10,
|
||||
html: permhtml
|
||||
});
|
||||
}
|
||||
|
||||
items.push({
|
||||
title: method,
|
||||
autoScroll: true,
|
||||
defaults: {
|
||||
border: false
|
||||
},
|
||||
items: sections
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var ct = Ext.getCmp('docview');
|
||||
ct.setTitle("Path: " + real_path(data.path));
|
||||
ct.removeAll(true);
|
||||
ct.add(items);
|
||||
ct.setActiveTab(0);
|
||||
};
|
||||
|
||||
Ext.define('Ext.form.SearchField', {
|
||||
extend: 'Ext.form.field.Text',
|
||||
alias: 'widget.searchfield',
|
||||
|
||||
emptyText: 'Search...',
|
||||
|
||||
flex: 1,
|
||||
|
||||
inputType: 'search',
|
||||
listeners: {
|
||||
'change': function(){
|
||||
|
||||
var value = this.getValue();
|
||||
if (!Ext.isEmpty(value)) {
|
||||
store.filter({
|
||||
property: 'path',
|
||||
value: value,
|
||||
anyMatch: true
|
||||
});
|
||||
} else {
|
||||
store.clearFilter();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var tree = Ext.create('Ext.tree.Panel', {
|
||||
title: 'Resource Tree',
|
||||
tbar: [
|
||||
{
|
||||
xtype: 'searchfield',
|
||||
}
|
||||
],
|
||||
tools: [
|
||||
{
|
||||
type: 'expand',
|
||||
tooltip: 'Expand all',
|
||||
tooltipType: 'title',
|
||||
callback: (tree) => tree.expandAll(),
|
||||
},
|
||||
{
|
||||
type: 'collapse',
|
||||
tooltip: 'Collapse all',
|
||||
tooltipType: 'title',
|
||||
callback: (tree) => tree.collapseAll(),
|
||||
},
|
||||
],
|
||||
store: store,
|
||||
width: 200,
|
||||
region: 'west',
|
||||
split: true,
|
||||
margins: '5 0 5 5',
|
||||
rootVisible: false,
|
||||
listeners: {
|
||||
selectionchange: function(v, selections) {
|
||||
if (!selections[0])
|
||||
return;
|
||||
var rec = selections[0];
|
||||
render_docu(rec.data);
|
||||
location.hash = '#' + rec.data.path;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Ext.create('Ext.container.Viewport', {
|
||||
layout: 'border',
|
||||
renderTo: Ext.getBody(),
|
||||
items: [
|
||||
tree,
|
||||
{
|
||||
xtype: 'tabpanel',
|
||||
title: 'Documentation',
|
||||
id: 'docview',
|
||||
region: 'center',
|
||||
margins: '5 5 5 0',
|
||||
layout: 'fit',
|
||||
items: []
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
var deepLink = function() {
|
||||
var path = window.location.hash.substring(1).replace(/\/\s*$/, '')
|
||||
var endpoint = store.findNode('path', path);
|
||||
|
||||
if (endpoint) {
|
||||
tree.getSelectionModel().select(endpoint);
|
||||
tree.expandPath(endpoint.getPath());
|
||||
render_docu(endpoint.data);
|
||||
}
|
||||
}
|
||||
window.onhashchange = deepLink;
|
||||
|
||||
deepLink();
|
||||
|
||||
});
|
||||
@ -6,7 +6,6 @@
|
||||
<title>Proxmox Backup Server API Documentation</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="extjs/theme-crisp/resources/theme-crisp-all.css">
|
||||
<link rel="stylesheet" type="text/css" media="(prefers-color-scheme: dark)" href="/widgettoolkit/themes/theme-proxmox-dark.css" />
|
||||
<script type="text/javascript" src="extjs/ext-all.js"></script>
|
||||
<script type="text/javascript" src="apidoc.js"></script>
|
||||
</head>
|
||||
|
||||
@ -1,38 +1,31 @@
|
||||
.. _client_usage:
|
||||
|
||||
Backup Client Usage
|
||||
===================
|
||||
|
||||
The command-line client for `Proxmox Backup`_ Server is called
|
||||
:command:`proxmox-backup-client`.
|
||||
The command line client is called :command:`proxmox-backup-client`.
|
||||
|
||||
.. _client_repository:
|
||||
|
||||
Backup Repository Locations
|
||||
---------------------------
|
||||
|
||||
The client uses the following format to specify a datastore repository
|
||||
on the backup server (where username is specified in the form of user@realm):
|
||||
The client uses the following notation to specify a datastore repository
|
||||
on the backup server.
|
||||
|
||||
[[username@]server[:port]:]datastore
|
||||
|
||||
The default value for ``username`` is ``root@pam``. If no server is specified,
|
||||
the default is the local host (``localhost``).
|
||||
|
||||
You can specify a port if your backup server is only reachable on a non-default
|
||||
port (for example, with NAT and port forwarding configurations).
|
||||
You can specify a port if your backup server is only reachable on a different
|
||||
port (e.g. with NAT and port forwarding).
|
||||
|
||||
Note that if the server uses an IPv6 address, you have to write it with square
|
||||
Note that if the server is an IPv6 address, you have to write it with square
|
||||
brackets (for example, `[fe80::01]`).
|
||||
|
||||
You can pass the repository with the ``--repository`` command-line option, or
|
||||
You can pass the repository with the ``--repository`` command line option, or
|
||||
by setting the ``PBS_REPOSITORY`` environment variable.
|
||||
|
||||
The web interface provides copyable repository text in the datastore summary
|
||||
with the `Show Connection Information` button.
|
||||
|
||||
Below are some examples of valid repositories and their corresponding real
|
||||
values:
|
||||
Here some examples of valid repositories and the real values
|
||||
|
||||
================================ ================== ================== ===========
|
||||
Example User Host:Port Datastore
|
||||
@ -40,30 +33,12 @@ Example User Host:Port Datastore
|
||||
mydatastore ``root@pam`` localhost:8007 mydatastore
|
||||
myhostname:mydatastore ``root@pam`` myhostname:8007 mydatastore
|
||||
user@pbs@myhostname:mydatastore ``user@pbs`` myhostname:8007 mydatastore
|
||||
user\@pbs!token@host:store ``user@pbs!token`` host:8007 store
|
||||
user\@pbs!token@host:store ``user@pbs!token`` myhostname:8007 mydatastore
|
||||
192.168.55.55:1234:mydatastore ``root@pam`` 192.168.55.55:1234 mydatastore
|
||||
[ff80::51]:mydatastore ``root@pam`` [ff80::51]:8007 mydatastore
|
||||
[ff80::51]:1234:mydatastore ``root@pam`` [ff80::51]:1234 mydatastore
|
||||
================================ ================== ================== ===========
|
||||
|
||||
.. _statically_linked_client:
|
||||
|
||||
Statically Linked Backup Client
|
||||
-------------------------------
|
||||
|
||||
A statically linked version of the Proxmox Backup client is available for Linux
|
||||
based systems where the regular client is not available. Please note that it is
|
||||
recommended to use the regular client when possible, as the statically linked
|
||||
client is not a full replacement. For example, name resolution will not be
|
||||
performed via the mechanisms provided by libc, but uses a resolver written
|
||||
purely in the Rust programming language. Therefore, features and modules
|
||||
provided by Name Service Switch cannot be used.
|
||||
|
||||
The statically linked client is available via the ``pbs-client`` repository as
|
||||
described in the :ref:`installation <install_pbc>` section.
|
||||
|
||||
.. _environment-variables:
|
||||
|
||||
Environment Variables
|
||||
---------------------
|
||||
|
||||
@ -71,80 +46,17 @@ Environment Variables
|
||||
The default backup repository.
|
||||
|
||||
``PBS_PASSWORD``
|
||||
When set, this value is used as the password for the backup server.
|
||||
You can also set this to an API token secret.
|
||||
|
||||
``PBS_PASSWORD_FD``, ``PBS_PASSWORD_FILE``, ``PBS_PASSWORD_CMD``
|
||||
Like ``PBS_PASSWORD``, but read data from an open file descriptor, a file
|
||||
name or from the `stdout` of a command, respectively. The first defined
|
||||
environment variable from the order above is preferred.
|
||||
When set, this value is used for the password required for the backup server.
|
||||
You can also set this to a API token secret.
|
||||
|
||||
``PBS_ENCRYPTION_PASSWORD``
|
||||
When set, this value is used to access the secret encryption key (if
|
||||
protected by password).
|
||||
|
||||
``PBS_ENCRYPTION_PASSWORD_FD``, ``PBS_ENCRYPTION_PASSWORD_FILE``, ``PBS_ENCRYPTION_PASSWORD_CMD``
|
||||
Like ``PBS_ENCRYPTION_PASSWORD``, but read data from an open file descriptor,
|
||||
a file name or from the `stdout` of a command, respectively. The first
|
||||
defined environment variable from the order above is preferred.
|
||||
``PBS_FINGERPRINT`` When set, this value is used to verify the server
|
||||
certificate (only used if the system CA certificates cannot validate the
|
||||
certificate).
|
||||
|
||||
``PBS_FINGERPRINT``
|
||||
When set, this value is used to verify the server certificate (only used if
|
||||
the system CA certificates cannot validate the certificate).
|
||||
|
||||
``ALL_PROXY``
|
||||
When set, the client uses the specified HTTP proxy for all connections to the
|
||||
backup server. Currently only HTTP proxies are supported. Valid proxy
|
||||
configurations have the following format:
|
||||
`[http://][user:password@]<host>[:port]`. Default `port` is 1080, if not
|
||||
otherwise specified.
|
||||
|
||||
|
||||
.. Note:: The recommended solution for shielding hosts is using tunnels such as
|
||||
wireguard, instead of using an HTTP proxy.
|
||||
|
||||
|
||||
.. Note:: Passwords must be valid UTF-8 and may not contain newlines. For your
|
||||
convenience, Proxmox Backup Server only uses the first line as password, so
|
||||
you can add arbitrary comments after the first newline.
|
||||
|
||||
|
||||
System and Service Credentials
|
||||
------------------------------
|
||||
|
||||
Some of the :ref:`environment variables <environment-variables>` above can be
|
||||
set using `system and service credentials <https://systemd.io/CREDENTIALS/>`_
|
||||
instead.
|
||||
|
||||
============================ ==============================================
|
||||
Environment Variable Credential Name Equivalent
|
||||
============================ ==============================================
|
||||
``PBS_REPOSITORY`` ``proxmox-backup-client.repository``
|
||||
``PBS_PASSWORD`` ``proxmox-backup-client.password``
|
||||
``PBS_ENCRYPTION_PASSWORD`` ``proxmox-backup-client.encryption-password``
|
||||
``PBS_FINGERPRINT`` ``proxmox-backup-client.fingerprint``
|
||||
============================ ==============================================
|
||||
|
||||
For example, the repository password can be stored in an encrypted file as
|
||||
follows:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# systemd-ask-password -n | systemd-creds encrypt --name=proxmox-backup-client.password - my-api-token.cred
|
||||
|
||||
The credential can then be reused inside of unit files or in a transient scope
|
||||
unit as follows:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# systemd-run --pipe --wait \
|
||||
--property=LoadCredentialEncrypted=proxmox-backup-client.password:/full/path/to/my-api-token.cred \
|
||||
--property=SetCredential=proxmox-backup-client.repository:'my_default_repository' \
|
||||
proxmox-backup-client ...
|
||||
|
||||
Additionally, system credentials (e.g. passed down from the hypervisor to a
|
||||
virtual machine via SMBIOS type 11) can be loaded on a service via
|
||||
`LoadCredential=` as described in the manual page ``systemd.exec(5)``.
|
||||
|
||||
Output Format
|
||||
-------------
|
||||
@ -158,15 +70,14 @@ Creating Backups
|
||||
----------------
|
||||
|
||||
This section explains how to create a backup from within the machine. This can
|
||||
be a physical host, a virtual machine, or a container. Such backups may contain
|
||||
file and image archives. There are no restrictions in this case.
|
||||
be a physical host, a virtual machine, or a container. Such backups may contain file
|
||||
and image archives. There are no restrictions in this case.
|
||||
|
||||
.. Note:: If you want to backup virtual machines or containers on Proxmox VE,
|
||||
see :ref:`pve-integration`.
|
||||
.. note:: If you want to backup virtual machines or containers on Proxmox VE, see :ref:`pve-integration`.
|
||||
|
||||
For the following example, you need to have a backup server set up, have working
|
||||
credentials, and know the repository name.
|
||||
In the following examples, we use ``backup-server:store1``.
|
||||
For the following example you need to have a backup server set up, working
|
||||
credentials and need to know the repository name.
|
||||
In the following examples we use ``backup-server:store1``.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -180,32 +91,32 @@ In the following examples, we use ``backup-server:store1``.
|
||||
Uploaded 12129 chunks in 87 seconds (564 MB/s).
|
||||
End Time: 2019-12-03T10:36:29+01:00
|
||||
|
||||
This will prompt you for a password, then upload a file archive named
|
||||
This will prompt you for a password and then uploads a file archive named
|
||||
``root.pxar`` containing all the files in the ``/`` directory.
|
||||
|
||||
.. Caution:: Please note that proxmox-backup-client does not
|
||||
.. Caution:: Please note that the proxmox-backup-client does not
|
||||
automatically include mount points. Instead, you will see a short
|
||||
``skip mount point`` message for each of them. The idea is to
|
||||
``skip mount point`` notice for each of them. The idea is to
|
||||
create a separate file archive for each mounted disk. You can
|
||||
explicitly include them using the ``--include-dev`` option
|
||||
(i.e. ``--include-dev /boot/efi``). You can use this option
|
||||
multiple times for each mount point that should be included.
|
||||
|
||||
The ``--repository`` option can get quite long and is used by all commands. You
|
||||
can avoid having to enter this value by setting the environment variable
|
||||
``PBS_REPOSITORY``. Note that if you would like this to remain set over
|
||||
multiple sessions, you should instead add the below line to your ``.bashrc``
|
||||
file.
|
||||
The ``--repository`` option can get quite long and is used by all
|
||||
commands. You can avoid having to enter this value by setting the
|
||||
environment variable ``PBS_REPOSITORY``. Note that if you would like this to remain set
|
||||
over multiple sessions, you should instead add the below line to your
|
||||
``.bashrc`` file.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# export PBS_REPOSITORY=backup-server:store1
|
||||
|
||||
After this, you can execute all commands without having to specify the
|
||||
``--repository`` option.
|
||||
After this you can execute all commands without specifying the ``--repository``
|
||||
option.
|
||||
|
||||
A single backup is allowed to contain more than one archive. For example, if
|
||||
you want to back up two disks mounted at ``/mnt/disk1`` and ``/mnt/disk2``:
|
||||
One single backup is allowed to contain more than one archive. For example, if
|
||||
you want to backup two disks mounted at ``/mnt/disk1`` and ``/mnt/disk2``:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -213,72 +124,59 @@ you want to back up two disks mounted at ``/mnt/disk1`` and ``/mnt/disk2``:
|
||||
|
||||
This creates a backup of both disks.
|
||||
|
||||
If you want to use a namespace for the backup target, you can add the `--ns`
|
||||
parameter:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client backup disk1.pxar:/mnt/disk1 disk2.pxar:/mnt/disk2 --ns a/b/c
|
||||
|
||||
The backup command takes a list of backup specifications, which include the
|
||||
archive name on the server, the type of the archive, and the archive source at
|
||||
the client. The format is:
|
||||
The backup command takes a list of backup specifications, which
|
||||
include the archive name on the server, the type of the archive, and the
|
||||
archive source at the client. The format is:
|
||||
|
||||
<archive-name>.<type>:<source-path>
|
||||
|
||||
The ``archive-name`` must contain alphanumerics, hyphens and underscores only.
|
||||
Common types are ``.pxar`` for file archives and ``.img`` for block
|
||||
device images. To create a backup of a block device, run the following command:
|
||||
Common types are ``.pxar`` for file archives, and ``.img`` for block
|
||||
device images. To create a backup of a block device run the following command:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client backup mydata.img:/dev/mylvm/mydata
|
||||
|
||||
|
||||
Excluding Files/Directories from a Backup
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Excluding files/folders from a backup
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Sometimes it is desired to exclude certain files or directories from a backup
|
||||
archive. To tell the Proxmox Backup client when and how to ignore files and
|
||||
directories, place a text file named ``.pxarexclude`` in the filesystem
|
||||
hierarchy. Whenever the backup client encounters such a file in a directory,
|
||||
it interprets each line as a glob match pattern for files and directories that
|
||||
are to be excluded from the backup.
|
||||
Sometimes it is desired to exclude certain files or folders from a backup archive.
|
||||
To tell the Proxmox Backup client when and how to ignore files and directories,
|
||||
place a text file called ``.pxarexclude`` in the filesystem hierarchy.
|
||||
Whenever the backup client encounters such a file in a directory, it interprets
|
||||
each line as glob match patterns for files and directories that are to be excluded
|
||||
from the backup.
|
||||
|
||||
The file must contain a single glob pattern per line. Empty lines and lines
|
||||
starting with ``#`` (indicating a comment) are ignored.
|
||||
A ``!`` at the beginning of a line reverses the glob match pattern from an
|
||||
exclusion to an explicit inclusion. This makes it possible to exclude all
|
||||
entries in a directory except for a few single files/subdirectories.
|
||||
The file must contain a single glob pattern per line. Empty lines are ignored.
|
||||
The same is true for lines starting with ``#``, which indicates a comment.
|
||||
A ``!`` at the beginning of a line reverses the glob match pattern from an exclusion
|
||||
to an explicit inclusion. This makes it possible to exclude all entries in a
|
||||
directory except for a few single files/subdirectories.
|
||||
Lines ending in ``/`` match only on directories.
|
||||
The directory containing the ``.pxarexclude`` file is considered to be the root
|
||||
of the given patterns. It is only possible to match files in this directory and
|
||||
its subdirectories.
|
||||
|
||||
.. Note:: Patterns without a leading ``/`` will also match in subdirectories,
|
||||
while patterns with a leading ``/`` will only match in the current directory.
|
||||
The directory containing the ``.pxarexclude`` file is considered to be the root of
|
||||
the given patterns. It is only possible to match files in this directory and its subdirectories.
|
||||
|
||||
``\`` is used to escape special glob characters.
|
||||
``?`` matches any single character.
|
||||
``*`` matches any character, including an empty string.
|
||||
``**`` is used to match current directory and subdirectories. For example, with
|
||||
the pattern ``**/*.tmp``, it would exclude all files ending in ``.tmp`` within
|
||||
a directory and its subdirectories.
|
||||
``**`` is used to match subdirectories. It can be used to, for example, exclude
|
||||
all files ending in ``.tmp`` within the directory or subdirectories with the
|
||||
following pattern ``**/*.tmp``.
|
||||
``[...]`` matches a single character from any of the provided characters within
|
||||
the brackets. ``[!...]`` does the complementary and matches any single
|
||||
character not contained within the brackets. It is also possible to specify
|
||||
ranges with two characters separated by ``-``. For example, ``[a-z]`` matches
|
||||
any lowercase alphabetic character, and ``[0-9]`` matches any single digit.
|
||||
the brackets. ``[!...]`` does the complementary and matches any single character
|
||||
not contained within the brackets. It is also possible to specify ranges with two
|
||||
characters separated by ``-``. For example, ``[a-z]`` matches any lowercase
|
||||
alphabetic character and ``[0-9]`` matches any one single digit.
|
||||
|
||||
The order of the glob match patterns defines whether a file is included or
|
||||
excluded, that is to say, later entries override earlier ones.
|
||||
This is also true for match patterns encountered deeper down the directory
|
||||
tree, which can override a previous exclusion.
|
||||
|
||||
.. Note:: Excluded directories will **not** be read by the backup client. Thus,
|
||||
a ``.pxarexclude`` file in an excluded subdirectory will have no effect.
|
||||
``.pxarexclude`` files are treated as regular files and will be included in
|
||||
the backup archive.
|
||||
excluded, that is to say later entries override previous ones.
|
||||
This is also true for match patterns encountered deeper down the directory tree,
|
||||
which can override a previous exclusion.
|
||||
Be aware that excluded directories will **not** be read by the backup client.
|
||||
Thus, a ``.pxarexclude`` file in an excluded subdirectory will have no effect.
|
||||
``.pxarexclude`` files are treated as regular files and will be included in the
|
||||
backup archive.
|
||||
|
||||
For example, consider the following directory structure:
|
||||
|
||||
@ -315,7 +213,7 @@ Restoring this backup will result in:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# ls -aR restored
|
||||
ls -aR restored
|
||||
restored/:
|
||||
. .. .pxarexclude subfolder0 subfolder1
|
||||
|
||||
@ -325,69 +223,6 @@ Restoring this backup will result in:
|
||||
restored/subfolder1:
|
||||
. .. file2
|
||||
|
||||
The same syntax can also be used directly in the cli with the ``--exclude``
|
||||
parameter. For example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client backup archive-name.pxar:./linux --exclude /usr
|
||||
|
||||
Multiple paths can be excluded like this:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client backup archive-name.pxar:./linux --exclude=/usr --exclude=/rust
|
||||
|
||||
.. _client_change_detection_mode:
|
||||
|
||||
Change Detection Mode
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
File-based backups containing a lot of data can take a long time, as the default
|
||||
behavior for the Proxmox backup client is to read all data and encode it into a
|
||||
pxar archive.
|
||||
The encoded stream is split into variable sized chunks. For each chunk, a digest
|
||||
is calculated and used to decide whether the chunk needs to be uploaded or can
|
||||
be indexed without upload, as it is already available on the server (and
|
||||
therefore deduplicated). If the backed up files are largely unchanged,
|
||||
re-reading and then detecting the corresponding chunks don't need to be uploaded
|
||||
after all is time consuming and undesired.
|
||||
|
||||
The backup client's ``change-detection-mode`` can be switched from default to
|
||||
``metadata`` based detection to reduce limitations as described above,
|
||||
instructing the client to avoid re-reading files with unchanged metadata
|
||||
whenever possible.
|
||||
When using this mode, instead of the regular pxar archive, the backup snapshot
|
||||
is stored into two separate files: the ``mpxar`` containing the archive's
|
||||
metadata and the ``ppxar`` containing a concatenation of the file contents. This
|
||||
splitting allows for efficient metadata lookups. When creating the backup
|
||||
archives, the current file metadata is compared to the one looked up in the
|
||||
previous ``mpxar`` archive. The operational details are explained more in depth
|
||||
in the :ref:`technical documentation <change-detection-mode-metadata>`.
|
||||
|
||||
Using the ``change-detection-mode`` set to ``data`` allows to create the same
|
||||
split archive as when using the ``metadata`` mode, but without using a previous
|
||||
reference and therefore reencoding all file payloads. For details of this mode
|
||||
please see the :ref:`technical documentation <change-detection-mode-data>`.
|
||||
|
||||
.. _client_change_detection_mode_table:
|
||||
|
||||
============ ===================================================================
|
||||
Mode Description
|
||||
============ ===================================================================
|
||||
``legacy`` (current default): Encode all files into a self contained pxar
|
||||
archive.
|
||||
``data`` Encode all files into a split data and metadata pxar archive.
|
||||
``metadata`` Encode changed files, reuse unchanged from previous snapshot,
|
||||
creating a split archive.
|
||||
============ ===================================================================
|
||||
|
||||
The following shows an example for the client invocation with the `metadata`
|
||||
mode:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client backup archive-name.pxar:./linux --change-detection-mode=metadata
|
||||
|
||||
.. _client_encryption:
|
||||
|
||||
@ -429,7 +264,7 @@ You can avoid entering the passwords by setting the environment
|
||||
variables ``PBS_PASSWORD`` and ``PBS_ENCRYPTION_PASSWORD``.
|
||||
|
||||
|
||||
Using a Master Key to Store and Recover Encryption Keys
|
||||
Using a master key to store and recover encryption keys
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You can also use ``proxmox-backup-client key`` to create an RSA public/private
|
||||
@ -509,13 +344,13 @@ To set up a master key:
|
||||
keep keys ordered and in a place that is separate from the contents being
|
||||
backed up. It can happen, for example, that you back up an entire system, using
|
||||
a key on that system. If the system then becomes inaccessible for any reason
|
||||
and needs to be restored, this will not be possible, as the encryption key will be
|
||||
and needs to be restored, this will not be possible as the encryption key will be
|
||||
lost along with the broken system.
|
||||
|
||||
It is recommended that you keep your master key safe, but easily accessible, in
|
||||
order for quick disaster recovery. For this reason, the best place to store it
|
||||
is in your password manager, where it is immediately recoverable. As a backup to
|
||||
this, you should also save the key to a USB flash drive and store that in a secure
|
||||
this, you should also save the key to a USB drive and store that in a secure
|
||||
place. This way, it is detached from any system, but is still easy to recover
|
||||
from, in case of emergency. Finally, in preparation for the worst case scenario,
|
||||
you should also consider keeping a paper copy of your master key locked away in
|
||||
@ -528,15 +363,13 @@ version of your master key. The following command sends the output of the
|
||||
proxmox-backup-client key paperkey --output-format text > qrkey.txt
|
||||
|
||||
|
||||
.. _client_restoring_data:
|
||||
|
||||
Restoring Data
|
||||
--------------
|
||||
|
||||
The regular creation of backups is a necessary step in avoiding data loss. More
|
||||
importantly, however, is the restoration. It is good practice to perform
|
||||
periodic recovery tests to ensure that you can access the data in case of
|
||||
disaster.
|
||||
The regular creation of backups is a necessary step to avoiding data
|
||||
loss. More importantly, however, is the restoration. It is good practice to perform
|
||||
periodic recovery tests to ensure that you can access the data in
|
||||
case of problems.
|
||||
|
||||
First, you need to find the snapshot which you want to restore. The snapshot
|
||||
list command provides a list of all the snapshots on the server:
|
||||
@ -553,11 +386,6 @@ list command provides a list of all the snapshots on the server:
|
||||
├────────────────────────────────┼─────────────┼────────────────────────────────────┤
|
||||
...
|
||||
|
||||
|
||||
.. tip:: List will by default only output the backup snapshots of the root
|
||||
namespace itself. To list backups from another namespace use the ``--ns
|
||||
<ns>`` option
|
||||
|
||||
You can inspect the catalog to find specific files.
|
||||
|
||||
.. code-block:: console
|
||||
@ -598,24 +426,25 @@ to use the interactive recovery shell.
|
||||
bin boot dev etc home lib lib32
|
||||
...
|
||||
|
||||
The interactive recovery shell is a minimal command-line interface that
|
||||
The interactive recovery shell is a minimal command line interface that
|
||||
utilizes the metadata stored in the catalog to quickly list, navigate and
|
||||
search for files in a file archive.
|
||||
search files in a file archive.
|
||||
To restore files, you can select them individually or match them with a glob
|
||||
pattern.
|
||||
|
||||
Using the catalog for navigation reduces the overhead considerably because only
|
||||
the catalog needs to be downloaded and, optionally, decrypted.
|
||||
The actual chunks are only accessed if the metadata in the catalog is
|
||||
insufficient or for the actual restore.
|
||||
The actual chunks are only accessed if the metadata in the catalog is not enough
|
||||
or for the actual restore.
|
||||
|
||||
Similar to common UNIX shells, ``cd`` and ``ls`` are the commands used to change
|
||||
Similar to common UNIX shells ``cd`` and ``ls`` are the commands used to change
|
||||
working directory and list directory contents in the archive.
|
||||
``pwd`` shows the full path of the current working directory with respect to the
|
||||
archive root.
|
||||
|
||||
The ability to quickly search the contents of the archive is a commonly required
|
||||
feature. That's where the catalog is most valuable. For example:
|
||||
Being able to quickly search the contents of the archive is a commonly needed feature.
|
||||
That's where the catalog is most valuable.
|
||||
For example:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -626,8 +455,8 @@ feature. That's where the catalog is most valuable. For example:
|
||||
pxar:/ > restore-selected /target/path
|
||||
...
|
||||
|
||||
This will find and print all files ending in ``.txt`` located in ``etc/`` or its
|
||||
subdirectories, and add the corresponding pattern to the list for subsequent restores.
|
||||
This will find and print all files ending in ``.txt`` located in ``etc/`` or a
|
||||
subdirectory and add the corresponding pattern to the list for subsequent restores.
|
||||
``list-selected`` shows these patterns and ``restore-selected`` finally restores
|
||||
all files in the archive matching the patterns to ``/target/path`` on the local
|
||||
host. This will scan the whole archive.
|
||||
@ -652,7 +481,7 @@ Mounting of Archives via FUSE
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The :term:`FUSE` implementation for the pxar archive allows you to mount a
|
||||
file archive as a read-only filesystem to a mount point on your host.
|
||||
file archive as a read-only filesystem to a mountpoint on your host.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -668,7 +497,7 @@ This allows you to access the full contents of the archive in a seamless manner.
|
||||
load on your host, depending on the operations you perform on the mounted
|
||||
filesystem.
|
||||
|
||||
To unmount the filesystem, use the ``umount`` command on the mount point:
|
||||
To unmount the filesystem use the ``umount`` command on the mountpoint:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -677,7 +506,7 @@ To unmount the filesystem, use the ``umount`` command on the mount point:
|
||||
Login and Logout
|
||||
----------------
|
||||
|
||||
The client tool prompts you to enter the login password as soon as you
|
||||
The client tool prompts you to enter the logon password as soon as you
|
||||
want to access the backup server. The server checks your credentials
|
||||
and responds with a ticket that is valid for two hours. The client
|
||||
tool automatically stores that ticket and uses it for further requests
|
||||
@ -706,7 +535,7 @@ Changing the Owner of a Backup Group
|
||||
By default, the owner of a backup group is the user which was used to originally
|
||||
create that backup group (or in the case of sync jobs, ``root@pam``). This
|
||||
means that if a user ``mike@pbs`` created a backup, another user ``john@pbs``
|
||||
can not be used to create backups in that same backup group. In case you want
|
||||
can not be used to create backups in that same backup group. In case you want
|
||||
to change the owner of a backup, you can do so with the below command, using a
|
||||
user that has ``Datastore.Modify`` privileges on the datastore.
|
||||
|
||||
@ -715,10 +544,10 @@ user that has ``Datastore.Modify`` privileges on the datastore.
|
||||
# proxmox-backup-client change-owner vm/103 john@pbs
|
||||
|
||||
This can also be done from within the web interface, by navigating to the
|
||||
`Content` section of the datastore that contains the backup group and selecting
|
||||
the user icon under the `Actions` column. Common cases for this could be to
|
||||
change the owner of a sync job from ``root@pam``, or to repurpose a backup
|
||||
group.
|
||||
`Content` section of the datastore that contains the backup group and
|
||||
selecting the user icon under the `Actions` column. Common cases for this could
|
||||
be to change the owner of a sync job from ``root@pam``, or to repurpose a
|
||||
backup group.
|
||||
|
||||
|
||||
.. _backup-pruning:
|
||||
@ -726,24 +555,16 @@ group.
|
||||
Pruning and Removing Backups
|
||||
----------------------------
|
||||
|
||||
You can manually delete a backup snapshot using the ``forget`` command:
|
||||
You can manually delete a backup snapshot using the ``forget``
|
||||
command:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client snapshot forget <snapshot>
|
||||
|
||||
|
||||
.. caution:: This command removes all archives in this backup snapshot. They
|
||||
will be inaccessible and *unrecoverable*.
|
||||
|
||||
Don't forget to add the namespace ``--ns`` parameter if you want to forget a
|
||||
snapshot that is contained in the root namespace:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client snapshot forget <snapshot> --ns <ns>
|
||||
|
||||
|
||||
.. caution:: This command removes all archives in this backup
|
||||
snapshot. They will be inaccessible and unrecoverable.
|
||||
|
||||
|
||||
Although manual removal is sometimes required, the ``prune``
|
||||
@ -755,28 +576,28 @@ following retention options are available:
|
||||
Keep the last ``<N>`` backup snapshots.
|
||||
|
||||
``--keep-hourly <N>``
|
||||
Keep backups for the last ``<N>`` hours. If there is more than one backup for
|
||||
a single hour, only the latest is kept. Hours without backups do not count.
|
||||
Keep backups for the last ``<N>`` hours. If there is more than one
|
||||
backup for a single hour, only the latest is kept.
|
||||
|
||||
``--keep-daily <N>``
|
||||
Keep backups for the last ``<N>`` days. If there is more than one backup for a
|
||||
single day, only the latest is kept. Days without backups do not count.
|
||||
Keep backups for the last ``<N>`` days. If there is more than one
|
||||
backup for a single day, only the latest is kept.
|
||||
|
||||
``--keep-weekly <N>``
|
||||
Keep backups for the last ``<N>`` weeks. If there is more than one backup for
|
||||
a single week, only the latest is kept. Weeks without backup do not count.
|
||||
Keep backups for the last ``<N>`` weeks. If there is more than one
|
||||
backup for a single week, only the latest is kept.
|
||||
|
||||
.. note:: Weeks start on Monday and end on Sunday. The software
|
||||
uses the `ISO week date`_ system and handles weeks at
|
||||
the end of the year correctly.
|
||||
|
||||
``--keep-monthly <N>``
|
||||
Keep backups for the last ``<N>`` months. If there is more than one backup for
|
||||
a single month, only the latest is kept. Months without backups do not count.
|
||||
Keep backups for the last ``<N>`` months. If there is more than one
|
||||
backup for a single month, only the latest is kept.
|
||||
|
||||
``--keep-yearly <N>``
|
||||
Keep backups for the last ``<N>`` years. If there is more than one backup for
|
||||
a single year, only the latest is kept. Years without backups do not count.
|
||||
Keep backups for the last ``<N>`` years. If there is more than one
|
||||
backup for a single year, only the latest is kept.
|
||||
|
||||
The retention options are processed in the order given above. Each option
|
||||
only covers backups within its time period. The next option does not take care
|
||||
@ -815,25 +636,6 @@ shows the list of existing snapshots and what actions prune would take.
|
||||
in the chunk-store. The chunk-store still contains the data blocks. To free
|
||||
space you need to perform :ref:`client_garbage-collection`.
|
||||
|
||||
It is also possible to protect single snapshots from being pruned or deleted:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client snapshot protected update <snapshot> true
|
||||
|
||||
This will set the protected flag on the snapshot and prevent pruning or manual
|
||||
deletion of this snapshot until the flag is removed again with:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client snapshot protected update <snapshot> false
|
||||
|
||||
When a group with a protected snapshot is deleted, only the non-protected
|
||||
ones are removed, and the rest will remain.
|
||||
|
||||
.. note:: This flag will not be synced when using pull or sync jobs. If you
|
||||
want to protect a synced snapshot, you have to do this again manually on
|
||||
the target backup server.
|
||||
|
||||
.. _client_garbage-collection:
|
||||
|
||||
@ -841,25 +643,29 @@ Garbage Collection
|
||||
------------------
|
||||
|
||||
The ``prune`` command removes only the backup index files, not the data
|
||||
from the datastore. Deletion of unused backup data from the datastore is done by
|
||||
:ref:`garbage collection<_maintenance_gc>`. It is therefore recommended to
|
||||
schedule garbage collection tasks on a regular basis. The working principle of
|
||||
garbage collection is described in more details in the related :ref:`background
|
||||
section <gc_background>`.
|
||||
from the datastore. This task is left to the garbage collection
|
||||
command. It is recommended to carry out garbage collection on a regular basis.
|
||||
|
||||
To start garbage collection from the client side, run the following command:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# proxmox-backup-client garbage-collect
|
||||
The garbage collection works in two phases. In the first phase, all
|
||||
data blocks that are still in use are marked. In the second phase,
|
||||
unused data blocks are removed.
|
||||
|
||||
.. note:: This command needs to read all existing backup index files
|
||||
and touches the complete chunk-store. This can take a long time
|
||||
depending on the number of chunks and the speed of the underlying
|
||||
disks.
|
||||
|
||||
The progress of the garbage collection will be displayed as shown in the example
|
||||
below:
|
||||
.. note:: The garbage collection will only remove chunks that haven't been used
|
||||
for at least one day (exactly 24h 5m). This grace period is necessary because
|
||||
chunks in use are marked by touching the chunk which updates the ``atime``
|
||||
(access time) property. Filesystems are mounted with the ``relatime`` option
|
||||
by default. This results in a better performance by only updating the
|
||||
``atime`` property if the last access has been at least 24 hours ago. The
|
||||
downside is, that touching a chunk within these 24 hours will not always
|
||||
update its ``atime`` property.
|
||||
|
||||
Chunks in the grace period will be logged at the end of the garbage
|
||||
collection task as *Pending removals*.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -879,8 +685,8 @@ below:
|
||||
Average chunk size: 2486565
|
||||
TASK OK
|
||||
|
||||
Garbage collection can also be scheduled using ``proxmox-backup-manager`` or
|
||||
from the Proxmox Backup Server's web interface.
|
||||
|
||||
.. todo:: howto run garbage-collection at regular intervals (cron)
|
||||
|
||||
Benchmarking
|
||||
------------
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
Backup Protocol
|
||||
===============
|
||||
|
||||
`Proxmox Backup`_ Server uses a REST-based API. While the management
|
||||
interface uses normal HTTP, the actual backup and restore interface uses
|
||||
Proxmox Backup Server uses a REST based API. While the management
|
||||
interface use normal HTTP, the actual backup and restore interface use
|
||||
HTTP/2 for improved performance. Both HTTP and HTTP/2 are well known
|
||||
standards, so the following section assumes that you are familiar with
|
||||
standards, so the following section assumes that you are familiar on
|
||||
how to use them.
|
||||
|
||||
|
||||
@ -13,35 +13,35 @@ Backup Protocol API
|
||||
|
||||
To start a new backup, the API call ``GET /api2/json/backup`` needs to
|
||||
be upgraded to a HTTP/2 connection using
|
||||
``proxmox-backup-protocol-v1`` as the protocol name::
|
||||
``proxmox-backup-protocol-v1`` as protocol name::
|
||||
|
||||
GET /api2/json/backup HTTP/1.1
|
||||
UPGRADE: proxmox-backup-protocol-v1
|
||||
|
||||
The server replies with the ``HTTP 101 Switching Protocol`` status code,
|
||||
and you can then issue REST commands on the updated HTTP/2 connection.
|
||||
The server replies with HTTP 101 Switching Protocol status code,
|
||||
and you can then issue REST commands on that updated HTTP/2 connection.
|
||||
|
||||
The backup protocol allows you to upload three different kind of files:
|
||||
|
||||
- Chunks and blobs (binary data)
|
||||
|
||||
- Fixed indexes (List of chunks with fixed size)
|
||||
- Fixed Indexes (List of chunks with fixed size)
|
||||
|
||||
- Dynamic indexes (List of chunks with variable size)
|
||||
- Dynamic Indexes (List of chunk with variable size)
|
||||
|
||||
The following section provides a short introduction on how to upload such
|
||||
The following section gives a short introduction how to upload such
|
||||
files. Please use the `API Viewer <api-viewer/index.html>`_ for
|
||||
details about the available REST commands.
|
||||
details about available REST commands.
|
||||
|
||||
|
||||
Upload Blobs
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Blobs are uploaded using ``POST /blob``. The HTTP body contains the
|
||||
data encoded as :ref:`Data Blob <data-blob-format>`.
|
||||
Uploading blobs is done using ``POST /blob``. The HTTP body contains the
|
||||
data encoded as :ref:`Data Blob <data-blob-format>`).
|
||||
|
||||
The file name must end with ``.blob``, and is automatically added
|
||||
to the backup manifest, following the call to ``POST /finish``.
|
||||
The file name needs to end with ``.blob``, and is automatically added
|
||||
to the backup manifest.
|
||||
|
||||
|
||||
Upload Chunks
|
||||
@ -56,41 +56,40 @@ encoded as :ref:`Data Blob <data-blob-format>`).
|
||||
Upload Fixed Indexes
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Fixed indexes are used to store VM image data. The VM image is split
|
||||
Fixed indexes are use to store VM image data. The VM image is split
|
||||
into equally sized chunks, which are uploaded individually. The index
|
||||
file simply contains a list of chunk digests.
|
||||
file simply contains a list to chunk digests.
|
||||
|
||||
You create a fixed index with ``POST /fixed_index``. Then, upload
|
||||
You create a fixed index with ``POST /fixed_index``. Then upload
|
||||
chunks with ``POST /fixed_chunk``, and append them to the index with
|
||||
``PUT /fixed_index``. When finished, you need to close the index using
|
||||
``POST /fixed_close``.
|
||||
|
||||
The file name needs to end with ``.fidx``, and is automatically added
|
||||
to the backup manifest, following the call to ``POST /finish``.
|
||||
to the backup manifest.
|
||||
|
||||
|
||||
Upload Dynamic Indexes
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Dynamic indexes are used to store file archive data. The archive data
|
||||
Dynamic indexes are use to store file archive data. The archive data
|
||||
is split into dynamically sized chunks, which are uploaded
|
||||
individually. The index file simply contains a list of chunk digests
|
||||
individually. The index file simply contains a list to chunk digests
|
||||
and offsets.
|
||||
|
||||
You can create a dynamically sized index with ``POST /dynamic_index``. Then,
|
||||
You create a dynamic sized index with ``POST /dynamic_index``. Then
|
||||
upload chunks with ``POST /dynamic_chunk``, and append them to the index with
|
||||
``PUT /dynamic_index``. When finished, you need to close the index using
|
||||
``POST /dynamic_close``.
|
||||
|
||||
The filename needs to end with ``.didx``, and is automatically added
|
||||
to the backup manifest, following the call to ``POST /finish``.
|
||||
|
||||
The file name needs to end with ``.didx``, and is automatically added
|
||||
to the backup manifest.
|
||||
|
||||
Finish Backup
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Once you have uploaded all data, you need to call ``POST /finish``. This
|
||||
commits all data and ends the backup protocol.
|
||||
Once you have uploaded all data, you need to call ``POST
|
||||
/finish``. This commits all data and ends the backup protocol.
|
||||
|
||||
|
||||
Restore/Reader Protocol API
|
||||
@ -103,39 +102,39 @@ be upgraded to a HTTP/2 connection using
|
||||
GET /api2/json/reader HTTP/1.1
|
||||
UPGRADE: proxmox-backup-reader-protocol-v1
|
||||
|
||||
The server replies with the ``HTTP 101 Switching Protocol`` status code,
|
||||
The server replies with HTTP 101 Switching Protocol status code,
|
||||
and you can then issue REST commands on that updated HTTP/2 connection.
|
||||
|
||||
The reader protocol allows you to download three different kinds of files:
|
||||
The reader protocol allows you to download three different kind of files:
|
||||
|
||||
- Chunks and blobs (binary data)
|
||||
|
||||
- Fixed indexes (list of chunks with fixed size)
|
||||
- Fixed Indexes (List of chunks with fixed size)
|
||||
|
||||
- Dynamic indexes (list of chunks with variable size)
|
||||
- Dynamic Indexes (List of chunk with variable size)
|
||||
|
||||
The following section provides a short introduction on how to download such
|
||||
The following section gives a short introduction how to download such
|
||||
files. Please use the `API Viewer <api-viewer/index.html>`_ for details about
|
||||
the available REST commands.
|
||||
available REST commands.
|
||||
|
||||
|
||||
Download Blobs
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Blobs are downloaded using ``GET /download``. The HTTP body contains the
|
||||
Downloading blobs is done using ``GET /download``. The HTTP body contains the
|
||||
data encoded as :ref:`Data Blob <data-blob-format>`.
|
||||
|
||||
|
||||
Download Chunks
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Chunks are downloaded using ``GET /chunk``. The HTTP body contains the
|
||||
data encoded as :ref:`Data Blob <data-blob-format>`.
|
||||
Downloading chunks is done using ``GET /chunk``. The HTTP body contains the
|
||||
data encoded as :ref:`Data Blob <data-blob-format>`).
|
||||
|
||||
|
||||
Download Index Files
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Index files are downloaded using ``GET /download``. The HTTP body
|
||||
Downloading index files is done using ``GET /download``. The HTTP body
|
||||
contains the data encoded as :ref:`Fixed Index <fixed-index-format>`
|
||||
or :ref:`Dynamic Index <dynamic-index-format>`.
|
||||
|
||||
@ -7,7 +7,7 @@ Introduction and Format
|
||||
-----------------------
|
||||
|
||||
Certain tasks, for example pruning and garbage collection, need to be
|
||||
performed on a regular basis. `Proxmox Backup`_ Server uses a format inspired
|
||||
performed on a regular basis. Proxmox Backup Server uses a format inspired
|
||||
by the systemd Time and Date Specification (see `systemd.time manpage`_)
|
||||
called `calendar events` for its schedules.
|
||||
|
||||
@ -37,7 +37,7 @@ Each field can contain multiple values in the following formats:
|
||||
* and a combination of the above: e.g., 01,05..10,12/02
|
||||
* or a `*` for every possible value: e.g., \*:00
|
||||
|
||||
There are some special values that have a specific meaning:
|
||||
There are some special values that have specific meaning:
|
||||
|
||||
================================= ==============================
|
||||
Value Syntax
|
||||
@ -81,19 +81,19 @@ Not all features of systemd calendar events are implemented:
|
||||
|
||||
* no Unix timestamps (e.g. `@12345`): instead use date and time to specify
|
||||
a specific point in time
|
||||
* no timezone: all schedules use the timezone of the server
|
||||
* no timezone: all schedules use the set timezone on the server
|
||||
* no sub-second resolution
|
||||
* no reverse day syntax (e.g. 2020-03~01)
|
||||
* no repetition of ranges (e.g. 1..10/2)
|
||||
|
||||
Notes on Scheduling
|
||||
Notes on scheduling
|
||||
-------------------
|
||||
|
||||
In Proxmox Backup, scheduling for most tasks is done in the
|
||||
In `Proxmox Backup`_ scheduling for most tasks is done in the
|
||||
`proxmox-backup-proxy`. This daemon checks all job schedules
|
||||
every minute, to see if any are due. This means that even though
|
||||
if they are due every minute. This means that even if
|
||||
`calendar events` can contain seconds, it will only be checked
|
||||
once per minute.
|
||||
once a minute.
|
||||
|
||||
Also, all schedules will be checked against the timezone set
|
||||
in the Proxmox Backup Server.
|
||||
in the `Proxmox Backup`_ server.
|
||||
|
||||
@ -1,335 +0,0 @@
|
||||
.. _sysadmin_certificate_management:
|
||||
|
||||
Certificate Management
|
||||
----------------------
|
||||
|
||||
Access to the API and thus the web-based administration interface is always
|
||||
encrypted through ``https``. Each `Proxmox Backup`_ host creates by default its
|
||||
own (self-signed) certificate. This certificate is used for encrypted
|
||||
communication with the host’s ``proxmox-backup-proxy`` service, for any API
|
||||
call between a user or backup-client and the web-interface.
|
||||
|
||||
Certificate verification when sending backups to a Proxmox Backup Server
|
||||
is either done based on pinning the certificate fingerprints in the storage/remote
|
||||
configuration, or by using certificates, signed by a trusted certificate authority.
|
||||
|
||||
.. _sysadmin_certs_api_gui:
|
||||
|
||||
Certificates for the API and SMTP
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Proxmox Backup stores its certificate and key in:
|
||||
|
||||
- ``/etc/proxmox-backup/proxy.pem``
|
||||
|
||||
- ``/etc/proxmox-backup/proxy.key``
|
||||
|
||||
You have the following options for the certificate:
|
||||
|
||||
1. Keep using the default self-signed certificate in
|
||||
``/etc/proxmox-backup/proxy.pem``.
|
||||
|
||||
2. Use an externally provided certificate (for example, signed by a
|
||||
commercial Certificate Authority (CA)).
|
||||
|
||||
3. Use an ACME provider like Let’s Encrypt to get a trusted certificate
|
||||
with automatic renewal; this is also integrated in the Proxmox Backup
|
||||
API and web interface.
|
||||
|
||||
Certificates are managed through the Proxmox Backup
|
||||
web-interface/API or using the ``proxmox-backup-manager`` CLI tool.
|
||||
|
||||
.. _sysadmin_certs_upload_custom:
|
||||
|
||||
Upload Custom Certificate
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you already have a certificate which you want to use for a `Proxmox Backup`_
|
||||
host, you can simply upload that certificate over the web interface.
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-certs-upload-custom.png
|
||||
:target: _images/pbs-gui-certs-upload-custom.png
|
||||
:align: right
|
||||
:alt: Upload a custom certificate
|
||||
|
||||
Note that any certificate key files must not be password protected.
|
||||
|
||||
.. _sysadmin_certs_get_trusted_acme_cert:
|
||||
|
||||
Trusted certificates via Let’s Encrypt (ACME)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Proxmox Backup includes an implementation of the **A**\ utomatic
|
||||
**C**\ ertificate **M**\ anagement **E**\ nvironment (**ACME**)
|
||||
protocol, allowing Proxmox Backup admins to use an ACME provider
|
||||
like Let’s Encrypt for easy setup of TLS certificates, which are
|
||||
accepted and trusted by modern operating systems and web browsers out of
|
||||
the box.
|
||||
|
||||
Currently, the two ACME endpoints implemented are the `Let’s Encrypt
|
||||
(LE) <https://letsencrypt.org>`_ production and staging environments.
|
||||
Our ACME client supports validation of ``http-01`` challenges using a
|
||||
built-in web server and validation of ``dns-01`` challenges using a DNS
|
||||
plugin supporting all the DNS API endpoints
|
||||
`acme.sh <https://acme.sh>`_ does.
|
||||
|
||||
.. _sysadmin_certs_acme_account:
|
||||
|
||||
ACME Account
|
||||
^^^^^^^^^^^^
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-acme-create-account.png
|
||||
:target: _images/pbs-gui-acme-create-account.png
|
||||
:align: right
|
||||
:alt: Create ACME Account
|
||||
|
||||
You need to register an ACME account per cluster, with the endpoint you
|
||||
want to use. The email address used for that account will serve as the
|
||||
contact point for renewal-due or similar notifications from the ACME
|
||||
endpoint.
|
||||
|
||||
You can register or deactivate ACME accounts over the web interface
|
||||
``Certificates -> ACME Accounts`` or using the ``proxmox-backup-manager``
|
||||
command-line tool.
|
||||
|
||||
::
|
||||
|
||||
proxmox-backup-manager acme account register <account-name> <mail@example.com>
|
||||
|
||||
.. tip::
|
||||
|
||||
Because of
|
||||
`rate-limits <https://letsencrypt.org/docs/rate-limits/>`_ you
|
||||
should use LE ``staging`` for experiments or if you use ACME for the
|
||||
very first time until all is working there, and only then switch over
|
||||
to the production directory.
|
||||
|
||||
.. _sysadmin_certs_acme_plugins:
|
||||
|
||||
ACME Plugins
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The ACME plugin’s role is to provide automatic verification that you,
|
||||
and thus the Proxmox Backup Server under your operation, are the
|
||||
real owner of a domain. This is the basic building block of automatic
|
||||
certificate management.
|
||||
|
||||
The ACME protocol specifies different types of challenges, for example
|
||||
the ``http-01``, where a web server provides a file with a specific
|
||||
token to prove that it controls a domain. Sometimes this isn’t possible,
|
||||
either because of technical limitations or if the address of a record is
|
||||
not reachable from the public internet. The ``dns-01`` challenge can be
|
||||
used in such cases. This challenge is fulfilled by creating a certain
|
||||
DNS record in the domain’s zone.
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-acme-create-challenge-plugin.png
|
||||
:target: _images/pbs-gui-acme-create-challenge-plugin.png
|
||||
:align: right
|
||||
:alt: Create ACME Account
|
||||
|
||||
Proxmox Backup supports both of those challenge types out of the
|
||||
box, you can configure plugins either over the web interface under
|
||||
``Certificates -> ACME Challenges``, or using the
|
||||
``proxmox-backup-manager acme plugin add`` command.
|
||||
|
||||
ACME Plugin configurations are stored in ``/etc/proxmox-backup/acme/plugins.cfg``.
|
||||
|
||||
.. _domains:
|
||||
|
||||
Domains
|
||||
^^^^^^^
|
||||
|
||||
You can add new or manage existing domain entries under
|
||||
``Certificates``, or using the ``proxmox-backup-manager`` command.
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-acme-add-domain.png
|
||||
:target: _images/pbs-gui-acme-add-domain.png
|
||||
:align: right
|
||||
:alt: Add a Domain for ACME verification
|
||||
|
||||
After configuring the desired domain(s) for a node and ensuring that the
|
||||
desired ACME account is selected, you can order your new certificate
|
||||
over the web-interface. On success, the interface will reload after
|
||||
roughly 10 seconds.
|
||||
|
||||
Renewal will happen `automatically <#sysadmin-certs-acme-automatic-renewal>`_
|
||||
|
||||
.. _sysadmin_certs_acme_http_challenge:
|
||||
|
||||
ACME HTTP Challenge Plugin
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
There is always an implicitly configured ``standalone`` plugin for
|
||||
validating ``http-01`` challenges via the built-in web server spawned on
|
||||
port 80.
|
||||
|
||||
.. note::
|
||||
|
||||
The name ``standalone`` means that it can provide the validation on
|
||||
its own, without any third party service.
|
||||
|
||||
There are a few prerequisites to use this for certificate management
|
||||
with Let’s Encrypts ACME.
|
||||
|
||||
- You have to accept the ToS of Let’s Encrypt to register an account.
|
||||
|
||||
- **Port 80** of the node needs to be reachable from the internet.
|
||||
|
||||
- There **must** be no other listener on port 80.
|
||||
|
||||
- The requested (sub)domain needs to resolve to a public IP of the
|
||||
Proxmox Backup host.
|
||||
|
||||
.. _sysadmin_certs_acme_dns_challenge:
|
||||
|
||||
ACME DNS API Challenge Plugin
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
On systems where external access for validation via the ``http-01``
|
||||
method is not possible or desired, it is possible to use the ``dns-01``
|
||||
validation method. This validation method requires a DNS server that
|
||||
allows provisioning of ``TXT`` records via an API.
|
||||
|
||||
.. _sysadmin_certs_acme_dns_api_config:
|
||||
|
||||
Configuring ACME DNS APIs for validation
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Proxmox Backup re-uses the DNS plugins developed for the
|
||||
``acme.sh`` [1]_ project. Please refer to its documentation for details
|
||||
on configuration of specific APIs.
|
||||
|
||||
The easiest way to configure a new plugin with the DNS API is using the
|
||||
web interface (``Certificates -> ACME Accounts/Challenges``).
|
||||
|
||||
Here you can add a new challenge plugin by selecting your API provider
|
||||
and entering the credential data to access your account over their API.
|
||||
|
||||
.. tip::
|
||||
|
||||
See the acme.sh `How to use DNS
|
||||
API <https://github.com/acmesh-official/acme.sh/wiki/dnsapi#how-to-use-dns-api>`_
|
||||
wiki for more detailed information about getting API credentials for
|
||||
your provider. Configuration values do not need to be quoted with
|
||||
single or double quotes; for some plugins that is even an error.
|
||||
|
||||
As there are many DNS providers and API endpoints, Proxmox Backup
|
||||
automatically generates the form for the credentials, but not all
|
||||
providers are annotated yet. For those you will see a bigger text area,
|
||||
into which you simply need to copy all the credential’s
|
||||
``KEY``\ =\ ``VALUE`` pairs.
|
||||
|
||||
.. _dns_validation_through_cname_alias:
|
||||
|
||||
DNS Validation through CNAME Alias
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A special ``alias`` mode can be used to handle validation on a different
|
||||
domain/DNS server, in case your primary/real DNS does not support
|
||||
provisioning via an API. Manually set up a permanent ``CNAME`` record
|
||||
for ``_acme-challenge.domain1.example`` pointing to
|
||||
``_acme-challenge.domain2.example``, and set the ``alias`` property in
|
||||
the Proxmox Backup node configuration file ``/etc/proxmox-backup/node.cfg``
|
||||
to ``domain2.example`` to allow the DNS server of ``domain2.example`` to
|
||||
validate all challenges for ``domain1.example``.
|
||||
|
||||
.. _sysadmin_certs_acme_dns_wildcard:
|
||||
|
||||
Wildcard Certificates
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Wildcard DNS names start with a ``*.`` prefix and are considered valid
|
||||
for all (one-level) subdomain names of the verified domain. So a
|
||||
certificate for ``*.domain.example`` is valid for ``foo.domain.example``
|
||||
and ``bar.domain.example``, but not for ``baz.foo.domain.example``.
|
||||
|
||||
Currently, you can only create wildcard certificates with the `DNS
|
||||
challenge
|
||||
type <https://letsencrypt.org/docs/challenge-types/#dns-01-challenge>`_.
|
||||
|
||||
.. _combination_of_plugins:
|
||||
|
||||
Combination of Plugins
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Combining ``http-01`` and ``dns-01`` validation is possible in case your
|
||||
node is reachable via multiple domains with different requirements / DNS
|
||||
provisioning capabilities. Mixing DNS APIs from multiple providers or
|
||||
instances is also possible by specifying different plugin instances per
|
||||
domain.
|
||||
|
||||
.. tip::
|
||||
|
||||
Accessing the same service over multiple domains increases complexity
|
||||
and should be avoided if possible.
|
||||
|
||||
.. _sysadmin_certs_acme_automatic_renewal:
|
||||
|
||||
Automatic renewal of ACME certificates
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If a node has been successfully configured with an ACME-provided
|
||||
certificate (either via ``proxmox-backup-manager`` or via the web-interface/API), the
|
||||
certificate will be renewed automatically by the ``proxmox-backup-daily-update.service``.
|
||||
Currently, renewal is triggered if the certificate either has already
|
||||
expired or if it will expire in the next 30 days.
|
||||
|
||||
.. _manually_change_certificate_over_command_line:
|
||||
|
||||
Manually Change Certificate over the Command Line
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you want to get rid of certificate verification warnings, you have to
|
||||
generate a valid certificate for your server.
|
||||
|
||||
Log in to your Proxmox Backup via ssh or use the console:
|
||||
|
||||
::
|
||||
|
||||
openssl req -newkey rsa:2048 -nodes -keyout key.pem -out req.pem
|
||||
|
||||
Follow the instructions on the screen, for example:
|
||||
|
||||
::
|
||||
|
||||
Country Name (2 letter code) [AU]: AT
|
||||
State or Province Name (full name) [Some-State]:Vienna
|
||||
Locality Name (eg, city) []:Vienna
|
||||
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Proxmox GmbH
|
||||
Organizational Unit Name (eg, section) []:Proxmox Backup
|
||||
Common Name (eg, YOUR name) []: yourproxmox.yourdomain.com
|
||||
Email Address []:support@yourdomain.com
|
||||
|
||||
Please enter the following 'extra' attributes to be sent with your certificate request
|
||||
A challenge password []: not necessary
|
||||
An optional company name []: not necessary
|
||||
|
||||
After you have finished the certificate request, you have to send the
|
||||
file ``req.pem`` to your Certification Authority (CA). The CA will issue
|
||||
the certificate (BASE64 encoded), based on your request – save this file
|
||||
as ``cert.pem`` to your Proxmox Backup.
|
||||
|
||||
To activate the new certificate, do the following on your Proxmox Backup
|
||||
|
||||
::
|
||||
|
||||
cp key.pem /etc/proxmox-backup/proxy.key
|
||||
cp cert.pem /etc/proxmox-backup/proxy.pem
|
||||
|
||||
Then restart the API servers:
|
||||
|
||||
::
|
||||
|
||||
systemctl restart proxmox-backup-proxy
|
||||
|
||||
Test your new certificate, using your browser.
|
||||
|
||||
.. note::
|
||||
|
||||
To transfer files to and from your Proxmox Backup, you can use
|
||||
secure copy: If your desktop runs Linux, you can use the ``scp``
|
||||
command-line tool. If your desktop PC runs windows, please use an scp
|
||||
client like WinSCP (see https://winscp.net/).
|
||||
|
||||
.. [1]
|
||||
acme.sh https://github.com/acmesh-official/acme.sh
|
||||
@ -1,4 +1,4 @@
|
||||
Command-line Tools
|
||||
Command Line Tools
|
||||
------------------
|
||||
|
||||
``proxmox-backup-client``
|
||||
@ -6,37 +6,18 @@ Command-line Tools
|
||||
|
||||
.. include:: proxmox-backup-client/description.rst
|
||||
|
||||
``proxmox-file-restore``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. include:: proxmox-file-restore/description.rst
|
||||
|
||||
``proxmox-backup-manager``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. include:: proxmox-backup-manager/description.rst
|
||||
|
||||
``proxmox-tape``
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. include:: proxmox-tape/description.rst
|
||||
|
||||
``pmt``
|
||||
~~~~~~~
|
||||
|
||||
.. include:: pmt/description.rst
|
||||
|
||||
``pmtx``
|
||||
~~~~~~~~
|
||||
|
||||
.. include:: pmtx/description.rst
|
||||
|
||||
``pxar``
|
||||
~~~~~~~~
|
||||
|
||||
.. include:: pxar/description.rst
|
||||
|
||||
``proxmox-file-restore``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. include:: proxmox-file-restore/description.rst
|
||||
|
||||
``proxmox-backup-debug``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. include:: proxmox-backup-debug/description.rst
|
||||
|
||||
@ -1,10 +1,6 @@
|
||||
Command Syntax
|
||||
==============
|
||||
|
||||
.. NOTE:: Logging verbosity for the command-line tools can be controlled with the
|
||||
``PBS_LOG`` (for ``pxar``: ``PXAR_LOG``) environment variable. Possible values are `off`,
|
||||
`error`, `warn`, `info`, `debug` and `trace` with `info` being the default.
|
||||
|
||||
``proxmox-backup-client``
|
||||
-------------------------
|
||||
|
||||
@ -14,7 +10,7 @@ Command Syntax
|
||||
Catalog Shell Commands
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The following commands are available in an interactive restore shell:
|
||||
Those command are available when you start an interactive restore shell:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
@ -55,13 +51,3 @@ The following commands are available in an interactive restore shell:
|
||||
--------
|
||||
|
||||
.. include:: pxar/synopsis.rst
|
||||
|
||||
|
||||
``proxmox-file-restore``
|
||||
------------------------
|
||||
.. include:: proxmox-file-restore/synopsis.rst
|
||||
|
||||
|
||||
``proxmox-backup-debug``
|
||||
------------------------
|
||||
.. include:: proxmox-backup-debug/synopsis.rst
|
||||
|
||||
62
docs/conf.py
@ -69,12 +69,15 @@ source_suffix = '.rst'
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
epilog_file = open('epilog.rst', 'r')
|
||||
rst_epilog = epilog_file.read()
|
||||
|
||||
# General information about the project.
|
||||
project = 'Proxmox Backup'
|
||||
copyright = '2019-2025, Proxmox Server Solutions GmbH'
|
||||
copyright = '2019-2021, Proxmox Server Solutions GmbH'
|
||||
author = 'Proxmox Support Team'
|
||||
|
||||
# The version info for the project you're documenting acts as a replacement for
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
@ -85,48 +88,12 @@ version = vstr(os.getenv('DEB_VERSION_UPSTREAM'))
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = vstr(os.getenv('DEB_VERSION'))
|
||||
|
||||
epilog_file = open('epilog.rst', 'r')
|
||||
rst_epilog = epilog_file.read()
|
||||
rst_epilog += f"\n.. |VERSION| replace:: {version}"
|
||||
rst_epilog += f"\n.. |pbs-copyright| replace:: Copyright (C) {copyright}"
|
||||
|
||||
man_pages = [
|
||||
# CLI
|
||||
('proxmox-backup-client/man1', 'proxmox-backup-client', 'Command line tool for Backup and Restore', [author], 1),
|
||||
('proxmox-backup-manager/man1', 'proxmox-backup-manager', 'Command line tool to manage and configure the backup server.', [author], 1),
|
||||
('proxmox-backup-debug/man1', 'proxmox-backup-debug', 'Debugging command line tool for Backup and Restore', [author], 1),
|
||||
('proxmox-backup-proxy/man1', 'proxmox-backup-proxy', 'Proxmox Backup Public API Server', [author], 1),
|
||||
('proxmox-backup/man1', 'proxmox-backup', 'Proxmox Backup Local API Server', [author], 1),
|
||||
('proxmox-file-restore/man1', 'proxmox-file-restore', 'CLI tool for restoring files and directories from Proxmox Backup Server archives', [author], 1),
|
||||
('proxmox-tape/man1', 'proxmox-tape', 'Proxmox Tape Backup CLI Tool', [author], 1),
|
||||
('pxar/man1', 'pxar', 'Proxmox File Archive CLI Tool', [author], 1),
|
||||
('pmt/man1', 'pmt', 'Control Linux Tape Devices', [author], 1),
|
||||
('pmtx/man1', 'pmtx', 'Control SCSI media changer devices (tape autoloaders)', [author], 1),
|
||||
('pbs3to4/man1', 'pbs3to4', 'Proxmox Backup Server upgrade checker script for 3.4+ to current 4.x major upgrades', [author], 1),
|
||||
# configs
|
||||
('config/acl/man5', 'acl.cfg', 'Access Control Configuration', [author], 5),
|
||||
('config/datastore/man5', 'datastore.cfg', 'Datastore Configuration', [author], 5),
|
||||
('config/domains/man5', 'domains.cfg', 'Realm Configuration', [author], 5),
|
||||
('config/media-pool/man5', 'media-pool.cfg', 'Media Pool Configuration', [author], 5),
|
||||
('config/node/man5', 'proxmox-backup.node.cfg', 'Proxmox Backup Server - Node Configuration', [author], 5),
|
||||
('config/remote/man5', 'remote.cfg', 'Remote Server Configuration', [author], 5),
|
||||
('config/sync/man5', 'sync.cfg', 'Synchronization Job Configuration', [author], 5),
|
||||
('config/tape-job/man5', 'tape-job.cfg', 'Tape Job Configuration', [author], 5),
|
||||
('config/tape/man5', 'tape.cfg', 'Tape Drive and Changer Configuration', [author], 5),
|
||||
('config/user/man5', 'user.cfg', 'User Configuration', [author], 5),
|
||||
('config/verification/man5', 'verification.cfg', 'Verification Job Configuration', [author], 5),
|
||||
('config/prune/man5', 'prune.cfg', 'Prune Job Configuration', [author], 5),
|
||||
('config/notifications/man5', 'notifications.cfg', 'Notification target/matcher configuration', [author], 5),
|
||||
('config/notifications-priv/man5', 'notifications-priv.cfg', 'Notification target secrets', [author], 5),
|
||||
]
|
||||
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = 'en'
|
||||
language = None
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
@ -135,20 +102,17 @@ language = 'en'
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
today_fmt = '%A, %d %B %Y'
|
||||
|
||||
suppress_warnings = [ 'toc.excluded' ]
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This patterns also effect to html_static_path and html_extra_path
|
||||
exclude_patterns = [
|
||||
'_build', 'Thumbs.db', '.DS_Store',
|
||||
'certificate-management.rst',
|
||||
'*/man1.rst',
|
||||
'config/*/man5.rst',
|
||||
'epilog.rst',
|
||||
'pbs-copyright.rst',
|
||||
'local-zfs.rst',
|
||||
'local-zfs.rst'
|
||||
'package-repositories.rst',
|
||||
'system-booting.rst',
|
||||
'traffic-control.rst',
|
||||
]
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all
|
||||
@ -203,12 +167,11 @@ html_theme_options = {
|
||||
'show_powered_by': False,
|
||||
|
||||
'extra_nav_links': {
|
||||
'Proxmox Homepage': 'https://www.proxmox.com',
|
||||
'Proxmox Homepage': 'https://proxmox.com',
|
||||
'PDF': 'proxmox-backup.pdf',
|
||||
'API Viewer' : 'api-viewer/index.html',
|
||||
'Prune Simulator' : 'prune-simulator/index.html',
|
||||
'LTO Barcode Generator' : 'lto-barcode/index.html',
|
||||
'Proxmox Backup Server Wiki' : 'https://pbs.proxmox.com'
|
||||
},
|
||||
|
||||
'sidebar_width': '320px',
|
||||
@ -269,9 +232,6 @@ html_static_path = ['_static']
|
||||
html_js_files = [
|
||||
'custom.js',
|
||||
]
|
||||
html_css_files = [
|
||||
'custom.css',
|
||||
]
|
||||
|
||||
# Add any extra paths that contain custom files (such as robots.txt or
|
||||
# .htaccess) here, relative to this directory. These files are copied
|
||||
@ -423,8 +383,6 @@ latex_logo = "images/proxmox-logo.png"
|
||||
#
|
||||
# latex_domain_indices = True
|
||||
|
||||
latex_table_style = ['booktabs', 'colorrows']
|
||||
|
||||
|
||||
# -- Options for Epub output ----------------------------------------------
|
||||
|
||||
|
||||
@ -2,13 +2,13 @@ This file contains the access control list for the Proxmox Backup
|
||||
Server API.
|
||||
|
||||
Each line starts with ``acl:``, followed by 4 additional values
|
||||
separated by colon.
|
||||
separated by collon.
|
||||
|
||||
:propagate: Propagate permissions down the hierarchy
|
||||
:propagate: Propagate permissions down the hierachrchy
|
||||
|
||||
:path: The object path
|
||||
|
||||
:User/Token: List of users and tokens
|
||||
:User/Token: List of users and token
|
||||
|
||||
:Role: List of assigned roles
|
||||
|
||||
|
||||
@ -1,13 +1,21 @@
|
||||
:orphan:
|
||||
|
||||
=======
|
||||
==========================
|
||||
acl.cfg
|
||||
=======
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Access Control Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/acl.cfg is a configuration file for Proxmox
|
||||
The file /etc/proxmox-backup/user.cfg is a configuration file for Proxmox
|
||||
Backup Server. It contains the access control configuration for the API.
|
||||
|
||||
File Format
|
||||
@ -15,6 +23,7 @@ File Format
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Roles
|
||||
=====
|
||||
|
||||
@ -22,4 +31,5 @@ The following roles exist:
|
||||
|
||||
.. include:: roles.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
This file contains a list of datastore configuration sections. Each
|
||||
section starts with the header ``datastore: <name>``, followed by the
|
||||
The file contains a list of datastore configuration sections. Each
|
||||
section starts with a header ``datastore: <name>``, followed by the
|
||||
datastore configuration options.
|
||||
|
||||
::
|
||||
|
||||
|
||||
datastore: <name1>
|
||||
path <path1>
|
||||
<option1> <value1>
|
||||
|
||||
@ -1,8 +1,16 @@
|
||||
:orphan:
|
||||
|
||||
=============
|
||||
==========================
|
||||
datastore.cfg
|
||||
=============
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Datastore Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
@ -15,9 +23,11 @@ File Format
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
This file contains the list authentication realms.
|
||||
|
||||
Each user configuration section starts with the header ``<realm-type>: <name>``,
|
||||
followed by the realm's configuration options.
|
||||
|
||||
For LDAP realms, the LDAP bind password is stored in ``ldap_passwords.json``.
|
||||
|
||||
::
|
||||
|
||||
openid: master
|
||||
client-id pbs
|
||||
comment
|
||||
issuer-url http://192.168.0.10:8080/realms/master
|
||||
username-claim username
|
||||
|
||||
ldap: ldap-server
|
||||
base-dn OU=People,DC=ldap-server,DC=example,DC=com
|
||||
mode ldaps
|
||||
server1 192.168.0.10
|
||||
sync-attributes email=mail
|
||||
sync-defaults-options enable-new=0,remove-vanished=acl;entry
|
||||
user-attr uid
|
||||
user-classes inetorgperson,posixaccount,person,user
|
||||
|
||||
|
||||
You can use the ``proxmox-backup-manager openid``, ``proxmox-backup-manager
|
||||
ldap`` and ``proxmox-backup-manager ad`` commands to manipulate this file.
|
||||
@ -1,23 +0,0 @@
|
||||
:orphan:
|
||||
|
||||
===========
|
||||
domains.cfg
|
||||
===========
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/domains.cfg is a configuration file for Proxmox
|
||||
Backup Server. It contains the realm configuration.
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
@ -1,4 +1,4 @@
|
||||
Each entry starts with the header ``pool: <name>``, followed by the
|
||||
Each entry starts with a header ``pool: <name>``, followed by the
|
||||
media pool configuration options.
|
||||
|
||||
::
|
||||
@ -8,6 +8,6 @@ media pool configuration options.
|
||||
retention overwrite
|
||||
|
||||
pool: ...
|
||||
|
||||
|
||||
|
||||
You can use the ``proxmox-tape pool`` command to manipulate this file.
|
||||
|
||||
@ -1,9 +1,17 @@
|
||||
:orphan:
|
||||
|
||||
==========================
|
||||
media-pool.cfg
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Media Pool Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
@ -11,14 +19,17 @@ The file /etc/proxmox-backup/media-pool.cfg is a configuration file
|
||||
for Proxmox Backup Server. It contains the medila pool configuration
|
||||
for tape backups.
|
||||
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,49 +0,0 @@
|
||||
The file contains these options:
|
||||
|
||||
:acme: The ACME account to use on this node.
|
||||
|
||||
:acmedomain0: ACME domain.
|
||||
|
||||
:acmedomain1: ACME domain.
|
||||
|
||||
:acmedomain2: ACME domain.
|
||||
|
||||
:acmedomain3: ACME domain.
|
||||
|
||||
:acmedomain4: ACME domain.
|
||||
|
||||
:http-proxy: Set proxy for apt and subscription checks.
|
||||
|
||||
:email-from: Fallback email from which notifications will be sent.
|
||||
|
||||
:ciphers-tls-1.3: List of TLS ciphers for TLS 1.3 that will be used by the proxy. Colon-separated and in descending priority (https://docs.openssl.org/master/man1/openssl-ciphers/). (Proxy has to be restarted for changes to take effect.)
|
||||
|
||||
:ciphers-tls-1.2: List of TLS ciphers for TLS <= 1.2 that will be used by the proxy. Colon-separated and in descending priority (https://docs.openssl.org/master/man1/openssl-ciphers/). (Proxy has to be restarted for changes to take effect.)
|
||||
|
||||
:default-lang: Default language used in the GUI.
|
||||
|
||||
:description: Node description.
|
||||
|
||||
:task-log-max-days: Maximum days to keep task logs.
|
||||
|
||||
For example:
|
||||
|
||||
::
|
||||
|
||||
acme: local
|
||||
acmedomain0: first.domain.com
|
||||
acmedomain1: second.domain.com
|
||||
acmedomain2: third.domain.com
|
||||
acmedomain3: fourth.domain.com
|
||||
acmedomain4: fifth.domain.com
|
||||
http-proxy: internal.proxy.com
|
||||
email-from: proxmox@mail.com
|
||||
ciphers-tls-1.3: TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_CHACHA20_POLY1305_SHA256
|
||||
ciphers-tls-1.2: RSA_WITH_AES_128_CCM:DHE_RSA_WITH_AES_128_CCM
|
||||
default-lang: en
|
||||
description: Primary PBS instance
|
||||
task-log-max-days: 30
|
||||
|
||||
|
||||
You can use the ``proxmox-backup-manager node`` command to manipulate
|
||||
this file.
|
||||
@ -1,18 +0,0 @@
|
||||
:orphan:
|
||||
|
||||
========
|
||||
node.cfg
|
||||
========
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/node.cfg is a configuration file for Proxmox
|
||||
Backup Server. It contains the general configuration regarding this node.
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
@ -1 +0,0 @@
|
||||
This file contains protected credentials for notification targets.
|
||||
@ -1,24 +0,0 @@
|
||||
:orphan:
|
||||
|
||||
======================
|
||||
notifications-priv.cfg
|
||||
======================
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/notifications-priv.cfg is a configuration file
|
||||
for Proxmox Backup Server. It contains the configuration for the
|
||||
notification system configuration.
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
@ -1,2 +0,0 @@
|
||||
This file contains configuration for notification targets and notification
|
||||
matchers.
|
||||
@ -1,24 +0,0 @@
|
||||
:orphan:
|
||||
|
||||
==================
|
||||
notifications.cfg
|
||||
==================
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/notifications.cfg is a configuration file
|
||||
for Proxmox Backup Server. It contains the configuration for the
|
||||
notification system configuration.
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
@ -1,14 +0,0 @@
|
||||
Each entry starts with the header ``prune: <name>``, followed by the job
|
||||
configuration options.
|
||||
|
||||
::
|
||||
|
||||
prune: prune-store2
|
||||
schedule mon..fri 10:30
|
||||
store my-datastore
|
||||
|
||||
prune: ...
|
||||
|
||||
|
||||
You can use the ``proxmox-backup-manager prune-job`` command to manipulate this
|
||||
file.
|
||||
@ -1,23 +0,0 @@
|
||||
:orphan:
|
||||
|
||||
=========
|
||||
prune.cfg
|
||||
=========
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/prune.cfg is a configuration file for Proxmox
|
||||
Backup Server. It contains the prune job configuration.
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
@ -1,6 +1,6 @@
|
||||
This file contains information used to access remote servers.
|
||||
|
||||
Each entry starts with the header ``remote: <name>``, followed by the
|
||||
Each entry starts with a header ``remote: <name>``, followed by the
|
||||
remote configuration options.
|
||||
|
||||
::
|
||||
@ -11,7 +11,7 @@ remote configuration options.
|
||||
...
|
||||
|
||||
remote: ...
|
||||
|
||||
|
||||
|
||||
You can use the ``proxmox-backup-manager remote`` command to manipulate
|
||||
this file.
|
||||
|
||||
@ -1,8 +1,16 @@
|
||||
:orphan:
|
||||
|
||||
==========
|
||||
==========================
|
||||
remote.cfg
|
||||
==========
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Remote Server Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
@ -11,14 +19,17 @@ The file /etc/proxmox-backup/remote.cfg is a configuration file for
|
||||
Proxmox Backup Server. It contains information about remote servers,
|
||||
usable for synchronization jobs.
|
||||
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
Each entry starts with the header ``sync: <name>``, followed by the
|
||||
Each entry starts with a header ``sync: <name>``, followed by the
|
||||
job configuration options.
|
||||
|
||||
::
|
||||
@ -9,7 +9,7 @@ job configuration options.
|
||||
remote lina
|
||||
|
||||
sync: ...
|
||||
|
||||
|
||||
|
||||
You can use the ``proxmox-backup-manager sync-job`` command to manipulate
|
||||
this file.
|
||||
|
||||
@ -1,23 +1,35 @@
|
||||
:orphan:
|
||||
|
||||
========
|
||||
==========================
|
||||
sync.cfg
|
||||
========
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Synchronization Job Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/sync.cfg is a configuration file for Proxmox
|
||||
Backup Server. It contains the synchronization job configuration.
|
||||
The file /etc/proxmox-backup/sync.cfg is a configuration file for
|
||||
Proxmox Backup Server. It contains the synchronization job
|
||||
configuration.
|
||||
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
Each entry starts with the header ``backup: <name>``, followed by the
|
||||
Each entry starts with a header ``backup: <name>``, followed by the
|
||||
job configuration options.
|
||||
|
||||
::
|
||||
|
||||
@ -1,8 +1,16 @@
|
||||
:orphan:
|
||||
|
||||
============
|
||||
==========================
|
||||
tape-job.cfg
|
||||
============
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Tape Job Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
@ -10,11 +18,13 @@ Description
|
||||
The file ``/etc/proxmox-backup/tape-job.cfg`` is a configuration file for
|
||||
Proxmox Backup Server. It contains the tape job configuration.
|
||||
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
Each LTO drive configuration section starts with the header ``lto: <name>``,
|
||||
Each LTO drive configuration section starts with a header ``lto: <name>``,
|
||||
followed by the drive configuration options.
|
||||
|
||||
Tape changer configurations start with the header ``changer: <name>``,
|
||||
Tape changer configurations starts with ``changer: <name>``,
|
||||
followed by the changer configuration options.
|
||||
|
||||
::
|
||||
@ -18,5 +18,5 @@ followed by the changer configuration options.
|
||||
You can use the ``proxmox-tape drive`` and ``proxmox-tape changer``
|
||||
commands to manipulate this file.
|
||||
|
||||
.. NOTE:: The ``virtual:`` drive type is experimental and should only be used
|
||||
.. NOTE:: The ``virtual:`` drive type is experimental and onyl used
|
||||
for debugging.
|
||||
|
||||
@ -1,8 +1,16 @@
|
||||
:orphan:
|
||||
|
||||
========
|
||||
==========================
|
||||
tape.cfg
|
||||
========
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Tape Drive and Changer Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
@ -15,9 +23,11 @@ File Format
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
This file contains the list of API users and API tokens.
|
||||
|
||||
Each user configuration section starts with the header ``user: <name>``,
|
||||
Each user configuration section starts with a header ``user: <name>``,
|
||||
followed by the user configuration options.
|
||||
|
||||
API token configuration starts with the header ``token:
|
||||
API token configuration starts with a header ``token:
|
||||
<userid!token_name>``, followed by the token configuration. The data
|
||||
used to authenticate tokens is stored in a separate file
|
||||
(``token.shadow``).
|
||||
|
||||
@ -1,8 +1,16 @@
|
||||
:orphan:
|
||||
|
||||
========
|
||||
==========================
|
||||
user.cfg
|
||||
========
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
User Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
@ -15,9 +23,11 @@ File Format
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
Each entry starts with the header ``verification: <name>``, followed by the
|
||||
Each entry starts with a header ``verification: <name>``, followed by the
|
||||
job configuration options.
|
||||
|
||||
::
|
||||
|
||||
@ -1,23 +1,35 @@
|
||||
:orphan:
|
||||
|
||||
================
|
||||
==========================
|
||||
verification.cfg
|
||||
================
|
||||
==========================
|
||||
|
||||
.. include:: ../../epilog.rst
|
||||
|
||||
-------------------------------------------------------------
|
||||
Verification Job Configuration
|
||||
-------------------------------------------------------------
|
||||
|
||||
:Author: |AUTHOR|
|
||||
:Version: Version |VERSION|
|
||||
:Manual section: 5
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The file /etc/proxmox-backup/verification.cfg is a configuration file for
|
||||
Proxmox Backup Server. It contains the verification job configuration.
|
||||
The file /etc/proxmox-backup/sync.cfg is a configuration file for
|
||||
Proxmox Backup Server. It contains the verification job
|
||||
configuration.
|
||||
|
||||
|
||||
File Format
|
||||
===========
|
||||
|
||||
.. include:: format.rst
|
||||
|
||||
|
||||
Options
|
||||
=======
|
||||
|
||||
.. include:: config.rst
|
||||
|
||||
|
||||
.. include:: ../../pbs-copyright.rst
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
Configuration Files
|
||||
===================
|
||||
|
||||
All `Proxmox Backup`_ Server configuration files reside in the directory
|
||||
All Proxmox Backup Server configuration files resides inside directory
|
||||
``/etc/proxmox-backup/``.
|
||||
|
||||
|
||||
@ -36,22 +36,6 @@ Options
|
||||
|
||||
.. include:: config/datastore/config.rst
|
||||
|
||||
.. _domains.cfg:
|
||||
|
||||
``domains.cfg``
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
File Format
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. include:: config/domains/format.rst
|
||||
|
||||
|
||||
Options
|
||||
^^^^^^^
|
||||
|
||||
.. include:: config/domains/config.rst
|
||||
|
||||
|
||||
``media-pool.cfg``
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
@ -67,61 +51,6 @@ Options
|
||||
|
||||
.. include:: config/media-pool/config.rst
|
||||
|
||||
``node.cfg``
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Options
|
||||
^^^^^^^
|
||||
|
||||
.. include:: config/node/format.rst
|
||||
|
||||
.. _notifications.cfg:
|
||||
|
||||
``notifications.cfg``
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
File Format
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. include:: config/notifications/format.rst
|
||||
|
||||
|
||||
Options
|
||||
^^^^^^^
|
||||
|
||||
.. include:: config/notifications/config.rst
|
||||
|
||||
.. _notifications_priv.cfg:
|
||||
|
||||
``notifications-priv.cfg``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
File Format
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. include:: config/notifications-priv/format.rst
|
||||
|
||||
|
||||
Options
|
||||
^^^^^^^
|
||||
|
||||
.. include:: config/notifications-priv/config.rst
|
||||
|
||||
|
||||
``prune.cfg``
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
File Format
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. include:: config/prune/format.rst
|
||||
|
||||
|
||||
Options
|
||||
^^^^^^^
|
||||
|
||||
.. include:: config/prune/config.rst
|
||||
|
||||
|
||||
``tape.cfg``
|
||||
~~~~~~~~~~~~
|
||||
|
||||
88
docs/custom.css
Normal file
@ -0,0 +1,88 @@
|
||||
div.sphinxsidebar {
|
||||
height: calc(100% - 20px);
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
h1.logo-name {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
div.body img {
|
||||
width: 250px;
|
||||
}
|
||||
pre {
|
||||
padding: 5px 10px;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
background-color: #FAFAFA;
|
||||
}
|
||||
|
||||
li a.current {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid #000;
|
||||
}
|
||||
ul li.toctree-l1 {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
ul li.toctree-l1 > a {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul {
|
||||
color: #444;
|
||||
}
|
||||
div.sphinxsidebar ul ul {
|
||||
list-style: circle;
|
||||
}
|
||||
div.sphinxsidebar ul ul ul {
|
||||
list-style: square;
|
||||
}
|
||||
|
||||
div.sphinxsidebar ul a code {
|
||||
font-weight: normal;
|
||||
}
|
||||
div.sphinxsidebar ul ul a {
|
||||
border-bottom: 1px dotted #CCC;
|
||||
}
|
||||
|
||||
div.sphinxsidebar form.search {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h3 {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.sphinxsidebar h1.logo-name {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.document, div.footer {
|
||||
width: min(100%, 1320px);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 875px) {
|
||||
div.sphinxsidebar p.logo {
|
||||
display: initial;
|
||||
}
|
||||
div.sphinxsidebar h1.logo-name {
|
||||
display: block;
|
||||
}
|
||||
div.sphinxsidebar span {
|
||||
color: #EEE;
|
||||
}
|
||||
.sphinxsidebar ul li.toctree-l1 > a, div.sphinxsidebar a {
|
||||
color: #FFF;
|
||||
}
|
||||
div.sphinxsidebar {
|
||||
background-color: #555;
|
||||
}
|
||||
div.body {
|
||||
min-width: 300px;
|
||||
}
|
||||
div.footer {
|
||||
display: block;
|
||||
margin: 15px auto 0px auto;
|
||||
}
|
||||
}
|
||||
@ -1,8 +1,10 @@
|
||||
.. Epilog (included at top of each file)
|
||||
|
||||
|
||||
We use this file to define external links and common replacement
|
||||
patterns.
|
||||
|
||||
.. |VERSION| replace:: 1.0
|
||||
.. |AUTHOR| replace:: Proxmox Support Team <support@proxmox.com>
|
||||
.. |WEBSITE| replace:: https://www.proxmox.com
|
||||
.. |DOWNLOADS| replace:: https://www.proxmox.com/downloads
|
||||
|
||||
@ -10,31 +12,32 @@
|
||||
.. _Zstandard: https://en.wikipedia.org/wiki/Zstandard
|
||||
.. _Proxmox: https://www.proxmox.com
|
||||
.. _Proxmox Community Forum: https://forum.proxmox.com
|
||||
.. _Proxmox Virtual Environment: https://www.proxmox.com/proxmox-virtual-environment
|
||||
.. _Proxmox Backup: https://www.proxmox.com/proxmox-backup-server
|
||||
.. _Proxmox Backup Server Development List: https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
|
||||
.. _Proxmox Virtual Environment: https://www.proxmox.com/proxmox-ve
|
||||
.. FIXME
|
||||
.. _Proxmox Backup: https://pbs.proxmox.com/wiki/index.php/Main_Page
|
||||
.. _PBS Development List: https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
|
||||
.. _reStructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html
|
||||
.. _Rust: https://www.rust-lang.org/
|
||||
.. _SHA-256: https://en.wikipedia.org/wiki/SHA-2
|
||||
.. _Sphinx: https://www.sphinx-doc.org
|
||||
.. _Virtual machine: https://en.wikipedia.org/wiki/Virtual_machine
|
||||
.. _APT: https://en.wikipedia.org/wiki/Advanced_Packaging_Tool
|
||||
.. _APT: http://en.wikipedia.org/wiki/Advanced_Packaging_Tool
|
||||
.. _QEMU: https://www.qemu.org/
|
||||
.. _LXC: https://linuxcontainers.org/lxc/introduction/
|
||||
|
||||
.. _Client-server model: https://en.wikipedia.org/wiki/Client-server_model
|
||||
.. _AE: https://en.wikipedia.org/wiki/Authenticated_encryption
|
||||
.. _GCM: https://en.wikipedia.org/wiki/Galois/Counter_Mode
|
||||
.. _AGPL3: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
.. _Debian: https://www.debian.org/index.html
|
||||
.. _Debian Administrator's Handbook: https://debian-handbook.info/
|
||||
.. _Debian Administrator's Handbook: https://debian-handbook.info/download/stable/debian-handbook.pdf
|
||||
|
||||
.. _LVM: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)
|
||||
.. _ZFS: https://en.wikipedia.org/wiki/ZFS
|
||||
.. _Proxmox VE: https://pve.proxmox.com
|
||||
|
||||
.. _RFC3339: https://tools.ietf.org/html/rfc3339
|
||||
.. _RFC3399: https://tools.ietf.org/html/rfc3339
|
||||
.. _UTC: https://en.wikipedia.org/wiki/Coordinated_Universal_Time
|
||||
.. _ISO Week date: https://en.wikipedia.org/wiki/ISO_week_date
|
||||
|
||||
.. _systemd.time manpage: https://manpages.debian.org/stable/systemd/systemd.time.7.en.html
|
||||
.. _systemd.time manpage: https://manpages.debian.org/buster/systemd/systemd.time.7.en.html
|
||||
|
||||
|
||||
@ -1,55 +0,0 @@
|
||||
External Metric Server
|
||||
----------------------
|
||||
|
||||
Proxmox Backup Server periodically sends various metrics about your host's memory,
|
||||
network and disk activity to configured external metric servers.
|
||||
|
||||
Currently supported are:
|
||||
|
||||
* InfluxDB (HTTP) (see https://docs.influxdata.com/influxdb/v2/ )
|
||||
* InfluxDB (UDP) (see https://docs.influxdata.com/influxdb/v1/ )
|
||||
|
||||
The external metric server definitions are saved in
|
||||
'/etc/proxmox-backup/metricserver.cfg', and can be edited through the web
|
||||
interface.
|
||||
|
||||
.. note::
|
||||
|
||||
Using HTTP is recommended as UDP support has been dropped in InfluxDB v2.
|
||||
|
||||
InfluxDB (HTTP) plugin configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The plugin can be configured to use the HTTP(s) API of InfluxDB 2.x.
|
||||
InfluxDB 1.8.x does contain a forwards compatible API endpoint for this v2 API.
|
||||
|
||||
Since InfluxDB's v2 API is only available with authentication, you have
|
||||
to generate a token that can write into the correct bucket and set it.
|
||||
|
||||
In the v2 compatible API of 1.8.x, you can use 'user:password' as token
|
||||
(if required), and can omit the 'organization' since that has no meaning in InfluxDB 1.x.
|
||||
|
||||
You can also set the maximum batch size (default 25000000 bytes) with the
|
||||
'max-body-size' setting (this corresponds to the InfluxDB setting with the
|
||||
same name).
|
||||
|
||||
InfluxDB (UDP) plugin configuration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Proxmox Backup Server can also send data via UDP. This requires the InfluxDB
|
||||
server to be configured correctly. The MTU can also be configured here if
|
||||
necessary.
|
||||
|
||||
Here is an example configuration for InfluxDB (on your InfluxDB server):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
[[udp]]
|
||||
enabled = true
|
||||
bind-address = "0.0.0.0:8089"
|
||||
database = "proxmox"
|
||||
batch-size = 1000
|
||||
batch-timeout = "1s"
|
||||
|
||||
With this configuration, the InfluxDB server listens on all IP addresses on
|
||||
port 8089, and writes the data in the *proxmox* database.
|
||||
@ -1,4 +0,0 @@
|
||||
Proxmox Backup Version , Debian Version , First Release , Debian EOL , Proxmox Backup EOL
|
||||
Proxmox Backup 3 , Debian 12 (Bookworm) , 2023-06 , TBA , TBA
|
||||
Proxmox Backup 2 , Debian 11 (Bullseye) , 2021-07 , 2024-07 , 2024-07
|
||||
Proxmox Backup 1 , Debian 10 (Buster) , 2020-11 , 2022-08 , 2022-07
|
||||
|
67
docs/faq.rst
@ -4,7 +4,7 @@ FAQ
|
||||
What distribution is Proxmox Backup Server (PBS) based on?
|
||||
----------------------------------------------------------
|
||||
|
||||
`Proxmox Backup`_ Server is based on `Debian GNU/Linux <https://www.debian.org/>`_.
|
||||
Proxmox Backup Server is based on `Debian GNU/Linux <https://www.debian.org/>`_.
|
||||
|
||||
|
||||
Which platforms are supported as a backup source (client)?
|
||||
@ -21,54 +21,15 @@ Proxmox Backup Server only supports 64-bit CPUs (AMD or Intel). There are no
|
||||
future plans to support 32-bit processors.
|
||||
|
||||
|
||||
.. _faq-support-table:
|
||||
|
||||
How long will my Proxmox Backup Server version be supported?
|
||||
------------------------------------------------------------
|
||||
|
||||
.. csv-table::
|
||||
:file: faq-release-support-table.csv
|
||||
:widths: 30 26 13 13 18
|
||||
:header-rows: 1
|
||||
+-----------------------+--------------------+---------------+------------+--------------------+
|
||||
|Proxmox Backup Version | Debian Version | First Release | Debian EOL | Proxmox Backup EOL |
|
||||
+=======================+====================+===============+============+====================+
|
||||
|Proxmox Backup 1.x | Debian 10 (Buster) | 2020-11 | tba | tba |
|
||||
+-----------------------+--------------------+---------------+------------+--------------------+
|
||||
|
||||
How can I upgrade Proxmox Backup Server to the next point release?
|
||||
------------------------------------------------------------------
|
||||
|
||||
Minor version upgrades, for example upgrading from Proxmox Backup Server in
|
||||
version 3.1 to 3.2 or 3.3, can be done just like any normal update.
|
||||
But, you should still check the `release notes
|
||||
<https://pbs.proxmox.com/wiki/index.php/Roadmap>`_ for any relevant notable,
|
||||
or breaking change.
|
||||
|
||||
For the update itself use either the Web UI *Node -> Updates* panel or
|
||||
through the CLI with:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
apt update
|
||||
apt full-upgrade
|
||||
|
||||
.. note:: Always ensure you correctly setup the
|
||||
:ref:`package repositories <sysadmin_package_repositories>` and only
|
||||
continue with the actual upgrade if `apt update` did not hit any error.
|
||||
|
||||
.. _faq-upgrade-major:
|
||||
|
||||
How can I upgrade Proxmox Backup Server to the next major release?
|
||||
------------------------------------------------------------------
|
||||
|
||||
Major version upgrades, for example going from Proxmox Backup Server 2.4 to
|
||||
3.1, are also supported.
|
||||
They must be carefully planned and tested and should **never** be started
|
||||
without having an off-site copy of the important backups, e.g., via remote sync
|
||||
or tape, ready.
|
||||
|
||||
Although the specific upgrade steps depend on your respective setup, we provide
|
||||
general instructions and advice of how a upgrade should be performed:
|
||||
|
||||
* `Upgrade from Proxmox Backup Server 2 to 3 <https://pbs.proxmox.com/wiki/index.php/Upgrade_from_2_to_3>`_
|
||||
|
||||
* `Upgrade from Proxmox Backup Server 1 to 2 <https://pbs.proxmox.com/wiki/index.php/Upgrade_from_1.1_to_2.x>`_
|
||||
|
||||
Can I copy or synchronize my datastore to another location?
|
||||
-----------------------------------------------------------
|
||||
@ -103,15 +64,9 @@ be able to read the data.
|
||||
:ref:`backup client encryption section <client_encryption>`.
|
||||
|
||||
|
||||
Is the backup incremental/deduplicated/full?
|
||||
--------------------------------------------
|
||||
Is the backup incremental/deduplicated?
|
||||
---------------------------------------
|
||||
|
||||
With Proxmox Backup Server, backups are sent incrementally to the server, and
|
||||
data is then deduplicated on the server. This minimizes both the storage
|
||||
consumed and the impact on the network. Each backup still references all
|
||||
data and such is a full backup. For details see the
|
||||
:ref:`Technical Overview <tech_design_overview>`
|
||||
|
||||
.. todo:: document our stability guarantees, i.e., the separate one for, in
|
||||
increasing duration of how long we'll support it: api compat, backup
|
||||
protocol compat and backup format compat
|
||||
With Proxmox Backup Server, backups are sent incremental and data is
|
||||
deduplicated on the server.
|
||||
This minimizes both the storage consumed and the network impact.
|
||||
|
||||
@ -8,60 +8,13 @@ Proxmox File Archive Format (``.pxar``)
|
||||
|
||||
.. graphviz:: pxar-format-overview.dot
|
||||
|
||||
.. _pxar-meta-format:
|
||||
|
||||
Proxmox File Archive Format - Meta (``.mpxar``)
|
||||
-----------------------------------------------
|
||||
|
||||
Pxar metadata archive with same structure as a regular pxar archive, with the
|
||||
exception of regular file payloads not being contained within the archive
|
||||
itself, but rather being stored as payload references to the corresponding pxar
|
||||
payload (``.ppxar``) file.
|
||||
|
||||
Can be used to lookup all the archive entries and metadata without the size
|
||||
overhead introduced by the file payloads.
|
||||
|
||||
.. graphviz:: meta-format-overview.dot
|
||||
|
||||
.. _ppxar-format:
|
||||
|
||||
Proxmox File Archive Format - Payload (``.ppxar``)
|
||||
--------------------------------------------------
|
||||
|
||||
Pxar payload file storing regular file payloads to be referenced and accessed by
|
||||
the corresponding pxar metadata (``.mpxar``) archive. Contains a concatenation
|
||||
of regular file payloads, each prefixed by a `PAYLOAD` header. Further, the
|
||||
actual referenced payload entries might be separated by padding (full/partial
|
||||
payloads not referenced), introduced when reusing chunks of a previous backup
|
||||
run, when chunk boundaries did not aligned to payload entry offsets.
|
||||
|
||||
All headers are stored as little-endian.
|
||||
|
||||
.. list-table::
|
||||
:widths: auto
|
||||
|
||||
* - ``PAYLOAD_START_MARKER``
|
||||
- header of ``[u8; 16]`` consisting of type hash and size;
|
||||
marks start
|
||||
* - ``PAYLOAD``
|
||||
- header of ``[u8; 16]`` cosisting of type hash and size;
|
||||
referenced by metadata archive
|
||||
* - Payload
|
||||
- raw regular file payload
|
||||
* - Padding
|
||||
- partial/full unreferenced payloads, caused by unaligned chunk boundary
|
||||
* - ...
|
||||
- further concatenation of payload header, payload and padding
|
||||
* - ``PAYLOAD_TAIL_MARKER``
|
||||
- header of ``[u8; 16]`` consisting of type hash and size;
|
||||
marks end
|
||||
.. _data-blob-format:
|
||||
|
||||
Data Blob Format (``.blob``)
|
||||
----------------------------
|
||||
|
||||
The data blob format is used to store small binary data. The magic number
|
||||
decides the exact format:
|
||||
The data blob format is used to store small binary data. The magic number decides the exact format:
|
||||
|
||||
.. list-table::
|
||||
:widths: auto
|
||||
@ -79,8 +32,7 @@ decides the exact format:
|
||||
- encrypted
|
||||
- compressed
|
||||
|
||||
The compression algorithm used is ``zstd``. The encryption cipher is
|
||||
``AES_256_GCM``.
|
||||
Compression algorithm is ``zstd``. Encryption cipher is ``AES_256_GCM``.
|
||||
|
||||
Unencrypted blobs use the following format:
|
||||
|
||||
@ -91,15 +43,15 @@ Unencrypted blobs use the following format:
|
||||
* - ``CRC32: [u8; 4]``
|
||||
* - ``Data: (max 16MiB)``
|
||||
|
||||
Encrypted blobs additionally contain a 16 byte initialization vector (IV),
|
||||
followed by a 16 byte authenticated encryption (AE) tag, followed by the
|
||||
encrypted data:
|
||||
Encrypted blobs additionally contains a 16 byte IV, followed by a 16
|
||||
byte Authenticated Encyryption (AE) tag, followed by the encrypted
|
||||
data:
|
||||
|
||||
.. list-table::
|
||||
|
||||
* - ``MAGIC: [u8; 8]``
|
||||
* - ``CRC32: [u8; 4]``
|
||||
* - ``IV: [u8; 16]``
|
||||
* - ``ÌV: [u8; 16]``
|
||||
* - ``TAG: [u8; 16]``
|
||||
* - ``Data: (max 16MiB)``
|
||||
|
||||
@ -120,19 +72,19 @@ All numbers are stored as little-endian.
|
||||
* - ``ctime: i64``,
|
||||
- Creation Time (epoch)
|
||||
* - ``index_csum: [u8; 32]``,
|
||||
- SHA-256 over the index (without header) ``SHA256(digest1||digest2||...)``
|
||||
- Sha256 over the index (without header) ``SHA256(digest1||digest2||...)``
|
||||
* - ``size: u64``,
|
||||
- Image size
|
||||
* - ``chunk_size: u64``,
|
||||
- Chunk size
|
||||
* - ``reserved: [u8; 4016]``,
|
||||
- Overall header size is one page (4096 bytes)
|
||||
- overall header size is one page (4096 bytes)
|
||||
* - ``digest1: [u8; 32]``
|
||||
- First chunk digest
|
||||
- first chunk digest
|
||||
* - ``digest2: [u8; 32]``
|
||||
- Second chunk digest
|
||||
- next chunk
|
||||
* - ...
|
||||
- Next chunk digest ...
|
||||
- next chunk ...
|
||||
|
||||
|
||||
.. _dynamic-index-format:
|
||||
@ -151,16 +103,16 @@ All numbers are stored as little-endian.
|
||||
* - ``ctime: i64``,
|
||||
- Creation Time (epoch)
|
||||
* - ``index_csum: [u8; 32]``,
|
||||
- SHA-256 over the index (without header) ``SHA256(offset1||digest1||offset2||digest2||...)``
|
||||
- Sha256 over the index (without header) ``SHA256(offset1||digest1||offset2||digest2||...)``
|
||||
* - ``reserved: [u8; 4032]``,
|
||||
- Overall header size is one page (4096 bytes)
|
||||
* - ``offset1: u64``
|
||||
- End of first chunk
|
||||
* - ``digest1: [u8; 32]``
|
||||
- First chunk digest
|
||||
- first chunk digest
|
||||
* - ``offset2: u64``
|
||||
- End of second chunk
|
||||
* - ``digest2: [u8; 32]``
|
||||
- Second chunk digest
|
||||
- second chunk digest
|
||||
* - ...
|
||||
- Next chunk offset/digest
|
||||
- next chunk offset/digest
|
||||
|
||||
@ -11,7 +11,7 @@ Glossary
|
||||
`Container`_
|
||||
|
||||
A container is an isolated user space. Programs run directly on
|
||||
the host's kernel, but with limited access to the host's resources.
|
||||
the host's kernel, but with limited access to the host resources.
|
||||
|
||||
Datastore
|
||||
|
||||
@ -23,19 +23,19 @@ Glossary
|
||||
Rust is a new, fast and memory-efficient system programming
|
||||
language. It has no runtime or garbage collector. Rust’s rich type
|
||||
system and ownership model guarantee memory-safety and
|
||||
thread-safety. This can eliminate many classes of bugs
|
||||
thread-safety. I can eliminate many classes of bugs
|
||||
at compile-time.
|
||||
|
||||
`Sphinx`_
|
||||
|
||||
Is a tool that makes it easy to create intelligent and nicely formatted
|
||||
documentation. It was originally created for the documentation of the
|
||||
Python programming language. It has excellent facilities for the
|
||||
Is a tool that makes it easy to create intelligent and
|
||||
beautiful documentation. It was originally created for the
|
||||
documentation of the Python programming language. It has excellent facilities for the
|
||||
documentation of software projects in a range of languages.
|
||||
|
||||
`reStructuredText`_
|
||||
|
||||
Is an easy-to-read, what-you-see-is-what-you-get, plaintext
|
||||
Is an easy-to-read, what-you-see-is-what-you-get plaintext
|
||||
markup syntax and parser system.
|
||||
|
||||
`FUSE`
|
||||
|
||||
76
docs/gui.rst
@ -1,16 +1,15 @@
|
||||
Graphical User Interface
|
||||
========================
|
||||
|
||||
`Proxmox Backup`_ Server offers an integrated, web-based interface to manage the
|
||||
Proxmox Backup Server offers an integrated, web-based interface to manage the
|
||||
server. This means that you can carry out all administration tasks through your
|
||||
web browser, and that you don't have to worry about installing extra management
|
||||
tools. The web interface also provides a built-in console, so if you prefer the
|
||||
command line or need some extra control, you have this option.
|
||||
|
||||
The web interface can be accessed via https://youripaddress:8007. The default
|
||||
login is `root`, and the password is either the one specified during the
|
||||
installation process or the password of the root user, in case of installation
|
||||
on top of Debian.
|
||||
login is `root`, and the password is the one specified during the installation
|
||||
process.
|
||||
|
||||
|
||||
Features
|
||||
@ -29,9 +28,8 @@ Login
|
||||
-----
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-login-window.png
|
||||
:target: _images/pbs-gui-login-window.png
|
||||
:align: right
|
||||
:alt: Proxmox Backup Server login window
|
||||
:alt: PBS login window
|
||||
|
||||
When you connect to the web interface, you will first see the login window.
|
||||
Proxmox Backup Server supports various languages and authentication back ends
|
||||
@ -40,34 +38,22 @@ Proxmox Backup Server supports various languages and authentication back ends
|
||||
.. note:: For convenience, you can save the username on the client side, by
|
||||
selecting the "Save User name" checkbox at the bottom of the window.
|
||||
|
||||
.. _consent_banner:
|
||||
|
||||
Consent Banner
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
A custom consent banner that has to be accepted before login can be configured
|
||||
in **Configuration -> Other -> General -> Consent Text**. If there is no
|
||||
content, the consent banner will not be displayed. The text will be stored as a
|
||||
base64 string in the ``/etc/proxmox-backup/node.cfg`` config file.
|
||||
|
||||
|
||||
GUI Overview
|
||||
------------
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-dashboard.png
|
||||
:target: _images/pbs-gui-dashboard.png
|
||||
:align: right
|
||||
:alt: Proxmox Backup Server GUI Dashboard
|
||||
:alt: PBS GUI Dashboard
|
||||
|
||||
The Proxmox Backup Server web interface consists of 3 main sections:
|
||||
|
||||
* **Header**: At the top. This shows version information and contains buttons to
|
||||
view documentation, monitor running tasks, set the language, configure various
|
||||
display settings, and logout.
|
||||
* **Sidebar**: On the left. This contains the administration options for
|
||||
* **Header**: At the top. This shows version information, and contains buttons to view
|
||||
documentation, monitor running tasks, set the language and logout.
|
||||
* **Sidebar**: On the left. This contains the configuration options for
|
||||
the server.
|
||||
* **Configuration Panel**: In the center. This contains the respective control
|
||||
interfaces for the administration options in the *Sidebar*.
|
||||
* **Configuration Panel**: In the center. This contains the control interface for the
|
||||
configuration options in the *Sidebar*.
|
||||
|
||||
|
||||
Sidebar
|
||||
@ -88,14 +74,12 @@ previous and currently running tasks, and subscription information.
|
||||
Configuration
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
The Configuration section contains some system options, such as time, network,
|
||||
WebAuthn, and HTTP proxy configuration. It also contains the following
|
||||
subsections:
|
||||
The Configuration section contains some system configuration options, such as
|
||||
time and network configuration. It also contains the following subsections:
|
||||
|
||||
* **Access Control**: Add and manage users, API tokens, and the permissions
|
||||
associated with these items
|
||||
* **Remotes**: Add, edit and remove remotes (see :term:`Remote`)
|
||||
* **Certificates**: Manage ACME accounts and create SSL certificates.
|
||||
* **Subscription**: Upload a subscription key, view subscription status and
|
||||
access a text-based system report.
|
||||
|
||||
@ -104,7 +88,6 @@ Administration
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-administration-serverstatus.png
|
||||
:target: _images/pbs-gui-administration-serverstatus.png
|
||||
:align: right
|
||||
:alt: Administration: Server Status overview
|
||||
|
||||
@ -115,12 +98,10 @@ tasks and information. These are:
|
||||
resource usage statistics
|
||||
* **Services**: Manage and monitor system services
|
||||
* **Updates**: An interface for upgrading packages
|
||||
* **Repositories**: An interface for configuring APT repositories
|
||||
* **Syslog**: View log messages from the server
|
||||
* **Tasks**: Task history with multiple filter options
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-disks.png
|
||||
:target: _images/pbs-gui-disks.png
|
||||
:align: right
|
||||
:alt: Administration: Disks
|
||||
|
||||
@ -129,43 +110,32 @@ The administration menu item also contains a disk management subsection:
|
||||
* **Disks**: View information on available disks
|
||||
|
||||
* **Directory**: Create and view information on *ext4* and *xfs* disks
|
||||
* **ZFS**: Create and view information on *ZFS* disks
|
||||
* **ZFS**: Create and view information on *ZFS* disks
|
||||
|
||||
Tape Backup
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-tape-changer-overview.png
|
||||
:target: _images/pbs-gui-tape-changer-overview.png
|
||||
:align: right
|
||||
:alt: Tape Backup: Tape changer overview
|
||||
|
||||
The `Tape Backup`_ section contains a top panel, with options for managing tape
|
||||
media sets, inventories, drives, changers, encryption keys, and the tape backup
|
||||
jobs itself. The tabs are as follows:
|
||||
The `Tape Backup`_ section contains a top panel, managing tape media sets,
|
||||
inventories, drives, changers and the tape backup jobs itself.
|
||||
|
||||
* **Content**: Information on the contents of the tape backup
|
||||
* **Inventory**: Manage the tapes attached to the system
|
||||
* **Changers**: Manage tape loading devices
|
||||
* **Drives**: Manage drives used for reading and writing to tapes
|
||||
* **Media Pools**: Manage logical pools of tapes
|
||||
* **Encryption Keys**: Manage tape backup encryption keys
|
||||
* **Backup Jobs**: Manage tape backup jobs
|
||||
|
||||
The section also contains a subsection per standalone drive and per changer,
|
||||
with a status and management view for those devices.
|
||||
It also contains a subsection per standalone drive and per changer, with a
|
||||
status and management view for those devices.
|
||||
|
||||
Datastore
|
||||
^^^^^^^^^
|
||||
|
||||
.. image:: images/screenshots/pbs-gui-datastore-summary.png
|
||||
:target: _images/pbs-gui-datastore-summary.png
|
||||
:align: right
|
||||
:alt: Datastore Configuration
|
||||
|
||||
The Datastore section contains interfaces for creating and managing
|
||||
datastores. It also contains a button for creating a new datastore on the
|
||||
server, as well as a subsection for each datastore on the system, in which you
|
||||
can use the top panel to view:
|
||||
datastores. It contains a button to create a new datastore on the server, as
|
||||
well as a subsection for each datastore on the system, in which you can use the
|
||||
top panel to view:
|
||||
|
||||
* **Summary**: Access a range of datastore usage statistics
|
||||
* **Content**: Information on the datastore's backup groups and their respective
|
||||
@ -174,7 +144,5 @@ can use the top panel to view:
|
||||
collection <client_garbage-collection>` operations, and run garbage collection
|
||||
manually
|
||||
* **Sync Jobs**: Create, manage and run :ref:`syncjobs` from remote servers
|
||||
* **Verify Jobs**: Create, manage and run :ref:`maintenance_verification` jobs
|
||||
on the datastore
|
||||
* **Options**: Configure notification and verification settings
|
||||
* **Permissions**: Manage permissions on the datastore
|
||||
* **Verify Jobs**: Create, manage and run :ref:`maintenance_verification` jobs on the
|
||||
datastore
|
||||
|
||||
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 438 KiB |
|
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 367 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 90 KiB |
BIN
docs/images/screenshots/pbs-gui-datastore-create-general.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 174 KiB |