From acf7b28086e6e553666b357bc06682d41f4bc2aa Mon Sep 17 00:00:00 2001 From: user Date: Sat, 28 Mar 2026 13:34:53 +0200 Subject: [PATCH] nuked the local es-scrcpy --- apps/ws-scrcpy | 1 - dockerfiles/app_builder.Dockerfile | 47 ------- dockerfiles/processor.Dockerfile | 21 ---- dockerfiles/ws_scrcpy.Dockerfile | 29 +++++ dokploy-install.sh => install.sh | 189 ++++++++++++++++++++++++----- 5 files changed, 191 insertions(+), 96 deletions(-) delete mode 160000 apps/ws-scrcpy delete mode 100644 dockerfiles/app_builder.Dockerfile delete mode 100644 dockerfiles/processor.Dockerfile create mode 100644 dockerfiles/ws_scrcpy.Dockerfile rename dokploy-install.sh => install.sh (50%) diff --git a/apps/ws-scrcpy b/apps/ws-scrcpy deleted file mode 160000 index ef273d9..0000000 --- a/apps/ws-scrcpy +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ef273d97c6ac0c05d03b41d4b55d59a25b95c505 diff --git a/dockerfiles/app_builder.Dockerfile b/dockerfiles/app_builder.Dockerfile deleted file mode 100644 index 96defbc..0000000 --- a/dockerfiles/app_builder.Dockerfile +++ /dev/null @@ -1,47 +0,0 @@ -FROM node:25.6.1-bookworm-slim AS app-builder - -ARG ANDROID_SDK_ROOT=/opt/android-sdk -ARG ANDROID_CMDLINE_TOOLS_VERSION=13114758 - -RUN apt-get update && apt-get install -y --no-install-recommends \ - bash \ - ca-certificates \ - curl \ - git \ - openjdk-17-jdk \ - unzip \ - && rm -rf /var/lib/apt/lists/* - -ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 -ENV ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT} -ENV ANDROID_HOME=${ANDROID_SDK_ROOT} -ENV PATH=${JAVA_HOME}/bin:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/platform-tools:${PATH} - -RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools /tmp/android-sdk && \ - curl -fsSL -o /tmp/android-sdk/cmdline-tools.zip \ - https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_CMDLINE_TOOLS_VERSION}_latest.zip && \ - unzip -q /tmp/android-sdk/cmdline-tools.zip -d /tmp/android-sdk && \ - mv /tmp/android-sdk/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \ - yes | sdkmanager --licenses > /dev/null && \ - sdkmanager \ - "platform-tools" \ - "platforms;android-36" \ - "build-tools;36.0.0" && \ - rm -rf /tmp/android-sdk - -RUN npm i -g pnpm - -WORKDIR /app - -COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./ -COPY apps/app-builder/package.json ./apps/app-builder/package.json -COPY packages ./packages - -RUN pnpm install --frozen-lockfile - -COPY apps/app-builder ./apps/app-builder -COPY mobile ./mobile - -EXPOSE 3000 - -CMD ["pnpm", "--filter", "@apps/app-builder", "run", "prod"] diff --git a/dockerfiles/processor.Dockerfile b/dockerfiles/processor.Dockerfile deleted file mode 100644 index 97f6d63..0000000 --- a/dockerfiles/processor.Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM node:25.6.1-alpine AS deps - -RUN npm i -g pnpm - -WORKDIR /app - -COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./ - -COPY apps/processor/package.json ./apps/processor/package.json - -COPY packages ./packages - -RUN pnpm install --frozen-lockfile - -COPY apps/processor ./apps/processor - -RUN pnpm install - -EXPOSE 3000 - -CMD ["pnpm", "--filter", "@apps/processor", "run", "prod"] diff --git a/dockerfiles/ws_scrcpy.Dockerfile b/dockerfiles/ws_scrcpy.Dockerfile new file mode 100644 index 0000000..8039fac --- /dev/null +++ b/dockerfiles/ws_scrcpy.Dockerfile @@ -0,0 +1,29 @@ +FROM node:25.7.0-bookworm + +# System deps: ADB for device communication, build tools for native modules (node-pty) +RUN apt-get update && \ + apt-get install -y android-tools-adb python3 make g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Clone and build ws-scrcpy +WORKDIR /build +RUN git clone --depth 1 https://github.com/NetrisTV/ws-scrcpy.git . && \ + npm install && \ + npm run dist:prod + +# Set up runtime +WORKDIR /app +RUN cp -r /build/dist/* . && \ + npm install && \ + rm -rf /build + +# Config: Android tracker on, no iOS, HTTP on port 8000 (Traefik handles TLS) +RUN printf 'runGoogTracker: true\nrunApplTracker: false\n\nserver:\n - secure: false\n port: 8000\n' > /app/config.yaml + +# Entrypoint: start ADB, connect to device if configured, then launch +RUN printf '#!/bin/bash\nset -e\nadb start-server\nif [ -n "$ADB_DEVICE_HOST" ]; then\n echo "Connecting to ADB device at $ADB_DEVICE_HOST:${ADB_DEVICE_PORT:-5555}"\n adb connect "$ADB_DEVICE_HOST:${ADB_DEVICE_PORT:-5555}"\n sleep 2\n adb devices\nfi\nexec node index.js\n' > /entrypoint.sh && \ + chmod +x /entrypoint.sh + +EXPOSE 8000 + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/dokploy-install.sh b/install.sh similarity index 50% rename from dokploy-install.sh rename to install.sh index aa20f90..1bed881 100644 --- a/dokploy-install.sh +++ b/install.sh @@ -1,5 +1,89 @@ #!/bin/bash + +# Detect version from environment variable or detect latest stable from GitHub +# Usage with curl (export first): export DOKPLOY_VERSION=canary && curl -sSL https://dokploy.com/install.sh | sh +# Usage with curl (export first): export DOKPLOY_VERSION=latest && curl -sSL https://dokploy.com/install.sh | sh +# Usage with curl (bash -s): DOKPLOY_VERSION=canary bash -s < <(curl -sSL https://dokploy.com/install.sh) +# Usage with curl (default): curl -sSL https://dokploy.com/install.sh | sh (detects latest stable version) +# Usage with bash: DOKPLOY_VERSION=canary bash install.sh +# Usage with bash: DOKPLOY_VERSION=latest bash install.sh +# Usage with bash: bash install.sh (detects latest stable version) +detect_version() { + local version="${DOKPLOY_VERSION}" + + # If no version specified, get latest stable version from GitHub releases + if [ -z "$version" ]; then + echo "Detecting latest stable version from GitHub..." >&2 + + # Try to get latest release from GitHub by following redirects + version=$(curl -fsSL -o /dev/null -w '%{url_effective}\n' \ + https://github.com/dokploy/dokploy/releases/latest 2>/dev/null | \ + sed 's#.*/tag/##') + + # Fallback to latest tag if detection fails + if [ -z "$version" ]; then + echo "Warning: Could not detect latest version from GitHub, using fallback version latest" >&2 + version="latest" + else + echo "Latest stable version detected: $version" >&2 + fi + fi + + echo "$version" +} + +# Function to detect if running in Proxmox LXC container +is_proxmox_lxc() { + # Check for LXC in environment + if [ -n "$container" ] && [ "$container" = "lxc" ]; then + return 0 # LXC container + fi + + # Check for LXC in /proc/1/environ + if grep -q "container=lxc" /proc/1/environ 2>/dev/null; then + return 0 # LXC container + fi + + return 1 # Not LXC +} + +generate_random_password() { + # Generate a secure random password using multiple methods with fallbacks + local password="" + + # Try using openssl (most reliable, available on most systems) + if command -v openssl >/dev/null 2>&1; then + password=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32) + # Fallback to /dev/urandom with tr (most Linux systems) + elif [ -r /dev/urandom ]; then + password=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32) + # Last resort fallback using date and simple hashing + else + if command -v sha256sum >/dev/null 2>&1; then + password=$(date +%s%N | sha256sum | base64 | head -c 32) + elif command -v shasum >/dev/null 2>&1; then + password=$(date +%s%N | shasum -a 256 | base64 | head -c 32) + else + # Very basic fallback - combines multiple sources of entropy + password=$(echo "$(date +%s%N)-$(hostname)-$$-$RANDOM" | base64 | tr -d "=+/" | head -c 32) + fi + fi + + # Ensure we got a password of correct length + if [ -z "$password" ] || [ ${#password} -lt 20 ]; then + echo "Error: Failed to generate random password" >&2 + exit 1 + fi + + echo "$password" +} + install_dokploy() { + # Detect version tag + VERSION_TAG=$(detect_version) + DOCKER_IMAGE="dokploy/dokploy:${VERSION_TAG}" + + echo "Installing Dokploy version: ${VERSION_TAG}" if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" >&2 exit 1 @@ -43,23 +127,36 @@ install_dokploy() { if command_exists docker; then echo "Docker already installed" else - curl -sSL https://get.docker.com | sh + curl -sSL https://get.docker.com | sh -s -- --version 28.5.0 fi + # Check if running in Proxmox LXC container and set endpoint mode + endpoint_mode="" + if is_proxmox_lxc; then + echo "⚠️ WARNING: Detected Proxmox LXC container environment!" + echo "Adding --endpoint-mode dnsrr to Docker services for LXC compatibility." + echo "This may affect service discovery but is required for LXC containers." + echo "" + endpoint_mode="--endpoint-mode dnsrr" + echo "Waiting for 5 seconds before continuing..." + sleep 5 + fi + + docker swarm leave --force 2>/dev/null get_ip() { local ip="" - + # Try IPv4 first # First attempt: ifconfig.io ip=$(curl -4s --connect-timeout 5 https://ifconfig.io 2>/dev/null) - + # Second attempt: icanhazip.com if [ -z "$ip" ]; then ip=$(curl -4s --connect-timeout 5 https://icanhazip.com 2>/dev/null) fi - + # Third attempt: ipecho.net if [ -z "$ip" ]; then ip=$(curl -4s --connect-timeout 5 https://ipecho.net/plain 2>/dev/null) @@ -69,12 +166,12 @@ install_dokploy() { if [ -z "$ip" ]; then # Try IPv6 with ifconfig.io ip=$(curl -6s --connect-timeout 5 https://ifconfig.io 2>/dev/null) - + # Try IPv6 with icanhazip.com if [ -z "$ip" ]; then ip=$(curl -6s --connect-timeout 5 https://icanhazip.com 2>/dev/null) fi - + # Try IPv6 with ipecho.net if [ -z "$ip" ]; then ip=$(curl -6s --connect-timeout 5 https://ipecho.net/plain 2>/dev/null) @@ -91,14 +188,32 @@ install_dokploy() { echo "$ip" } - advertise_addr="${ADVERTISE_ADDR:-$(get_ip)}" + get_private_ip() { + ip addr show | grep -E "inet (192\.168\.|10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.)" | head -n1 | awk '{print $2}' | cut -d/ -f1 + } + + advertise_addr="${ADVERTISE_ADDR:-$(get_private_ip)}" + + if [ -z "$advertise_addr" ]; then + echo "ERROR: We couldn't find a private IP address." + echo "Please set the ADVERTISE_ADDR environment variable manually." + echo "Example: export ADVERTISE_ADDR=192.168.1.100" + exit 1 + fi echo "Using advertise address: $advertise_addr" - docker swarm init \ - --advertise-addr $advertise_addr \ - --default-addr-pool 10.200.0.0/16 \ - --default-addr-pool-mask-length 24 - + # Allow custom Docker Swarm init arguments via DOCKER_SWARM_INIT_ARGS environment variable + # Example: export DOCKER_SWARM_INIT_ARGS="--default-addr-pool 172.20.0.0/16 --default-addr-pool-mask-length 24" + # This is useful to avoid CIDR overlapping with cloud provider VPCs (e.g., AWS) + swarm_init_args="${DOCKER_SWARM_INIT_ARGS:-}" + + if [ -n "$swarm_init_args" ]; then + echo "Using custom swarm init arguments: $swarm_init_args" + docker swarm init --advertise-addr $advertise_addr $swarm_init_args + else + docker swarm init --advertise-addr $advertise_addr + fi + if [ $? -ne 0 ]; then echo "Error: Failed to initialize Docker Swarm" >&2 exit 1 @@ -107,7 +222,7 @@ install_dokploy() { echo "Swarm initialized" docker network rm -f dokploy-network 2>/dev/null - docker network create --driver overlay --attachable --subnet 10.201.0.0/16 dokploy-network + docker network create --driver overlay --attachable dokploy-network echo "Network created" @@ -116,11 +231,11 @@ install_dokploy() { chmod 777 /etc/dokploy # Generate secure random password for Postgres - POSTGRES_PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32) - + POSTGRES_PASSWORD=$(generate_random_password) + # Store password as Docker Secret (encrypted and secure) echo "$POSTGRES_PASSWORD" | docker secret create dokploy_postgres_password - 2>/dev/null || true - + echo "Generated secure database credentials (stored in Docker Secrets)" docker service create \ @@ -132,6 +247,7 @@ install_dokploy() { --secret source=dokploy_postgres_password,target=/run/secrets/postgres_password \ --env POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password \ --mount type=volume,source=dokploy-postgres,target=/var/lib/postgresql/data \ + $endpoint_mode \ postgres:16 docker service create \ @@ -139,9 +255,20 @@ install_dokploy() { --constraint 'node.role==manager' \ --network dokploy-network \ --mount type=volume,source=dokploy-redis,target=/data \ + $endpoint_mode \ redis:7 # Installation + # Set RELEASE_TAG environment variable for canary/feature versions + release_tag_env="" + if [[ "$VERSION_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then + # Specific version (v0.26.6, v0.26.7, etc.) → latest + release_tag_env="-e RELEASE_TAG=latest" + elif [ "$VERSION_TAG" != "latest" ]; then + # canary, feature/*, etc. → use the tag as-is + release_tag_env="-e RELEASE_TAG=$VERSION_TAG" + fi + docker service create \ --name dokploy \ --replicas 1 \ @@ -154,10 +281,13 @@ install_dokploy() { --update-parallelism 1 \ --update-order stop-first \ --constraint 'node.role == manager' \ + $endpoint_mode \ + $release_tag_env \ -e ADVERTISE_ADDR=$advertise_addr \ -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password \ - dokploy/dokploy:latest + $DOCKER_IMAGE + sleep 4 docker run -d \ --name dokploy-traefik \ @@ -169,7 +299,7 @@ install_dokploy() { -p 443:443/tcp \ -p 443:443/udp \ traefik:v3.6.7 - + docker network connect dokploy-network dokploy-traefik @@ -180,7 +310,7 @@ install_dokploy() { # --network dokploy-network \ # --mount type=bind,source=/etc/dokploy/traefik/traefik.yml,target=/etc/traefik/traefik.yml \ # --mount type=bind,source=/etc/dokploy/traefik/dynamic,target=/etc/dokploy/traefik/dynamic \ - # --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock,readonly \ + # --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ # --publish mode=host,published=443,target=443 \ # --publish mode=host,published=80,target=80 \ # --publish mode=host,published=443,target=443,protocol=udp \ @@ -202,7 +332,8 @@ install_dokploy() { fi } - formatted_addr=$(format_ip_for_url "$advertise_addr") + public_ip="${ADVERTISE_ADDR:-$(get_ip)}" + formatted_addr=$(format_ip_for_url "$public_ip") echo "" printf "${GREEN}Congratulations, Dokploy is installed!${NC}\n" printf "${BLUE}Wait 15 seconds for the server to start${NC}\n" @@ -210,15 +341,19 @@ install_dokploy() { } update_dokploy() { - echo "Updating Dokploy..." - - # Pull the latest image - docker pull dokploy/dokploy:latest + # Detect version tag + VERSION_TAG=$(detect_version) + DOCKER_IMAGE="dokploy/dokploy:${VERSION_TAG}" + + echo "Updating Dokploy to version: ${VERSION_TAG}" + + # Pull the image + docker pull $DOCKER_IMAGE # Update the service - docker service update --image dokploy/dokploy:latest dokploy + docker service update --image $DOCKER_IMAGE dokploy - echo "Dokploy has been updated to the latest version." + echo "Dokploy has been updated to version: ${VERSION_TAG}" } # Main script execution @@ -226,4 +361,4 @@ if [ "$1" = "update" ]; then update_dokploy else install_dokploy -fi +fi \ No newline at end of file