mirror of
https://github.com/openlibrecommunity/olcrtc.git
synced 2026-06-02 06:23:37 +02:00
feat(script): add cnc mode and Go build caching
This commit is contained in:
+50
-21
@@ -7,13 +7,14 @@ set -e
|
||||
|
||||
PODMAN_ID=$(tr -dc 'a-z0-9' </dev/urandom | head -c 8)
|
||||
CONTAINER_NAME="olcrtc-client-$PODMAN_ID"
|
||||
IMAGE_NAME="docker.io/library/golang:1.26-alpine"
|
||||
IMAGE_NAME="docker.io/library/golang:1.25-alpine3.22"
|
||||
REPO_URL="https://github.com/openlibrecommunity/olcrtc.git"
|
||||
WORK_DIR="/tmp/olcrtc-client-$PODMAN_ID"
|
||||
|
||||
SOCKS_IP="127.0.0.1"
|
||||
SOCKS_PORT="8808"
|
||||
BRANCH="master"
|
||||
NO_CACHE=0
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
@@ -21,6 +22,10 @@ while [[ $# -gt 0 ]]; do
|
||||
BRANCH="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
--no-cache)
|
||||
NO_CACHE=1
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
shift
|
||||
;;
|
||||
@@ -163,7 +168,7 @@ VIDEO_W=1920; VIDEO_H=1080; VIDEO_FPS=30; VIDEO_BITRATE="2M"; VIDEO_HW="none"
|
||||
VIDEO_CODEC="qrcode"; VIDEO_QR_SIZE=0; VIDEO_QR_RECOVERY="low"
|
||||
VIDEO_TILE_MODULE=4; VIDEO_TILE_RS=20
|
||||
VP8_FPS=25; VP8_BATCH=1
|
||||
SEI_FPS=20; SEI_BATCH=1; SEI_FRAG=900; SEI_ACK=3000
|
||||
SEI_FPS=60; SEI_BATCH=64; SEI_FRAG=900; SEI_ACK=2000
|
||||
|
||||
if [ "$TRANSPORT" = "videochannel" ]; then
|
||||
echo ""
|
||||
@@ -230,37 +235,58 @@ if [ "$TRANSPORT" = "seichannel" ]; then
|
||||
echo ""
|
||||
echo "--- SEIchannel settings ---"
|
||||
|
||||
read -p "SEI FPS [default: 20]: " SEIFPS_INPUT
|
||||
SEI_FPS=${SEIFPS_INPUT:-20}
|
||||
read -p "SEI FPS [default: 60]: " SEIFPS_INPUT
|
||||
SEI_FPS=${SEIFPS_INPUT:-60}
|
||||
|
||||
read -p "SEI batch size (frames per tick) [default: 1]: " SEIBATCH_INPUT
|
||||
SEI_BATCH=${SEIBATCH_INPUT:-1}
|
||||
read -p "SEI batch size (frames per tick) [default: 64]: " SEIBATCH_INPUT
|
||||
SEI_BATCH=${SEIBATCH_INPUT:-64}
|
||||
|
||||
read -p "SEI fragment size in bytes [default: 900]: " SEIFRAG_INPUT
|
||||
SEI_FRAG=${SEIFRAG_INPUT:-900}
|
||||
|
||||
read -p "SEI ACK timeout in milliseconds [default: 3000]: " SEIACK_INPUT
|
||||
SEI_ACK=${SEIACK_INPUT:-3000}
|
||||
read -p "SEI ACK timeout in milliseconds [default: 2000]: " SEIACK_INPUT
|
||||
SEI_ACK=${SEIACK_INPUT:-2000}
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "[*] Cleaning workspace..."
|
||||
rm -rf $WORK_DIR
|
||||
mkdir -p $WORK_DIR
|
||||
rm -rf "$WORK_DIR"
|
||||
mkdir -p "$WORK_DIR"
|
||||
|
||||
CACHE_DIR="${OLCRTC_CACHE_DIR:-$HOME/.cache/olcrtc}"
|
||||
GOMOD_CACHE="$CACHE_DIR/gomod"
|
||||
GO_BUILD_CACHE="$CACHE_DIR/gobuild"
|
||||
|
||||
if [ "$NO_CACHE" = "1" ]; then
|
||||
echo "[*] --no-cache: purging Go cache at $CACHE_DIR"
|
||||
chmod -R u+w "$GOMOD_CACHE" "$GO_BUILD_CACHE" 2>/dev/null || true
|
||||
if ! rm -rf "$GOMOD_CACHE" "$GO_BUILD_CACHE" 2>/dev/null; then
|
||||
echo "[*] Falling back to in-container purge (files owned by container UID)..."
|
||||
podman run --rm \
|
||||
-v "$CACHE_DIR":/cache:Z \
|
||||
"$IMAGE_NAME" \
|
||||
sh -c 'rm -rf /cache/gomod /cache/gobuild'
|
||||
fi
|
||||
fi
|
||||
|
||||
mkdir -p "$GOMOD_CACHE" "$GO_BUILD_CACHE"
|
||||
echo "[*] Using Go cache: $CACHE_DIR"
|
||||
|
||||
echo "[*] Cloning repository..."
|
||||
git clone --depth 1 --recurse-submodules --branch "$BRANCH" $REPO_URL $WORK_DIR
|
||||
git clone --depth 1 --recurse-submodules --branch "$BRANCH" "$REPO_URL" "$WORK_DIR"
|
||||
|
||||
echo "[*] Pulling Go image..."
|
||||
podman pull $IMAGE_NAME
|
||||
podman pull "$IMAGE_NAME"
|
||||
|
||||
echo "[*] Building OlcRTC..."
|
||||
podman run --rm \
|
||||
--add-host=host.containers.internal:host-gateway \
|
||||
-v $WORK_DIR:/app:Z \
|
||||
-v "$WORK_DIR":/app:Z \
|
||||
-v "$GOMOD_CACHE":/go/pkg/mod:Z \
|
||||
-v "$GO_BUILD_CACHE":/root/.cache/go-build:Z \
|
||||
-w /app \
|
||||
$IMAGE_NAME \
|
||||
sh -c "go mod tidy && go build -o olcrtc cmd/olcrtc/main.go"
|
||||
"$IMAGE_NAME" \
|
||||
sh -c "go mod download && go build -trimpath -ldflags='-s -w' -o olcrtc ./cmd/olcrtc"
|
||||
|
||||
if [ ! -f "$WORK_DIR/olcrtc" ]; then
|
||||
echo "[X] Build failed"
|
||||
@@ -271,7 +297,6 @@ fi
|
||||
CONFIG_FILE="$WORK_DIR/client.yaml"
|
||||
cat > "$CONFIG_FILE" <<EOF
|
||||
mode: cnc
|
||||
link: direct
|
||||
auth:
|
||||
provider: "$AUTH"
|
||||
room:
|
||||
@@ -333,15 +358,19 @@ debug: false
|
||||
EOF
|
||||
|
||||
echo "[*] Starting OlcRTC client..."
|
||||
START_CMD="./olcrtc client.yaml"
|
||||
if [ "$TRANSPORT" = "videochannel" ]; then
|
||||
START_CMD="apk add --no-cache ffmpeg >/dev/null && ./olcrtc client.yaml"
|
||||
fi
|
||||
podman run -d \
|
||||
--name $CONTAINER_NAME \
|
||||
--name "$CONTAINER_NAME" \
|
||||
--add-host=host.containers.internal:host-gateway \
|
||||
--restart unless-stopped \
|
||||
-p $SOCKS_IP:$SOCKS_PORT:$SOCKS_PORT \
|
||||
-v $WORK_DIR:/app:Z \
|
||||
-p "$SOCKS_IP:$SOCKS_PORT:$SOCKS_PORT" \
|
||||
-v "$WORK_DIR":/app:Z \
|
||||
-w /app \
|
||||
$IMAGE_NAME \
|
||||
./olcrtc client.yaml
|
||||
"$IMAGE_NAME" \
|
||||
sh -c "$START_CMD"
|
||||
|
||||
sleep 2
|
||||
|
||||
|
||||
@@ -16,15 +16,18 @@ fi
|
||||
|
||||
mode="${OLCRTC_MODE:-srv}"
|
||||
room_id="${OLCRTC_ROOM_ID:-}"
|
||||
carrier="${OLCRTC_CARRIER:-}"
|
||||
carrier="${OLCRTC_CARRIER:-${OLCRTC_AUTH:-}}"
|
||||
transport="${OLCRTC_TRANSPORT:-}"
|
||||
link="${OLCRTC_LINK:-direct}"
|
||||
data_dir="${OLCRTC_DATA_DIR:-/usr/share/olcrtc}"
|
||||
dns_server="${OLCRTC_DNS:-1.1.1.1:53}"
|
||||
key="${OLCRTC_KEY:-}"
|
||||
key_file="${OLCRTC_KEY_FILE:-/var/lib/olcrtc/key.hex}"
|
||||
socks_proxy="${OLCRTC_SOCKS_PROXY:-}"
|
||||
socks_proxy_port="${OLCRTC_SOCKS_PROXY_PORT:-1080}"
|
||||
socks_host="${OLCRTC_SOCKS_HOST:-127.0.0.1}"
|
||||
socks_port="${OLCRTC_SOCKS_PORT:-8808}"
|
||||
socks_user="${OLCRTC_SOCKS_USER:-}"
|
||||
socks_pass="${OLCRTC_SOCKS_PASS:-}"
|
||||
|
||||
video_w="${OLCRTC_VIDEO_W:-0}"
|
||||
video_h="${OLCRTC_VIDEO_H:-0}"
|
||||
@@ -46,8 +49,12 @@ sei_frag="${OLCRTC_SEI_FRAG:-0}"
|
||||
sei_ack="${OLCRTC_SEI_ACK:-0}"
|
||||
|
||||
debug="${OLCRTC_DEBUG:-false}"
|
||||
ffmpeg="${OLCRTC_FFMPEG:-ffmpeg}"
|
||||
|
||||
[ "$mode" = "srv" ] || die "server image defaults to OLCRTC_MODE=srv; got '$mode'"
|
||||
case "$mode" in
|
||||
srv|cnc) ;;
|
||||
*) die "set OLCRTC_MODE to srv or cnc" ;;
|
||||
esac
|
||||
[ -n "$carrier" ] || die "set OLCRTC_CARRIER (e.g. telemost, jazz, wbstream)"
|
||||
[ -n "$transport" ] || die "set OLCRTC_TRANSPORT (e.g. datachannel, videochannel, seichannel, vp8channel)"
|
||||
|
||||
@@ -62,6 +69,7 @@ make_key() {
|
||||
if [ -z "$room_id" ]; then
|
||||
case "$carrier" in
|
||||
jazz)
|
||||
[ "$mode" = "srv" ] || die "set OLCRTC_ROOM_ID to the server room identifier"
|
||||
echo "olcrtc-entrypoint: OLCRTC_ROOM_ID not set, generating room..." >&2
|
||||
gen_config="/tmp/olcrtc-gen.yaml"
|
||||
cat > "$gen_config" <<GENEOF
|
||||
@@ -88,12 +96,14 @@ fi
|
||||
if [ -z "$key" ]; then
|
||||
if [ -s "$key_file" ]; then
|
||||
key="$(tr -d '[:space:]' < "$key_file")"
|
||||
else
|
||||
elif [ "$mode" = "srv" ]; then
|
||||
key="$(make_key)"
|
||||
umask 077
|
||||
printf '%s\n' "$key" > "$key_file"
|
||||
echo "olcrtc-entrypoint: generated encryption key and saved it to $key_file" >&2
|
||||
echo "olcrtc-entrypoint: OLCRTC_KEY=$key" >&2
|
||||
else
|
||||
die "set OLCRTC_KEY or mount OLCRTC_KEY_FILE with the server encryption key"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -106,10 +116,9 @@ esac
|
||||
[ "${#key}" -eq 64 ] || die "OLCRTC_KEY must be 64 hex characters"
|
||||
|
||||
# Generate YAML config
|
||||
config="/tmp/olcrtc-server.yaml"
|
||||
config="/tmp/olcrtc-${mode}.yaml"
|
||||
cat > "$config" <<EOF
|
||||
mode: $mode
|
||||
link: $link
|
||||
auth:
|
||||
provider: "$carrier"
|
||||
room:
|
||||
@@ -122,7 +131,7 @@ net:
|
||||
data: "$data_dir"
|
||||
EOF
|
||||
|
||||
if [ -n "$socks_proxy" ]; then
|
||||
if [ "$mode" = "srv" ] && [ -n "$socks_proxy" ]; then
|
||||
cat >> "$config" <<EOF
|
||||
socks:
|
||||
proxy_addr: "$socks_proxy"
|
||||
@@ -130,6 +139,20 @@ socks:
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [ "$mode" = "cnc" ]; then
|
||||
cat >> "$config" <<EOF
|
||||
socks:
|
||||
host: "$socks_host"
|
||||
port: $socks_port
|
||||
EOF
|
||||
if [ -n "$socks_user" ]; then
|
||||
cat >> "$config" <<EOF
|
||||
user: "$socks_user"
|
||||
pass: "$socks_pass"
|
||||
EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$transport" = "videochannel" ]; then
|
||||
cat >> "$config" <<EOF
|
||||
video:
|
||||
@@ -170,4 +193,6 @@ case "${debug}" in
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$ffmpeg" ] && printf 'ffmpeg: "%s"\n' "$ffmpeg" >> "$config"
|
||||
|
||||
exec /usr/local/bin/olcrtc "$config"
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
exe="$(readlink /proc/1/exe 2>/dev/null || true)"
|
||||
case "$exe" in
|
||||
*/olcrtc) exit 0 ;;
|
||||
*) exit 1 ;;
|
||||
esac
|
||||
pidof olcrtc >/dev/null 2>&1
|
||||
|
||||
+33
-25
@@ -6,7 +6,7 @@ set -e
|
||||
|
||||
PODMAN_ID=$(tr -dc 'a-z0-9' </dev/urandom | head -c 8)
|
||||
CONTAINER_NAME="olcrtc-server-$PODMAN_ID"
|
||||
IMAGE_NAME="docker.io/library/golang:1.26-alpine"
|
||||
IMAGE_NAME="docker.io/library/golang:1.25-alpine3.22"
|
||||
REPO_URL="https://github.com/openlibrecommunity/olcrtc.git"
|
||||
WORK_DIR="/tmp/olcrtc-deploy-$PODMAN_ID"
|
||||
BRANCH="master"
|
||||
@@ -38,8 +38,13 @@ if ! command -v podman &> /dev/null; then
|
||||
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
SUDO=""
|
||||
else
|
||||
elif command -v sudo &> /dev/null; then
|
||||
SUDO="sudo"
|
||||
elif command -v doas &> /dev/null; then
|
||||
SUDO="doas"
|
||||
else
|
||||
echo "[X] No sudo/doas found and not running as root. Cannot install podman."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if command -v apt &> /dev/null; then
|
||||
@@ -164,7 +169,7 @@ VIDEO_W=1920; VIDEO_H=1080; VIDEO_FPS=30; VIDEO_BITRATE="2M"; VIDEO_HW="none"
|
||||
VIDEO_CODEC="qrcode"; VIDEO_QR_SIZE=0; VIDEO_QR_RECOVERY="low"
|
||||
VIDEO_TILE_MODULE=4; VIDEO_TILE_RS=20
|
||||
VP8_FPS=25; VP8_BATCH=1
|
||||
SEI_FPS=20; SEI_BATCH=1; SEI_FRAG=900; SEI_ACK=3000
|
||||
SEI_FPS=60; SEI_BATCH=64; SEI_FRAG=900; SEI_ACK=2000
|
||||
|
||||
if [ "$TRANSPORT" = "videochannel" ]; then
|
||||
echo ""
|
||||
@@ -231,23 +236,23 @@ if [ "$TRANSPORT" = "seichannel" ]; then
|
||||
echo ""
|
||||
echo "--- SEIchannel settings ---"
|
||||
|
||||
read -p "SEI FPS [default: 20]: " SEIFPS_INPUT
|
||||
SEI_FPS=${SEIFPS_INPUT:-20}
|
||||
read -p "SEI FPS [default: 60]: " SEIFPS_INPUT
|
||||
SEI_FPS=${SEIFPS_INPUT:-60}
|
||||
|
||||
read -p "SEI batch size (frames per tick) [default: 1]: " SEIBATCH_INPUT
|
||||
SEI_BATCH=${SEIBATCH_INPUT:-1}
|
||||
read -p "SEI batch size (frames per tick) [default: 64]: " SEIBATCH_INPUT
|
||||
SEI_BATCH=${SEIBATCH_INPUT:-64}
|
||||
|
||||
read -p "SEI fragment size in bytes [default: 900]: " SEIFRAG_INPUT
|
||||
SEI_FRAG=${SEIFRAG_INPUT:-900}
|
||||
|
||||
read -p "SEI ACK timeout in milliseconds [default: 3000]: " SEIACK_INPUT
|
||||
SEI_ACK=${SEIACK_INPUT:-3000}
|
||||
read -p "SEI ACK timeout in milliseconds [default: 2000]: " SEIACK_INPUT
|
||||
SEI_ACK=${SEIACK_INPUT:-2000}
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "[*] Cleaning workspace..."
|
||||
rm -rf $WORK_DIR
|
||||
mkdir -p $WORK_DIR
|
||||
rm -rf "$WORK_DIR"
|
||||
mkdir -p "$WORK_DIR"
|
||||
|
||||
CACHE_DIR="${OLCRTC_CACHE_DIR:-$HOME/.cache/olcrtc}"
|
||||
GOMOD_CACHE="$CACHE_DIR/gomod"
|
||||
@@ -269,20 +274,20 @@ mkdir -p "$GOMOD_CACHE" "$GO_BUILD_CACHE"
|
||||
echo "[*] Using Go cache: $CACHE_DIR"
|
||||
|
||||
echo "[*] Cloning repository..."
|
||||
git clone --depth 1 --recurse-submodules --branch "$BRANCH" $REPO_URL $WORK_DIR
|
||||
git clone --depth 1 --recurse-submodules --branch "$BRANCH" "$REPO_URL" "$WORK_DIR"
|
||||
|
||||
echo "[*] Pulling Go image..."
|
||||
podman pull $IMAGE_NAME
|
||||
podman pull "$IMAGE_NAME"
|
||||
|
||||
echo "[*] Building OlcRTC..."
|
||||
podman run --rm \
|
||||
--network host \
|
||||
-v $WORK_DIR:/app:Z \
|
||||
-v $GOMOD_CACHE:/go/pkg/mod:Z \
|
||||
-v $GO_BUILD_CACHE:/root/.cache/go-build:Z \
|
||||
-v "$WORK_DIR":/app:Z \
|
||||
-v "$GOMOD_CACHE":/go/pkg/mod:Z \
|
||||
-v "$GO_BUILD_CACHE":/root/.cache/go-build:Z \
|
||||
-w /app \
|
||||
$IMAGE_NAME \
|
||||
sh -c "go mod tidy && go build -o olcrtc cmd/olcrtc/main.go"
|
||||
"$IMAGE_NAME" \
|
||||
sh -c "go mod download && go build -trimpath -ldflags='-s -w' -o olcrtc ./cmd/olcrtc"
|
||||
|
||||
if [ ! -f "$WORK_DIR/olcrtc" ]; then
|
||||
echo "[X] Build failed"
|
||||
@@ -304,9 +309,9 @@ data: data
|
||||
GENEOF
|
||||
ROOM_ID=$(podman run --rm \
|
||||
--network host \
|
||||
-v $WORK_DIR:/app:Z \
|
||||
-v "$WORK_DIR":/app:Z \
|
||||
-w /app \
|
||||
$IMAGE_NAME \
|
||||
"$IMAGE_NAME" \
|
||||
./olcrtc gen.yaml)
|
||||
if [ -z "$ROOM_ID" ]; then
|
||||
echo "[X] Room generation failed"
|
||||
@@ -337,7 +342,6 @@ fi
|
||||
CONFIG_FILE="$WORK_DIR/server.yaml"
|
||||
cat > "$CONFIG_FILE" <<EOF
|
||||
mode: srv
|
||||
link: direct
|
||||
auth:
|
||||
provider: "$CARRIER"
|
||||
room:
|
||||
@@ -397,14 +401,18 @@ debug: false
|
||||
EOF
|
||||
|
||||
echo "[*] Starting OlcRTC server..."
|
||||
START_CMD="./olcrtc server.yaml"
|
||||
if [ "$TRANSPORT" = "videochannel" ]; then
|
||||
START_CMD="apk add --no-cache ffmpeg >/dev/null && ./olcrtc server.yaml"
|
||||
fi
|
||||
podman run -d \
|
||||
--network host \
|
||||
--name $CONTAINER_NAME \
|
||||
--name "$CONTAINER_NAME" \
|
||||
--restart unless-stopped \
|
||||
-v $WORK_DIR:/app:Z \
|
||||
-v "$WORK_DIR":/app:Z \
|
||||
-w /app \
|
||||
$IMAGE_NAME \
|
||||
./olcrtc server.yaml
|
||||
"$IMAGE_NAME" \
|
||||
sh -c "$START_CMD"
|
||||
|
||||
read -p "Enter a comment for the config (default: olc - t.me/openlibrecommunity): " sub_configname
|
||||
if [ -z "$sub_configname" ]; then
|
||||
|
||||
Reference in New Issue
Block a user