ffplayout/docker/README.md

187 lines
4.6 KiB
Markdown
Raw Normal View History

2023-02-22 15:48:51 -05:00
# Run ffplayout in container
## Base Image
Use of [CentOS image](https://hub.docker.com/_/centos) as base image as it offer the possibility to use systemd.
2023-02-22 15:48:51 -05:00
In order to run systemd in a container it has to run in privileged mode and bind to the `cgroup` of the host.
2024-04-10 08:34:46 -04:00
> **_NOTE:_** A system with CGroup V2 is need!
> Currently tested host systems are:
> - debian 12 with official docker ce from docker.com
> - Manjaro from 2024 Kernel 6.6+
> - fedora 39 with podman
2023-02-22 15:48:51 -05:00
## Image
In addition to the base image, there is the compilation of ffmpeg and all lib from source based on https://github.com/jrottenberg/ffmpeg.
We can't use directly the image from `jrottenberg/ffmpeg` as it compile ffmpeg with the flag `--enable-small` that remove some part of the json from the ffprobe command.
2023-02-22 15:48:51 -05:00
The image is build with a default user/pass `admin/admin`.
2024-04-10 08:34:46 -04:00
You can take a look at the [Dockerfile](Dockerfile)
2023-02-22 15:48:51 -05:00
### /!\ as ffmpeg is compiled with `--enable-nonfree` don't push it to a public registry nor distribute the image /!\
## Storage
2023-06-21 02:17:09 -04:00
There are some folders/files that are important for ffplayout to work well such as:
- **/usr/share/ffplayout/db** => where all the data for the `ffpapi` are stored (user/pass etc)
- **/var/lib/ffplayout/tv-media** => where the media are stored by default (configurable)
- **/var/lib/ffplayout/playlists** => where playlists are stored (configurable)
- **/etc/ffplayout/ffplayout.yml** => the core config file
2023-02-22 15:48:51 -05:00
It may be useful to create/link volume for those folders/files.
## Docker
How to build the image:\
```BASH
# build default
docker build -t ffplayout-image .
# build from root folder, to copy local *.rpm package
docker build -f docker/Dockerfile -t ffplayout-image:alma .
# build ffmpeg from source
docker build -f fromSource.Dockerfile -t ffplayout-image:from-source .
2024-04-10 08:34:46 -04:00
# build with nvidia image for hardware support
docker build -f nvidia-centos7.Dockerfile -t ffplayout-image:nvidia .
```
2023-02-22 15:48:51 -05:00
example of command to start the container:
2024-04-10 08:34:46 -04:00
```BASH
docker run -it --name ffplayout --privileged -p 8787:8787 ffplayout-image
# run in daemon mode
docker run -d --name ffplayout --privileged -p 8787:8787 ffplayout-image
# run with docker-compose
docker-compose up -d
2023-06-21 02:17:09 -04:00
```
2023-02-22 15:48:51 -05:00
2023-06-21 02:17:09 -04:00
#### Note from CentOS docker hub page
2024-04-10 08:34:46 -04:00
There have been reports that if you're using an Ubuntu host, you will need to add `-v /tmp/$(mktemp -d):/run` to the mount.
2023-02-22 15:48:51 -05:00
## Kubernetes
basic example to run the service in k8s:
```
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ffplayout
name: ffplayout
namespace: ffplayout
spec:
replicas: 1
selector:
matchLabels:
app: ffplayout
strategy:
type: Recreate
template:
metadata:
labels:
app: ffplayout
spec:
containers:
- name: ffplayout
securityContext:
allowPrivilegeEscalation: true
capabilities:
add:
- SYS_ADMIN
image: ffplayout-image:latest
ports:
- containerPort: 8787
name: web
protocol: TCP
volumeMounts:
- name: cgroup
mountPath: /sys/fs/cgroup
readOnly: true
- name: database-volume
mountPath: /usr/share/ffplayout/db
restartPolicy: Always
volumes:
- name: cgroup
hostPath:
path: '/sys/fs/cgroup'
type: Directory
- name: database-volume
2023-02-22 15:48:51 -05:00
ephemeral:
volumeClaimTemplate:
metadata:
labels:
type: my-database-volume
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "database-storage-class"
resources:
requests:
storage: 1Gi
```
### Use with traefik
If you are using traefik here is a sample config
2023-02-22 15:48:51 -05:00
```
---
kind: Service
apiVersion: v1
metadata:
name: ffplayout
namespace: ffplayout
spec:
ports:
- port: 8787
name: web
protocol: TCP
selector:
app: ffplayout
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ffplayout-http
namespace: ffplayout
spec:
entryPoints:
- web
routes:
- match: Host(`ffplayout.example.com`) && PathPrefix(`/`)
kind: Rule
middlewares:
- name: redirect-https
namespace: default
services:
- name: ffplayout
namespace: ffplayout
port: 8787
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ffplayout-https
namespace: ffplayout
spec:
entryPoints:
- websecure
routes:
- match: Host(`ffplayout.example.com`) && PathPrefix(`/`)
kind: Rule
services:
- name: ffplayout
namespace: ffplayout
port: 8787
tls:
certResolver: yourCert
```