feat: Enable Piston language installation on container startup and provide a manual installation script, configuring docker-compose for package persistence.

This commit is contained in:
n.tolstov 2025-11-30 21:07:57 +03:00
parent edb6217c0b
commit a8534561b9
4 changed files with 182 additions and 2 deletions

View File

@ -26,6 +26,10 @@ 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
@ -72,3 +76,4 @@ services:
volumes:
postgres_data:
piston_packages:

View File

@ -35,7 +35,7 @@ const features = [
},
{
icon: Code2,
title: "60+ языков",
title: "30+ языков",
description: "Python, C++, Java, JavaScript, Go, Rust и многие другие языки",
color: "text-green-500",
bgColor: "bg-green-500/10",
@ -151,7 +151,7 @@ export default function HomePage() {
className="mt-20 grid grid-cols-2 md:grid-cols-4 gap-8 max-w-4xl mx-auto"
>
{[
{ value: "60+", label: "Языков программирования" },
{ value: "30+", label: "Языков программирования" },
{ value: "∞", label: "Контестов" },
{ value: "100%", label: "Автопроверка" },
{ value: "24/7", label: "Доступность" },

82
piston/entrypoint.sh Normal file
View File

@ -0,0 +1,82 @@
#!/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/pkg/piston/piston_api

View File

@ -0,0 +1,93 @@
#!/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