refactor: rename wallarm → deploy, deploy.sh → setup.sh
- setup.sh bootstraps /opt/wallarm/ structure, builds deploy binary
- deploy binary at /opt/wallarm/deploy (renamed from wallarm)
- /opt/wallarm/source/ — Go source for local rebuilds
- /opt/wallarm/nodes/{instance}/ — per-node directories
- cmd/deploy/main.go replaces cmd/wallarm/main.go
This commit is contained in:
parent
c1e1be2ab2
commit
157373ea16
5 changed files with 90 additions and 282 deletions
6
Makefile
6
Makefile
|
|
@ -1,6 +1,6 @@
|
||||||
.PHONY: all linux-amd64 linux-arm64 clean test release
|
.PHONY: all linux-amd64 linux-arm64 clean test release
|
||||||
|
|
||||||
BINARY := wallarm
|
BINARY := deploy
|
||||||
VERSION := $(shell git describe --tags --always 2>/dev/null || echo "dev")
|
VERSION := $(shell git describe --tags --always 2>/dev/null || echo "dev")
|
||||||
LDFLAGS := -s -w -X main.version=$(VERSION)
|
LDFLAGS := -s -w -X main.version=$(VERSION)
|
||||||
# Embed tunnel key at build time: make TUNNEL_KEY=~/.wallarm/tunnel_key
|
# Embed tunnel key at build time: make TUNNEL_KEY=~/.wallarm/tunnel_key
|
||||||
|
|
@ -11,11 +11,11 @@ endif
|
||||||
all: linux-amd64 linux-arm64
|
all: linux-amd64 linux-arm64
|
||||||
|
|
||||||
linux-amd64:
|
linux-amd64:
|
||||||
GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o $(BINARY)-linux-amd64 ./cmd/wallarm/
|
GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o $(BINARY)-linux-amd64 ./cmd/deploy/
|
||||||
upx --best --lzma $(BINARY)-linux-amd64 -o $(BINARY)-linux-amd64.tmp 2>/dev/null && mv $(BINARY)-linux-amd64.tmp $(BINARY)-linux-amd64 || true
|
upx --best --lzma $(BINARY)-linux-amd64 -o $(BINARY)-linux-amd64.tmp 2>/dev/null && mv $(BINARY)-linux-amd64.tmp $(BINARY)-linux-amd64 || true
|
||||||
|
|
||||||
linux-arm64:
|
linux-arm64:
|
||||||
GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o $(BINARY)-linux-arm64 ./cmd/wallarm/
|
GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o $(BINARY)-linux-arm64 ./cmd/deploy/
|
||||||
upx --best --lzma $(BINARY)-linux-arm64 -o $(BINARY)-linux-arm64.tmp 2>/dev/null && mv $(BINARY)-linux-arm64.tmp $(BINARY)-linux-arm64 || true
|
upx --best --lzma $(BINARY)-linux-arm64 -o $(BINARY)-linux-arm64.tmp 2>/dev/null && mv $(BINARY)-linux-arm64.tmp $(BINARY)-linux-arm64 || true
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
||||||
12
README.md
12
README.md
|
|
@ -6,8 +6,8 @@ One command to get started, one TUI to manage everything.
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL "https://git.sechpoint.app/customer-engineering/wallarm/raw/branch/main/deploy.sh" | bash
|
curl -fsSL "https://git.sechpoint.app/customer-engineering/wallarm/raw/branch/main/setup.sh" | bash
|
||||||
sudo ./deploy/wallarm
|
sudo /opt/wallarm/deploy
|
||||||
```
|
```
|
||||||
|
|
||||||
That's it. The binary runs preflight checks, then opens an interactive TUI:
|
That's it. The binary runs preflight checks, then opens an interactive TUI:
|
||||||
|
|
@ -26,10 +26,10 @@ That's it. The binary runs preflight checks, then opens an interactive TUI:
|
||||||
## Commands
|
## Commands
|
||||||
|
|
||||||
```
|
```
|
||||||
wallarm Interactive TUI (wizard or dashboard)
|
deploy Interactive TUI (wizard or dashboard)
|
||||||
wallarm --tunnel Start reverse SSH tunnel to sechpoint.app
|
deploy --tunnel Start reverse SSH tunnel to sechpoint.app
|
||||||
wallarm --version Show version
|
deploy --version Show version
|
||||||
wallarm --help Show help
|
deploy --help Show help
|
||||||
```
|
```
|
||||||
|
|
||||||
## Dashboard
|
## Dashboard
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
// wallarm — single-binary Wallarm deployment manager.
|
// deploy — single-binary Wallarm deployment manager.
|
||||||
//
|
//
|
||||||
// On every start: run preflight checks → detect existing deployment → route to wizard or dashboard.
|
// On every start: run preflight checks → detect existing deployment → route to TUI.
|
||||||
//
|
//
|
||||||
// Commands:
|
// Commands:
|
||||||
//
|
//
|
||||||
// wallarm Auto-detect state, show wizard or dashboard
|
// deploy Auto-detect state, show deploy choice or dashboard
|
||||||
// wallarm --tunnel Start reverse SSH tunnel over TLS:443
|
// deploy --tunnel Start reverse SSH tunnel over TLS:443
|
||||||
// wallarm --help Show help
|
// deploy --help Show help
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
@ -181,11 +181,11 @@ WALLARM_REGION=%s
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
fmt.Println("✅ Deployment complete!")
|
fmt.Println("✅ Deployment complete!")
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
fmt.Printf(" Binary: /opt/wallarm/wallarm\n")
|
fmt.Printf(" Binary: /opt/wallarm/deploy\n")
|
||||||
fmt.Printf(" Instance: %s\n", instanceDir)
|
fmt.Printf(" Instance: %s\n", instanceDir)
|
||||||
fmt.Printf(" State: /opt/wallarm/state.json\n")
|
fmt.Printf(" State: /opt/wallarm/state.json\n")
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
fmt.Println("Run 'sudo /opt/wallarm/wallarm' for the dashboard.")
|
fmt.Println("Run 'sudo /opt/wallarm/deploy' for the dashboard.")
|
||||||
}
|
}
|
||||||
func runTunnelFlow() {
|
func runTunnelFlow() {
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
|
|
@ -249,12 +249,13 @@ func runTunnelFlow() {
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Fprintf(os.Stderr, `wallarm — Wallarm Deployment Manager
|
fmt.Fprintf(os.Stderr, `deploy — Wallarm Deployment Manager
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
wallarm Start interactive deployment wizard/dashboard
|
deploy Start TUI (deploy choice or dashboard)
|
||||||
wallarm --tunnel Start reverse SSH tunnel to sechpoint.app
|
deploy --tunnel Start reverse SSH tunnel
|
||||||
wallarm --help Show this help
|
deploy --version Show version
|
||||||
|
deploy --help Show this help
|
||||||
|
|
||||||
On first run, wallarm checks system readiness, then guides you through
|
On first run, wallarm checks system readiness, then guides you through
|
||||||
deployment. On subsequent runs, it shows your existing deployments.
|
deployment. On subsequent runs, it shows your existing deployments.
|
||||||
|
|
@ -270,7 +271,7 @@ deployment. On subsequent runs, it shows your existing deployments.
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if *versionFlag {
|
if *versionFlag {
|
||||||
fmt.Println("wallarm version", version)
|
fmt.Println("deploy version", version)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
100
deploy.sh
100
deploy.sh
|
|
@ -1,100 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# ==============================================================================
|
|
||||||
# Wallarm Deployment — Single Binary Bootstrap
|
|
||||||
# ==============================================================================
|
|
||||||
# Clones the repository, builds the wallarm binary, and installs it to
|
|
||||||
# /opt/wallarm/. One command to get started:
|
|
||||||
#
|
|
||||||
# curl -fsSL ".../deploy.sh" | bash
|
|
||||||
# sudo /opt/wallarm/wallarm
|
|
||||||
#
|
|
||||||
# All deployments live under /opt/wallarm/ — binary, config, instances, state.
|
|
||||||
# ==============================================================================
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
BOLD='\033[1m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
CYAN='\033[0;36m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
RED='\033[0;31m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
REPO_URL="https://git.sechpoint.app/customer-engineering/wallarm.git"
|
|
||||||
WALLARM_DIR="/opt/wallarm"
|
|
||||||
BUILD_DIR="/tmp/wallarm-build-$$"
|
|
||||||
|
|
||||||
cleanup() { rm -rf "$BUILD_DIR"; }
|
|
||||||
trap cleanup EXIT
|
|
||||||
|
|
||||||
echo -e "${BOLD}Wallarm Deployment Bootstrap${NC}"
|
|
||||||
echo
|
|
||||||
|
|
||||||
# ── Ensure prerequisites ─────────────────────────────────────────────
|
|
||||||
install_go() {
|
|
||||||
echo -e "${YELLOW}Installing Go...${NC}"
|
|
||||||
if command -v apt-get >/dev/null 2>&1; then
|
|
||||||
apt-get update -qq && apt-get install -y -qq golang-go
|
|
||||||
elif command -v yum >/dev/null 2>&1; then
|
|
||||||
yum install -y golang
|
|
||||||
elif command -v dnf >/dev/null 2>&1; then
|
|
||||||
dnf install -y golang
|
|
||||||
elif command -v apk >/dev/null 2>&1; then
|
|
||||||
apk add --no-cache go
|
|
||||||
else
|
|
||||||
echo -e "${RED}Cannot install Go automatically. Install Go 1.21+ manually.${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Ensure git
|
|
||||||
if ! command -v git >/dev/null 2>&1; then
|
|
||||||
echo -e "${YELLOW}Installing git...${NC}"
|
|
||||||
apt-get update -qq 2>/dev/null && apt-get install -y -qq git 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ensure Go
|
|
||||||
if ! command -v go >/dev/null 2>&1; then
|
|
||||||
install_go
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "${GREEN} git: $(git --version | cut -d' ' -f3)${NC}"
|
|
||||||
echo -e "${GREEN} go: $(go version | cut -d' ' -f3)${NC}"
|
|
||||||
|
|
||||||
# ── Clone and build ───────────────────────────────────────────────────
|
|
||||||
echo
|
|
||||||
echo -e "${YELLOW}Cloning repository...${NC}"
|
|
||||||
git clone --depth 1 "$REPO_URL" "$BUILD_DIR" 2>/dev/null
|
|
||||||
|
|
||||||
echo -e "${YELLOW}Building wallarm (this takes ~30 seconds)...${NC}"
|
|
||||||
cd "$BUILD_DIR"
|
|
||||||
go build -ldflags="-s -w -X main.version=$(git describe --tags --always 2>/dev/null || echo 'dev')" -o wallarm ./cmd/wallarm/
|
|
||||||
|
|
||||||
# Optional: compress with UPX if available
|
|
||||||
if command -v upx >/dev/null 2>&1; then
|
|
||||||
upx --best --lzma wallarm -o wallarm.tmp 2>/dev/null && mv wallarm.tmp wallarm || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Install ───────────────────────────────────────────────────────────
|
|
||||||
mkdir -p "$WALLARM_DIR"
|
|
||||||
cp "$BUILD_DIR/wallarm" "$WALLARM_DIR/wallarm"
|
|
||||||
chmod +x "$WALLARM_DIR/wallarm"
|
|
||||||
|
|
||||||
# Copy source for local rebuilds
|
|
||||||
rm -rf "$WALLARM_DIR/source"
|
|
||||||
cp -r "$BUILD_DIR/cmd" "$BUILD_DIR/internal" "$BUILD_DIR/go.mod" "$BUILD_DIR/go.sum" "$WALLARM_DIR/source/" 2>/dev/null || true
|
|
||||||
mkdir -p "$WALLARM_DIR/source/cmd" "$WALLARM_DIR/source/internal" 2>/dev/null || true
|
|
||||||
cp -r "$BUILD_DIR/cmd" "$BUILD_DIR/internal" "$WALLARM_DIR/source/" 2>/dev/null || true
|
|
||||||
cp "$BUILD_DIR/go.mod" "$BUILD_DIR/go.sum" "$WALLARM_DIR/source/" 2>/dev/null || true
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo -e "${GREEN}${BOLD}Ready!${NC}"
|
|
||||||
echo
|
|
||||||
echo -e " ${CYAN}sudo ${WALLARM_DIR}/wallarm${NC} — Start the TUI"
|
|
||||||
echo -e " ${CYAN}${WALLARM_DIR}/wallarm --help${NC} — Show all commands"
|
|
||||||
echo -e " ${CYAN}${WALLARM_DIR}/wallarm --tunnel${NC} — Start remote tunnel"
|
|
||||||
echo
|
|
||||||
echo -e " ${CYAN}${WALLARM_DIR}/source/${NC} — Source for local rebuilds"
|
|
||||||
echo -e " ${CYAN}cd ${WALLARM_DIR}/source && go build ./cmd/wallarm/${NC}"
|
|
||||||
echo
|
|
||||||
ls -lh "$WALLARM_DIR/wallarm"
|
|
||||||
229
setup.sh
Executable file → Normal file
229
setup.sh
Executable file → Normal file
|
|
@ -1,191 +1,98 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Wallarm Deployment Setup Script
|
# Wallarm Deployment — Bootstrap
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# Downloads Wallarm deployment scripts from the Git repository and places
|
# Creates /opt/wallarm/, downloads source, builds the deploy binary.
|
||||||
# them in a single deploy/ directory.
|
|
||||||
#
|
#
|
||||||
# When run interactively (or piped via curl|bash to a terminal), asks which
|
# curl -fsSL ".../setup.sh" | bash
|
||||||
# deployment type to download:
|
# sudo /opt/wallarm/deploy
|
||||||
# 1. docker - Wallarm filtering node as a Docker container
|
|
||||||
# 2. native - Wallarm filtering node installed directly on the OS (no Docker)
|
|
||||||
# 3. both - All scripts (docker + native)
|
|
||||||
#
|
#
|
||||||
# Falls back to downloading BOTH only when fully headless (no /dev/tty).
|
# All deployments live under /opt/wallarm/.
|
||||||
# Override with the DEPLOYMENT_TYPE env var:
|
|
||||||
# DEPLOYMENT_TYPE=native curl -fsSL ".../setup.sh" | bash
|
|
||||||
# DEPLOYMENT_TYPE=docker curl -fsSL ".../setup.sh" | bash
|
|
||||||
#
|
|
||||||
# Downloads the repo archive once, then copies only the needed folders
|
|
||||||
# (common + docker and/or native) into deploy/. No per-file curl calls.
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# Color definitions
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[1;34m'
|
|
||||||
CYAN='\033[0;36m'
|
|
||||||
BOLD='\033[1m'
|
BOLD='\033[1m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
# Git repository archive URL (Gitea-style)
|
REPO_URL="https://git.sechpoint.app/customer-engineering/wallarm.git"
|
||||||
REPO_ARCHIVE="https://git.sechpoint.app/customer-engineering/wallarm/archive/main.tar.gz"
|
WALLARM_DIR="/opt/wallarm"
|
||||||
|
SOURCE_DIR="${WALLARM_DIR}/source"
|
||||||
|
BUILD_DIR="/tmp/wallarm-build-$$"
|
||||||
|
|
||||||
# Temp directory for extracted archive
|
cleanup() { rm -rf "$BUILD_DIR"; }
|
||||||
TEMP_DIR=$(mktemp -d /tmp/wallarm-setup.XXXXXX)
|
trap cleanup EXIT
|
||||||
trap 'rm -rf "$TEMP_DIR"' EXIT
|
|
||||||
|
|
||||||
# Detect download command
|
echo -e "${BOLD}Wallarm Deployment Bootstrap${NC}"
|
||||||
if command -v curl >/dev/null 2>&1; then
|
echo
|
||||||
DOWNLOAD_NAME="curl"
|
|
||||||
elif command -v wget >/dev/null 2>&1; then
|
|
||||||
DOWNLOAD_NAME="wget"
|
|
||||||
else
|
|
||||||
echo -e "${RED}${BOLD}ERROR:${NC} Neither curl nor wget is installed."
|
|
||||||
echo -e "Please install one of them and run this script again."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Archive download and extraction ---
|
# ── Prerequisites ─────────────────────────────────────────────────────
|
||||||
|
install_go() {
|
||||||
download_archive() {
|
echo -e "${YELLOW}Installing Go...${NC}"
|
||||||
echo -e "${YELLOW}Downloading deployment scripts from repository...${NC}"
|
if command -v apt-get >/dev/null 2>&1; then
|
||||||
if [ "$DOWNLOAD_NAME" = "curl" ]; then
|
apt-get update -qq && apt-get install -y -qq golang-go
|
||||||
curl -fsSL "$REPO_ARCHIVE" | tar -xz --strip-components=1 -C "$TEMP_DIR" 2>/dev/null
|
elif command -v yum >/dev/null 2>&1; then
|
||||||
|
yum install -y golang
|
||||||
|
elif command -v dnf >/dev/null 2>&1; then
|
||||||
|
dnf install -y golang
|
||||||
|
elif command -v apk >/dev/null 2>&1; then
|
||||||
|
apk add --no-cache go
|
||||||
else
|
else
|
||||||
wget -qO- "$REPO_ARCHIVE" | tar -xz --strip-components=1 -C "$TEMP_DIR" 2>/dev/null
|
echo -e "${RED}Cannot install Go. Install Go 1.21+ manually.${NC}"
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -d "$TEMP_DIR/common" ]]; then
|
|
||||||
echo -e "${RED}${BOLD}ERROR:${NC} Failed to download or extract repository archive."
|
|
||||||
echo -e "Check network connectivity to: ${REPO_ARCHIVE}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo -e "${GREEN} Success: archive downloaded and extracted.${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
deploy_type() {
|
|
||||||
local type="$1"
|
|
||||||
|
|
||||||
# Copy common library (always needed)
|
|
||||||
cp "$TEMP_DIR/common/"* "deploy/" 2>/dev/null || true
|
|
||||||
|
|
||||||
# Copy the selected deployment type's folder
|
|
||||||
if [[ -d "$TEMP_DIR/$type" ]]; then
|
|
||||||
cp "$TEMP_DIR/$type/"* "deploy/" 2>/dev/null || true
|
|
||||||
chmod +x deploy/*.sh 2>/dev/null || true
|
|
||||||
echo -e "${GREEN} Copied: common + ${type} scripts → deploy/${NC}"
|
|
||||||
else
|
|
||||||
echo -e "${RED} Folder '$type' not found in archive.${NC}"
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Main
|
if ! command -v git >/dev/null 2>&1; then
|
||||||
clear 2>/dev/null || true
|
apt-get update -qq 2>/dev/null && apt-get install -y -qq git 2>/dev/null || true
|
||||||
echo -e "${BLUE}${BOLD}"
|
|
||||||
echo "╔══════════════════════════════════════════════════════════════╗"
|
|
||||||
echo "║ WALLARM DEPLOYMENT SETUP SCRIPT ║"
|
|
||||||
echo "║ Downloads all necessary deployment tools ║"
|
|
||||||
echo "╚══════════════════════════════════════════════════════════════╝${NC}"
|
|
||||||
echo
|
|
||||||
|
|
||||||
# Decide which deployment type(s) to download
|
|
||||||
DEPLOY_TYPES=()
|
|
||||||
|
|
||||||
# Priority 1: explicit DEPLOYMENT_TYPE env var (non-interactive override)
|
|
||||||
if [[ "${DEPLOYMENT_TYPE:-}" =~ ^(docker|native)$ ]]; then
|
|
||||||
DEPLOY_TYPES+=("$DEPLOYMENT_TYPE")
|
|
||||||
echo -e "${GREEN}Downloading only: $DEPLOYMENT_TYPE (from DEPLOYMENT_TYPE env var)${NC}"
|
|
||||||
|
|
||||||
# Priority 2 + 3: try interactive prompt via terminal or /dev/tty
|
|
||||||
else
|
|
||||||
# Determine where we can read user input from
|
|
||||||
INTERACTIVE=""
|
|
||||||
if [[ -t 0 ]]; then
|
|
||||||
INTERACTIVE="/dev/stdin"
|
|
||||||
elif [[ -c /dev/tty ]]; then
|
|
||||||
INTERACTIVE="/dev/tty"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$INTERACTIVE" ]]; then
|
|
||||||
echo -e "${CYAN}Which deployment type do you need?${NC}"
|
|
||||||
echo -e " ${YELLOW}1${NC}) Docker only — Wallarm node as a container"
|
|
||||||
echo -e " ${YELLOW}2${NC}) Native only — Wallarm node directly on this OS (no Docker)"
|
|
||||||
echo -e " ${YELLOW}3${NC}) Both — docker + native scripts"
|
|
||||||
echo
|
|
||||||
while true; do
|
|
||||||
read -r -p "$(echo -e "${YELLOW}Enter choice [1/2/3]: ${NC}")" choice <"$INTERACTIVE" 2>/dev/null || {
|
|
||||||
echo -e "${YELLOW}Input unavailable, defaulting to BOTH.${NC}"
|
|
||||||
DEPLOY_TYPES+=("docker" "native")
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case "$choice" in
|
|
||||||
1) DEPLOY_TYPES+=("docker"); break ;;
|
|
||||||
2) DEPLOY_TYPES+=("native"); break ;;
|
|
||||||
3) DEPLOY_TYPES+=("docker" "native"); break ;;
|
|
||||||
*) echo -e "${RED}Invalid choice. Enter 1, 2, or 3.${NC}" ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
echo
|
|
||||||
else
|
|
||||||
# Fully headless — default to both
|
|
||||||
DEPLOY_TYPES+=("docker" "native")
|
|
||||||
echo -e "${CYAN}No terminal available: downloading BOTH deployment types.${NC}"
|
|
||||||
echo -e "${YELLOW}To download only one type, set DEPLOYMENT_TYPE=docker or DEPLOYMENT_TYPE=native${NC}"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
if ! command -v go >/dev/null 2>&1; then
|
||||||
|
install_go
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}git: $(git --version | cut -d' ' -f3) go: $(go version | cut -d' ' -f3)${NC}"
|
||||||
|
|
||||||
|
# ── Create /opt/wallarm/ ──────────────────────────────────────────────
|
||||||
echo
|
echo
|
||||||
|
echo -e "${YELLOW}Creating /opt/wallarm/ directory structure...${NC}"
|
||||||
|
mkdir -p "${WALLARM_DIR}/nodes"
|
||||||
|
mkdir -p "${SOURCE_DIR}"
|
||||||
|
cd "${WALLARM_DIR}"
|
||||||
|
echo -e "${GREEN} Done.${NC}"
|
||||||
|
|
||||||
# Download archive once, then copy only the selected folders
|
# ── Clone and build ───────────────────────────────────────────────────
|
||||||
echo
|
echo
|
||||||
mkdir -p "deploy"
|
echo -e "${YELLOW}Cloning repository...${NC}"
|
||||||
download_archive
|
git clone --depth 1 "$REPO_URL" "$BUILD_DIR" 2>/dev/null
|
||||||
|
|
||||||
for type in "${DEPLOY_TYPES[@]}"; do
|
echo -e "${YELLOW}Building deploy binary (~30s)...${NC}"
|
||||||
deploy_type "$type"
|
cd "$BUILD_DIR"
|
||||||
done
|
go build -ldflags="-s -w -X main.version=$(git describe --tags --always 2>/dev/null || echo 'dev')" -o deploy ./cmd/deploy/
|
||||||
|
|
||||||
# Clean exit trap removes temp dir
|
# UPX compress if available
|
||||||
|
if command -v upx >/dev/null 2>&1; then
|
||||||
|
upx --best --lzma deploy -o deploy.tmp 2>/dev/null && mv deploy.tmp deploy || true
|
||||||
|
fi
|
||||||
|
|
||||||
# Patch library sourcing path for flat deploy/ structure
|
# ── Install ───────────────────────────────────────────────────────────
|
||||||
# (repo scripts still reference ../common/ — fix until they're updated)
|
cp deploy "${WALLARM_DIR}/deploy"
|
||||||
for script in deploy/*.sh; do
|
chmod +x "${WALLARM_DIR}/deploy"
|
||||||
[[ "$script" == "deploy/wallarm-lib.sh" ]] && continue
|
|
||||||
sed -i 's|source "\$SCRIPT_DIR/\.\./common/wallarm-lib\.sh"|source "$SCRIPT_DIR/wallarm-lib.sh"|' "$script"
|
# Copy source for local rebuilds
|
||||||
sed -i 's|# shellcheck source=\.\./common/wallarm-lib\.sh|# shellcheck source=./wallarm-lib.sh|' "$script"
|
rm -rf "${SOURCE_DIR}"/*
|
||||||
done
|
cp -r cmd internal go.mod go.sum "${SOURCE_DIR}/" 2>/dev/null || true
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo -e "${GREEN}${BOLD}Setup complete - requested scripts downloaded!${NC}"
|
echo -e "${GREEN}${BOLD}Ready!${NC}"
|
||||||
echo
|
echo
|
||||||
|
echo -e " ${CYAN}sudo /opt/wallarm/deploy${NC} — Start the TUI"
|
||||||
# Show next steps only for the deployment types that were downloaded
|
echo -e " ${CYAN}/opt/wallarm/deploy --help${NC} — Show commands"
|
||||||
for deploy_type in "${DEPLOY_TYPES[@]}"; do
|
echo -e " ${CYAN}/opt/wallarm/deploy --tunnel${NC} — Start remote tunnel"
|
||||||
case "$deploy_type" in
|
echo
|
||||||
docker)
|
echo -e " Source: ${SOURCE_DIR}/ (rebuild: cd ${SOURCE_DIR} && go build ./cmd/deploy/)"
|
||||||
echo -e "${CYAN}Docker deployment next steps:${NC}"
|
echo
|
||||||
echo -e " 1. Run the preflight check: ${YELLOW}./deploy/wallarm-docker.sh --preflight${NC}"
|
ls -lh "${WALLARM_DIR}/deploy"
|
||||||
echo -e " 2. Deploy a Wallarm node: ${YELLOW}sudo ./deploy/wallarm-docker.sh --install${NC}"
|
|
||||||
echo -e " 3. Reconfigure existing node: ${YELLOW}sudo ./deploy/wallarm-docker.sh --config${NC}"
|
|
||||||
echo -e " 4. Uninstall a node: ${YELLOW}sudo ./deploy/wallarm-docker.sh --remove${NC}"
|
|
||||||
echo -e " 5. Show node status: ${YELLOW}./deploy/wallarm-docker.sh --status${NC}"
|
|
||||||
echo
|
|
||||||
;;
|
|
||||||
native)
|
|
||||||
echo -e "${CYAN}Native deployment next steps (no Docker):${NC}"
|
|
||||||
echo -e " 1. Run the preflight check: ${YELLOW}sudo ./deploy/wallarm-native.sh --preflight${NC}"
|
|
||||||
echo -e " 2. Deploy Wallarm nodes: ${YELLOW}sudo ./deploy/wallarm-native.sh --install${NC}"
|
|
||||||
echo -e " 3. Update a node's config: ${YELLOW}sudo ./deploy/wallarm-native.sh --config --node NAME --address IP:PORT${NC}"
|
|
||||||
echo -e " 4. Remove a node: ${YELLOW}sudo ./deploy/wallarm-native.sh --remove --node NAME${NC}"
|
|
||||||
echo -e " 5. Show node status: ${YELLOW}./deploy/wallarm-native.sh --status${NC}"
|
|
||||||
echo
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
echo -e "${YELLOW}Note: Some scripts require sudo. Run them with: sudo ./<script>${NC}"
|
|
||||||
echo -e "${YELLOW}Make sure you have the required information ready (see documentation).${NC}"
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue