#!/bin/bash # Установка systemd-службы shop (после git clone и .env) # sudo bash scripts/install-shop-service.sh set -euo pipefail if [ "$(id -u)" -ne 0 ]; then echo "Запустите от root: sudo bash scripts/install-shop-service.sh" exit 1 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/shop-root.sh" echo "=== Установка службы shop ===" echo "Каталог: $SHOP_ROOT" if [ ! -f "$SHOP_ROOT/package.json" ]; then echo "Ошибка: нет package.json в $SHOP_ROOT" exit 1 fi # .env в родительском каталоге (если переносили клон) PARENT_ENV="$(dirname "$SHOP_ROOT")/.env" if [ ! -f "$SHOP_ROOT/.env" ] && [ -f "$PARENT_ENV" ]; then cp "$PARENT_ENV" "$SHOP_ROOT/.env" echo "Скопирован .env из $(dirname "$SHOP_ROOT")" fi if [ ! -f "$SHOP_ROOT/.env" ]; then if [ -f "$SHOP_ROOT/.env.example" ]; then cp "$SHOP_ROOT/.env.example" "$SHOP_ROOT/.env" if command -v openssl >/dev/null; then sed -i "s/change-me-to-a-long-random-string/$(openssl rand -hex 32)/" "$SHOP_ROOT/.env" fi echo "Создан .env — проверьте DATABASE_URL" else echo "Ошибка: нет .env" exit 1 fi fi if ! grep -q '^DATABASE_URL=' "$SHOP_ROOT/.env"; then echo "Добавляю DATABASE_URL по умолчанию..." echo 'DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop' >> "$SHOP_ROOT/.env" fi NODE_BIN=$(command -v node) echo "Node: $NODE_BIN ($($NODE_BIN -v))" chmod +x "$SHOP_ROOT/scripts/wait-postgres.sh" 2>/dev/null || true if command -v pg_isready >/dev/null; then bash "$SCRIPT_DIR/install-postgresql-ubuntu.sh" 2>/dev/null || true systemctl enable postgresql 2>/dev/null || true systemctl start postgresql 2>/dev/null || true bash "$SCRIPT_DIR/setup-postgres-ubuntu.sh" 2>/dev/null || true fi npm install --omit=dev --prefix "$SHOP_ROOT" bash "$SCRIPT_DIR/fix-shop-permissions.sh" cp -f "$SHOP_ROOT/deploy/shop.service" /etc/systemd/system/shop.service sed -i "s|WorkingDirectory=.*|WorkingDirectory=${SHOP_ROOT}|" /etc/systemd/system/shop.service sed -i "s|EnvironmentFile=.*|EnvironmentFile=${SHOP_ROOT}/.env|" /etc/systemd/system/shop.service sed -i "s|ExecStartPre=.*|ExecStartPre=+/bin/bash ${SHOP_ROOT}/scripts/wait-postgres.sh|" /etc/systemd/system/shop.service sed -i "s|ExecStart=.*|ExecStart=${NODE_BIN} src/server.js|" /etc/systemd/system/shop.service if ! sudo -u www-data test -r "$SHOP_ROOT/package.json"; then echo "Ошибка: www-data не читает $SHOP_ROOT" ls -la "$SHOP_ROOT" | head -5 exit 1 fi systemctl daemon-reload systemctl enable shop systemctl stop shop 2>/dev/null || true bash "$SCRIPT_DIR/free-port-3000.sh" 3000 echo "Запуск shop..." if ! systemctl restart shop; then echo "" echo "=== Ошибка запуска — лог ===" journalctl -u shop -n 40 --no-pager echo "" bash "$SCRIPT_DIR/diagnose-shop-service.sh" || true exit 1 fi sleep 3 if ! systemctl is-active --quiet shop; then echo "shop.service не в состоянии active" journalctl -u shop -n 40 --no-pager exit 1 fi if curl -sf http://127.0.0.1:3000/health; then echo "" echo "OK — служба shop запущена (systemd active)" systemctl status shop --no-pager | head -15 systemctl reload caddy 2>/dev/null || true else echo "health не отвечает" journalctl -u shop -n 40 --no-pager exit 1 fi