#!/usr/bin/env bash # Разовая подготовка сервера: nginx, git, nodejs, клон репозитория в /opt/vizitka-site, сервис API счётчика. # Безопасно запускать повторно. Использование: ./deploy/setup-server.sh root@192.168.10.112 # Обновления потом приходят через `git pull` (его делает CI, см. .gitea/workflows/deploy.yml). set -euo pipefail TARGET="${1:?укажите сервер: ./deploy/setup-server.sh root@192.168.10.112}" REPO_URL="${REPO_URL:-https://git.ibrash.duckdns.org/aibrash/vizitka-site.git}" # репозиторий публичный: ключи не нужны # откуда разрешены POST к API (домен сайта и адрес в локальной сети) ORIGINS="${ORIGINS:-https://me.ibrash.duckdns.org,http://me.ibrash.duckdns.org,http://192.168.10.112}" HERE="$(cd "$(dirname "$0")" && pwd)" scp -q "$HERE/nginx-site.conf" "$TARGET:/tmp/vizitka-nginx.conf" scp -q "$HERE/vizitka-api.service" "$TARGET:/tmp/vizitka-api.service" ssh "$TARGET" "REPO_URL='$REPO_URL' ORIGINS='$ORIGINS' bash -s" <<'REMOTE' set -euo pipefail export DEBIAN_FRONTEND=noninteractive if ! command -v nginx >/dev/null || ! command -v git >/dev/null || ! command -v node >/dev/null; then apt-get update -qq apt-get install -y -qq nginx git nodejs >/dev/null fi DIR=/opt/vizitka-site if [ -d "$DIR/.git" ]; then git -C "$DIR" pull --ff-only else [ -e "$DIR" ] && mv "$DIR" "$DIR.old-$(date +%s)" # старое содержимое (не репозиторий) откладываем, не удаляем git clone "$REPO_URL" "$DIR" fi # сервис API: настройки лежат вне репозитория; существующий файл не перезаписываем if [ ! -f /etc/vizitka-api.env ]; then cat > /etc/vizitka-api.env </dev/null 2>&1 systemctl restart vizitka-api install -m 644 /tmp/vizitka-nginx.conf /etc/nginx/sites-available/vizitka-site ln -sf /etc/nginx/sites-available/vizitka-site /etc/nginx/sites-enabled/vizitka-site rm -f /etc/nginx/sites-enabled/default nginx -t systemctl enable --now nginx >/dev/null 2>&1 systemctl reload nginx echo "готово: nginx $(nginx -v 2>&1 | cut -d/ -f2), node $(node --version), сайт $DIR/web (коммит $(git -C "$DIR" rev-parse --short HEAD)), API: $(systemctl is-active vizitka-api)" REMOTE