diff --git a/AGENTS.md b/AGENTS.md
index 8e4a1f4..037bea7 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -7,6 +7,7 @@
- Все изменения должны быть предварительно объяснены пользователю
- Перед решением конкретной задачи всегда составлять план
- После внесения изменений в код - проводить проверку - только после этого приступать к дальнейшему решению задачи
+ - **НЕ производить сборку проекта (`bun run build`) без явного разрешения пользователя**
2. **Прозрачность действий**
- Ассистент должен объяснить, какие изменения планируется внести
@@ -36,14 +37,14 @@
8 **Проверка типов данных**
- Проверять проект на ошибки типизации через команду `bun run tsc --noEmit -p frontend/tsconfig.json`
- - Не производить сборку проекта без моего разрешения
+ - НЕ производить сборку проекта (`bun run build`) без явного разрешения пользователя
- В проекте не должно быть типов any
- Все интерфейсы компонентов прописывать в файле globalInterfaces.ts
- При работе с PocketBase использовать актуальные сигнатуры методов из файла `D:\Verstka\production\astro_minivan\frontend\node_modules\pocketbase\dist\pocketbase.es.d.ts`
9 **Плагин @astrojs/sitemap**
- Обязательно к установке в проект пакета @astrojs/sitemap
- - Обязательно к созданию в проекте файла .nvmrc
+ - Обязательно к созданию в проекте файл .nvmrc
## Технические правила (Astro)
diff --git a/backend/pb_migrations/1777466303_created_site_visitors.js b/backend/pb_migrations/1777466303_created_site_visitors.js
new file mode 100644
index 0000000..3e5cd05
--- /dev/null
+++ b/backend/pb_migrations/1777466303_created_site_visitors.js
@@ -0,0 +1,103 @@
+///
+migrate((app) => {
+ const collection = new Collection({
+ "createRule": null,
+ "deleteRule": null,
+ "fields": [
+ {
+ "autogeneratePattern": "[a-z0-9]{15}",
+ "help": "",
+ "hidden": false,
+ "id": "text3208210256",
+ "max": 15,
+ "min": 15,
+ "name": "id",
+ "pattern": "^[a-z0-9]+$",
+ "presentable": false,
+ "primaryKey": true,
+ "required": true,
+ "system": true,
+ "type": "text"
+ },
+ {
+ "autogeneratePattern": "",
+ "help": "",
+ "hidden": false,
+ "id": "text791980464",
+ "max": 0,
+ "min": 0,
+ "name": "visitor_hash",
+ "pattern": "",
+ "presentable": false,
+ "primaryKey": false,
+ "required": false,
+ "system": false,
+ "type": "text"
+ },
+ {
+ "autogeneratePattern": "",
+ "help": "",
+ "hidden": false,
+ "id": "text2783163181",
+ "max": 0,
+ "min": 0,
+ "name": "ip",
+ "pattern": "",
+ "presentable": false,
+ "primaryKey": false,
+ "required": false,
+ "system": false,
+ "type": "text"
+ },
+ {
+ "autogeneratePattern": "",
+ "help": "",
+ "hidden": false,
+ "id": "text3293145029",
+ "max": 0,
+ "min": 0,
+ "name": "user_agent",
+ "pattern": "",
+ "presentable": false,
+ "primaryKey": false,
+ "required": false,
+ "system": false,
+ "type": "text"
+ },
+ {
+ "hidden": false,
+ "id": "autodate2990389176",
+ "name": "created",
+ "onCreate": true,
+ "onUpdate": false,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ },
+ {
+ "hidden": false,
+ "id": "autodate3332085495",
+ "name": "updated",
+ "onCreate": true,
+ "onUpdate": true,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ }
+ ],
+ "id": "pbc_2651661972",
+ "indexes": [],
+ "listRule": null,
+ "name": "site_visitors",
+ "system": false,
+ "type": "base",
+ "updateRule": null,
+ "viewRule": null
+ });
+
+ return app.save(collection);
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972");
+
+ return app.delete(collection);
+})
diff --git a/backend/pb_migrations/1777466913_updated_site_visitors.js b/backend/pb_migrations/1777466913_updated_site_visitors.js
new file mode 100644
index 0000000..842c27a
--- /dev/null
+++ b/backend/pb_migrations/1777466913_updated_site_visitors.js
@@ -0,0 +1,28 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "createRule": "",
+ "deleteRule": "@request.auth.id != \"\"",
+ "listRule": "@request.auth.id != \"\"",
+ "updateRule": "@request.auth.id != \"\"",
+ "viewRule": "@request.auth.id != \"\" "
+ }, collection)
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "createRule": null,
+ "deleteRule": null,
+ "listRule": null,
+ "updateRule": null,
+ "viewRule": null
+ }, collection)
+
+ return app.save(collection)
+})
diff --git a/backend/pb_migrations/1777466930_updated_site_visitors.js b/backend/pb_migrations/1777466930_updated_site_visitors.js
new file mode 100644
index 0000000..e650eff
--- /dev/null
+++ b/backend/pb_migrations/1777466930_updated_site_visitors.js
@@ -0,0 +1,20 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "createRule": "@request.method = \"POST\""
+ }, collection)
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "createRule": ""
+ }, collection)
+
+ return app.save(collection)
+})
diff --git a/backend/pb_migrations/1777468200_updated_site_visitors.js b/backend/pb_migrations/1777468200_updated_site_visitors.js
new file mode 100644
index 0000000..d36f60c
--- /dev/null
+++ b/backend/pb_migrations/1777468200_updated_site_visitors.js
@@ -0,0 +1,20 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "createRule": ""
+ }, collection)
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "createRule": "@request.method = \"POST\""
+ }, collection)
+
+ return app.save(collection)
+})
diff --git a/backend/pb_migrations/1777472256_updated_site_visitors.js b/backend/pb_migrations/1777472256_updated_site_visitors.js
new file mode 100644
index 0000000..735b763
--- /dev/null
+++ b/backend/pb_migrations/1777472256_updated_site_visitors.js
@@ -0,0 +1,22 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "listRule": "",
+ "viewRule": ""
+ }, collection)
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_2651661972")
+
+ // update collection data
+ unmarshal({
+ "listRule": "@request.auth.id != \"\"",
+ "viewRule": "@request.auth.id != \"\" "
+ }, collection)
+
+ return app.save(collection)
+})
diff --git a/frontend/src/components/layout/footer/Footer.astro b/frontend/src/components/layout/footer/Footer.astro
index a299cbd..bb6562d 100644
--- a/frontend/src/components/layout/footer/Footer.astro
+++ b/frontend/src/components/layout/footer/Footer.astro
@@ -1,5 +1,6 @@
---
import { COMPANY } from '@constants';
+import VisitorCounter from './VisitorCounter.astro';
const sectionsLinks = [
{ label: 'Услуги', href: '/services' },
@@ -25,10 +26,8 @@ const currentYear = new Date().getFullYear().toString();