feat(script): add cnc mode and Go build caching

This commit is contained in:
zarazaex69
2026-05-17 20:56:07 +03:00
parent 6db5a53351
commit 32b8c8ef3e
4 changed files with 116 additions and 58 deletions
+50 -21
View File
@@ -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
+32 -7
View File
@@ -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 -5
View File
@@ -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
View File
@@ -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