A privacy-focused, intelligent security camera system.
- Multi-camera support w/ minimal configuration. Supports USB cameras and the Raspberry Pi camera module.
- Motion detection that automatically saves videos and lets you view them in the web app.
- Encrypted in transit, both from the cameras to the server and the server to your browser.
- Integrated authentication
- Self-Hosted
- Free and Open Source (GPLv3)
Sec-cam-server is designed to be deployed flexibly. There are 2 core components:
A device capable of capturing video and streaming to the server. Requirements:
- Must be able to run Python
- Must have a device capable of capturing video (e.g. a USB camera, webcam, or raspberry pi camera module)
- Must be able to communicate to the server over a network. During setup, you will point the camera at the server's hostname or IP address.
The server components aggregates feeds from the cameras, performs motion detection, and makes video available in a web UI via an API. The server can be a standalone host, or can run on one of your cameras (e.g. a Raspberry Pi). Requirements:
- Must be able to run Docker.
- Must be accessible to your camera(s) over a network.
Example 1: A standalone server, with the hostname sec-cam-server.local
, and 2 cameras, with hostnames camera1.local
and
camera2.local
.
- On
sec-cam-server.local
, follow the instructions in "Setting up the server". Replace<server-hostname:server-port>
withsec-cam-server.local:8443
. - On each camera, follow the instructions in "Adding a camera". In Step 3,
run.sh
should be updated to contain--server_url sec-cam-server.local
. - The web UI with camera feeds will be available at
https://sec-cam-server.local:8443
Example 2: 2 cameras with hostnames camera1.local
and camera2.local
, with the "server" running camera1.local
- On
camera1.local
, follow the steps to install the server. - On
camera1.local
, follow the steps to install the in "Adding a camera". In Step 3,run.sh
should be updated to contain--server_url localhost
. - On
camera2.local
, follow the steps to install the in "Adding a camera". In Step 3,run.sh
should be updated to contain--server_url camera1.local
. - The web UI with camera feeds will be available at
https://camera1.local:8443
- Install Docker following the instructions on their website.
- Clone this repository
- Generate SSL certificates:
./create-certs.sh
. Alternatively, you may place your own certs in thecerts
dir - Pull and run the docker containers:
docker-compose pull API_URL=<server-hostname:server-port> docker-compose up -d
For example, if the server was running on the host sec-cam-server
and port 8443
(the default), you should use
API_URL=sec-cam-server:8443
.
5. You should now be able to view the UI at https://<server-hostname>:8443
.
6. Until a user is created, you will be automatically redirected to
By default, user registration will be disabled once an initial user is created. To enable registration to add
additional users, update the environment variable ENABLE_REGISTRATION
under the server
service:
- ENABLE_REGISTRATION=1
When you're done adding users, you should re-set this value to 0
and restart the server.
NOTE: These instructions assume you are deploying to a Debian-based OS.
- Install the
python3-opencv
package and dependencies:sudo apt-get install python3-opencv libatlas-base-dev
- Clone this repository
- Install the package:
cd backend && python3 -m pip install .[streamer]
. If you are using the Raspberry Pi camera module, runcd backend && python3 -m pip install .[streamer,picam]
. - Update
--server_url
inrun.sh
to point at the host you deployed the server to. - You can install the camera software as a systemd service or run it manually. Either:
- Run the script to create the camera systemd service:
cd scripts && ./create-streamer-service.sh
- Run the camera manually:
./run.sh
.
- Run the script to create the camera systemd service:
- In the Web UI, you should see live video from that camera.
- @khlam for his help with Github Actions and building docker images