mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
Migrate default database path from /media/frigate
to /config
(#5219)
* Migrate db path to /config * Ensure oneshot runs * Put logic inside of Frigate's run * Use new db default path in code * Fix missing config dir * Upgrade yq to 4.33.3
This commit is contained in:
parent
fbaab71d78
commit
cdd8e6fd4e
3
.gitignore
vendored
3
.gitignore
vendored
@ -4,7 +4,8 @@
|
|||||||
debug
|
debug
|
||||||
.vscode/*
|
.vscode/*
|
||||||
!.vscode/launch.json
|
!.vscode/launch.json
|
||||||
config/config.yml
|
config/*
|
||||||
|
!config/*.example
|
||||||
models
|
models
|
||||||
*.mp4
|
*.mp4
|
||||||
*.ts
|
*.ts
|
||||||
|
2
Makefile
2
Makefile
@ -30,7 +30,7 @@ push: build
|
|||||||
docker buildx build --push --platform linux/amd64 --target=frigate-tensorrt --tag $(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-tensorrt .
|
docker buildx build --push --platform linux/amd64 --target=frigate-tensorrt --tag $(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-tensorrt .
|
||||||
|
|
||||||
run: local
|
run: local
|
||||||
docker run --rm --publish=5000:5000 --volume=${PWD}/config/config.yml:/config/config.yml frigate:latest
|
docker run --rm --publish=5000:5000 --volume=${PWD}/config:/config frigate:latest
|
||||||
|
|
||||||
run_tests: local
|
run_tests: local
|
||||||
docker run --rm --workdir=/opt/frigate --entrypoint= frigate:latest python3 -u -m unittest
|
docker run --rm --workdir=/opt/frigate --entrypoint= frigate:latest python3 -u -m unittest
|
||||||
|
@ -27,7 +27,7 @@ services:
|
|||||||
- .:/workspace/frigate:cached
|
- .:/workspace/frigate:cached
|
||||||
- ./web/dist:/opt/frigate/web:cached
|
- ./web/dist:/opt/frigate/web:cached
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
- ./config/config.yml:/config/config.yml
|
- ./config:/config
|
||||||
- ./debug:/media/frigate
|
- ./debug:/media/frigate
|
||||||
# Create the trt-models folder using the documented method of generating TRT models
|
# Create the trt-models folder using the documented method of generating TRT models
|
||||||
# - ./debug/trt-models:/trt-models
|
# - ./debug/trt-models:/trt-models
|
||||||
|
@ -70,3 +70,9 @@ apt-get purge gnupg apt-transport-https wget xz-utils -y
|
|||||||
apt-get clean autoclean -y
|
apt-get clean autoclean -y
|
||||||
apt-get autoremove --purge -y
|
apt-get autoremove --purge -y
|
||||||
rm -rf /var/lib/apt/lists/*
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Install yq, for frigate-prepare and go2rtc echo source
|
||||||
|
curl -fsSL \
|
||||||
|
"https://github.com/mikefarah/yq/releases/download/v4.33.3/yq_linux_$(dpkg --print-architecture)" \
|
||||||
|
--output /usr/local/bin/yq
|
||||||
|
chmod +x /usr/local/bin/yq
|
||||||
|
@ -9,6 +9,42 @@ set -o errexit -o nounset -o pipefail
|
|||||||
# Tell S6-Overlay not to restart this service
|
# Tell S6-Overlay not to restart this service
|
||||||
s6-svc -O .
|
s6-svc -O .
|
||||||
|
|
||||||
|
function migrate_db_path() {
|
||||||
|
# Find config file in yaml or yml, but prefer yaml
|
||||||
|
local config_file="${CONFIG_FILE:-"/config/config.yml"}"
|
||||||
|
local config_file_yaml="${config_file//.yaml/.yml}"
|
||||||
|
if [[ -f "${config_file_yaml}" ]]; then
|
||||||
|
config_file="${config_file_yaml}"
|
||||||
|
elif [[ ! -f "${config_file}" ]]; then
|
||||||
|
echo "[ERROR] Frigate config file not found"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
unset config_file_yaml
|
||||||
|
|
||||||
|
# Use yq to check if database.path is set
|
||||||
|
local user_db_path
|
||||||
|
user_db_path=$(yq eval '.database.path' "${config_file}")
|
||||||
|
|
||||||
|
if [[ "${user_db_path}" == "null" ]]; then
|
||||||
|
local previous_db_path="/media/frigate/frigate.db"
|
||||||
|
local new_db_dir="/config"
|
||||||
|
if [[ -f "${previous_db_path}" ]]; then
|
||||||
|
if mountpoint --quiet "${new_db_dir}"; then
|
||||||
|
# /config is a mount point, move the db
|
||||||
|
echo "[INFO] Moving db from '${previous_db_path}' to the '${new_db_dir}' dir..."
|
||||||
|
# Move all files that starts with frigate.db to the new directory
|
||||||
|
mv -vf "${previous_db_path}"* "${new_db_dir}"
|
||||||
|
else
|
||||||
|
echo "[ERROR] Trying to migrate the db path from '${previous_db_path}' to the '${new_db_dir}' dir, but '${new_db_dir}' is not a mountpoint, please mount the '${new_db_dir}' dir"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "[INFO] Preparing Frigate..."
|
||||||
|
migrate_db_path
|
||||||
|
|
||||||
echo "[INFO] Starting Frigate..."
|
echo "[INFO] Starting Frigate..."
|
||||||
|
|
||||||
cd /opt/frigate || echo "[ERROR] Failed to change working directory to /opt/frigate"
|
cd /opt/frigate || echo "[ERROR] Failed to change working directory to /opt/frigate"
|
||||||
|
@ -42,7 +42,7 @@ environment_vars:
|
|||||||
|
|
||||||
### `database`
|
### `database`
|
||||||
|
|
||||||
Event and recording information is managed in a sqlite database at `/media/frigate/frigate.db`. If that database is deleted, recordings will be orphaned and will need to be cleaned up manually. They also won't show up in the Media Browser within Home Assistant.
|
Event and recording information is managed in a sqlite database at `/config/frigate.db`. If that database is deleted, recordings will be orphaned and will need to be cleaned up manually. They also won't show up in the Media Browser within Home Assistant.
|
||||||
|
|
||||||
If you are storing your database on a network share (SMB, NFS, etc), you may get a `database is locked` error message on startup. You can customize the location of the database in the config if necessary.
|
If you are storing your database on a network share (SMB, NFS, etc), you may get a `database is locked` error message on startup. You can customize the location of the database in the config if necessary.
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ ffmpeg:
|
|||||||
hwaccel_args: preset-vaapi
|
hwaccel_args: preset-vaapi
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTICE**: With some of the processors, like the J4125, the default driver `iHD` doesn't seem to work correctly for hardware acceleration. You may need to change the driver to `i965` by adding the following environment variable `LIBVA_DRIVER_NAME=i965` to your docker-compose file or [in the frigate.yml for HA OS users](advanced.md#environment_vars).
|
**NOTICE**: With some of the processors, like the J4125, the default driver `iHD` doesn't seem to work correctly for hardware acceleration. You may need to change the driver to `i965` by adding the following environment variable `LIBVA_DRIVER_NAME=i965` to your docker-compose file or [in the `frigate.yaml` for HA OS users](advanced.md#environment_vars).
|
||||||
|
|
||||||
### Intel-based CPUs (>=10th Generation) via Quicksync
|
### Intel-based CPUs (>=10th Generation) via Quicksync
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ id: index
|
|||||||
title: Configuration File
|
title: Configuration File
|
||||||
---
|
---
|
||||||
|
|
||||||
For Home Assistant Addon installations, the config file needs to be in the root of your Home Assistant config directory (same location as `configuration.yaml`). It can be named `frigate.yml` or `frigate.yaml`, but if both files exist `frigate.yaml` will be preferred and `frigate.yml` will be ignored.
|
For Home Assistant Addon installations, the config file needs to be in the root of your Home Assistant config directory (same location as `configuration.yaml`). It can be named `frigate.yaml` or `frigate.yml`, but if both files exist `frigate.yaml` will be preferred and `frigate.yml` will be ignored.
|
||||||
|
|
||||||
For all other installation types, the config file should be mapped to `/config/config.yml` inside the container.
|
For all other installation types, the config file should be mapped to `/config/config.yml` inside the container.
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ detectors:
|
|||||||
# Optional: Database configuration
|
# Optional: Database configuration
|
||||||
database:
|
database:
|
||||||
# The path to store the SQLite DB (default: shown below)
|
# The path to store the SQLite DB (default: shown below)
|
||||||
path: /media/frigate/frigate.db
|
path: /config/frigate.db
|
||||||
|
|
||||||
# Optional: model modifications
|
# Optional: model modifications
|
||||||
model:
|
model:
|
||||||
|
@ -21,12 +21,11 @@ Windows is not officially supported, but some users have had success getting it
|
|||||||
|
|
||||||
Frigate uses the following locations for read/write operations in the container. Docker volume mappings can be used to map these to any location on your host machine.
|
Frigate uses the following locations for read/write operations in the container. Docker volume mappings can be used to map these to any location on your host machine.
|
||||||
|
|
||||||
|
- `/config`: Used to store the Frigate config file and sqlite database. You will also see a few files alongside the database file while Frigate is running.
|
||||||
- `/media/frigate/clips`: Used for snapshot storage. In the future, it will likely be renamed from `clips` to `snapshots`. The file structure here cannot be modified and isn't intended to be browsed or managed manually.
|
- `/media/frigate/clips`: Used for snapshot storage. In the future, it will likely be renamed from `clips` to `snapshots`. The file structure here cannot be modified and isn't intended to be browsed or managed manually.
|
||||||
- `/media/frigate/recordings`: Internal system storage for recording segments. The file structure here cannot be modified and isn't intended to be browsed or managed manually.
|
- `/media/frigate/recordings`: Internal system storage for recording segments. The file structure here cannot be modified and isn't intended to be browsed or managed manually.
|
||||||
- `/media/frigate/frigate.db`: Default location for the sqlite database. You will also see several files alongside this file while Frigate is running. If moving the database location (often needed when using a network drive at `/media/frigate`), it is recommended to mount a volume with docker at `/db` and change the storage location of the database to `/db/frigate.db` in the config file.
|
|
||||||
- `/tmp/cache`: Cache location for recording segments. Initial recordings are written here before being checked and converted to mp4 and moved to the recordings folder.
|
- `/tmp/cache`: Cache location for recording segments. Initial recordings are written here before being checked and converted to mp4 and moved to the recordings folder.
|
||||||
- `/dev/shm`: It is not recommended to modify this directory or map it with docker. This is the location for raw decoded frames in shared memory and it's size is impacted by the `shm-size` calculations below.
|
- `/dev/shm`: It is not recommended to modify this directory or map it with docker. This is the location for raw decoded frames in shared memory and it's size is impacted by the `shm-size` calculations below.
|
||||||
- `/config/config.yml`: Default location of the config file.
|
|
||||||
|
|
||||||
#### Common docker compose storage configurations
|
#### Common docker compose storage configurations
|
||||||
|
|
||||||
@ -38,7 +37,7 @@ services:
|
|||||||
frigate:
|
frigate:
|
||||||
...
|
...
|
||||||
volumes:
|
volumes:
|
||||||
- /path/to/your/config.yml:/config/config.yml
|
- /path/to/your/config:/config
|
||||||
- /path/to/your/storage:/media/frigate
|
- /path/to/your/storage:/media/frigate
|
||||||
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
|
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
|
||||||
target: /tmp/cache
|
target: /tmp/cache
|
||||||
@ -47,31 +46,6 @@ services:
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
Writing to a network drive with database on a local drive:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
version: "3.9"
|
|
||||||
services:
|
|
||||||
frigate:
|
|
||||||
...
|
|
||||||
volumes:
|
|
||||||
- /path/to/your/config.yml:/config/config.yml
|
|
||||||
- /path/to/network/storage:/media/frigate
|
|
||||||
- /path/to/local/disk:/db
|
|
||||||
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
|
|
||||||
target: /tmp/cache
|
|
||||||
tmpfs:
|
|
||||||
size: 1000000000
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
frigate.yml
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
database:
|
|
||||||
path: /db/frigate.db
|
|
||||||
```
|
|
||||||
|
|
||||||
### Calculating required shm-size
|
### Calculating required shm-size
|
||||||
|
|
||||||
Frigate utilizes shared memory to store frames during processing. The default `shm-size` provided by Docker is **64MB**.
|
Frigate utilizes shared memory to store frames during processing. The default `shm-size` provided by Docker is **64MB**.
|
||||||
@ -123,7 +97,7 @@ services:
|
|||||||
- /dev/dri/renderD128 # for intel hwaccel, needs to be updated for your hardware
|
- /dev/dri/renderD128 # for intel hwaccel, needs to be updated for your hardware
|
||||||
volumes:
|
volumes:
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
- /path/to/your/config.yml:/config/config.yml
|
- /path/to/your/config:/config
|
||||||
- /path/to/your/storage:/media/frigate
|
- /path/to/your/storage:/media/frigate
|
||||||
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
|
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
|
||||||
target: /tmp/cache
|
target: /tmp/cache
|
||||||
@ -149,7 +123,7 @@ docker run -d \
|
|||||||
--device /dev/dri/renderD128 \
|
--device /dev/dri/renderD128 \
|
||||||
--shm-size=64m \
|
--shm-size=64m \
|
||||||
-v /path/to/your/storage:/media/frigate \
|
-v /path/to/your/storage:/media/frigate \
|
||||||
-v /path/to/your/config.yml:/config/config.yml \
|
-v /path/to/your/config:/config \
|
||||||
-v /etc/localtime:/etc/localtime:ro \
|
-v /etc/localtime:/etc/localtime:ro \
|
||||||
-e FRIGATE_RTSP_PASSWORD='password' \
|
-e FRIGATE_RTSP_PASSWORD='password' \
|
||||||
-p 5000:5000 \
|
-p 5000:5000 \
|
||||||
@ -182,7 +156,7 @@ HassOS users can install via the addon repository.
|
|||||||
2. Add https://github.com/blakeblackshear/frigate-hass-addons
|
2. Add https://github.com/blakeblackshear/frigate-hass-addons
|
||||||
3. Install your desired Frigate NVR Addon and navigate to it's page
|
3. Install your desired Frigate NVR Addon and navigate to it's page
|
||||||
4. Setup your network configuration in the `Configuration` tab
|
4. Setup your network configuration in the `Configuration` tab
|
||||||
5. (not for proxy addon) Create the file `frigate.yml` in your `config` directory with your detailed Frigate configuration
|
5. (not for proxy addon) Create the file `frigate.yaml` in your `config` directory with your detailed Frigate configuration
|
||||||
6. Start the addon container
|
6. Start the addon container
|
||||||
7. (not for proxy addon) If you are using hardware acceleration for ffmpeg, you may need to disable "Protection mode"
|
7. (not for proxy addon) If you are using hardware acceleration for ffmpeg, you may need to disable "Protection mode"
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ This error message is due to a shm-size that is too small. Try updating your shm
|
|||||||
|
|
||||||
By default, Frigate removes audio from recordings to reduce the likelihood of failing for invalid data. If you would like to include audio, you need to set a [FFmpeg preset](/configuration/ffmpeg_presets) that supports audio:
|
By default, Frigate removes audio from recordings to reduce the likelihood of failing for invalid data. If you would like to include audio, you need to set a [FFmpeg preset](/configuration/ffmpeg_presets) that supports audio:
|
||||||
|
|
||||||
```yaml title="frigate.yml"
|
```yaml
|
||||||
ffmpeg:
|
ffmpeg:
|
||||||
output_args:
|
output_args:
|
||||||
record: preset-record-generic-audio-aac
|
record: preset-record-generic-audio-aac
|
||||||
|
@ -18,7 +18,7 @@ from frigate.comms.dispatcher import Communicator, Dispatcher
|
|||||||
from frigate.comms.mqtt import MqttClient
|
from frigate.comms.mqtt import MqttClient
|
||||||
from frigate.comms.ws import WebSocketClient
|
from frigate.comms.ws import WebSocketClient
|
||||||
from frigate.config import FrigateConfig
|
from frigate.config import FrigateConfig
|
||||||
from frigate.const import CACHE_DIR, CLIPS_DIR, RECORD_DIR
|
from frigate.const import CACHE_DIR, CLIPS_DIR, CONFIG_DIR, DEFAULT_DB_PATH, RECORD_DIR
|
||||||
from frigate.object_detection import ObjectDetectProcess
|
from frigate.object_detection import ObjectDetectProcess
|
||||||
from frigate.events import EventCleanup, EventProcessor
|
from frigate.events import EventCleanup, EventProcessor
|
||||||
from frigate.http import create_app
|
from frigate.http import create_app
|
||||||
@ -55,7 +55,7 @@ class FrigateApp:
|
|||||||
os.environ[key] = value
|
os.environ[key] = value
|
||||||
|
|
||||||
def ensure_dirs(self) -> None:
|
def ensure_dirs(self) -> None:
|
||||||
for d in [RECORD_DIR, CLIPS_DIR, CACHE_DIR]:
|
for d in [CONFIG_DIR, RECORD_DIR, CLIPS_DIR, CACHE_DIR]:
|
||||||
if not os.path.exists(d) and not os.path.islink(d):
|
if not os.path.exists(d) and not os.path.islink(d):
|
||||||
logger.info(f"Creating directory: {d}")
|
logger.info(f"Creating directory: {d}")
|
||||||
os.makedirs(d)
|
os.makedirs(d)
|
||||||
@ -141,7 +141,7 @@ class FrigateApp:
|
|||||||
|
|
||||||
def init_database(self) -> None:
|
def init_database(self) -> None:
|
||||||
# Migrate DB location
|
# Migrate DB location
|
||||||
old_db_path = os.path.join(CLIPS_DIR, "frigate.db")
|
old_db_path = DEFAULT_DB_PATH
|
||||||
if not os.path.isfile(self.config.database.path) and os.path.isfile(
|
if not os.path.isfile(self.config.database.path) and os.path.isfile(
|
||||||
old_db_path
|
old_db_path
|
||||||
):
|
):
|
||||||
|
@ -13,8 +13,8 @@ from pydantic import BaseModel, Extra, Field, validator, parse_obj_as
|
|||||||
from pydantic.fields import PrivateAttr
|
from pydantic.fields import PrivateAttr
|
||||||
|
|
||||||
from frigate.const import (
|
from frigate.const import (
|
||||||
BASE_DIR,
|
|
||||||
CACHE_DIR,
|
CACHE_DIR,
|
||||||
|
DEFAULT_DB_PATH,
|
||||||
REGEX_CAMERA_NAME,
|
REGEX_CAMERA_NAME,
|
||||||
YAML_EXT,
|
YAML_EXT,
|
||||||
)
|
)
|
||||||
@ -731,9 +731,7 @@ class CameraConfig(FrigateBaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class DatabaseConfig(FrigateBaseModel):
|
class DatabaseConfig(FrigateBaseModel):
|
||||||
path: str = Field(
|
path: str = Field(default=DEFAULT_DB_PATH, title="Database path.")
|
||||||
default=os.path.join(BASE_DIR, "frigate.db"), title="Database path."
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class LogLevelEnum(str, Enum):
|
class LogLevelEnum(str, Enum):
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
CONFIG_DIR = "/config"
|
||||||
|
DEFAULT_DB_PATH = f"{CONFIG_DIR}/frigate.db"
|
||||||
BASE_DIR = "/media/frigate"
|
BASE_DIR = "/media/frigate"
|
||||||
CLIPS_DIR = f"{BASE_DIR}/clips"
|
CLIPS_DIR = f"{BASE_DIR}/clips"
|
||||||
RECORD_DIR = f"{BASE_DIR}/recordings"
|
RECORD_DIR = f"{BASE_DIR}/recordings"
|
||||||
|
Loading…
Reference in New Issue
Block a user