#!/bin/bash set -euo pipefail echo "[INFO] Starting Fluent Bit setup in Ubuntu container (offline-first)..." export DEBIAN_FRONTEND=noninteractive # Stage bundle to /tmp (read-only mount under /private) echo "[INFO] Staging fluent-bit bundle..." rm -rf /tmp/flb && mkdir -p /tmp/flb cp -r /private/etc /tmp/flb/ mkdir -p /tmp/flb/packages cp -r /private/packages/* /tmp/flb/packages/ 2>/dev/null || true # Helper: check and install a local deb if not already satisfied ensure_lib() { local soname="$1"; shift local pattern="$1"; shift if ldconfig -p 2>/dev/null | grep -q "$soname"; then echo "[OK] $soname already present" return 0 fi local deb="$(ls /tmp/flb/packages/$pattern 2>/dev/null | head -n1 || true)" if [[ -n "$deb" ]]; then echo "[INFO] Installing local dependency: $(basename "$deb")" dpkg -i "$deb" >/dev/null 2>&1 || true else echo "[WARN] Local deb for $soname not found (pattern=$pattern)" fi if ! ldconfig -p 2>/dev/null | grep -q "$soname"; then echo "[WARN] $soname still missing after local install; attempting apt fallback" apt-get update -qq || true case "$soname" in libpq.so.5) apt-get install -y -qq libpq5 || true ;; libyaml-0.so.2) apt-get install -y -qq libyaml-0-2 || true ;; esac fi ldconfig 2>/dev/null || true } # Offline-first: satisfy runtime deps from local debs, fallback to apt only if necessary ensure_lib "libpq.so.5" "libpq5_*_amd64.deb" ensure_lib "libyaml-0.so.2" "libyaml-0-2_*_amd64.deb" ensure_lib "libsasl2.so.2" "libsasl2-2_*_amd64.deb" ensure_lib "libldap-2.5.so.0" "libldap-2.5-0_*_amd64.deb" # Install fluent-bit main package from local bundle FLB_DEB="$(ls /tmp/flb/packages/fluent-bit_*_amd64.deb 2>/dev/null | head -n1 || true)" if [[ -z "$FLB_DEB" ]]; then echo "[ERROR] fluent-bit deb not found under /private/packages" >&2 exit 1 fi echo "[INFO] Installing Fluent Bit: $(basename "$FLB_DEB")" dpkg -i "$FLB_DEB" >/dev/null 2>&1 || true # If dpkg reported unresolved dependencies, try apt -f only as last resort if ! command -v /opt/fluent-bit/bin/fluent-bit >/dev/null 2>&1; then echo "[WARN] fluent-bit binary missing after dpkg; attempting apt --fix-broken" apt-get install -f -y -qq || true fi # Ensure runtime library dependencies are satisfied (libsasl2, libldap are required via libpq/curl) MISSING=$(ldd /opt/fluent-bit/bin/fluent-bit 2>/dev/null | awk '/not found/{print $1}' | xargs -r echo || true) if [[ -n "$MISSING" ]]; then echo "[WARN] missing shared libs: $MISSING" apt-get update -qq || true apt-get install -y -qq libsasl2-2 libldap-2.5-0 || true apt-get install -f -y -qq || true fi echo "[INFO] Fluent Bit version:" /opt/fluent-bit/bin/fluent-bit --version || { echo "[ERROR] fluent-bit not installed or libraries missing" >&2; exit 1; } # Place configuration mkdir -p /etc/fluent-bit cp -r /tmp/flb/etc/* /etc/fluent-bit/ # Create logs/buffers dirs mkdir -p /logs/train /logs/infer /buffers chmod 755 /logs/train /logs/infer /buffers # Wait for Elasticsearch via bash /dev/tcp to avoid curl dependency echo "[INFO] Waiting for Elasticsearch to be ready (tcp ${ES_HOST}:${ES_PORT})..." for i in $(seq 1 120); do if exec 3<>/dev/tcp/${ES_HOST}/${ES_PORT}; then exec 3<&- 3>&- echo "[INFO] Elasticsearch is ready" break fi [[ $i -eq 120 ]] && { echo "[ERROR] ES not reachable" >&2; exit 1; } sleep 1 done echo "[INFO] Starting Fluent Bit with configuration from /etc/fluent-bit/" echo "[INFO] Command: /opt/fluent-bit/bin/fluent-bit --config=/etc/fluent-bit/fluent-bit.conf" exec /opt/fluent-bit/bin/fluent-bit --config=/etc/fluent-bit/fluent-bit.conf