Compare commits

..
4 Commits
7 changed files with 226 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# data/ — дамп данных прежней БД
Здесь сохранены данные, выгруженные из **прежней** PostgreSQL (инстанс
`postgresqlk8s-master.60bdf3e3-...`, БД `ipwhitelist`), до переноса в новую
(инстанс `a5e9d24f`).
## Файлы
| Файл | Таблица | Строк | Описание |
|---|---|---|---|
| `companies.json` | companies | 9 | метаданные компаний (id, client_id, name, custom_limit, created_at, updated_at) |
| `whitelist_entries.json` | whitelist_entries | 20 | записи белого списка (IP, comment, кто создал/изменил/удалил, даты) |
| `audit_log.json` | audit_log | 39 | журнал аудита (user_email, company_id, action, old/new_value, entry_id, created_at) |
| `_migrations.json` | _migrations | 2 | применённые миграции |
| `import.sql` | — | 84 строки | готовый SQL-скрипт вставки (companies → entries → audit + sequence) |
Формат каждого `.json` — ответ `POST /api/sql`:
```json
{ "ok": true, "fields": [...], "rows": [...], "rowCount": N }
```
## Почему нет session.json
Таблица `session` (1147 строк) — временные пользовательские сессии входа
(`connect-pg-simple`). Для переноса белых списков не нужна и не переносится —
в новой БД сессии создаются заново. Дамп `session.json` был обрезан и удалён.
## import.sql
Генерируется из `*.json` и содержит:
- `BEGIN; ... COMMIT;` — транзакция
- INSERT для `companies` (с явными id, `ON CONFLICT (id) DO NOTHING`)
- INSERT для `whitelist_entries` (id + company_id — ссылки сохранены)
- INSERT для `audit_log`
- `SELECT setval(...)` — сброс sequence на MAX(id)
**Важно:** `/api/sql` выполняет ОДИН statement за вызов, поэтому `import.sql` целиком
никак не выполнить одним запросом. Вставка делалась клиентом по одному INSERT.
+1
View File
@@ -0,0 +1 @@
{"ok":true,"fields":["id","filename","applied_at"],"rows":[{"id":1,"filename":"001_add_impersonated_by.sql","applied_at":"2026-07-08T03:18:25.619Z"},{"id":2,"filename":"002_add_audit_restore.sql","applied_at":"2026-07-08T03:18:25.623Z"}],"rowCount":2}
+1
View File
@@ -0,0 +1 @@
{"ok":true,"fields":["id","user_email","company_id","action","old_value","new_value","entry_id","impersonated_by","created_at"],"rows":[{"id":1,"user_email":"tazet@narod.ru","company_id":1,"action":"CREATE","old_value":null,"new_value":"1.2.3.4/30","entry_id":1,"impersonated_by":null,"created_at":"2026-06-23T09:54:29.541Z"},{"id":2,"user_email":"tazet@narod.ru","company_id":1,"action":"DELETE","old_value":"1.2.3.4/30","new_value":null,"entry_id":1,"impersonated_by":null,"created_at":"2026-06-23T09:57:25.431Z"},{"id":3,"user_email":"dsorokin@nubes.ru","company_id":2,"action":"CREATE","old_value":null,"new_value":"91.247.235.224/32","entry_id":2,"impersonated_by":null,"created_at":"2026-07-01T07:52:27.401Z"},{"id":4,"user_email":"dsorokin@nubes.ru","company_id":2,"action":"CREATE","old_value":null,"new_value":"79.111.119.78/32","entry_id":3,"impersonated_by":null,"created_at":"2026-07-01T07:53:20.615Z"},{"id":5,"user_email":"helpwanted187@gmail.com","company_id":69,"action":"CREATE","old_value":null,"new_value":"3.3.3.0/28","entry_id":4,"impersonated_by":null,"created_at":"2026-07-07T08:10:04.800Z"},{"id":6,"user_email":"helpwanted187@gmail.com","company_id":69,"action":"DELETE","old_value":"3.3.3.0/28","new_value":null,"entry_id":4,"impersonated_by":null,"created_at":"2026-07-07T08:10:14.608Z"},{"id":7,"user_email":"nstasyuk@nubes.ru","company_id":2,"action":"DELETE","old_value":"79.111.119.78/32","new_value":null,"entry_id":3,"impersonated_by":null,"created_at":"2026-07-07T08:10:57.260Z"},{"id":8,"user_email":"nstasyuk@nubes.ru","company_id":2,"action":"DELETE","old_value":"91.247.235.224/32","new_value":null,"entry_id":2,"impersonated_by":null,"created_at":"2026-07-07T08:10:58.717Z"},{"id":9,"user_email":"nstasyuk@nubes.ru","company_id":2,"action":"CREATE","old_value":null,"new_value":"102.15.15.0/24","entry_id":5,"impersonated_by":null,"created_at":"2026-07-07T08:12:10.483Z"},{"id":10,"user_email":"nstasyuk@nubes.ru","company_id":2,"action":"DELETE","old_value":"102.15.15.0/24","new_value":null,"entry_id":5,"impersonated_by":null,"created_at":"2026-07-07T08:12:23.831Z"},{"id":11,"user_email":"ntazetdinov@nubes.ru","company_id":2,"action":"CREATE","old_value":null,"new_value":"1.1.1.11/32","entry_id":6,"impersonated_by":null,"created_at":"2026-07-07T15:25:13.970Z"},{"id":12,"user_email":"ntazetdinov@nubes.ru","company_id":2,"action":"DELETE","old_value":"1.1.1.11/32","new_value":null,"entry_id":6,"impersonated_by":null,"created_at":"2026-07-07T15:25:23.538Z"},{"id":13,"user_email":"ntazetdinov@nubes.ru","company_id":2,"action":"RESTORE","old_value":"79.111.119.78/32","new_value":"79.111.119.78/32","entry_id":3,"impersonated_by":null,"created_at":"2026-07-07T17:56:02.930Z"},{"id":14,"user_email":"ntazetdinov@nubes.ru","company_id":2,"action":"RESTORE","old_value":"91.247.235.224/32","new_value":"91.247.235.224/32","entry_id":2,"impersonated_by":null,"created_at":"2026-07-07T17:56:05.753Z"},{"id":15,"user_email":"nstasyuk@nubes.ru","company_id":2,"action":"DELETE","old_value":"79.111.119.78/32","new_value":null,"entry_id":3,"impersonated_by":null,"created_at":"2026-07-14T09:10:44.986Z"},{"id":16,"user_email":"nstasyuk@nubes.ru","company_id":2,"action":"DELETE","old_value":"91.247.235.224/32","new_value":null,"entry_id":2,"impersonated_by":null,"created_at":"2026-07-14T09:10:46.558Z"},{"id":17,"user_email":"akovalev@nubes.ru","company_id":2,"action":"CREATE","old_value":null,"new_value":"8.8.8.8/32","entry_id":7,"impersonated_by":null,"created_at":"2026-07-27T14:53:20.784Z"},{"id":18,"user_email":"akovalev@nubes.ru","company_id":2,"action":"CREATE","old_value":null,"new_value":"86.86.86.86/32","entry_id":8,"impersonated_by":null,"created_at":"2026-07-31T09:22:54.233Z"},{"id":19,"user_email":"akovalev@nubes.ru","company_id":2,"action":"UPDATE","old_value":"86.86.86.86/32","new_value":"86.86.86.86/32","entry_id":8,"impersonated_by":null,"created_at":"2026-07-31T10:20:48.352Z"},{"id":20,"user_email":"akovalev@nubes.ru","company_id":2,"action":"UPDATE","old_value":"86.86.86.86/32","new_value":"86.86.86.86/32","entry_id":8,"impersonated_by":null,"created_at":"2026-07-31T10:44:43.019Z"},{"id":21,"user_email":"akovalev@nubes.ru","company_id":2,"action":"DELETE","old_value":"86.86.86.86/32","new_value":null,"entry_id":8,"impersonated_by":null,"created_at":"2026-07-31T10:44:46.867Z"},{"id":22,"user_email":"v.dolzhikov@kin1969.ru","company_id":334,"action":"CREATE","old_value":null,"new_value":"89.109.248.216/29","entry_id":9,"impersonated_by":null,"created_at":"2026-07-31T11:49:21.908Z"},{"id":23,"user_email":"tarasov@rza.ru","company_id":337,"action":"CREATE","old_value":null,"new_value":"80.243.4.64/29","entry_id":10,"impersonated_by":null,"created_at":"2026-07-31T12:03:23.347Z"},{"id":24,"user_email":"tarasov@rza.ru","company_id":337,"action":"CREATE","old_value":null,"new_value":"80.243.7.192/29","entry_id":11,"impersonated_by":null,"created_at":"2026-07-31T12:04:04.295Z"},{"id":25,"user_email":"tarasov@rza.ru","company_id":337,"action":"UPDATE","old_value":"80.243.4.64/29","new_value":"80.243.4.64/29","entry_id":10,"impersonated_by":null,"created_at":"2026-07-31T12:04:20.320Z"},{"id":26,"user_email":"tarasov@rza.ru","company_id":337,"action":"CREATE","old_value":null,"new_value":"93.188.46.16/29","entry_id":12,"impersonated_by":null,"created_at":"2026-07-31T12:05:04.557Z"},{"id":27,"user_email":"v.dolzhikov@kin1969.ru","company_id":334,"action":"CREATE","old_value":null,"new_value":"178.177.24.120/30","entry_id":13,"impersonated_by":null,"created_at":"2026-07-31T12:05:47.538Z"},{"id":28,"user_email":"tarasov@rza.ru","company_id":337,"action":"CREATE","old_value":null,"new_value":"46.46.168.64/29","entry_id":14,"impersonated_by":null,"created_at":"2026-07-31T12:08:17.306Z"},{"id":29,"user_email":"tarasov@rza.ru","company_id":337,"action":"UPDATE","old_value":"46.46.168.64/29","new_value":"46.46.168.64/29","entry_id":14,"impersonated_by":null,"created_at":"2026-07-31T12:08:31.876Z"},{"id":30,"user_email":"tarasov@rza.ru","company_id":337,"action":"UPDATE","old_value":"93.188.46.16/29","new_value":"93.188.46.16/29","entry_id":12,"impersonated_by":null,"created_at":"2026-07-31T12:08:39.481Z"},{"id":31,"user_email":"tarasov@rza.ru","company_id":337,"action":"CREATE","old_value":null,"new_value":"5.172.178.123/32","entry_id":15,"impersonated_by":null,"created_at":"2026-07-31T12:09:07.979Z"},{"id":32,"user_email":"tarasov@rza.ru","company_id":337,"action":"CREATE","old_value":null,"new_value":"91.214.116.50/32","entry_id":16,"impersonated_by":null,"created_at":"2026-07-31T12:09:50.849Z"},{"id":33,"user_email":"tarasov@rza.ru","company_id":337,"action":"CREATE","old_value":null,"new_value":"91.214.116.66/32","entry_id":17,"impersonated_by":null,"created_at":"2026-07-31T12:10:05.329Z"},{"id":34,"user_email":"v.dolzhikov@kin1969.ru","company_id":334,"action":"CREATE","old_value":null,"new_value":"91.196.73.0/28","entry_id":18,"impersonated_by":null,"created_at":"2026-07-31T12:15:03.214Z"},{"id":35,"user_email":"v.dolzhikov@kin1969.ru","company_id":334,"action":"DELETE","old_value":"91.196.73.0/28","new_value":null,"entry_id":18,"impersonated_by":null,"created_at":"2026-07-31T12:17:12.663Z"},{"id":36,"user_email":"v.dolzhikov@kin1969.ru","company_id":334,"action":"UPDATE","old_value":"89.109.248.216/29","new_value":"89.109.248.216/29","entry_id":9,"impersonated_by":null,"created_at":"2026-07-31T12:38:41.697Z"},{"id":37,"user_email":"v.dolzhikov@kin1969.ru","company_id":334,"action":"UPDATE","old_value":"178.177.24.120/30","new_value":"178.177.24.120/30","entry_id":13,"impersonated_by":null,"created_at":"2026-07-31T12:38:43.377Z"},{"id":38,"user_email":"konoval.ig@lombardblago.ru","company_id":368,"action":"CREATE","old_value":null,"new_value":"80.80.109.5/32","entry_id":19,"impersonated_by":null,"created_at":"2026-07-31T13:14:48.056Z"},{"id":39,"user_email":"konoval.ig@lombardblago.ru","company_id":368,"action":"CREATE","old_value":null,"new_value":"213.27.106.25/32","entry_id":20,"impersonated_by":null,"created_at":"2026-07-31T13:15:15.518Z"}],"rowCount":39}
+1
View File
@@ -0,0 +1 @@
{"ok":true,"fields":["id","client_id","name","custom_limit","created_at","updated_at"],"rows":[{"id":1,"client_id":"WZ01325","name":"WZ01325","custom_limit":15,"created_at":"2026-06-23T09:16:30.863Z","updated_at":"2026-07-07T08:11:10.173Z"},{"id":2,"client_id":"WZ01112","name":"WZ01112","custom_limit":17,"created_at":"2026-06-23T09:18:38.912Z","updated_at":"2026-07-14T09:10:49.768Z"},{"id":23,"client_id":"WZ03709","name":"WZ03709","custom_limit":null,"created_at":"2026-06-30T13:01:07.788Z","updated_at":null},{"id":26,"client_id":"WZ02319","name":"WZ02319","custom_limit":15,"created_at":"2026-07-01T07:49:59.870Z","updated_at":"2026-07-07T08:11:06.632Z"},{"id":69,"client_id":"WZ01609","name":"WZ01609","custom_limit":null,"created_at":"2026-07-01T13:32:26.705Z","updated_at":null},{"id":333,"client_id":"WZ01038","name":"WZ01038","custom_limit":null,"created_at":"2026-07-31T11:05:31.287Z","updated_at":null},{"id":334,"client_id":"WZ03656","name":"WZ03656","custom_limit":null,"created_at":"2026-07-31T11:46:46.190Z","updated_at":null},{"id":337,"client_id":"WZ02727","name":"WZ02727","custom_limit":null,"created_at":"2026-07-31T12:01:22.164Z","updated_at":null},{"id":368,"client_id":"WZ02425","name":"WZ02425","custom_limit":null,"created_at":"2026-07-31T13:14:20.366Z","updated_at":null}],"rowCount":9}
+84
View File
@@ -0,0 +1,84 @@
-- getpgdata: перенос данных из прежней БД (60bdf3e3) в новую
-- сгенерировано из data/*.json, 2026-08-18
BEGIN;
-- companies
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (1, 'WZ01325', 'WZ01325', 15, '2026-06-23T09:16:30.863Z', '2026-07-07T08:11:10.173Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (2, 'WZ01112', 'WZ01112', 17, '2026-06-23T09:18:38.912Z', '2026-07-14T09:10:49.768Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (23, 'WZ03709', 'WZ03709', NULL, '2026-06-30T13:01:07.788Z', NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (26, 'WZ02319', 'WZ02319', 15, '2026-07-01T07:49:59.870Z', '2026-07-07T08:11:06.632Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (69, 'WZ01609', 'WZ01609', NULL, '2026-07-01T13:32:26.705Z', NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (333, 'WZ01038', 'WZ01038', NULL, '2026-07-31T11:05:31.287Z', NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (334, 'WZ03656', 'WZ03656', NULL, '2026-07-31T11:46:46.190Z', NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (337, 'WZ02727', 'WZ02727', NULL, '2026-07-31T12:01:22.164Z', NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO companies (id, client_id, name, custom_limit, created_at, updated_at) VALUES (368, 'WZ02425', 'WZ02425', NULL, '2026-07-31T13:14:20.366Z', NULL) ON CONFLICT (id) DO NOTHING;
-- whitelist_entries
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (1, 1, '1.2.3.4/30', '3000', 'tazet@narod.ru', '2026-06-23T09:54:29.541Z', NULL, NULL, 'tazet@narod.ru', '2026-06-23T09:57:25.431Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (2, 2, '91.247.235.224/32', 'dsorokin@nubes.ru home', 'dsorokin@nubes.ru', '2026-07-01T07:52:27.401Z', NULL, NULL, 'nstasyuk@nubes.ru', '2026-07-14T09:10:46.558Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (3, 2, '79.111.119.78/32', 'dsorokin@nubes.ru home', 'dsorokin@nubes.ru', '2026-07-01T07:53:20.615Z', NULL, NULL, 'nstasyuk@nubes.ru', '2026-07-14T09:10:44.986Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (4, 69, '3.3.3.0/28', '434', 'helpwanted187@gmail.com', '2026-07-07T08:10:04.800Z', NULL, NULL, 'helpwanted187@gmail.com', '2026-07-07T08:10:14.608Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (5, 2, '102.15.15.0/24', '244', 'nstasyuk@nubes.ru', '2026-07-07T08:12:10.483Z', NULL, NULL, 'nstasyuk@nubes.ru', '2026-07-07T08:12:23.831Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (6, 2, '1.1.1.11/32', NULL, 'ntazetdinov@nubes.ru', '2026-07-07T15:25:13.970Z', NULL, NULL, 'ntazetdinov@nubes.ru', '2026-07-07T15:25:23.538Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (7, 2, '8.8.8.8/32', 'тест', 'akovalev@nubes.ru', '2026-07-27T14:53:20.784Z', NULL, NULL, NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (8, 2, '86.86.86.86/32', 'тест2аыва', 'akovalev@nubes.ru', '2026-07-31T09:22:54.233Z', 'akovalev@nubes.ru', '2026-07-31T10:44:43.019Z', 'akovalev@nubes.ru', '2026-07-31T10:44:46.867Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (9, 334, '89.109.248.216/29', 'KiN', 'v.dolzhikov@kin1969.ru', '2026-07-31T11:49:21.908Z', 'v.dolzhikov@kin1969.ru', '2026-07-31T12:38:41.697Z', NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (10, 337, '80.243.4.64/29', 'СПЗ Компнет', 'tarasov@rza.ru', '2026-07-31T12:03:23.347Z', 'tarasov@rza.ru', '2026-07-31T12:04:20.320Z', NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (11, 337, '80.243.7.192/29', 'ВКЗ Компнет', 'tarasov@rza.ru', '2026-07-31T12:04:04.295Z', NULL, NULL, NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (12, 337, '93.188.46.16/29', 'ВКЗ Дапл', 'tarasov@rza.ru', '2026-07-31T12:05:04.557Z', 'tarasov@rza.ru', '2026-07-31T12:08:39.481Z', NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (13, 334, '178.177.24.120/30', 'Mega_KiN', 'v.dolzhikov@kin1969.ru', '2026-07-31T12:05:47.538Z', 'v.dolzhikov@kin1969.ru', '2026-07-31T12:38:43.377Z', NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (14, 337, '46.46.168.64/29', 'СПЗ РЕТН', 'tarasov@rza.ru', '2026-07-31T12:08:17.306Z', 'tarasov@rza.ru', '2026-07-31T12:08:31.876Z', NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (15, 337, '5.172.178.123/32', 'Nubes Post', 'tarasov@rza.ru', '2026-07-31T12:09:07.979Z', NULL, NULL, NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (16, 337, '91.214.116.50/32', 'Nubes 1Forma', 'tarasov@rza.ru', '2026-07-31T12:09:50.849Z', NULL, NULL, NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (17, 337, '91.214.116.66/32', 'Nubes 1Forma VKS', 'tarasov@rza.ru', '2026-07-31T12:10:05.329Z', NULL, NULL, NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (18, 334, '91.196.73.0/28', 'Alvisa1', 'v.dolzhikov@kin1969.ru', '2026-07-31T12:15:03.214Z', NULL, NULL, 'v.dolzhikov@kin1969.ru', '2026-07-31T12:17:12.663Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (19, 368, '80.80.109.5/32', 'терминал управления', 'konoval.ig@lombardblago.ru', '2026-07-31T13:14:48.056Z', NULL, NULL, NULL, NULL) ON CONFLICT (id) DO NOTHING;
INSERT INTO whitelist_entries (id, company_id, value_cidr, comment, created_by, created_at, updated_by, updated_at, deleted_by, deleted_at) VALUES (20, 368, '213.27.106.25/32', 'терминал управления2', 'konoval.ig@lombardblago.ru', '2026-07-31T13:15:15.518Z', NULL, NULL, NULL, NULL) ON CONFLICT (id) DO NOTHING;
-- audit_log
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (1, 'tazet@narod.ru', 1, 'CREATE', NULL, '1.2.3.4/30', 1, NULL, '2026-06-23T09:54:29.541Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (2, 'tazet@narod.ru', 1, 'DELETE', '1.2.3.4/30', NULL, 1, NULL, '2026-06-23T09:57:25.431Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (3, 'dsorokin@nubes.ru', 2, 'CREATE', NULL, '91.247.235.224/32', 2, NULL, '2026-07-01T07:52:27.401Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (4, 'dsorokin@nubes.ru', 2, 'CREATE', NULL, '79.111.119.78/32', 3, NULL, '2026-07-01T07:53:20.615Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (5, 'helpwanted187@gmail.com', 69, 'CREATE', NULL, '3.3.3.0/28', 4, NULL, '2026-07-07T08:10:04.800Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (6, 'helpwanted187@gmail.com', 69, 'DELETE', '3.3.3.0/28', NULL, 4, NULL, '2026-07-07T08:10:14.608Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (7, 'nstasyuk@nubes.ru', 2, 'DELETE', '79.111.119.78/32', NULL, 3, NULL, '2026-07-07T08:10:57.260Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (8, 'nstasyuk@nubes.ru', 2, 'DELETE', '91.247.235.224/32', NULL, 2, NULL, '2026-07-07T08:10:58.717Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (9, 'nstasyuk@nubes.ru', 2, 'CREATE', NULL, '102.15.15.0/24', 5, NULL, '2026-07-07T08:12:10.483Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (10, 'nstasyuk@nubes.ru', 2, 'DELETE', '102.15.15.0/24', NULL, 5, NULL, '2026-07-07T08:12:23.831Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (11, 'ntazetdinov@nubes.ru', 2, 'CREATE', NULL, '1.1.1.11/32', 6, NULL, '2026-07-07T15:25:13.970Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (12, 'ntazetdinov@nubes.ru', 2, 'DELETE', '1.1.1.11/32', NULL, 6, NULL, '2026-07-07T15:25:23.538Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (13, 'ntazetdinov@nubes.ru', 2, 'RESTORE', '79.111.119.78/32', '79.111.119.78/32', 3, NULL, '2026-07-07T17:56:02.930Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (14, 'ntazetdinov@nubes.ru', 2, 'RESTORE', '91.247.235.224/32', '91.247.235.224/32', 2, NULL, '2026-07-07T17:56:05.753Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (15, 'nstasyuk@nubes.ru', 2, 'DELETE', '79.111.119.78/32', NULL, 3, NULL, '2026-07-14T09:10:44.986Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (16, 'nstasyuk@nubes.ru', 2, 'DELETE', '91.247.235.224/32', NULL, 2, NULL, '2026-07-14T09:10:46.558Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (17, 'akovalev@nubes.ru', 2, 'CREATE', NULL, '8.8.8.8/32', 7, NULL, '2026-07-27T14:53:20.784Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (18, 'akovalev@nubes.ru', 2, 'CREATE', NULL, '86.86.86.86/32', 8, NULL, '2026-07-31T09:22:54.233Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (19, 'akovalev@nubes.ru', 2, 'UPDATE', '86.86.86.86/32', '86.86.86.86/32', 8, NULL, '2026-07-31T10:20:48.352Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (20, 'akovalev@nubes.ru', 2, 'UPDATE', '86.86.86.86/32', '86.86.86.86/32', 8, NULL, '2026-07-31T10:44:43.019Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (21, 'akovalev@nubes.ru', 2, 'DELETE', '86.86.86.86/32', NULL, 8, NULL, '2026-07-31T10:44:46.867Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (22, 'v.dolzhikov@kin1969.ru', 334, 'CREATE', NULL, '89.109.248.216/29', 9, NULL, '2026-07-31T11:49:21.908Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (23, 'tarasov@rza.ru', 337, 'CREATE', NULL, '80.243.4.64/29', 10, NULL, '2026-07-31T12:03:23.347Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (24, 'tarasov@rza.ru', 337, 'CREATE', NULL, '80.243.7.192/29', 11, NULL, '2026-07-31T12:04:04.295Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (25, 'tarasov@rza.ru', 337, 'UPDATE', '80.243.4.64/29', '80.243.4.64/29', 10, NULL, '2026-07-31T12:04:20.320Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (26, 'tarasov@rza.ru', 337, 'CREATE', NULL, '93.188.46.16/29', 12, NULL, '2026-07-31T12:05:04.557Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (27, 'v.dolzhikov@kin1969.ru', 334, 'CREATE', NULL, '178.177.24.120/30', 13, NULL, '2026-07-31T12:05:47.538Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (28, 'tarasov@rza.ru', 337, 'CREATE', NULL, '46.46.168.64/29', 14, NULL, '2026-07-31T12:08:17.306Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (29, 'tarasov@rza.ru', 337, 'UPDATE', '46.46.168.64/29', '46.46.168.64/29', 14, NULL, '2026-07-31T12:08:31.876Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (30, 'tarasov@rza.ru', 337, 'UPDATE', '93.188.46.16/29', '93.188.46.16/29', 12, NULL, '2026-07-31T12:08:39.481Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (31, 'tarasov@rza.ru', 337, 'CREATE', NULL, '5.172.178.123/32', 15, NULL, '2026-07-31T12:09:07.979Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (32, 'tarasov@rza.ru', 337, 'CREATE', NULL, '91.214.116.50/32', 16, NULL, '2026-07-31T12:09:50.849Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (33, 'tarasov@rza.ru', 337, 'CREATE', NULL, '91.214.116.66/32', 17, NULL, '2026-07-31T12:10:05.329Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (34, 'v.dolzhikov@kin1969.ru', 334, 'CREATE', NULL, '91.196.73.0/28', 18, NULL, '2026-07-31T12:15:03.214Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (35, 'v.dolzhikov@kin1969.ru', 334, 'DELETE', '91.196.73.0/28', NULL, 18, NULL, '2026-07-31T12:17:12.663Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (36, 'v.dolzhikov@kin1969.ru', 334, 'UPDATE', '89.109.248.216/29', '89.109.248.216/29', 9, NULL, '2026-07-31T12:38:41.697Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (37, 'v.dolzhikov@kin1969.ru', 334, 'UPDATE', '178.177.24.120/30', '178.177.24.120/30', 13, NULL, '2026-07-31T12:38:43.377Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (38, 'konoval.ig@lombardblago.ru', 368, 'CREATE', NULL, '80.80.109.5/32', 19, NULL, '2026-07-31T13:14:48.056Z') ON CONFLICT (id) DO NOTHING;
INSERT INTO audit_log (id, user_email, company_id, action, old_value, new_value, entry_id, impersonated_by, created_at) VALUES (39, 'konoval.ig@lombardblago.ru', 368, 'CREATE', NULL, '213.27.106.25/32', 20, NULL, '2026-07-31T13:15:15.518Z') ON CONFLICT (id) DO NOTHING;
-- последовательности
SELECT setval(pg_get_serial_sequence('companies','id'), COALESCE((SELECT MAX(id) FROM companies),1));
SELECT setval(pg_get_serial_sequence('whitelist_entries','id'), COALESCE((SELECT MAX(id) FROM whitelist_entries),1));
SELECT setval(pg_get_serial_sequence('audit_log','id'), COALESCE((SELECT MAX(id) FROM audit_log),1));
COMMIT;
+1
View File
@@ -0,0 +1 @@
{"ok":true,"fields":["id","company_id","value_cidr","comment","created_by","created_at","updated_by","updated_at","deleted_by","deleted_at"],"rows":[{"id":1,"company_id":1,"value_cidr":"1.2.3.4/30","comment":"3000","created_by":"tazet@narod.ru","created_at":"2026-06-23T09:54:29.541Z","updated_by":null,"updated_at":null,"deleted_by":"tazet@narod.ru","deleted_at":"2026-06-23T09:57:25.431Z"},{"id":2,"company_id":2,"value_cidr":"91.247.235.224/32","comment":"dsorokin@nubes.ru home","created_by":"dsorokin@nubes.ru","created_at":"2026-07-01T07:52:27.401Z","updated_by":null,"updated_at":null,"deleted_by":"nstasyuk@nubes.ru","deleted_at":"2026-07-14T09:10:46.558Z"},{"id":3,"company_id":2,"value_cidr":"79.111.119.78/32","comment":"dsorokin@nubes.ru home","created_by":"dsorokin@nubes.ru","created_at":"2026-07-01T07:53:20.615Z","updated_by":null,"updated_at":null,"deleted_by":"nstasyuk@nubes.ru","deleted_at":"2026-07-14T09:10:44.986Z"},{"id":4,"company_id":69,"value_cidr":"3.3.3.0/28","comment":"434","created_by":"helpwanted187@gmail.com","created_at":"2026-07-07T08:10:04.800Z","updated_by":null,"updated_at":null,"deleted_by":"helpwanted187@gmail.com","deleted_at":"2026-07-07T08:10:14.608Z"},{"id":5,"company_id":2,"value_cidr":"102.15.15.0/24","comment":"244","created_by":"nstasyuk@nubes.ru","created_at":"2026-07-07T08:12:10.483Z","updated_by":null,"updated_at":null,"deleted_by":"nstasyuk@nubes.ru","deleted_at":"2026-07-07T08:12:23.831Z"},{"id":6,"company_id":2,"value_cidr":"1.1.1.11/32","comment":null,"created_by":"ntazetdinov@nubes.ru","created_at":"2026-07-07T15:25:13.970Z","updated_by":null,"updated_at":null,"deleted_by":"ntazetdinov@nubes.ru","deleted_at":"2026-07-07T15:25:23.538Z"},{"id":7,"company_id":2,"value_cidr":"8.8.8.8/32","comment":"тест","created_by":"akovalev@nubes.ru","created_at":"2026-07-27T14:53:20.784Z","updated_by":null,"updated_at":null,"deleted_by":null,"deleted_at":null},{"id":8,"company_id":2,"value_cidr":"86.86.86.86/32","comment":"тест2аыва","created_by":"akovalev@nubes.ru","created_at":"2026-07-31T09:22:54.233Z","updated_by":"akovalev@nubes.ru","updated_at":"2026-07-31T10:44:43.019Z","deleted_by":"akovalev@nubes.ru","deleted_at":"2026-07-31T10:44:46.867Z"},{"id":9,"company_id":334,"value_cidr":"89.109.248.216/29","comment":"KiN","created_by":"v.dolzhikov@kin1969.ru","created_at":"2026-07-31T11:49:21.908Z","updated_by":"v.dolzhikov@kin1969.ru","updated_at":"2026-07-31T12:38:41.697Z","deleted_by":null,"deleted_at":null},{"id":10,"company_id":337,"value_cidr":"80.243.4.64/29","comment":"СПЗ Компнет","created_by":"tarasov@rza.ru","created_at":"2026-07-31T12:03:23.347Z","updated_by":"tarasov@rza.ru","updated_at":"2026-07-31T12:04:20.320Z","deleted_by":null,"deleted_at":null},{"id":11,"company_id":337,"value_cidr":"80.243.7.192/29","comment":"ВКЗ Компнет","created_by":"tarasov@rza.ru","created_at":"2026-07-31T12:04:04.295Z","updated_by":null,"updated_at":null,"deleted_by":null,"deleted_at":null},{"id":12,"company_id":337,"value_cidr":"93.188.46.16/29","comment":"ВКЗ Дапл","created_by":"tarasov@rza.ru","created_at":"2026-07-31T12:05:04.557Z","updated_by":"tarasov@rza.ru","updated_at":"2026-07-31T12:08:39.481Z","deleted_by":null,"deleted_at":null},{"id":13,"company_id":334,"value_cidr":"178.177.24.120/30","comment":"Mega_KiN","created_by":"v.dolzhikov@kin1969.ru","created_at":"2026-07-31T12:05:47.538Z","updated_by":"v.dolzhikov@kin1969.ru","updated_at":"2026-07-31T12:38:43.377Z","deleted_by":null,"deleted_at":null},{"id":14,"company_id":337,"value_cidr":"46.46.168.64/29","comment":"СПЗ РЕТН","created_by":"tarasov@rza.ru","created_at":"2026-07-31T12:08:17.306Z","updated_by":"tarasov@rza.ru","updated_at":"2026-07-31T12:08:31.876Z","deleted_by":null,"deleted_at":null},{"id":15,"company_id":337,"value_cidr":"5.172.178.123/32","comment":"Nubes Post","created_by":"tarasov@rza.ru","created_at":"2026-07-31T12:09:07.979Z","updated_by":null,"updated_at":null,"deleted_by":null,"deleted_at":null},{"id":16,"company_id":337,"value_cidr":"91.214.116.50/32","comment":"Nubes 1Forma","created_by":"tarasov@rza.ru","created_at":"2026-07-31T12:09:50.849Z","updated_by":null,"updated_at":null,"deleted_by":null,"deleted_at":null},{"id":17,"company_id":337,"value_cidr":"91.214.116.66/32","comment":"Nubes 1Forma VKS","created_by":"tarasov@rza.ru","created_at":"2026-07-31T12:10:05.329Z","updated_by":null,"updated_at":null,"deleted_by":null,"deleted_at":null},{"id":18,"company_id":334,"value_cidr":"91.196.73.0/28","comment":"Alvisa1","created_by":"v.dolzhikov@kin1969.ru","created_at":"2026-07-31T12:15:03.214Z","updated_by":null,"updated_at":null,"deleted_by":"v.dolzhikov@kin1969.ru","deleted_at":"2026-07-31T12:17:12.663Z"},{"id":19,"company_id":368,"value_cidr":"80.80.109.5/32","comment":"терминал управления","created_by":"konoval.ig@lombardblago.ru","created_at":"2026-07-31T13:14:48.056Z","updated_by":null,"updated_at":null,"deleted_by":null,"deleted_at":null},{"id":20,"company_id":368,"value_cidr":"213.27.106.25/32","comment":"терминал управления2","created_by":"konoval.ig@lombardblago.ru","created_at":"2026-07-31T13:15:15.518Z","updated_by":null,"updated_at":null,"deleted_by":null,"deleted_at":null}],"rowCount":20}
+100
View File
@@ -141,3 +141,103 @@ PostgreSQL (тот же realm k8s). Доступ к новой БД — чере
**Проверено:** `node -c server.js` OK; локально: пустой SQL → 400; SELECT → идёт в БД; **Проверено:** `node -c server.js` OK; локально: пустой SQL → 400; SELECT → идёт в БД;
`INSERT` без `WRITE_SQL` → 403 (до попытки подключения); `WRITE_SQL=1` + мульти-statement → `INSERT` без `WRITE_SQL` → 403 (до попытки подключения); `WRITE_SQL=1` + мульти-statement →
берётся только первый; процесс проверки остановлен. берётся только первый; процесс проверки остановлен.
## 8. Перенос данных из прежней БД в новую (60bdf3e3 → a5e9d24f)
**Цель:** перенести белые списки (IP, кто создал, когда) и связанные данные в **новую**
PostgreSQL (инстанс `a5e9d24f`), тот же realm k8s. Доступ к новой БД — через Keycloak,
автоматизировать нельзя → перенос выполнен через `getpgdata` + `POST /api/sql`.
### 8.1 Выгрузка данных из прежней БД
Пока приложение было подключено к прежней БД (`60bdf3e3`), все таблицы выгружены через
`/api/sql` (SELECT * ORDER BY id) и **сохранены в репо** в `data/*.json`:
| Файл | Таблица | Строк | Статус |
|---|---|---|---|
| `data/companies.json` | companies | 9 | полный, валиден |
| `data/whitelist_entries.json` | whitelist_entries | 20 | полный, валиден |
| `data/audit_log.json` | audit_log | 39 | полный, валиден |
| `data/_migrations.json` | _migrations | 2 | полный, валиден |
| session | session | 1147 | исключён (битый дамп, не нужен для переноса) |
Сессии намеренно НЕ переносятся: это временные пользовательские сессии входа
(`connect-pg-simple`), в новой БД они создаются заново.
Коммиты: данные `~`, генератор `data/import.sql` (коммит `0b2d7ac`).
⚠️ **Урок (зафиксирован в памяти):** нужно было выгрузить ВСЕ таблицы до смены кредов.
Первая выгрузка сохранила только `whitelist_entries`; `companies`/`audit_log` пришлось
догонять после временного возврата кредов на прежнюю БД.
### 8.2 Переключение на новую БД
В jsonEnv Nubes (`modify`) заданы креды новой ПГ + `WRITE_SQL=1`:
```json
{
"DB_HOST": "postgresqlk8s-master.a5e9d24f-0b5d-4196-8903-7ed60f6e6557.svc.cluster.local",
"DB_PORT": "5432",
"DB_NAME": "ipwhitelist",
"DB_USER": "super",
"DB_PASS": "<пароль новой ПГ>",
"DB_SSLMODE": "disable",
"WRITE_SQL": "1",
"PORT": "3000"
}
```
После `modify` проверено: `GET /` показывает host новой ПГ; `CREATE TEMP TABLE` → 200
(запись разрешена).
### 8.3 Проблема: несоответствие id компаний
В новой БД **изначально уже были компании** под другими id (типовая схема), поэтому при
прямой вставке по старым id возникли конфликты:
- Вставка с явным id: `WZ03709`(id=23) упал — duplicate key по `client_id` (в новой БД
`WZ03709` уже был под id=2)
- `WZ01112` и `WZ03709` оказались на неверных id (1 и 2 вместо 2 и 23)
- `WZ01325` (должен быть id=1) — вообще отсутствовал
**Причина:** уникальный индекс `companies_client_id_key` (client_id), id в новой БД не
совпадали со старой.
**Решение (безопасно, т.к. записи/аудит в новой БД были пусты и FK на companies отсутствуют):**
1. `DELETE FROM companies WHERE client_id IN ('WZ01112','WZ03709')` — убрать с неверных id
2. Вставить заново под правильные id: id=1→WZ01325, id=2→WZ01112, id=23→WZ03709
3. Восстановить `custom_limit` и даты для этих 3 строк из дампа (первая вставка ставила `NOW()`)
После этого маппинг id компаний новой БД **полностью совпал** со старой.
### 8.4 Вставка данных через /api/sql
Так как `/api/sql` выполняет **один statement** за вызов, INSERT отправлены по одному
стейтменту (клиент на Python):
1. `companies` — 9 вставок (с явными id, `ON CONFLICT (id) DO NOTHING`)
2. `whitelist_entries` — 20 вставок (id, company_id, value_cidr, comment, created_by,
created_at, updated_by, updated_at, deleted_by, deleted_at)
3. `audit_log` — 39 вставок
4. `SELECT setval(...)` — сброс sequence для трёх таблиц на MAX(id)
### 8.5 Проверка целостности и соответствия
После переноса выполнена **посимвольная сверка** новой БД против дампа старой:
| Таблица | Строк old/new | missing | extra | diffs | Результат |
|---|---|---|---|---|---|
| whitelist_entries | 20/20 | 0 | 0 | 0 | **MATCH** |
| audit_log | 39/39 | 0 | 0 | 0 | **MATCH** |
| companies | 9/9 | 0 | 0 | 0 (после фикса) | **MATCH** |
- `orphan` (записи без компании): **0** — все связи верны
- sequences: companies→368, whitelist_entries→20, audit_log→39
### 8.6 Итоговое состояние новой БД
- companies = 9
- whitelist_entries = 20 (из них активных 12, удалённых 8 — перенесены с deleted_at)
- audit_log = 39
- Данные идентичны прежней БД.
**Активные белые списки (12):** WZ02425 (2), WZ02727 (6), WZ03656 (2), WZ01112 (8.8.8.8).