Initial commit
This commit is contained in:
commit
22522a6607
98
.woodpecker/build.yml
Normal file
98
.woodpecker/build.yml
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
variables:
|
||||||
|
- &file Containerfile
|
||||||
|
- &repo dev.shielddagger.com/opensource/talk-recording
|
||||||
|
|
||||||
|
when:
|
||||||
|
- event: [push, pull_request, cron]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: dryrun
|
||||||
|
image: woodpeckerci/plugin-docker-buildx:5
|
||||||
|
backend_options:
|
||||||
|
kubernetes:
|
||||||
|
securityContext:
|
||||||
|
privileged: true
|
||||||
|
settings:
|
||||||
|
dockerfile: *file
|
||||||
|
platforms: linux/arm64,linux/amd64
|
||||||
|
cache_from: type=registry,ref=dev.shielddagger.com/opensource/talk-recording
|
||||||
|
cache_to: type=inline
|
||||||
|
dry_run: true
|
||||||
|
repo: *repo
|
||||||
|
tags: latest
|
||||||
|
registry: dev.shielddagger.com
|
||||||
|
username:
|
||||||
|
from_secret: registry_username
|
||||||
|
password:
|
||||||
|
from_secret: registry_password
|
||||||
|
when:
|
||||||
|
- event: pull_request
|
||||||
|
- name: publish
|
||||||
|
image: woodpeckerci/plugin-docker-buildx:5
|
||||||
|
backend_options:
|
||||||
|
kubernetes:
|
||||||
|
securityContext:
|
||||||
|
privileged: true
|
||||||
|
settings:
|
||||||
|
dockerfile: *file
|
||||||
|
platforms: linux/arm64,linux/amd64
|
||||||
|
cache_from: type=registry,ref=dev.shielddagger.com/opensource/talk-recording
|
||||||
|
cache_to: type=inline
|
||||||
|
repo: *repo
|
||||||
|
auto_tag: true
|
||||||
|
tags: ${CI_COMMIT_SHA:0:8}
|
||||||
|
registry: dev.shielddagger.com
|
||||||
|
username:
|
||||||
|
from_secret: registry_username
|
||||||
|
password:
|
||||||
|
from_secret: registry_password
|
||||||
|
when:
|
||||||
|
- event: push
|
||||||
|
branch: main
|
||||||
|
- name: gather-digests
|
||||||
|
image: quay.io/skopeo/stable:latest
|
||||||
|
environment:
|
||||||
|
DOCKER_USER:
|
||||||
|
from_secret: registry_username
|
||||||
|
DOCKER_PASS:
|
||||||
|
from_secret: registry_password
|
||||||
|
DOCKER_REPO: *repo
|
||||||
|
when:
|
||||||
|
- event: [push, cron]
|
||||||
|
branch: main
|
||||||
|
cron: "security-scan"
|
||||||
|
commands:
|
||||||
|
- dnf install -y jq
|
||||||
|
- skopeo login dev.shielddagger.com --username $DOCKER_USER --password $DOCKER_PASS
|
||||||
|
- skopeo inspect --raw docker://$DOCKER_REPO:latest | jq -r .'manifests[] | select(.platform.architecture=="arm64").digest' > digest-arm64
|
||||||
|
- skopeo inspect --raw docker://$DOCKER_REPO:latest | jq -r .'manifests[] | select(.platform.architecture=="amd64").digest' > digest-amd64
|
||||||
|
- name: image-scan
|
||||||
|
image: aquasec/trivy
|
||||||
|
environment:
|
||||||
|
TRIVY_USER:
|
||||||
|
from_secret: registry_username
|
||||||
|
TRIVY_PASSWORD:
|
||||||
|
from_secret: registry_password
|
||||||
|
TRIVY_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-db
|
||||||
|
TRIVY_JAVA_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-java-db
|
||||||
|
TRIVY_CHECKS_BUNDLE_REPOSITORY: public.ecr.aws/aquasecurity/trivy-checks
|
||||||
|
DOCKER_REPO: *repo
|
||||||
|
commands:
|
||||||
|
- export ARM64_DIGEST=$(cat digest-arm64)
|
||||||
|
- trivy image --platform linux/arm64 --debug ${DOCKER_REPO}@$ARM64_DIGEST --exit-code 1 --username $TRIVY_USER --severity HIGH,CRITICAL
|
||||||
|
when:
|
||||||
|
- event: [push, cron]
|
||||||
|
branch: main
|
||||||
|
cron: "security-scan"
|
||||||
|
- name: notify
|
||||||
|
image: dev.shielddagger.com/opensource/discord-notifier
|
||||||
|
failure: ignore
|
||||||
|
settings:
|
||||||
|
webhook_url:
|
||||||
|
from_secret: discord_webhook
|
||||||
|
woodpecker_url: https://ci.shielddagger.com/api
|
||||||
|
woodpecker_token:
|
||||||
|
from_secret: woodpecker_token
|
||||||
|
icon_url: https://discord.com/api/webhooks/1231848304694919270/1ApQzOPMfNosxhQ62HbYScBT5s94m0bIUn1IFGQlT6d8Ru2ImcHHjjkFA_SaonBNU3yz
|
||||||
|
when:
|
||||||
|
- status: [success, failure]
|
||||||
61
Dockerfile
Normal file
61
Dockerfile
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
# syntax=docker/dockerfile:latest
|
||||||
|
FROM python:3.13.7-alpine3.22
|
||||||
|
|
||||||
|
COPY --chmod=775 start.sh /start.sh
|
||||||
|
COPY --chmod=775 healthcheck.sh /healthcheck.sh
|
||||||
|
|
||||||
|
ENV RECORDING_VERSION=v0.1
|
||||||
|
ENV ALLOW_ALL=false
|
||||||
|
ENV HPB_PROTOCOL=https
|
||||||
|
ENV NC_PROTOCOL=https
|
||||||
|
ENV SKIP_VERIFY=false
|
||||||
|
ENV HPB_PATH=/standalone-signaling/
|
||||||
|
|
||||||
|
RUN set -ex; \
|
||||||
|
apk upgrade --no-cache -a; \
|
||||||
|
apk add --no-cache \
|
||||||
|
ca-certificates \
|
||||||
|
tzdata \
|
||||||
|
bash \
|
||||||
|
xvfb \
|
||||||
|
ffmpeg \
|
||||||
|
firefox \
|
||||||
|
bind-tools \
|
||||||
|
netcat-openbsd \
|
||||||
|
git \
|
||||||
|
wget \
|
||||||
|
shadow \
|
||||||
|
pulseaudio \
|
||||||
|
openssl \
|
||||||
|
build-base \
|
||||||
|
linux-headers \
|
||||||
|
geckodriver; \
|
||||||
|
useradd -d /tmp --system recording -u 122; \
|
||||||
|
# Give root a random password
|
||||||
|
echo "root:$(openssl rand -base64 12)" | chpasswd; \
|
||||||
|
git clone --recursive https://github.com/nextcloud/nextcloud-talk-recording --depth=1 --single-branch --branch "$RECORDING_VERSION" /src; \
|
||||||
|
python3 -m pip install --no-cache-dir /src; \
|
||||||
|
rm -rf /src; \
|
||||||
|
touch /etc/recording.conf; \
|
||||||
|
chown recording:recording -R \
|
||||||
|
/tmp /etc/recording.conf; \
|
||||||
|
mkdir -p /conf; \
|
||||||
|
chmod 777 /conf; \
|
||||||
|
chmod 777 /tmp; \
|
||||||
|
apk del --no-cache \
|
||||||
|
git \
|
||||||
|
wget \
|
||||||
|
shadow \
|
||||||
|
openssl \
|
||||||
|
build-base \
|
||||||
|
linux-headers;
|
||||||
|
|
||||||
|
VOLUME /tmp
|
||||||
|
WORKDIR /tmp
|
||||||
|
USER 122
|
||||||
|
ENTRYPOINT ["/start.sh"]
|
||||||
|
CMD ["python", "-m", "nextcloud.talk.recording", "--config", "/conf/recording.conf"]
|
||||||
|
|
||||||
|
HEALTHCHECK CMD /healthcheck.sh
|
||||||
|
LABEL com.centurylinklabs.watchtower.enable="false" \
|
||||||
|
org.label-schema.vendor="Nextcloud"
|
||||||
3
healthcheck.sh
Executable file
3
healthcheck.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
nc -z 127.0.0.1 1234 || exit 1
|
||||||
123
recording.conf
Normal file
123
recording.conf
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
[logs]
|
||||||
|
# Log level based on numeric values of Python logging levels:
|
||||||
|
# - Critical: 50
|
||||||
|
# - Error: 40
|
||||||
|
# - Warning: 30
|
||||||
|
# - Info: 20
|
||||||
|
# - Debug: 10
|
||||||
|
# - Not set: 0
|
||||||
|
#level = 20
|
||||||
|
|
||||||
|
[http]
|
||||||
|
# IP and port to listen on for HTTP requests.
|
||||||
|
#listen = 127.0.0.1:8000
|
||||||
|
|
||||||
|
[backend]
|
||||||
|
# Allow any hostname as backend endpoint. This is extremely insecure and should
|
||||||
|
# only be used during development.
|
||||||
|
#allowall = false
|
||||||
|
|
||||||
|
# Common shared secret for requests from and to the backend servers if
|
||||||
|
# "allowall" is enabled. This must be the same value as configured in the
|
||||||
|
# Nextcloud admin ui.
|
||||||
|
#secret = the-shared-secret
|
||||||
|
|
||||||
|
# Comma-separated list of backend ids allowed to connect.
|
||||||
|
#backends = backend-id, another-backend
|
||||||
|
|
||||||
|
# If set to "true", certificate validation of backend endpoints will be skipped.
|
||||||
|
# This should only be enabled during development, e.g. to work with self-signed
|
||||||
|
# certificates.
|
||||||
|
# Overridable by backend.
|
||||||
|
#skipverify = false
|
||||||
|
|
||||||
|
# Maximum allowed size in bytes for messages sent by the backend.
|
||||||
|
# Overridable by backend.
|
||||||
|
#maxmessagesize = 1024
|
||||||
|
|
||||||
|
# Width for recorded videos.
|
||||||
|
# Overridable by backend.
|
||||||
|
#videowidth = 1920
|
||||||
|
|
||||||
|
# Height for recorded videos.
|
||||||
|
# Overridable by backend.
|
||||||
|
#videoheight = 1080
|
||||||
|
|
||||||
|
# Temporary directory used to store recordings until uploaded. It must be
|
||||||
|
# writable by the user running the recording server.
|
||||||
|
# Overridable by backend.
|
||||||
|
#directory = /tmp
|
||||||
|
|
||||||
|
# Backend configurations as defined in the "[backend]" section above. The
|
||||||
|
# section names must match the ids used in "backends" above.
|
||||||
|
#[backend-id]
|
||||||
|
# URL of the Nextcloud instance
|
||||||
|
#url = https://cloud.domain.invalid
|
||||||
|
|
||||||
|
# Shared secret for requests from and to the backend servers. This must be the
|
||||||
|
# same value as configured in the Nextcloud admin ui.
|
||||||
|
#secret = the-shared-secret
|
||||||
|
|
||||||
|
#[another-backend]
|
||||||
|
# URL of the Nextcloud instance
|
||||||
|
#url = https://cloud.otherdomain.invalid
|
||||||
|
|
||||||
|
# Shared secret for requests from and to the backend servers. This must be the
|
||||||
|
# same value as configured in the Nextcloud admin ui.
|
||||||
|
#secret = the-shared-secret
|
||||||
|
|
||||||
|
[signaling]
|
||||||
|
# Common shared secret for authenticating as an internal client of signaling
|
||||||
|
# servers if a specific secret is not set for a signaling server. This must be
|
||||||
|
# the same value as configured in the signaling server configuration file.
|
||||||
|
#internalsecret = the-shared-secret-for-internal-clients
|
||||||
|
|
||||||
|
# Comma-separated list of signaling servers with specific internal secrets.
|
||||||
|
#signalings = signaling-id, another-signaling
|
||||||
|
|
||||||
|
# Signaling server configurations as defined in the "[signaling]" section above.
|
||||||
|
# The section names must match the ids used in "signalings" above.
|
||||||
|
#[signaling-id]
|
||||||
|
# URL of the signaling server
|
||||||
|
#url = https://signaling.domain.invalid
|
||||||
|
|
||||||
|
# Shared secret for authenticating as an internal client of signaling servers.
|
||||||
|
# This must be the same value as configured in the signaling server
|
||||||
|
# configuration file.
|
||||||
|
#internalsecret = the-shared-secret-for-internal-clients
|
||||||
|
|
||||||
|
#[another-signaling]
|
||||||
|
# URL of the signaling server
|
||||||
|
#url = https://signaling.otherdomain.invalid
|
||||||
|
|
||||||
|
# Shared secret for authenticating as an internal client of signaling servers.
|
||||||
|
# This must be the same value as configured in the signaling server
|
||||||
|
# configuration file.
|
||||||
|
#internalsecret = the-shared-secret-for-internal-clients
|
||||||
|
|
||||||
|
[ffmpeg]
|
||||||
|
# The ffmpeg executable (name or full path) and the global options given to
|
||||||
|
# ffmpeg. The options given here fully override the default global options.
|
||||||
|
#common = ffmpeg -loglevel level+warning -n
|
||||||
|
|
||||||
|
# The options given to ffmpeg to encode the audio output. The options given here
|
||||||
|
# fully override the default options for the audio output.
|
||||||
|
#outputaudio = -c:a libopus
|
||||||
|
|
||||||
|
# The options given to ffmpeg to encode the video output. The options given here
|
||||||
|
# fully override the default options for the video output.
|
||||||
|
#outputvideo = -c:v libvpx -deadline:v realtime -crf 10 -b:v 1M
|
||||||
|
|
||||||
|
# The extension of the file for audio only recordings.
|
||||||
|
#extensionaudio = .ogg
|
||||||
|
|
||||||
|
# The extension of the file for audio and video recordings.
|
||||||
|
#extensionvideo = .webm
|
||||||
|
|
||||||
|
[recording]
|
||||||
|
# Browser to use for recordings. Please note that the "chrome" value does not
|
||||||
|
# refer to the web browser, but to the Selenium WebDriver. In practice, "chrome"
|
||||||
|
# will use Google Chrome, or Chromium if Google Chrome is not installed.
|
||||||
|
# Allowed values: firefox, chrome
|
||||||
|
# Defaults to firefox
|
||||||
|
# browser = firefox
|
||||||
65
start.sh
Executable file
65
start.sh
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
if [ -z "$NC_DOMAIN" ]; then
|
||||||
|
echo "You need to provide the NC_DOMAIN."
|
||||||
|
exit 1
|
||||||
|
elif [ -z "$RECORDING_SECRET" ]; then
|
||||||
|
echo "You need to provide the RECORDING_SECRET."
|
||||||
|
exit 1
|
||||||
|
elif [ -z "$INTERNAL_SECRET" ]; then
|
||||||
|
echo "You need to provide the INTERNAL_SECRET."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$HPB_DOMAIN" ]; then
|
||||||
|
export HPB_DOMAIN="$NC_DOMAIN"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Delete all contents on startup to start fresh
|
||||||
|
rm -fr /tmp/{*,.*}
|
||||||
|
|
||||||
|
cat << RECORDING_CONF > "/conf/recording.conf"
|
||||||
|
[logs]
|
||||||
|
# 30 means Warning
|
||||||
|
level = 30
|
||||||
|
|
||||||
|
[http]
|
||||||
|
listen = 0.0.0.0:1234
|
||||||
|
|
||||||
|
[backend]
|
||||||
|
allowall = ${ALLOW_ALL}
|
||||||
|
# The secret below is still needed if allowall is set to true, also it doesn't hurt to be here
|
||||||
|
secret = ${RECORDING_SECRET}
|
||||||
|
backends = backend-1
|
||||||
|
skipverify = ${SKIP_VERIFY}
|
||||||
|
maxmessagesize = 1024
|
||||||
|
videowidth = 1920
|
||||||
|
videoheight = 1080
|
||||||
|
directory = /tmp
|
||||||
|
|
||||||
|
[backend-1]
|
||||||
|
url = ${NC_PROTOCOL}://${NC_DOMAIN}
|
||||||
|
secret = ${RECORDING_SECRET}
|
||||||
|
skipverify = ${SKIP_VERIFY}
|
||||||
|
|
||||||
|
[signaling]
|
||||||
|
signalings = signaling-1
|
||||||
|
|
||||||
|
[signaling-1]
|
||||||
|
url = ${HPB_PROTOCOL}://${HPB_DOMAIN}${HPB_PATH}
|
||||||
|
internalsecret = ${INTERNAL_SECRET}
|
||||||
|
|
||||||
|
[ffmpeg]
|
||||||
|
# common = ffmpeg -loglevel level+warning -n
|
||||||
|
# outputaudio = -c:a libopus
|
||||||
|
# outputvideo = -c:v libvpx -deadline:v realtime -crf 10 -b:v 1M
|
||||||
|
extensionaudio = .ogg
|
||||||
|
extensionvideo = .webm
|
||||||
|
|
||||||
|
[recording]
|
||||||
|
browser = firefox
|
||||||
|
driverPath = /usr/bin/geckodriver
|
||||||
|
RECORDING_CONF
|
||||||
|
|
||||||
|
exec "$@"
|
||||||
Loading…
x
Reference in New Issue
Block a user