docs: один зарегистрированный администратор (ADMIN_EMAIL)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+2
-1
@@ -4,7 +4,8 @@ NODE_ENV=production
|
|||||||
TRUST_PROXY=1
|
TRUST_PROXY=1
|
||||||
SESSION_SECRET=change-me-to-a-long-random-string
|
SESSION_SECRET=change-me-to-a-long-random-string
|
||||||
|
|
||||||
# Первый администратор (создаётся при старте, если email не занят)
|
# Единственный администратор (зарегистрированный пользователь с этим email)
|
||||||
|
# При регистрации через сайт все получают роль customer; admin — только этот аккаунт
|
||||||
ADMIN_EMAIL=admin@site.com
|
ADMIN_EMAIL=admin@site.com
|
||||||
ADMIN_PASSWORD=admin
|
ADMIN_PASSWORD=admin
|
||||||
ADMIN_NAME=Администратор
|
ADMIN_NAME=Администратор
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
- Корзина и оформление заказа
|
- Корзина и оформление заказа
|
||||||
- Регистрация, вход (пароль или passkey), сброс пароля по email
|
- Регистрация, вход (пароль или passkey), сброс пароля по email
|
||||||
- Личный кабинет: профиль, бронирования
|
- Личный кабинет: профиль, бронирования
|
||||||
- Роли клиент / администратор, админ-панель
|
- Роли: клиент (`customer`) и **один** администратор (`admin`) — аккаунт из `ADMIN_EMAIL` в `.env`
|
||||||
- Согласие на cookies
|
- Согласие на cookies
|
||||||
- Подписка «сообщить о поступлении», если товара нет в наличии
|
- Подписка «сообщить о поступлении», если товара нет в наличии
|
||||||
|
|
||||||
@@ -158,6 +158,16 @@ DATABASE_URL=postgresql://shop:shop@127.0.0.1:5432/shop
|
|||||||
| `DATABASE_URL` | Строка подключения PostgreSQL |
|
| `DATABASE_URL` | Строка подключения PostgreSQL |
|
||||||
| `PGHOST`, `PGPORT`, `PGUSER`, `PGPASSWORD`, `PGDATABASE` | Альтернатива `DATABASE_URL` |
|
| `PGHOST`, `PGPORT`, `PGUSER`, `PGPASSWORD`, `PGDATABASE` | Альтернатива `DATABASE_URL` |
|
||||||
| `HOST` | `127.0.0.1` в production (доступ через Caddy) |
|
| `HOST` | `127.0.0.1` в production (доступ через Caddy) |
|
||||||
|
| `ADMIN_EMAIL` | Email **единственного** администратора (создаётся/обновляется при старте) |
|
||||||
|
| `ADMIN_PASSWORD` | Пароль администратора (только при первом создании аккаунта) |
|
||||||
|
| `ADMIN_NAME` | Имя администратора |
|
||||||
|
|
||||||
|
### Роли и администратор
|
||||||
|
|
||||||
|
- Через **регистрацию** на сайте все пользователи получают роль **клиент** (`customer`).
|
||||||
|
- **Один** зарегистрированный пользователь — **администратор**: аккаунт с email из `ADMIN_EMAIL` (по умолчанию `admin@site.com`). При старте приложения он создаётся, если ещё нет, или ему назначается роль `admin`.
|
||||||
|
- Админ-панель: `/admin` (кнопка в шапке и в личном кабинете — только у администратора).
|
||||||
|
- Сменить администратора: укажите другой email в `ADMIN_EMAIL` и перезапустите shop (прежние admin-аккаунты станут клиентами).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -685,6 +685,15 @@ a:hover {
|
|||||||
margin-top: 1.25rem;
|
margin-top: 1.25rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.admin-hint {
|
||||||
|
margin: 0 0 1rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-hint code {
|
||||||
|
font-size: 0.85em;
|
||||||
|
}
|
||||||
|
|
||||||
.admin-header {
|
.admin-header {
|
||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-2
@@ -7,6 +7,15 @@ async function seedAdmin() {
|
|||||||
const password = process.env.ADMIN_PASSWORD || 'admin';
|
const password = process.env.ADMIN_PASSWORD || 'admin';
|
||||||
const name = process.env.ADMIN_NAME || 'Администратор';
|
const name = process.env.ADMIN_NAME || 'Администратор';
|
||||||
|
|
||||||
|
// Только один администратор — пользователь с ADMIN_EMAIL (остальные customer)
|
||||||
|
const { rowCount: demoted } = await query(
|
||||||
|
`UPDATE users SET role = $1 WHERE role = $2 AND email != $3`,
|
||||||
|
[ROLES.CUSTOMER, ROLES.ADMIN, email]
|
||||||
|
);
|
||||||
|
if (demoted > 0) {
|
||||||
|
console.log('Снята роль admin у', demoted, 'пользоват(елей) — админ только:', email);
|
||||||
|
}
|
||||||
|
|
||||||
const { rows } = await query('SELECT id, role FROM users WHERE email = $1', [email]);
|
const { rows } = await query('SELECT id, role FROM users WHERE email = $1', [email]);
|
||||||
|
|
||||||
if (!rows[0]) {
|
if (!rows[0]) {
|
||||||
@@ -16,13 +25,13 @@ async function seedAdmin() {
|
|||||||
VALUES ($1, $2, $3, $4)`,
|
VALUES ($1, $2, $3, $4)`,
|
||||||
[email, hash, name, ROLES.ADMIN]
|
[email, hash, name, ROLES.ADMIN]
|
||||||
);
|
);
|
||||||
console.log('Создан администратор:', email);
|
console.log('Создан администратор (единственный):', email);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rows[0].role !== ROLES.ADMIN) {
|
if (rows[0].role !== ROLES.ADMIN) {
|
||||||
await query('UPDATE users SET role = $1 WHERE id = $2', [ROLES.ADMIN, rows[0].id]);
|
await query('UPDATE users SET role = $1 WHERE id = $2', [ROLES.ADMIN, rows[0].id]);
|
||||||
console.log('Пользователю назначена роль admin:', email);
|
console.log('Назначен единственный администратор:', email);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,11 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<p class="muted admin-hint">
|
||||||
|
Один администратор — зарегистрированный пользователь с email из <code>ADMIN_EMAIL</code> в <code>.env</code>.
|
||||||
|
Остальные при регистрации получают роль «Клиент».
|
||||||
|
</p>
|
||||||
|
|
||||||
<table class="cart-table">
|
<table class="cart-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -16,6 +16,15 @@
|
|||||||
|
|
||||||
**Без Docker:** Ubuntu 22.04 / 24.04, Node.js 20, PostgreSQL 17.
|
**Без Docker:** Ubuntu 22.04 / 24.04, Node.js 20, PostgreSQL 17.
|
||||||
|
|
||||||
|
## Роли
|
||||||
|
|
||||||
|
| Роль | Кто |
|
||||||
|
|------|-----|
|
||||||
|
| **customer** | Все, кто регистрируется через сайт |
|
||||||
|
| **admin** | **Один** пользователь — email из `ADMIN_EMAIL` в `.env` (по умолчанию `admin@site.com` / пароль `admin`) |
|
||||||
|
|
||||||
|
Админ-панель доступна только этому аккаунту.
|
||||||
|
|
||||||
## Быстрый старт
|
## Быстрый старт
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|||||||
Reference in New Issue
Block a user