Getting started
Installation
Install FaceStream.AI with Docker or Docker Compose, on a Synology, QNAP or Unraid NAS, a Raspberry Pi or Linux without Docker. Updates and backups.
On this page
FaceStream.AI comes as a Docker image for linux/amd64 and linux/arm64, and as a
package for Linux without Docker. Both are the same software; which edition it runs as is
decided by the licence you enter, not by what you download.
Everything that changes, settings, enrolled people, visits, the licence, lives in one data folder. The program itself is disposable: you can delete and recreate the container at any time, as long as the data folder stays.
Before you start
| Hardware | A 64-bit processor, x86-64 or ARM64. All recognition runs on the processor; a graphics card is not used. How many cores and how much memory each edition needs is on the page system requirements |
| Ports | 8000 for the interface, 8100 for the video stream and the address a doorbell or home automation calls to start a recognition. Both need to be reachable in your network |
| Storage | Well under a gigabyte for the program, plus the pictures kept for each visit. How long they are kept is up to you, see Events and visits |
| Time zone | Set it. A container does not take over the time zone of the machine it runs on, and times in messages would otherwise be in UTC |
Do not forward ports 8000 or 8100 from your router to the internet. For access from outside, use a VPN into your own network, many routers and NAS systems have one built in.
Docker
docker run -d --name facestream \
-p 8000:8000 -p 8100:8100 \
-v facestream-data:/data \
-e TZ=Europe/Berlin \
--restart unless-stopped \
kumkju/facestream:latest
Then open http://<address of the machine>:8000 and choose a password, there is no
preset one.
Docker Compose
The same as a compose.yaml:
services:
facestream:
image: kumkju/facestream:latest
container_name: facestream
ports:
- "8000:8000" # the interface
- "8100:8100" # the video stream and the trigger address
volumes:
- facestream-data:/data
environment:
TZ: Europe/Berlin
restart: unless-stopped
volumes:
facestream-data:
docker compose up -d
Synology
On a Synology NAS with DSM 7.2 or later, through the NAS's own interface. A project in Container Manager is the safest way: the folder for your data is written into a file and cannot be forgotten the next time the container is rebuilt.
-
File Station: in the shared folder
docker, create a folderfacestream. It holds all your data and is the one thing to back up. -
Container Manager → Project → Create.
-
Project name
facestream, Path/docker/facestream. -
Source: create a
compose.yamland paste:services: facestream: image: kumkju/facestream:latest container_name: facestream restart: unless-stopped ports: - "8000:8000" - "8100:8100" volumes: - /volume1/docker/facestream:/data environment: TZ: Europe/Berlin -
Skip the web portal settings, FaceStream.AI brings its own interface.
-
Confirm. DSM downloads the image and starts the container.
Open http://<address of the NAS>:8000 and choose a password.
Check once that the data folder is really used. After the first start, the folder
docker/facestream in File Station contains config.json, auth.json and a folder
known_faces. If it stays empty while the interface answers on port 8000, the line under
volumes is missing or wrong, and the next update would lose everything.
Port 8000 already taken? Change only the left-hand side, for example "18000:8000"
and "18100:8100", and open http://<address of the NAS>:18000.
An address of its own on the network
If you would rather give FaceStream.AI its own address in your home network, no port conflicts, and cameras see an ordinary device, use a macvlan network. Container Manager cannot create one, so this takes one command over SSH (Control Panel → Terminal & SNMP → Enable SSH service):
sudo docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 --ip-range=192.168.1.240/28 -o parent=eth0 lan
Adjust the network and the router to yours, and choose an --ip-range outside the
range your router hands out by DHCP. parent is the NAS's network interface, eth0
usually, ovs_eth0 if Virtual Machine Manager is installed; sudo ip -br link lists them.
In the project, replace ports: with:
networks:
lan:
ipv4_address: 192.168.1.242
networks:
lan:
external: true
name: lan
The interface is then at http://192.168.1.242:8000. One limitation comes with it: the
NAS itself cannot reach a container on a macvlan network, and the container cannot reach
the NAS. Every other device in your network can.
QNAP, Unraid and other NAS systems
Container Station on a QNAP, the Docker page on Unraid and most other container managers ask for the same four things:
- the image
kumkju/facestream, taglatest - a folder on the NAS, mounted at
/data - the ports
8000 → 8000and8100 → 8100, TCP - the variable
TZwith your time zone, and automatic restart switched on
32-bit ARM models cannot run it.
Linux without Docker
For a mini PC or a Raspberry Pi that should run nothing else. The package is built on Debian 12 (Bookworm) and needs a 64-bit system with systemd that is at least as recent: Debian 12 or later, Ubuntu 24.04, Raspberry Pi OS based on Bookworm. On an older system, use Docker.
Packages are not published at a public address. Sign in to your account on
facestream-ai.com, open Downloads and
download the one for your processor, amd64 for Intel and AMD, arm64 for a Raspberry
Pi and other ARM boards. Then:
tar xzf facestream-2.4.0-linux-arm64.tar.gz
cd facestream-2.4.0-linux-arm64
sudo ./install.sh
The installer puts the program in /opt/facestream, keeps all data in
/var/lib/facestream, creates a user facestream without a login, and starts two
services:
systemctl status facestream-frontend facestream-video
journalctl -u facestream-video -f
facestream-frontend is the interface on port 8000, facestream-video the recognition
and the stream on port 8100. The time zone is the system's own.
Raspberry Pi
A Raspberry Pi 5 is the board to use; a Raspberry Pi 4 is the minimum, and only for the Free edition. Install the 64-bit Raspberry Pi OS, a 32-bit system cannot run FaceStream.AI. Then either install Docker and follow Docker above:
curl -fsSL https://get.docker.com | sh
or use the arm64 package from Linux without Docker.
Put the data on an SSD rather than the memory card: the event database writes all the time, and a memory card wears out long before an SSD does. The figures for the Raspberry Pi on the page system requirements are planning values derived from measurements on faster machines; try your own camera and settings before relying on them.
Settings in the environment
Rarely needed beyond TZ:
| Variable | Default | What it does |
|---|---|---|
TZ |
UTC | Set this. The time zone for times in messages, e-mails and syslog lines, for example Europe/Berlin or Europe/London |
DATA_FOLDER |
/data |
Where everything that changes is kept |
FACES_FOLDER |
inside the data folder | The photos of enrolled people, if they should live elsewhere, a network share, for example |
EVENT_IMAGES_FOLDER |
inside the data folder | The pictures kept for each visit, if they should live elsewhere. This is the folder that grows |
CONFIG_SERVER_PORT |
8000 |
The port of the interface inside the container |
STREAMING_SERVER_PORT |
8100 |
The port of the video stream inside the container |
To move FaceStream.AI to other ports, change the host side of the port mapping, not these
variables: -p 18000:8000 -p 18100:8100. The two port variables are for host networking or
a NAS that already uses port 8000 itself, and then the interface and the video stream both
need to know, set both.
Updating
When a newer version is published, a button Update 2.x.y appears at the bottom left, next to the version number. It shows what changed and the commands for your installation. FaceStream.AI never installs anything by itself.
Docker:
docker pull kumkju/facestream:latest
docker stop facestream && docker rm facestream
then the same docker run as before, with the same volume. With Docker Compose:
docker compose pull && docker compose up -d.
Synology: in Container Manager, update the image under Image, then stop the project
and build it again. The menu entries differ slightly between DSM versions, you want the
one that rebuilds the project from its compose.yaml, not the one that deletes it.
Linux without Docker: download the new package and run the same three commands as for
the installation. The installer stops the services, replaces the program and starts them
again; /var/lib/facestream is not touched.
Your update period. A licence includes the versions published until the date shown
under Updates until on the licence card. A version published after that date runs as
the Free edition with that licence. The update button only offers versions your licence
covers; if you update by hand after your update period has ended, use the version number
instead of latest, kumkju/facestream:2.4.0, or extend the update period in your
account first.
Version tags such as 2.4.0 never change; latest moves with every release.
Backing up and moving
Back up the data folder and nothing else: the volume facestream-data, the folder you
chose on the NAS, or /var/lib/facestream. Stop FaceStream.AI while you copy it, so the
event database is not in the middle of a write.
| In the data folder | |
|---|---|
config.json |
Cameras, connections, rules and all other settings |
auth.json |
The password and the key that signs sessions |
events.db |
The visits and the delivery log |
known_faces/ |
The photos of enrolled people |
saved_faces/ |
The pictures kept for each visit |
machine-id |
The identity of this installation, which the licence is bound to |
licence.key, activation.json |
The licence and, if it needs one, its activation |
encodings.npz, updates.json |
Caches that rebuild themselves |
To move to another machine, copy the whole folder and start FaceStream.AI there with it.
Because machine-id moves along, the licence stays with the installation. If you start
from scratch on new hardware instead, the new installation has a new device ID; release the
old device in your account first, see Editions and licence.
Forgot the password? Troubleshooting explains how to set a new one without losing anything.