add install.sh
This commit is contained in:
parent
8ef8f9e1c9
commit
811b285fe6
1 changed files with 173 additions and 0 deletions
173
install.sh
Normal file
173
install.sh
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
REPO_URL="https://git.simplifiedprivacy.com/Support/sp-hydra-veil-core"
|
||||
BRANCH="core-laravel-proxyTEST"
|
||||
INSTALL_DIR="$HOME/sp-hydra-veil-core"
|
||||
SINGBOX_VERSION="1.13.5"
|
||||
SINGBOX_BIN="/usr/bin/sing-box"
|
||||
WRAPPER_PATH="/usr/local/bin/hydraveil-singbox"
|
||||
SUDOERS_PATH="/etc/sudoers.d/hydraveil"
|
||||
HV_DATA_HOME="$HOME/.local/share/hydra-veil"
|
||||
|
||||
echo "=== sp-hydra-veil-core installer ==="
|
||||
|
||||
# 1. Clone repo
|
||||
echo ""
|
||||
echo "[1/6] Cloning repository (branch: $BRANCH)..."
|
||||
if [ -d "$INSTALL_DIR" ]; then
|
||||
echo "Directory already exists, removing..."
|
||||
rm -rf "$INSTALL_DIR"
|
||||
fi
|
||||
git clone --branch "$BRANCH" "$REPO_URL" "$INSTALL_DIR"
|
||||
cd "$INSTALL_DIR"
|
||||
|
||||
# 2. .env
|
||||
echo ""
|
||||
echo "[2/6] Creating .env..."
|
||||
cat > "$INSTALL_DIR/.env" << 'DOTENV'
|
||||
SP_API_BASE_URL_LOCAL=http://simplifiedprivacy.test/api/v1
|
||||
SP_API_BASE_URL_PRODUCTION=https://fake.simplifiedprivacy.org/api/v1
|
||||
APP_ENV=production
|
||||
DOTENV
|
||||
echo ".env created."
|
||||
|
||||
# 3. venv + dependencies
|
||||
echo ""
|
||||
echo "[3/6] Setting up virtual environment..."
|
||||
python3 -m venv "$INSTALL_DIR/.venv"
|
||||
source "$INSTALL_DIR/.venv/bin/activate"
|
||||
|
||||
pip install --quiet --upgrade pip
|
||||
|
||||
pip install \
|
||||
python-dotenv \
|
||||
"cryptography~=46.0.3" \
|
||||
"dataclasses-json~=0.6.7" \
|
||||
"marshmallow~=3.26.1" \
|
||||
"psutil~=7.1.3" \
|
||||
"pysocks~=1.7.1" \
|
||||
"python-dateutil~=2.9.0.post0" \
|
||||
"requests~=2.32.5" \
|
||||
"annotated-types==0.7.0" \
|
||||
"certifi==2026.4.22" \
|
||||
"charset-normalizer==3.4.7" \
|
||||
"click==8.3.3" \
|
||||
"cytoolz==1.1.0" \
|
||||
"eth-hash==0.8.0" \
|
||||
"eth-typing==6.0.0" \
|
||||
"eth-utils==6.0.0" \
|
||||
"idna==3.13" \
|
||||
"packaging==26.2" \
|
||||
"pathspec==1.1.1" \
|
||||
"platformdirs==4.9.6" \
|
||||
"py-ecc==8.0.0" \
|
||||
"pydantic==2.13.3" \
|
||||
"pydantic_core==2.46.3" \
|
||||
"pydeps==3.0.6" \
|
||||
"pytokens==0.4.1" \
|
||||
"stdlib-list==0.12.0" \
|
||||
"toolz==1.1.0" \
|
||||
"typing-inspect==0.9.0" \
|
||||
"typing-inspection==0.4.2" \
|
||||
"typing_extensions==4.15.0" \
|
||||
"urllib3==2.6.3"
|
||||
|
||||
pip install -e "$INSTALL_DIR" --no-deps
|
||||
echo "Dependencies installed."
|
||||
|
||||
# 4. sing-box
|
||||
echo ""
|
||||
echo "[4/6] Checking sing-box..."
|
||||
|
||||
# Find sing-box in any common location
|
||||
FOUND_SINGBOX=""
|
||||
for candidate in /usr/bin/sing-box /usr/local/bin/sing-box /bin/sing-box /usr/local/sbin/sing-box; do
|
||||
if [ -x "$candidate" ]; then
|
||||
FOUND_SINGBOX="$candidate"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Also check PATH
|
||||
if [ -z "$FOUND_SINGBOX" ]; then
|
||||
FOUND_SINGBOX=$(command -v sing-box 2>/dev/null || true)
|
||||
fi
|
||||
|
||||
if [ -n "$FOUND_SINGBOX" ]; then
|
||||
echo "sing-box found at: $FOUND_SINGBOX"
|
||||
echo "Version: $($FOUND_SINGBOX version | head -1)"
|
||||
# If not at /usr/bin/sing-box, create symlink
|
||||
if [ "$FOUND_SINGBOX" != "$SINGBOX_BIN" ]; then
|
||||
echo "Creating symlink: $FOUND_SINGBOX -> $SINGBOX_BIN"
|
||||
sudo ln -sf "$FOUND_SINGBOX" "$SINGBOX_BIN"
|
||||
fi
|
||||
else
|
||||
echo "sing-box not found, installing v$SINGBOX_VERSION..."
|
||||
wget -q "https://github.com/SagerNet/sing-box/releases/download/v${SINGBOX_VERSION}/sing-box-${SINGBOX_VERSION}-linux-amd64.tar.gz" -O /tmp/sing-box.tar.gz
|
||||
tar -xzf /tmp/sing-box.tar.gz -C /tmp
|
||||
sudo cp "/tmp/sing-box-${SINGBOX_VERSION}-linux-amd64/sing-box" "$SINGBOX_BIN"
|
||||
sudo chmod 755 "$SINGBOX_BIN"
|
||||
rm -rf /tmp/sing-box.tar.gz "/tmp/sing-box-${SINGBOX_VERSION}-linux-amd64"
|
||||
echo "sing-box installed: $($SINGBOX_BIN version | head -1)"
|
||||
fi
|
||||
|
||||
# Final check
|
||||
if [ ! -x "$SINGBOX_BIN" ]; then
|
||||
echo "ERROR: sing-box not found at $SINGBOX_BIN after install. Aborting."
|
||||
exit 1
|
||||
fi
|
||||
echo "sing-box OK at $SINGBOX_BIN"
|
||||
|
||||
# 5. wrapper + sudoers + HV_DATA_HOME
|
||||
echo ""
|
||||
echo "[5/6] Installing wrapper..."
|
||||
|
||||
sudo tee "$WRAPPER_PATH" > /dev/null << WRAPPER
|
||||
#!/bin/bash
|
||||
CONFIG=\$1
|
||||
ACTION=\$2
|
||||
|
||||
if [[ "\$ACTION" == "stop" ]]; then
|
||||
pkill -9 -f sing-box
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "\$CONFIG" != /tmp/*.json ]] && \\
|
||||
[[ "\$CONFIG" != /home/*/.local/share/hydra-veil/*.json ]]; then
|
||||
echo "Error: config path not allowed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec $SINGBOX_BIN run -c "\$CONFIG"
|
||||
WRAPPER
|
||||
|
||||
sudo chmod 755 "$WRAPPER_PATH"
|
||||
|
||||
# Verify wrapper points to correct sing-box
|
||||
if grep -q "$SINGBOX_BIN" "$WRAPPER_PATH"; then
|
||||
echo "Wrapper OK — points to $SINGBOX_BIN"
|
||||
else
|
||||
echo "ERROR: wrapper does not reference $SINGBOX_BIN"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 6. sudoers
|
||||
echo ""
|
||||
echo "[6/6] Configuring sudoers..."
|
||||
if [ ! -f "$SUDOERS_PATH" ]; then
|
||||
echo "$USER ALL=(ALL) NOPASSWD: $WRAPPER_PATH" | sudo tee "$SUDOERS_PATH" > /dev/null
|
||||
sudo chmod 440 "$SUDOERS_PATH"
|
||||
echo "Sudoers configured."
|
||||
else
|
||||
echo "Sudoers already exists, skipping."
|
||||
fi
|
||||
|
||||
# Create HV_DATA_HOME directory
|
||||
mkdir -p "$HV_DATA_HOME"
|
||||
echo "HV_DATA_HOME created: $HV_DATA_HOME"
|
||||
|
||||
echo ""
|
||||
echo "=== Installation complete ==="
|
||||
echo "Activate the environment with:"
|
||||
echo " source $INSTALL_DIR/.venv/bin/activate"
|
||||
Loading…
Reference in a new issue