From e69ba6755d95d5f3e9a8198f6d38735eded716a4 Mon Sep 17 00:00:00 2001 From: "n.tolstov" Date: Sun, 30 Nov 2025 21:19:40 +0300 Subject: [PATCH] feat: move Piston language installation from Piston service to backend entrypoint --- backend/entrypoint.sh | 81 +++++++++++++++++++++++++ docker-compose.yml | 2 - piston/entrypoint.sh | 82 ------------------------- scripts/install-piston-languages.sh | 93 ----------------------------- 4 files changed, 81 insertions(+), 177 deletions(-) delete mode 100644 piston/entrypoint.sh delete mode 100755 scripts/install-piston-languages.sh diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index ded4b66..6e3c9e7 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -1,6 +1,8 @@ #!/bin/sh set -e +PISTON_URL="${PISTON_URL:-http://piston:2000}" + MAX_RETRIES=10 COUNT=0 @@ -16,4 +18,83 @@ until alembic upgrade head; do done echo "Migrations applied." + +# Install Piston languages in background +install_piston_languages() { + echo "Installing Piston languages in background..." + + # Wait for Piston to be ready + until curl -s "$PISTON_URL/api/v2/runtimes" > /dev/null 2>&1; do + echo "Waiting for Piston..." + sleep 2 + done + + # Check which languages are already installed + INSTALLED=$(curl -s "$PISTON_URL/api/v2/runtimes" | python3 -c "import sys,json; print(' '.join(f\"{r['language']}={r['version']}\" for r in json.load(sys.stdin)))" 2>/dev/null || echo "") + + install_lang() { + lang=$1 + version=$2 + if echo "$INSTALLED" | grep -q "$lang=$version"; then + echo "✓ $lang $version already installed" + else + echo "Installing $lang $version..." + curl -s -X POST "$PISTON_URL/api/v2/packages" \ + -H "Content-Type: application/json" \ + -d "{\"language\":\"$lang\",\"version\":\"$version\"}" > /dev/null && \ + echo "✓ $lang $version installed" || \ + echo "✗ Failed to install $lang $version" + fi + } + + echo "=== Core Languages ===" + install_lang "python" "3.12.0" + install_lang "gcc" "10.2.0" + install_lang "java" "15.0.2" + install_lang "node" "20.11.1" + + echo "=== Systems Programming ===" + install_lang "go" "1.16.2" + install_lang "rust" "1.68.2" + + echo "=== JVM Languages ===" + install_lang "kotlin" "1.8.20" + install_lang "scala" "3.2.2" + + echo "=== .NET ===" + install_lang "dotnet" "5.0.201" + + echo "=== Scripting ===" + install_lang "ruby" "3.0.1" + install_lang "perl" "5.36.0" + install_lang "php" "8.2.3" + install_lang "lua" "5.4.4" + + echo "=== Functional ===" + install_lang "haskell" "9.0.1" + install_lang "ocaml" "4.12.0" + install_lang "elixir" "1.11.3" + install_lang "clojure" "1.10.3" + install_lang "racket" "8.3.0" + + echo "=== Other ===" + install_lang "pascal" "3.2.2" + install_lang "fortran" "10.2.0" + install_lang "swift" "5.3.3" + install_lang "typescript" "5.0.3" + install_lang "nim" "1.6.2" + install_lang "zig" "0.10.1" + install_lang "d" "10.2.0" + install_lang "prolog" "8.2.4" + + echo "=== Low-level ===" + install_lang "nasm" "2.15.5" + install_lang "bash" "5.1.0" + + echo "=== Piston languages installation complete ===" +} + +# Run language installation in background +install_piston_languages & + exec "$@" diff --git a/docker-compose.yml b/docker-compose.yml index eec4f7c..4417b96 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,9 +26,7 @@ services: - "2000:2000" privileged: true restart: unless-stopped - entrypoint: ["/bin/bash", "/piston-init/entrypoint.sh"] volumes: - - ./piston/entrypoint.sh:/piston-init/entrypoint.sh:ro - piston_packages:/piston/packages tmpfs: - /piston/jobs:exec,mode=777 diff --git a/piston/entrypoint.sh b/piston/entrypoint.sh deleted file mode 100644 index fc29ab2..0000000 --- a/piston/entrypoint.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# Piston entrypoint - installs languages on first run - -LANGUAGES_INSTALLED_FLAG="/piston/packages/.languages_installed" -PPMAN="/piston_api/cli/index.js ppman" - -install_lang() { - local pkg=$1 - echo "Installing $pkg..." - $PPMAN install "$pkg" || echo "Warning: Failed to install $pkg" -} - -install_languages() { - echo "=== Installing Competitive Programming Languages ===" - echo "This may take a while on first run..." - echo "" - - # Core languages (most used in competitive programming) - echo ">>> Core Languages" - install_lang "python=3.12.0" - install_lang "gcc=10.2.0" # C/C++ - install_lang "java=15.0.2" - install_lang "node=20.11.1" # JavaScript - - # Systems programming - echo ">>> Systems Programming" - install_lang "go=1.16.2" - install_lang "rust=1.68.2" - - # JVM languages - echo ">>> JVM Languages" - install_lang "kotlin=1.8.20" - install_lang "scala=3.2.2" - - # .NET - echo ">>> .NET" - install_lang "dotnet=5.0.201" # C# - - # Scripting - echo ">>> Scripting Languages" - install_lang "ruby=3.0.1" - install_lang "perl=5.36.0" - install_lang "php=8.2.3" - install_lang "lua=5.4.4" - - # Functional - echo ">>> Functional Languages" - install_lang "haskell=9.0.1" - install_lang "ocaml=4.12.0" - install_lang "elixir=1.11.3" - install_lang "clojure=1.10.3" - install_lang "racket=8.3.0" - - # Other competitive programming languages - echo ">>> Other Languages" - install_lang "pascal=3.2.2" - install_lang "fortran=10.2.0" - install_lang "swift=5.3.3" - install_lang "typescript=5.0.3" - install_lang "nim=1.6.2" - install_lang "zig=0.10.1" - install_lang "d=10.2.0" - install_lang "prolog=8.2.4" - - # Low-level - echo ">>> Low-level" - install_lang "nasm=2.15.5" - install_lang "bash=5.1.0" - - touch "$LANGUAGES_INSTALLED_FLAG" - echo "" - echo "=== Languages installation complete ===" - $PPMAN list -} - -# Install languages only on first run -if [ ! -f "$LANGUAGES_INSTALLED_FLAG" ]; then - install_languages & -fi - -# Start Piston API server (don't wait for languages to finish) -exec /piston_api/src/docker-entrypoint.sh diff --git a/scripts/install-piston-languages.sh b/scripts/install-piston-languages.sh deleted file mode 100755 index a948863..0000000 --- a/scripts/install-piston-languages.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash -# Script to install competitive programming languages in Piston -# Run this script inside the Piston container: -# docker cp scripts/install-piston-languages.sh sp-piston:/tmp/ -# docker exec -it sp-piston bash /tmp/install-piston-languages.sh - -set -e - -echo "=== Installing Competitive Programming Languages in Piston ===" -echo "" - -# Function to install a language with error handling -install_lang() { - local lang=$1 - local version=$2 - echo "Installing $lang $version..." - if piston ppman install "$lang=$version"; then - echo "✓ $lang $version installed successfully" - else - echo "✗ Failed to install $lang $version" - fi - echo "" -} - -# Core competitive programming languages (latest versions from Piston repo) -echo "=== Core Languages ===" -install_lang "python" "3.12.0" -install_lang "gcc" "10.2.0" # C/C++ (provides c and c++) -install_lang "java" "15.0.2" -install_lang "node" "20.11.1" # JavaScript - -# Systems programming languages -echo "=== Systems Programming ===" -install_lang "go" "1.16.2" -install_lang "rust" "1.68.2" - -# JVM languages -echo "=== JVM Languages ===" -install_lang "kotlin" "1.8.20" -install_lang "scala" "3.2.2" - -# .NET -echo "=== .NET ===" -install_lang "dotnet" "5.0.201" # C#/F# -install_lang "mono" "6.12.0" # Mono C# - -# Scripting languages -echo "=== Scripting Languages ===" -install_lang "ruby" "3.0.1" -install_lang "perl" "5.36.0" -install_lang "php" "8.2.3" -install_lang "lua" "5.4.4" - -# Functional programming languages -echo "=== Functional Languages ===" -install_lang "haskell" "9.0.1" -install_lang "ocaml" "4.12.0" -install_lang "elixir" "1.11.3" -install_lang "clojure" "1.10.3" -install_lang "erlang" "23.0.0" -install_lang "racket" "8.3.0" -install_lang "lisp" "2.1.2" # CLISP - -# Other competitive programming languages -echo "=== Other Languages ===" -install_lang "pascal" "3.2.2" # Free Pascal -install_lang "fortran" "10.2.0" # GFortran -install_lang "swift" "5.3.3" -install_lang "typescript" "5.0.3" -install_lang "nim" "1.6.2" -install_lang "crystal" "1.9.2" -install_lang "julia" "1.8.5" -install_lang "zig" "0.10.1" -install_lang "vlang" "0.3.3" -install_lang "d" "10.2.0" # GDC -install_lang "groovy" "3.0.7" -install_lang "cobol" "3.1.2" -install_lang "fsharp" "5.0.201" -install_lang "prolog" "8.2.4" # SWI-Prolog -install_lang "r" "4.1.1" - -# Low-level / Assembly -echo "=== Low-level ===" -install_lang "nasm" "2.15.5" # x86/x64 Assembly - -# Shell scripting -echo "=== Shell ===" -install_lang "bash" "5.1.0" - -echo "" -echo "=== Installation Complete ===" -echo "Installed languages:" -piston ppman list