CI: деплой через ssh и git pull, README со стилистикой и заметками
deploy / deploy (push) Successful in 9s
deploy / deploy (push) Successful in 9s
- .gitea/workflows/deploy.yml: при пуше в main заходит на сервер по ssh и делает git pull - deploy/: конфиг nginx (root /opt/vizitka-site/web) и скрипт разовой настройки сервера - tools/: генераторы страниц архитектуры и проектов (раньше лежали вне репозитория) - README: стилистика сайта, устройство, деплой, заметки для следующих сессий Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# nginx: статический сайт-визитка. Репозиторий клонирован в /opt/vizitka-site, раздаём его папку web/
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
server_name _;
|
||||
|
||||
root /opt/vizitka-site/web;
|
||||
index index.html;
|
||||
|
||||
# сжатие
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_min_length 512;
|
||||
gzip_types text/css application/javascript application/json image/svg+xml text/plain application/xml;
|
||||
|
||||
# заголовки безопасности (строгий CSP: на сайте нет inline-скриптов и стилей, внешних ресурсов нет)
|
||||
server_tokens off;
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ =404;
|
||||
}
|
||||
|
||||
# кэш: картинки и шрифты надолго, стили и скрипты на час, данные без кэша
|
||||
location ~* \.(woff2|webp|png|jpe?g|svg|ico)$ {
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, max-age=2592000" always;
|
||||
# add_header в location сбрасывает наследуемые, поэтому дублируем безопасные заголовки
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
}
|
||||
location ~* \.(css|js)$ {
|
||||
add_header Cache-Control "public, max-age=3600" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
}
|
||||
location = /config.json {
|
||||
add_header Cache-Control "no-cache" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
}
|
||||
|
||||
# скрытые файлы наружу не отдаём
|
||||
location ~ /\. { deny all; }
|
||||
|
||||
error_page 404 /404.html;
|
||||
location = /404.html { internal; }
|
||||
}
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# Разовая подготовка сервера: nginx, git, клон репозитория в /opt/vizitka-site. Безопасно запускать повторно.
|
||||
# Использование: ./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}" # репозиторий публичный: ключи не нужны
|
||||
HERE="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
scp -q "$HERE/nginx-site.conf" "$TARGET:/tmp/vizitka-nginx.conf"
|
||||
ssh "$TARGET" "REPO_URL='$REPO_URL' bash -s" <<'REMOTE'
|
||||
set -euo pipefail
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
if ! command -v nginx >/dev/null || ! command -v git >/dev/null; then
|
||||
apt-get update -qq
|
||||
apt-get install -y -qq nginx git >/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
|
||||
|
||||
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), сайт: $DIR/web (коммит $(git -C "$DIR" rev-parse --short HEAD))"
|
||||
REMOTE
|
||||
Reference in New Issue
Block a user