mirror of
https://github.com/scottlamb/moonfire-nvr.git
synced 2025-11-20 01:50:24 -05:00
no more Docker!
* use `termion` rather than `ncurses` to limit runtime deps * cross-compile with `cross` instead of our own dockerfiles/scripts * update instructions * update release procedure and GitHub actions to match * prep changelog for `v0.7.8` Fixes #160 Closes #265
This commit is contained in:
241
guide/build.md
241
guide/build.md
@@ -2,7 +2,7 @@
|
||||
|
||||
This document has notes for software developers on building Moonfire NVR from
|
||||
source code for development. If you just want to install precompiled
|
||||
binaries, see the [Docker installation instructions](install.md) instead.
|
||||
binaries, see the [installation instructions](install.md) instead.
|
||||
|
||||
This document doesn't spell out as many details as the installation
|
||||
instructions. Please ask on Moonfire NVR's [issue
|
||||
@@ -11,11 +11,9 @@ tracker](https://github.com/scottlamb/moonfire-nvr/issues) or
|
||||
stuck. Please also send pull requests to improve this doc.
|
||||
|
||||
* [Downloading](#downloading)
|
||||
* [Docker builds](#docker-builds)
|
||||
* [Release procedure](#release-procedure)
|
||||
* [Non-Docker setup](#non-docker-setup)
|
||||
* [Building](#building)
|
||||
* [Running interactively straight from the working copy](#running-interactively-straight-from-the-working-copy)
|
||||
* [Running as a `systemd` service](#running-as-a-systemd-service)
|
||||
* [Release procedure](#release-procedure)
|
||||
|
||||
## Downloading
|
||||
|
||||
@@ -28,152 +26,16 @@ $ git clone https://github.com/scottlamb/moonfire-nvr.git
|
||||
$ cd moonfire-nvr
|
||||
```
|
||||
|
||||
## Docker builds
|
||||
## Building
|
||||
|
||||
This command should prepare a deployment image for your local machine:
|
||||
|
||||
```console
|
||||
$ sudo docker buildx build --load --tag=moonfire-nvr -f docker/Dockerfile .
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Common errors</summary>
|
||||
|
||||
* `docker: 'buildx' is not a docker command.`: You shouldn't see this with
|
||||
Docker 20.10. With Docker version 19.03 you'll need to prepend
|
||||
`DOCKER_CLI_EXPERIMENTAL=enabled` to `docker buildx build` commands. If
|
||||
your Docker version is older than 19.03, you'll need to upgrade.
|
||||
* `At least one invalid signature was encountered.`: this is likely
|
||||
due to an error in `libseccomp`, as described [in this askubuntu.com answer](https://askubuntu.com/a/1264921/1365248).
|
||||
Try running in a privileged builder. As described in [`docker buildx build` documentation](https://docs.docker.com/engine/reference/commandline/buildx_build/#allow),
|
||||
run this command once:
|
||||
```console
|
||||
$ sudo docker buildx create --use --name insecure-builder --buildkitd-flags '--allow-insecure-entitlement security.insecure'
|
||||
```
|
||||
then add `--allow security.insecure` to your `docker buildx build` commandlines.
|
||||
</details>
|
||||
|
||||
If you want to iterate on code changes, doing a full Docker build from
|
||||
scratch every time will be painfully slow. You will likely find it more
|
||||
helpful to use the `dev` target. This is a self-contained developer environment
|
||||
which you can use from its shell via `docker run` or via something like
|
||||
Visual Studio Code's Docker plugin.
|
||||
|
||||
```console
|
||||
$ sudo docker buildx build \
|
||||
--load --tag=moonfire-dev --target=dev -f docker/Dockerfile .
|
||||
...
|
||||
$ sudo docker run \
|
||||
--rm --interactive=true --tty \
|
||||
--mount=type=bind,source=$(pwd),destination=/var/lib/moonfire-nvr/src \
|
||||
moonfire-dev
|
||||
```
|
||||
|
||||
The development image overrides cargo's output directory to
|
||||
`/var/lib/moonfire-nvr/target`. (See `~moonfire-nvr/.buildrc`.) This avoids
|
||||
using a bind filesystem for build products, which can be slow on macOS. It
|
||||
also means that if you sometimes compile directly on the host and sometimes
|
||||
within Docker, they don't trip over each other's target directories.
|
||||
|
||||
You can also cross-compile to a different architecture. Adding a
|
||||
`--platform=linux/arm64/v8,linux/arm/v7,linux/amd64` argument will compile
|
||||
Moonfire NVR for all supported platforms. (Note: this has been used
|
||||
successfully for building on x86-64 and compiling to arm but not the
|
||||
reverse.) For the `dev` target, this prepares a build which executes on your
|
||||
local architecture and is capable of building a binary for your desired target
|
||||
architecture.
|
||||
|
||||
On the author's macOS machine with Docker desktop 3.0.4, building for
|
||||
multiple platforms at once will initially fail with the following error:
|
||||
|
||||
```console
|
||||
$ sudo docker buildx build ... --platform=linux/arm64/v8,linux/arm/v7,linux/amd64
|
||||
[+] Building 0.0s (0/0)
|
||||
error: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
|
||||
```
|
||||
|
||||
Running `docker buildx create --use` once solves this problem, with a couple
|
||||
caveats:
|
||||
|
||||
* you'll need to specify an additional `--load` argument to make builds
|
||||
available to run locally.
|
||||
* the `--load` argument only works for one platform at a time. With multiple
|
||||
platforms, it gives an error like the following:
|
||||
```
|
||||
error: failed to solve: rpc error: code = Unknown desc = docker exporter does not currently support exporting manifest lists
|
||||
```
|
||||
[A comment on docker/buildx issue
|
||||
#59](https://github.com/docker/buildx/issues/59#issuecomment-667548900)
|
||||
suggests a workaround of building all three then using caching to quickly
|
||||
load the one of immediate interest:
|
||||
```
|
||||
$ sudo docker buildx build --platform=linux/arm64/v8,linux/arm/v7,linux/amd64 ...
|
||||
$ sudo docker buildx build --load --platform=arm64/v8 ...
|
||||
```
|
||||
|
||||
On Linux hosts (as opposed to when using Docker Desktop on macOS/Windows),
|
||||
you'll likely see errors like the ones below. The solution is to [install
|
||||
emulators](https://github.com/tonistiigi/binfmt#installing-emulators).
|
||||
You may need to reinstall emulators on each boot of the host.
|
||||
|
||||
```
|
||||
Exec format error
|
||||
|
||||
Error while loading /usr/sbin/dpkg-split: No such file or directory
|
||||
Error while loading /usr/sbin/dpkg-deb: No such file or directory
|
||||
```
|
||||
|
||||
Moonfire NVR's `Dockerfile` has some built-in debugging tools:
|
||||
|
||||
* Each stage saves some debug info to `/docker-build-debug/<stage>`, and
|
||||
the `deploy` stage preserves the output from previous stages. The debug
|
||||
info includes:
|
||||
* output (stdout + stderr) from the build script, running long operations
|
||||
through the `time` command.
|
||||
* `find -ls` output on cache mounts before and after.
|
||||
* Each stage accepts a `INVALIDATE_CACHE_<stage>` argument. You can use eg
|
||||
`--build-arg=INVALIDATE_CACHE_BUILD_SERVER=$(date +%s)` to force the
|
||||
`build-server` stage to be rebuilt rather than use cached Docker layers.
|
||||
|
||||
### Release procedure
|
||||
|
||||
Releases are currently a bit manual. From a completely clean git work tree,
|
||||
|
||||
1. manually verify the current commit is pushed to github's master branch and
|
||||
has a green checkmark indicating CI passed.
|
||||
2. update version in `CHANGELOG.md`.
|
||||
3. run commands:
|
||||
```bash
|
||||
VERSION=x.y.z
|
||||
git commit -am "prepare version ${VERSION}"
|
||||
git tag -a "v${VERSION}" -m "version ${VERSION}"
|
||||
./release.bash
|
||||
git push
|
||||
git push origin "v${VERSION}"
|
||||
```
|
||||
|
||||
The `release.bash` script needs [`jq`](https://stedolan.github.io/jq/)
|
||||
installed to work.
|
||||
|
||||
## Non-Docker setup
|
||||
|
||||
You may prefer building without Docker on the host. Moonfire NVR should run
|
||||
natively on any Unix-like system. It's been tested on Linux and macOS.
|
||||
(In theory [Windows Subsystem for
|
||||
Moonfire NVR should run natively on any Unix-like system. It's been tested on
|
||||
Linux, macOS, and FreeBSD. (In theory [Windows Subsystem for
|
||||
Linux](https://docs.microsoft.com/en-us/windows/wsl/about) should also work.
|
||||
Please speak up if you try it.)
|
||||
|
||||
On macOS systems native builds may be noticeably faster than using Docker's
|
||||
Linux VM and filesystem overlay.
|
||||
|
||||
To build the server, you will need the following C libraries installed:
|
||||
|
||||
* [SQLite3](https://www.sqlite.org/), at least version 3.8.2.
|
||||
(You can skip this if you compile with `--features=bundled` and
|
||||
don't mind the `moonfire-nvr sql` command not working.)
|
||||
|
||||
* [`ncursesw`](https://www.gnu.org/software/ncurses/), the UTF-8 version of
|
||||
the `ncurses` library.
|
||||
To build the server, you will need [SQLite3](https://www.sqlite.org/). You
|
||||
can skip this if compiling with `--features=rusqlite/bundled` and don't
|
||||
mind the `moonfire-nvr sql` command not working.
|
||||
|
||||
To build the UI, you'll need a [nodejs](https://nodejs.org/en/download/) release
|
||||
in "Maintenance" or "LTS" status: currently v14, v16, or v18.
|
||||
@@ -184,7 +46,6 @@ most non-Rust dependencies:
|
||||
```console
|
||||
$ sudo apt-get install \
|
||||
build-essential \
|
||||
libncurses-dev \
|
||||
libsqlite3-dev \
|
||||
pkgconf \
|
||||
sqlite3 \
|
||||
@@ -253,72 +114,24 @@ $ nvr run
|
||||
with `cargo build` rather than `cargo build --release`, for a faster build
|
||||
cycle and slower performance.)
|
||||
|
||||
Note this `nvr` is a little different than the `nvr` shell script you create
|
||||
when following the [install instructions](install.md). With that shell wrapper,
|
||||
`nvr run` will create and run a detached Docker container with some extra
|
||||
arguments specified in the script. This `nvr run` will directly run from the
|
||||
terminal, with no extra arguments, until you abort with Ctrl-C. Likewise,
|
||||
some of the shell script's subcommands that wrap Docker (`start`, `stop`, and
|
||||
`logs`) have no parallel with this `nvr`.
|
||||
## Release procedure
|
||||
|
||||
### Running as a `systemd` service
|
||||
Releases are currently a bit manual. From a completely clean git work tree,
|
||||
|
||||
If you want to deploy a non-Docker build on Linux, you may want to use
|
||||
`systemd`. Create `/etc/systemd/system/moonfire-nvr.service`:
|
||||
1. manually verify the current commit is pushed to github's master branch and
|
||||
has a green checkmark indicating CI passed.
|
||||
2. update versions:
|
||||
* update `server/Cargo.toml` version by hand; run `cargo test --workspace`
|
||||
to update `Cargo.lock`.
|
||||
* ensure `README.md` and `CHANGELOG.md` refer to the new version.
|
||||
3. run commands:
|
||||
```bash
|
||||
VERSION=x.y.z
|
||||
git commit -am "prepare version ${VERSION}"
|
||||
git tag -a "v${VERSION}" -m "version ${VERSION}"
|
||||
git push origin "v${VERSION}"
|
||||
```
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Moonfire NVR
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/moonfire-nvr run
|
||||
Environment=TZ=:/etc/localtime
|
||||
Environment=MOONFIRE_FORMAT=google-systemd
|
||||
Environment=MOONFIRE_LOG=info
|
||||
Environment=RUST_BACKTRACE=1
|
||||
Type=simple
|
||||
User=moonfire-nvr
|
||||
Restart=on-failure
|
||||
CPUAccounting=true
|
||||
MemoryAccounting=true
|
||||
BlockIOAccounting=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
You'll also need a `/etc/moonfire-nvr.toml`:
|
||||
|
||||
```toml
|
||||
[[binds]]
|
||||
ipv4 = "0.0.0.0:8080"
|
||||
allowUnauthenticatedPermissions = { viewVideo = true }
|
||||
|
||||
[[binds]]
|
||||
unix = "/var/lib/moonfire-nvr/sock"
|
||||
ownUidIsPrivileged = true
|
||||
```
|
||||
|
||||
Note this configuration is insecure. You can change that via replacing the
|
||||
`allowUnauthenticatedPermissions` here as described in [Securing Moonfire NVR
|
||||
and exposing it to the Internet](secure.md).
|
||||
|
||||
See [ref/config.md](../ref/config.md) for more about `/etc/moonfire-nvr.toml`.
|
||||
|
||||
Some handy commands:
|
||||
|
||||
```console
|
||||
$ sudo systemctl daemon-reload # reload configuration files
|
||||
$ sudo systemctl start moonfire-nvr # start the service now
|
||||
$ sudo systemctl stop moonfire-nvr # stop the service now (but don't wait for it finish stopping)
|
||||
$ sudo systemctl status moonfire-nvr # show if the service is running and the last few log lines
|
||||
$ sudo systemctl enable moonfire-nvr # start the service on boot
|
||||
$ sudo systemctl disable moonfire-nvr # don't start the service on boot
|
||||
$ sudo journalctl --unit=moonfire-nvr --since='-5 min' --follow # look at recent logs and await more
|
||||
```
|
||||
|
||||
See the [systemd](http://www.freedesktop.org/wiki/Software/systemd/)
|
||||
documentation for more information. The [manual
|
||||
pages](http://www.freedesktop.org/software/systemd/man/) for `systemd.service`
|
||||
and `systemctl` may be of particular interest.
|
||||
The rest should happen automatically—the tag push will fire off a GitHub
|
||||
Actions workflow which creates a release, cross-compiles statically compiled
|
||||
binaries for three different platforms, and uploads them to the release.
|
||||
|
||||
182
guide/install.md
182
guide/install.md
@@ -1,14 +1,14 @@
|
||||
# Installing Moonfire NVR <!-- omit in toc -->
|
||||
|
||||
* [Downloading, installing, and configuring Moonfire NVR with Docker](#downloading-installing-and-configuring-moonfire-nvr-with-docker)
|
||||
* [Downloading, installing, and configuring Moonfire NVR](#downloading-installing-and-configuring-moonfire-nvr)
|
||||
* [Dedicated hard drive setup](#dedicated-hard-drive-setup)
|
||||
* [Completing configuration through the UI](#completing-configuration-through-the-ui)
|
||||
* [Starting it up](#starting-it-up)
|
||||
|
||||
## Downloading, installing, and configuring Moonfire NVR with Docker
|
||||
## Downloading, installing, and configuring Moonfire NVR
|
||||
|
||||
This document describes how to download, install, and configure Moonfire NVR
|
||||
via the prebuilt Docker images available for x86-64, arm64, and arm. If you
|
||||
via the prebuilt Linux binaries available for x86-64, arm64, and arm. If you
|
||||
instead want to build Moonfire NVR yourself, see the [Build
|
||||
instructions](build.md).
|
||||
|
||||
@@ -18,17 +18,16 @@ left, and pick the [latest tagged version](https://github.com/scottlamb/moonfire
|
||||
|
||||

|
||||
|
||||
Next, install [Docker](https://www.docker.com/) if you haven't already,
|
||||
and verify `sudo docker run --rm hello-world` works.
|
||||
Download the binary for your platform from the matching GitHub release.
|
||||
Install it as `/usr/local/bin/moonfire-nvr` and ensure it is executable, e.g.
|
||||
for version `v0.7.8` on Intel machines:
|
||||
|
||||
<details>
|
||||
<summary><tt>sudo</tt> or not?</summary>
|
||||
|
||||
If you prefer to save typing by not prefixing all `docker` and `nvr` commands
|
||||
with `sudo`, see [Docker docs: Manage Docker as a non-root
|
||||
user](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user).
|
||||
Note `docker` access is equivalent to root access security-wise.
|
||||
</details>
|
||||
```console
|
||||
$ VERSION=v0.7.8
|
||||
$ ARCH=x86_64-unknown-linux-musl
|
||||
$ curl -OL "https://github.com/scottlamb/moonfire-nvr/releases/download/$VERSION/moonfire-nvr-$VERSION-$ARCH"
|
||||
$ sudo install -m 755 "moonfire-nvr-$VERSION-$ARCH" /usr/local/bin/moonfire-nvr
|
||||
```
|
||||
|
||||
Next, you'll need to set up your filesystem and the Moonfire NVR user.
|
||||
|
||||
@@ -49,22 +48,12 @@ On most Linux systems, you can create the user as follows:
|
||||
$ sudo useradd --user-group --create-home --home /var/lib/moonfire-nvr moonfire-nvr
|
||||
```
|
||||
|
||||
and create a script called `nvr` to run Moonfire NVR as the intended host user.
|
||||
This script supports running Moonfire NVR's various administrative commands interactively
|
||||
and managing a long-lived Docker container for its web interface.
|
||||
|
||||
As you set up this script, adjust the `tz` variable as appropriate for your
|
||||
time zone.
|
||||
|
||||
Use your favorite editor to create `/etc/moonfire-nvr.toml` and
|
||||
`/usr/local/bin/nvr`, starting from the configurations below:
|
||||
Use your favorite editor to create `/etc/moonfire-nvr.toml`,
|
||||
starting from the configurations below:
|
||||
|
||||
```console
|
||||
$ sudo nano /etc/moonfire-nvr.toml
|
||||
(see below for contents)
|
||||
$ sudo nano /usr/local/bin/nvr
|
||||
(see below for contents)
|
||||
$ sudo chmod a+rx /usr/local/bin/nvr
|
||||
```
|
||||
|
||||
`/etc/moonfire-nvr.toml` (see [ref/config.md](../ref/config.md) for more explanation):
|
||||
@@ -78,79 +67,10 @@ unix = "/var/lib/moonfire-nvr/sock"
|
||||
ownUidIsPrivileged = true
|
||||
```
|
||||
|
||||
`/usr/local/bin/nvr`:
|
||||
```bash
|
||||
#!/bin/bash -e
|
||||
|
||||
# Set your timezone here.
|
||||
tz="America/Los_Angeles"
|
||||
|
||||
image_name="scottlamb/moonfire-nvr:v0.7.7"
|
||||
container_name="moonfire-nvr"
|
||||
common_docker_run_args=(
|
||||
--mount=type=bind,source=/var/lib/moonfire-nvr,destination=/var/lib/moonfire-nvr
|
||||
--mount=type=bind,source=/etc/moonfire-nvr.toml,destination=/etc/moonfire-nvr.toml
|
||||
|
||||
# Add additional mount lines here for each sample file directory
|
||||
# outside of /var/lib/moonfire-nvr, e.g.:
|
||||
# --mount=type=bind,source=/media/nvr/sample,destination=/media/nvr/sample
|
||||
|
||||
--user="$(id -u moonfire-nvr):$(id -g moonfire-nvr)"
|
||||
|
||||
# This avoids errors with broken seccomp on older 32-bit hosts.
|
||||
# https://github.com/moby/moby/issues/40734
|
||||
--security-opt=seccomp:unconfined
|
||||
|
||||
# This is the simplest way of configuring networking, although
|
||||
# you can use e.g. --publish=8080:8080 in the run) case below if you
|
||||
# prefer.
|
||||
--network=host
|
||||
|
||||
# docker's default log driver won't rotate logs properly, and will throw
|
||||
# away logs when you destroy and recreate the container. Using journald
|
||||
# solves these problems.
|
||||
# https://docs.docker.com/config/containers/logging/configure/
|
||||
--log-driver=journald
|
||||
--log-opt="tag=moonfire-nvr"
|
||||
|
||||
--env=RUST_BACKTRACE=1
|
||||
--env=TZ=":${tz}"
|
||||
)
|
||||
|
||||
case "$1" in
|
||||
run)
|
||||
shift
|
||||
exec docker run \
|
||||
--detach=true \
|
||||
--restart=unless-stopped \
|
||||
"${common_docker_run_args[@]}" \
|
||||
--name="${container_name}" \
|
||||
"${image_name}" \
|
||||
run \
|
||||
"$@"
|
||||
;;
|
||||
start|stop|logs|rm)
|
||||
exec docker "$@" "${container_name}"
|
||||
;;
|
||||
pull)
|
||||
exec docker pull "${image_name}"
|
||||
;;
|
||||
*)
|
||||
exec docker run \
|
||||
--interactive=true \
|
||||
--tty \
|
||||
--rm \
|
||||
"${common_docker_run_args[@]}" \
|
||||
"${image_name}" \
|
||||
"$@"
|
||||
;;
|
||||
esac
|
||||
```
|
||||
|
||||
then try it out by initializing the database:
|
||||
Then initialize the database:
|
||||
|
||||
```console
|
||||
$ sudo nvr init
|
||||
$ sudo -u moonfire-nvr moonfire-nvr init
|
||||
```
|
||||
|
||||
This will create a directory `/var/lib/moonfire-nvr/db` with a SQLite3 database
|
||||
@@ -189,10 +109,6 @@ system will boot successfully even when the hard drive is unavailable (such as
|
||||
when your external USB storage is unmounted). This can be helpful when
|
||||
recovering from problems.
|
||||
|
||||
Add a new `--mount` line to your Docker wrapper script `/usr/local/bin/nvr`
|
||||
to expose the new sample directory `/media/nvr/sample` to the Docker container,
|
||||
right where a comment mentions "Additional mount lines".
|
||||
|
||||
### Completing configuration through the UI
|
||||
|
||||
Once your system is set up, it's time to initialize an empty database
|
||||
@@ -200,16 +116,17 @@ and add the cameras and sample directories. You can do this
|
||||
by using the `moonfire-nvr` binary's text-based configuration tool.
|
||||
|
||||
```console
|
||||
$ sudo nvr config 2>debug-log
|
||||
$ sudo -u moonfire-nvr moonfire-nvr config 2>debug-log
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Did it return without doing anything?</summary>
|
||||
|
||||
If `nvr config` returns you to the console prompt right away, look in the
|
||||
`debug-log` file for why. One common reason is that you have Moonfire NVR
|
||||
running; you'll need to shut it down first. Try `nvr stop` before `nvr config`
|
||||
and `nvr start` afterward.
|
||||
If `moonfire-nvr config` returns you to the console prompt right away, look in
|
||||
the `debug-log` file for why. One common reason is that you have Moonfire NVR
|
||||
running; you'll need to shut it down first. If you are running a systemd
|
||||
service as described below, try `sudo systemctl stop moonfire-nvr` before
|
||||
editing the config and `sudo systemctl start moonfire-nvr` after.
|
||||
</details>
|
||||
|
||||
In the user interface,
|
||||
@@ -277,15 +194,58 @@ starting it in this configuration to try it out, particularly if the machine
|
||||
it's running on is behind a home router's firewall. You might not; in that case
|
||||
read through [secure the system](secure.md) first.
|
||||
|
||||
This command will start a detached Docker container for the web interface.
|
||||
It will automatically restart when your system does.
|
||||
Assuming you want to proceed, you can launch Moonfire NVR through `systemd`.
|
||||
Create `/etc/systemd/system/moonfire-nvr.service`:
|
||||
|
||||
```console
|
||||
$ sudo nvr run
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Moonfire NVR
|
||||
After=network-online.target
|
||||
|
||||
# If you use an external hard drive, uncomment this with a reference to the
|
||||
# mount point as written in `/etc/fstab`.
|
||||
# RequiresMountsFor=/media/nvr
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/moonfire-nvr run
|
||||
Environment=TZ=:/etc/localtime
|
||||
Environment=MOONFIRE_FORMAT=systemd
|
||||
Environment=MOONFIRE_LOG=info
|
||||
Environment=RUST_BACKTRACE=1
|
||||
Type=simple
|
||||
User=moonfire-nvr
|
||||
Restart=on-failure
|
||||
CPUAccounting=true
|
||||
MemoryAccounting=true
|
||||
BlockIOAccounting=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
You can temporarily disable the service via `nvr stop` and restart it later via
|
||||
`nvr start`. You'll need to do this before and after using `nvr config`.
|
||||
Then start it up as follows:
|
||||
|
||||
```console
|
||||
$ sudo systemctl daemon-reload # read in the new config file
|
||||
$ sudo systemctl enable --now moonfire-nvr # start the service now and on boot
|
||||
```
|
||||
|
||||
Some handy commands:
|
||||
|
||||
```console
|
||||
$ sudo systemctl daemon-reload # reload configuration files
|
||||
$ sudo systemctl start moonfire-nvr # start the service now without enabling on boot
|
||||
$ sudo systemctl stop moonfire-nvr # stop the service now (but don't wait for it finish stopping)
|
||||
$ sudo systemctl status moonfire-nvr # show if the service is running and the last few log lines
|
||||
$ sudo systemctl enable moonfire-nvr # start the service on boot
|
||||
$ sudo systemctl disable moonfire-nvr # don't start the service on boot
|
||||
$ sudo journalctl --unit=moonfire-nvr --since='-5 min' --follow # look at recent logs and await more
|
||||
```
|
||||
|
||||
See the [systemd](http://www.freedesktop.org/wiki/Software/systemd/)
|
||||
documentation for more information. The [manual
|
||||
pages](http://www.freedesktop.org/software/systemd/man/) for `systemd.service`
|
||||
and `systemctl` may be of particular interest.
|
||||
|
||||
The HTTP interface is accessible on port 8080; if your web browser is running
|
||||
on the same machine, you can access it at
|
||||
|
||||
@@ -62,11 +62,11 @@ SQLite database:
|
||||
no longer in the dangerous mode.
|
||||
|
||||
Next ensure Moonfire NVR is not running and does not automatically restart if
|
||||
the system is rebooted during the upgrade. If you followed the Docker
|
||||
the system is rebooted during the upgrade. If you followed the standard
|
||||
instructions, you can do this as follows:
|
||||
|
||||
```console
|
||||
$ sudo nvr stop
|
||||
$ sudo systemctl disable --now moonfire-nvr
|
||||
```
|
||||
|
||||
Then back up your SQLite database. If you are using the default path, you can
|
||||
@@ -92,34 +92,27 @@ manual for write-ahead logging](https://www.sqlite.org/wal.html):
|
||||
|
||||
Run the upgrade procedure using the new software binary.
|
||||
|
||||
```console
|
||||
$ sudo nvr pull # updates the docker image to the latest binary
|
||||
$ sudo nvr upgrade # runs the upgrade
|
||||
```
|
||||
|
||||
As a rule of thumb, on a Raspberry Pi 4 with a 1 GiB database, an upgrade might
|
||||
take about four minutes for each schema version and for the final vacuum.
|
||||
|
||||
Next, you can run the system in read-only mode, although you'll find this only
|
||||
works in the "insecure" setup. (Authorization requires writing the database.)
|
||||
To just run directly within the console until you hit ctrl-C, use the following
|
||||
command:
|
||||
|
||||
```console
|
||||
$ sudo nvr rm
|
||||
$ sudo nvr run --read-only
|
||||
$ sudo -u moonfire-nvr moonfire-nvr run --read-only
|
||||
```
|
||||
|
||||
Go to the web interface and ensure the system is operating correctly. If
|
||||
you detect a problem now, you can copy the old database back over the new one
|
||||
and edit your `nvr` script to use the corresponding older Docker image. If
|
||||
you detect a problem after enabling read-write operation, a restore will be
|
||||
more complicated.
|
||||
and go back to the prior release. If you detect a problem after enabling
|
||||
read-write operation, a restore will be more complicated.
|
||||
|
||||
Once you're satisfied, restart the system in read-write mode:
|
||||
Once you're satisfied, ctrl-C and start the system in read-write mode:
|
||||
|
||||
```console
|
||||
$ sudo nvr stop
|
||||
$ sudo nvr rm
|
||||
$ sudo nvr run
|
||||
$ sudo systemctl enable --now moonfire-nvr
|
||||
```
|
||||
|
||||
Hopefully your system is functioning correctly. If not, there are two options
|
||||
@@ -137,7 +130,8 @@ for restore; neither are easy:
|
||||
* undo the changes by hand. There's no documentation on this; you'll need
|
||||
to read the code and come up with a reverse transformation.
|
||||
|
||||
The `nvr check` command will show you what problems exist on your system.
|
||||
The `sudo -u moonfire-nvr moonfire-nvr check` command will show you what
|
||||
problems exist on your system.
|
||||
|
||||
### Unversioned to version 0
|
||||
|
||||
|
||||
@@ -161,8 +161,8 @@ your browser. See [How to secure Nginx with Let's Encrypt on Ubuntu
|
||||
|
||||
## 6. Reconfigure Moonfire NVR
|
||||
|
||||
If you follow the recommended Docker setup, your `/etc/moonfire-nvr.toml`
|
||||
will contain this line:
|
||||
If you follow the recommended setup, your `/etc/moonfire-nvr.toml` will contain
|
||||
this line:
|
||||
|
||||
```toml
|
||||
allowUnauthenticatedPermissions = { viewVideo = true }
|
||||
@@ -185,18 +185,16 @@ This change has two effects:
|
||||
See also [ref/config.md](../ref/config.md) for more about the configuration file.
|
||||
|
||||
If the webserver is running on the same machine as Moonfire NVR, you might
|
||||
also change `--publish=8080:8080` to `--publish=127.0.0.1:8080:8080` in your
|
||||
`/usr/local/bin/nvr` script, preventing other machines on the network from
|
||||
impersonating the proxy, effectively allowing them to lie about the client's IP
|
||||
and protocol.
|
||||
also change the `ipv4 = "0.0.0.0:8080"` line in `/etc/moonfire-nvr/toml` to
|
||||
`ipv4 = "127.0.0.1:8080"`, so that only the local host can directly connect to
|
||||
Moonfire NVR. If other machines can connect directly, they can impersonate
|
||||
the proxy, which would effectively allow them to lie about the client's IP and
|
||||
protocol.
|
||||
|
||||
To make this take effect, you'll need to stop the running Docker container,
|
||||
delete it, and create/run a new one:
|
||||
To make this take effect, you'll need to restart Moonfire NVR:
|
||||
|
||||
```console
|
||||
$ sudo nvr stop
|
||||
$ sudo nvr rm
|
||||
$ sudo nvr run
|
||||
$ sudo systemctl restart moonfire-nvr
|
||||
```
|
||||
|
||||
## 7. Configure the webserver
|
||||
|
||||
@@ -11,7 +11,6 @@ need more help.
|
||||
* [Camera stream errors](#camera-stream-errors)
|
||||
* [Problems](#problems)
|
||||
* [Server errors](#server-errors)
|
||||
* [`clock_gettime failed: EPERM: Operation not permitted`](#clock_gettime-failed-eperm-operation-not-permitted)
|
||||
* [`Error: pts not monotonically increasing; got 26615520 then 26539470`](#error-pts-not-monotonically-increasing-got-26615520-then-26539470)
|
||||
* [Out of disk space](#out-of-disk-space)
|
||||
* [Database or filesystem corruption errors](#database-or-filesystem-corruption-errors)
|
||||
@@ -29,9 +28,8 @@ While Moonfire NVR is running, logs will be written to stderr.
|
||||
* When running the configuration UI, you typically should redirect stderr
|
||||
to a text file to avoid poor interaction between the interactive stdout
|
||||
output and the logging. If you use the recommended
|
||||
`nvr config 2>debug-log` command, output will be in the `debug-log` file.
|
||||
* When running detached through Docker, Docker saves the logs for you.
|
||||
Try `nvr logs` or `docker logs moonfire-nvr`.
|
||||
`moonfire-nvr config 2>debug-log` command, output will be in the
|
||||
`debug-log` file.
|
||||
* When running through systemd, stderr will be redirected to the journal.
|
||||
Try `sudo journalctl --unit moonfire-nvr` to view the logs. You also
|
||||
likely want to set `MOONFIRE_FORMAT=systemd` to format logs as
|
||||
@@ -56,8 +54,6 @@ Logging options are controlled by environment variables:
|
||||
consumption.
|
||||
* Errors include a backtrace if `RUST_BACKTRACE=1` is set.
|
||||
|
||||
If you use Docker, set these via Docker's `--env` argument.
|
||||
|
||||
With `MOONFIRE_FORMAT` left unset, log events look as follows:
|
||||
|
||||
```text
|
||||
@@ -191,23 +187,6 @@ quickly enough. In the latter case, you'll likely see a
|
||||
|
||||
### Server errors
|
||||
|
||||
#### `clock_gettime failed: EPERM: Operation not permitted`
|
||||
|
||||
If commands fail with an error like the following, you're likely running
|
||||
Docker with an overly restrictive `seccomp` setup. [This stackoverflow
|
||||
answer](https://askubuntu.com/questions/1263284/apt-update-throws-signature-error-in-ubuntu-20-04-container-on-arm/1264921#1264921) describes the
|
||||
problem in more detail. The simplest solution is to add
|
||||
`--security-opt=seccomp:unconfined` to your Docker commandline.
|
||||
If you are using the recommended `/usr/local/bin/nvr` wrapper script,
|
||||
add this option to the `common_docker_run_args` section.
|
||||
|
||||
```console
|
||||
$ sudo docker run --rm -it moonfire-nvr:latest
|
||||
clock_gettime failed: EPERM: Operation not permitted
|
||||
|
||||
This indicates a broken environment. See the troubleshooting guide.
|
||||
```
|
||||
|
||||
#### `Error: pts not monotonically increasing; got 26615520 then 26539470`
|
||||
|
||||
If your streams cut out and you see error messages like this one in Moonfire
|
||||
@@ -322,8 +301,7 @@ mechanism to fix old timestamps after the fact. Ideas and help welcome; see
|
||||
|
||||
#### `moonfire-nvr config` displays garbage
|
||||
|
||||
This happens if you're not using the premade Docker containers and have
|
||||
configured your machine is configured to a non-UTF-8 locale, due to
|
||||
This may happen if your machine is configured to a non-UTF-8 locale, due to
|
||||
gyscos/Cursive#13. As a workaround, try setting the environment variable
|
||||
`LC_ALL=C.UTF-8`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user