deploy / deploy (push) Successful in 4s
- Главная: тихая кнопка «Помахать» (web/js/wave.js), общий счётчик для всех посетителей - server/server.mjs: мини-API (/api/waves, /api/wave), счётчик хранится вне репозитория (/var/lib/vizitka-site/waves.json), лимит раз в секунду с IP, проверка Origin - deploy: systemd-сервис vizitka-api, проксирование /api в nginx, setup-server.sh ставит nodejs - CI: после git pull перезапускает API - Домен https://me.ibrash.duckdns.org вместо заглушки, исправлен пробел в шапке - README и заметки обновлены Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
53 lines
2.6 KiB
Bash
Executable File
53 lines
2.6 KiB
Bash
Executable File
#!/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 <<ENV
|
|
PORT=8787
|
|
HOST=127.0.0.1
|
|
DATA_FILE=/var/lib/vizitka-site/waves.json
|
|
ALLOWED_ORIGINS=$ORIGINS
|
|
TRUST_PROXY=1
|
|
ENV
|
|
fi
|
|
install -m 644 /tmp/vizitka-api.service /etc/systemd/system/vizitka-api.service
|
|
systemctl daemon-reload
|
|
systemctl enable vizitka-api >/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
|