diff --git a/npm_install.py b/npm_install.py index 6a484ee..60643e5 100644 --- a/npm_install.py +++ b/npm_install.py @@ -248,17 +248,34 @@ def setup_certbot_venv(venv_dir: Path = Path("/opt/certbot")): "PATH": "/usr/lib/pyenv/bin:/usr/bin:/bin" }) with step(f"Installing Python {PYTHON_VERSION} via pyenv into {PYENV_ROOT}"): - cmd = ( + # 1) Upewnij się, że PYENV_ROOT istnieje i należy do 'npm' + run(["mkdir", "-p", str(PYENV_ROOT)]) + run(["chown", "-R", f"{PYENV_OWNER}:{PYENV_OWNER}", "/opt/npm"], check=False) + + # 2) Jeżeli lokalny pyenv nie istnieje – sklonuj go (pomija wrappera Debiana) + run([ + "sudo", "-u", PYENV_OWNER, "bash", "-lc", + 'if [ ! -x "/opt/npm/.pyenv/bin/pyenv" ]; then ' + ' command -v git >/dev/null 2>&1 || sudo apt-get install -y git; ' + ' git clone --depth=1 https://github.com/pyenv/pyenv.git /opt/npm/.pyenv; ' + "fi" + ]) + + # 3) Z bardzo czystym środowiskiem (env -i) instalujemy CPython + # – żadnych /etc/profile, żadnych wrapperów. + install_cmd = ( 'export HOME=/opt/npm; ' - f'export PYENV_ROOT="{PYENV_ROOT}"; ' - 'export PATH="$PYENV_ROOT/bin:/usr/lib/pyenv/bin:/usr/bin:/bin"; ' - 'mkdir -p "$PYENV_ROOT"; cd /opt/npm; ' - f'/usr/lib/pyenv/bin/pyenv install -s {PYTHON_VERSION}' + 'export PYENV_ROOT=/opt/npm/.pyenv; ' + 'export PATH="$PYENV_ROOT/bin:/usr/bin:/bin"; ' + 'mkdir -p "$PYENV_ROOT"; cd "$HOME"; ' + f'pyenv install -s {PYTHON_VERSION}' ) run([ - "sudo", "-H", "-u", PYENV_OWNER, - "--preserve-env=HOME,PYENV_ROOT,PATH", - "bash", "-lc", cmd + "sudo", "-u", PYENV_OWNER, "env", "-i", + "HOME=/opt/npm", + f"PYENV_ROOT={PYENV_ROOT}", + f"PATH={PYENV_ROOT}/bin:/usr/bin:/bin", + "bash", "-lc", install_cmd ])