Compare commits
4 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc6bfc94b8 | ||
|
|
b0ed6ac499 | ||
|
|
3899c78a89 | ||
|
|
dc1b30a34e |
14
activator/Dockerfile
Normal file
14
activator/Dockerfile
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
FROM debian:bookworm-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN useradd -r -m -d /app appuser
|
||||||
|
|
||||||
|
COPY activator-force-monitor /app/activator-force-monitor
|
||||||
|
RUN chmod +x /app/activator-force-monitor
|
||||||
|
|
||||||
|
USER appuser
|
||||||
|
|
||||||
|
EXPOSE 8090
|
||||||
|
|
||||||
|
CMD ["/app/activator-force-monitor"]
|
||||||
Binary file not shown.
7
activator/docker-compose.yml
Normal file
7
activator/docker-compose.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
services:
|
||||||
|
tonnage-activator:
|
||||||
|
build: .
|
||||||
|
container_name: tonnage-activator
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8099:8090"
|
||||||
143
activator/install.sh
Executable file
143
activator/install.sh
Executable file
|
|
@ -0,0 +1,143 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# ── Config ─────────────────────────────────────────────
|
||||||
|
CONTAINER_ENGINE="${CONTAINER_ENGINE:-}"
|
||||||
|
IMAGE_NAME="${IMAGE_NAME:-license-activator}"
|
||||||
|
CONTAINER_NAME="${CONTAINER_NAME:-license-activator}"
|
||||||
|
HOST_PORT="${HOST_PORT:-8090}"
|
||||||
|
|
||||||
|
# ── Detect Docker / Podman ─────────────────────────────
|
||||||
|
if [ -z "$CONTAINER_ENGINE" ]; then
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
CONTAINER_ENGINE=docker
|
||||||
|
elif command -v podman &>/dev/null; then
|
||||||
|
CONTAINER_ENGINE=podman
|
||||||
|
else
|
||||||
|
echo "Error: neither docker nor podman found. Install one first." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "Using container engine: $CONTAINER_ENGINE"
|
||||||
|
|
||||||
|
# ── Check daemon is running ────────────────────────────
|
||||||
|
if ! $CONTAINER_ENGINE info >/dev/null 2>&1; then
|
||||||
|
echo "Error: $CONTAINER_ENGINE daemon is not running or you lack permissions." >&2
|
||||||
|
echo " Start the daemon or add your user to the docker/podman group." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Stop & remove existing container ───────────────────
|
||||||
|
if $CONTAINER_ENGINE ps -a --format '{{.Names}}' | grep -Eq "^${CONTAINER_NAME}$"; then
|
||||||
|
echo ""
|
||||||
|
echo "Container '$CONTAINER_NAME' already exists."
|
||||||
|
echo " → Stopping..."
|
||||||
|
$CONTAINER_ENGINE stop "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
||||||
|
echo " → Removing..."
|
||||||
|
$CONTAINER_ENGINE rm "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
||||||
|
echo " → Old container cleaned up."
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo "No existing container '$CONTAINER_NAME' found."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Check if host port is already in use (by something else) ──
|
||||||
|
check_port_in_use() {
|
||||||
|
local port="$1"
|
||||||
|
if command -v ss &>/dev/null; then
|
||||||
|
ss -tln | awk '{print $4}' | grep -Eq ":${port}$"
|
||||||
|
elif command -v netstat &>/dev/null; then
|
||||||
|
netstat -tln 2>/dev/null | awk '{print $4}' | grep -Eq ":${port}$"
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if check_port_in_use "$HOST_PORT"; then
|
||||||
|
echo "Error: port $HOST_PORT is already listening on this host (another process)." >&2
|
||||||
|
echo " Use a different port: HOST_PORT=8080 ./install.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Locate main.go ─────────────────────────────────────
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
MAIN_GO="$SCRIPT_DIR/main.go"
|
||||||
|
|
||||||
|
if [ ! -f "$MAIN_GO" ]; then
|
||||||
|
echo "Error: main.go not found in $SCRIPT_DIR" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── Prepare build context ──────────────────────────────
|
||||||
|
BUILD_DIR=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$BUILD_DIR"' EXIT
|
||||||
|
cp "$MAIN_GO" "$BUILD_DIR/"
|
||||||
|
|
||||||
|
cat > "$BUILD_DIR/Dockerfile" <<'EOF'
|
||||||
|
FROM golang:1.23-alpine AS builder
|
||||||
|
WORKDIR /build
|
||||||
|
COPY main.go .
|
||||||
|
RUN go mod init license-activator && go mod tidy
|
||||||
|
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o activator main.go
|
||||||
|
|
||||||
|
FROM alpine:latest
|
||||||
|
RUN apk add --no-cache ca-certificates
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /build/activator .
|
||||||
|
EXPOSE 8090
|
||||||
|
ENTRYPOINT ["./activator"]
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# ── Build ──────────────────────────────────────────────
|
||||||
|
echo "Building image $IMAGE_NAME:latest..."
|
||||||
|
$CONTAINER_ENGINE build -t "$IMAGE_NAME:latest" "$BUILD_DIR"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# ── Run ────────────────────────────────────────────────
|
||||||
|
echo "Starting container '$CONTAINER_NAME' on port $HOST_PORT..."
|
||||||
|
$CONTAINER_ENGINE run -d \
|
||||||
|
--name "$CONTAINER_NAME" \
|
||||||
|
-p "${HOST_PORT}:8090" \
|
||||||
|
--restart unless-stopped \
|
||||||
|
"$IMAGE_NAME:latest"
|
||||||
|
|
||||||
|
# ── Wait a moment for container to start ───────────────
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
# ── Show container status ──────────────────────────────
|
||||||
|
echo ""
|
||||||
|
echo "═══════════════════════════════════════════════════════"
|
||||||
|
echo " CONTAINER STATUS"
|
||||||
|
echo "═══════════════════════════════════════════════════════"
|
||||||
|
|
||||||
|
$CONTAINER_ENGINE ps --filter "name=^${CONTAINER_NAME}$" --format \
|
||||||
|
" Name: {{.Names}}
|
||||||
|
Image: {{.Image}}
|
||||||
|
Status: {{.Status}}
|
||||||
|
State: {{.State}}
|
||||||
|
Ports: {{.Ports}}
|
||||||
|
Created: {{.CreatedAt}}
|
||||||
|
Command: {{.Command}}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "═══════════════════════════════════════════════════════"
|
||||||
|
echo " HEALTH CHECK"
|
||||||
|
echo "═══════════════════════════════════════════════════════"
|
||||||
|
|
||||||
|
if curl -sf http://localhost:${HOST_PORT}/api/health >/dev/null 2>&1; then
|
||||||
|
echo " ✅ Health endpoint responding on http://localhost:${HOST_PORT}/api/health"
|
||||||
|
curl -s http://localhost:${HOST_PORT}/api/health | sed 's/^/ /'
|
||||||
|
else
|
||||||
|
echo " ⚠️ Health endpoint not responding yet (may need a few seconds)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "═══════════════════════════════════════════════════════"
|
||||||
|
echo " QUICK COMMANDS"
|
||||||
|
echo "═══════════════════════════════════════════════════════"
|
||||||
|
echo " Open app: http://localhost:${HOST_PORT}"
|
||||||
|
echo " View logs: $CONTAINER_ENGINE logs -f $CONTAINER_NAME"
|
||||||
|
echo " Stop: $CONTAINER_ENGINE stop $CONTAINER_NAME"
|
||||||
|
echo " Remove: $CONTAINER_ENGINE rm -f $CONTAINER_NAME"
|
||||||
|
echo " Shell inside: $CONTAINER_ENGINE exec -it $CONTAINER_NAME sh"
|
||||||
|
echo ""
|
||||||
Loading…
Reference in a new issue