package nodeinstall import ( "fmt" "strings" "github.com/orohi/vpn-panel/internal/models" ) const AgentVersion = "0.3.0" func ComposeYAML(n *models.Node) string { return fmt.Sprintf(`services: vpn-node: container_name: vpn-panel-node image: alpine:3.21 restart: unless-stopped network_mode: host environment: NODE_NAME: %q NODE_PORT: %q SECRET_KEY: %q AGENT_VERSION: %q DATA_DIR: /var/lib/vpn-node HOST_DATA_DIR: /opt/vpn-panel-node/data volumes: - ./vpn-node:/usr/local/bin/vpn-node:ro - ./data:/var/lib/vpn-node - /var/run/docker.sock:/var/run/docker.sock command: ["sh", "-c", "apk add --no-cache docker-cli >/dev/null && exec /usr/local/bin/vpn-node"] `, n.Name, fmt.Sprintf("%d", n.NodePort), n.SecretKey, AgentVersion) } func ManualInstallScript(n *models.Node) string { compose := ComposeYAML(n) var b strings.Builder b.WriteString("#!/usr/bin/env bash\n") b.WriteString("set -euo pipefail\n\n") b.WriteString("sudo curl -fsSL https://get.docker.com | sh\n") b.WriteString("sudo mkdir -p /opt/vpn-panel-node/data\n") b.WriteString("cd /opt/vpn-panel-node\n\n") b.WriteString("cat > docker-compose.yml <<'EOF'\n") b.WriteString(compose) b.WriteString("EOF\n\n") b.WriteString("# Скопируйте бинарник vpn-node (linux amd64) в /opt/vpn-panel-node/vpn-node\n") b.WriteString("# chmod +x /opt/vpn-panel-node/vpn-node\n") b.WriteString("# docker compose up -d && docker compose logs -f -t\n") b.WriteString("\necho \"NODE_PORT=") b.WriteString(fmt.Sprintf("%d", n.NodePort)) b.WriteString(" — откройте его только для IP панели\"\n") return b.String() }