diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index d95aca7..b1d7b56 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -13,13 +13,15 @@ docker compose exec web npx prisma db push curl -fsSL https://raw.githubusercontent.com/andrey271192/Domain_web/main/install.sh | sudo bash ``` -Install path: `/opt/domain_web` -Service: Docker Compose (`web`, `postgres`, `redis`) -Nginx site: `domain-scanner` on port 80 → app `:3000` +Install path: `/opt/domain-scanner` (lite VPS install via `install.sh`) +Service: `domain-scanner.service` — `npm start` from repo root (not standalone `server.js` alone) +Nginx site: `domain-scanner` on port 80 → app `:3000`, with `/_next/static/` served from disk + +**CSS / static assets:** After `next build`, run `scripts/sync-standalone-assets.sh` (also via `postbuild`) so `.next/static` and `public` exist under `.next/standalone` for Docker. Host deploy must keep `${INSTALL_DIR}/.next/static` — never run `node .next/standalone/server.js` without that copy. ## Environment on server -Edit `/opt/domain_web/.env`: +Edit `/opt/domain-scanner/.env`: - `NEXTAUTH_SECRET` — auto-generated on first install - `NEXTAUTH_URL` / `NEXT_PUBLIC_APP_URL` — public IP or domain @@ -39,5 +41,5 @@ Place certbot in front of nginx or terminate TLS at a reverse proxy. ## Upgrades ```bash -cd /opt/domain_web && git pull && docker compose up -d --build +cd /opt/domain-scanner && git pull && npm ci && npm run build && systemctl restart domain-scanner nginx ``` diff --git a/install.sh b/install.sh index 0964c9e..9a46967 100755 --- a/install.sh +++ b/install.sh @@ -109,6 +109,7 @@ build_app() { npx prisma generate npx prisma db push npm run build + bash scripts/sync-standalone-assets.sh "${INSTALL_DIR}" # Keep production deps at repo root; `next start` is more reliable than # standalone on small VPS (avoids incomplete traced node_modules). npm ci --omit=dev @@ -154,6 +155,13 @@ server { client_max_body_size 32m; + location /_next/static/ { + alias ${INSTALL_DIR}/.next/static/; + expires 1y; + add_header Cache-Control "public, max-age=31536000, immutable"; + access_log off; + } + location / { proxy_pass http://127.0.0.1:${APP_PORT}; proxy_http_version 1.1; @@ -188,6 +196,18 @@ verify() { echo "Health check failed on port ${APP_PORT}" >&2 exit 1 fi + local css + css="$(find "${INSTALL_DIR}/.next/static/css" -name '*.css' -type f 2>/dev/null | head -1 || true)" + if [[ -z "${css}" ]]; then + echo "ERROR: no CSS build output in .next/static/css" >&2 + exit 1 + fi + local css_url="/_next/static/css/$(basename "${css}")" + if ! curl -fsSI "http://127.0.0.1${css_url}" | grep -qi 'content-type:.*css'; then + echo "ERROR: CSS not served (${css_url})" >&2 + exit 1 + fi + log "CSS OK: ${css_url}" local title title="$(curl -fsS "http://127.0.0.1/" | grep -o '