#!/usr/bin/env bash set -euo pipefail if [[ ${EUID} -ne 0 ]]; then printf '%s\n' "bootstrap must run as root" >&2 exit 1 fi SOURCE_DIR=${1:-} if [[ -z "$SOURCE_DIR" || ! -d "$SOURCE_DIR" ]]; then printf '%s\n' "usage: bootstrap.sh " >&2 exit 1 fi export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y ca-certificates certbot curl jq nginx openssl python3-certbot-dns-cloudflare rsync tar gzip ufw fail2ban docker.io docker-compose-v2 systemctl enable --now docker nginx fail2ban if ! id harbor >/dev/null 2>&1; then useradd --system --home /var/lib/harbor --shell /usr/sbin/nologin harbor fi install -d -m 0755 /opt/harbor /opt/harbor/releases /opt/harbor/slots /opt/harbor/deploy install -d -m 2770 -o daniel -g harbor /opt/harbor/incoming install -d -m 0750 -o harbor -g harbor /var/lib/harbor install -d -m 0700 /var/backups/harbor install -d -m 0750 -o root -g harbor /etc/harbor rsync -a --delete "$SOURCE_DIR/" /opt/harbor/deploy/ chown -R root:root /opt/harbor/deploy chmod +x /opt/harbor/deploy/remote/*.sh /opt/harbor/deploy/backup/backup.sh install -m 0644 /opt/harbor/deploy/config/gateway.yaml /etc/harbor/gateway.yaml install -m 0644 /opt/harbor/deploy/systemd/harbor-gateway@.service /etc/systemd/system/harbor-gateway@.service install -m 0644 /opt/harbor/deploy/systemd/harbor-worker@.service /etc/systemd/system/harbor-worker@.service install -m 0644 /opt/harbor/deploy/systemd/harbor-backup.service /etc/systemd/system/harbor-backup.service install -m 0644 /opt/harbor/deploy/systemd/harbor-backup.timer /etc/systemd/system/harbor-backup.timer if [[ ! -f /etc/harbor/harbor.env ]]; then mongo_password=$(openssl rand -hex 24) redis_password=$(openssl rand -hex 24) minio_password=$(openssl rand -hex 24) grafana_password=$(openssl rand -base64 24 | tr -d '/+=') cat > /etc/harbor/harbor.env < /etc/harbor/gateway-blue.env <<'EOF' PORT=8888 EOF cat > /etc/harbor/gateway-green.env <<'EOF' PORT=8889 EOF chmod 0644 /etc/harbor/gateway-blue.env /etc/harbor/gateway-green.env printf '%s\n' 'server 127.0.0.1:8888;' > /etc/nginx/harbor-active-server.conf install -m 0644 /opt/harbor/deploy/nginx/harbor-http.conf /etc/nginx/sites-available/harbor.conf ln -sfn /etc/nginx/sites-available/harbor.conf /etc/nginx/sites-enabled/harbor.conf rm -f /etc/nginx/sites-enabled/default cat > /etc/sudoers.d/harbor-deploy <<'EOF' daniel ALL=(root) NOPASSWD: /opt/harbor/deploy/remote/activate-release.sh * daniel ALL=(root) NOPASSWD: /opt/harbor/deploy/remote/rollback.sh daniel ALL=(root) NOPASSWD: /opt/harbor/deploy/remote/status.sh EOF chmod 0440 /etc/sudoers.d/harbor-deploy visudo -cf /etc/sudoers.d/harbor-deploy systemctl daemon-reload docker compose --env-file /etc/harbor/harbor.env -f /opt/harbor/deploy/compose/docker-compose.yml pull docker compose --env-file /etc/harbor/harbor.env -f /opt/harbor/deploy/compose/docker-compose.yml up -d ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable nginx -t systemctl reload nginx systemctl enable --now harbor-backup.timer printf '%s\n' "bootstrap complete" printf '%s\n' "runtime secrets: /etc/harbor/harbor.env"