68 lines
2.8 KiB
Bash
68 lines
2.8 KiB
Bash
#!/usr/bin/env bash
|
|
# burnServ worker bootstrap — join as WORKER only (no temp manager)
|
|
# Run as root (e.g., cloud-init user-data or startup script)
|
|
|
|
set -euo pipefail
|
|
|
|
### === CONFIG: fill these in ===
|
|
SWARM_MANAGER_ADDR="10.10.10.5:2377" # e.g., 10.10.10.7:2377
|
|
WORKER_JOIN_TOKEN="SWMTKN-1-2a2sxynvwvpcapqysty6fyifxjsdu7xlk529r05nnvi6g7i01c-e700ngcb66bp9rp04am7cmcli"
|
|
|
|
# Shared storage (NFS)
|
|
NFS_SERVER="10.10.10.8" # e.g., 10.10.10.7
|
|
NFS_EXPORT="/mnt/data" # e.g., /volume2/nfs0 or /mnt/data
|
|
MOUNTPOINT="/mnt/data"
|
|
|
|
# Optional local user
|
|
LINUX_USER="josh"
|
|
SSH_PUBKEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOFiNTLzVAex3rG3P233A85qwClxlhm+vIjhvi6e1tER josh@jos
|
|
h-zbook" # leave empty to skip
|
|
|
|
### ===============================
|
|
|
|
log(){ echo "[bootstrap] $*"; }
|
|
|
|
log "Installing base packages"
|
|
apt-get update -y
|
|
apt-get install -y ca-certificates curl gnupg lsb-release nfs-common uidmap
|
|
|
|
log "Ensuring user '${LINUX_USER}'"
|
|
if ! id -u "$LINUX_USER" >/dev/null 2>&1; then
|
|
adduser --disabled-password --gecos "" "$LINUX_USER"
|
|
fi
|
|
if [[ -n "$SSH_PUBKEY" ]]; then
|
|
install -d -m 700 -o "$LINUX_USER" -g "$LINUX_USER" "/home/$LINUX_USER/.ssh"
|
|
touch "/home/$LINUX_USER/.ssh/authorized_keys"
|
|
chown "$LINUX_USER:$LINUX_USER" "/home/$LINUX_USER/.ssh/authorized_keys"
|
|
chmod 600 "/home/$LINUX_USER/.ssh/authorized_keys"
|
|
grep -qxF "$SSH_PUBKEY" "/home/$LINUX_USER/.ssh/authorized_keys" || echo "$SSH_PUBKEY" >> "/home/$LINUX_USER/.ssh/authorized_keys"
|
|
fi
|
|
|
|
log "Installing Docker (official repo)"
|
|
install -m 0755 -d /etc/apt/keyrings
|
|
curl -fsSL "https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg" | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
chmod a+r /etc/apt/keyrings/docker.gpg
|
|
echo \
|
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
|
|
https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
|
|
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
|
|
| tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
apt-get update -y
|
|
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
usermod -aG docker "$LINUX_USER" || true
|
|
|
|
log "Mounting NFS ${NFS_SERVER}:${NFS_EXPORT} -> ${MOUNTPOINT}"
|
|
mkdir -p "$MOUNTPOINT"
|
|
if ! grep -qE "^\s*${NFS_SERVER}:${NFS_EXPORT}\s+${MOUNTPOINT}\s+nfs" /etc/fstab; then
|
|
echo "${NFS_SERVER}:${NFS_EXPORT} ${MOUNTPOINT} nfs defaults,_netdev,proto=tcp,noatime 0 0" >> /etc/fstab
|
|
fi
|
|
mount -a
|
|
|
|
log "Joining swarm as WORKER"
|
|
# leave any existing swarm membership (idempotent)
|
|
if docker info 2>/dev/null | grep -q 'Swarm: active'; then
|
|
docker swarm leave --force || true
|
|
fi
|
|
docker swarm join --token "$WORKER_JOIN_TOKEN" "$SWARM_MANAGER_ADDR"
|
|
|
|
log "Done. Labels can be applied from a manager (e.g., scripts/bs-label-workers.sh)." |