Files
shop10/scripts/install-shop-service.sh
T

102 lines
3.3 KiB
Bash

#!/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: shop10 или старый /opt/shop
if [ ! -f "$SHOP_ROOT/.env" ] && [ -f /opt/shop/.env ]; then
cp /opt/shop/.env "$SHOP_ROOT/.env"
echo "Скопирован .env из /opt/shop"
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"
# Доступ www-data: чтение кода и .env (systemd читает .env от root, но на всякий случай)
chmod o+x /opt /opt/shop 2>/dev/null || true
chmod -R a+rX "$SHOP_ROOT"
chmod 640 "$SHOP_ROOT/.env"
chown root:www-data "$SHOP_ROOT/.env" 2>/dev/null || chmod 644 "$SHOP_ROOT/.env"
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=+${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
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 curl -sf http://127.0.0.1:3000/health; then
echo ""
echo "OK — служба shop запущена"
systemctl status shop --no-pager | head -15
systemctl reload caddy 2>/dev/null || true
else
echo "shop не отвечает на :3000"
journalctl -u shop -n 40 --no-pager
exit 1
fi