Files
angel 72b6879f4b v1.7.0: refactor max_bot to flat structure, add VCF+UserModel+NLP history context, portal pages and proxy fixes
- Refactored max_bot from nested packages to flat module structure
- Q2: Extended BotUser model (patronymic, email, org, address, vcf_raw, contact_hash, phone_verified, email_verified, last_interaction, total_conversations, total_tickets)
- Q2: VCF parser (FN, N, TEL, EMAIL, ORG, ADR), upsert on re-contact, NLP history context (_get_user_history_context -> YandexGPT)
- Q1: Broadcast preview modal with 10s confirmation timer
- Q3: CSS var(--white)->var(--bg-card), var(--text)->var(--text-primary)
- Q4: bot_settings showNotification(), editable max_bot_id
- Q5: Webhook secret passthrough via X-Max-Bot-Api-Secret
- Masking sensitive keys, dialog_cleared handler, migrate via _add_column_if_not_exists()
- Rate limit (asyncio.sleep 0.5 per 10), dead code removed, conv.intent context in contact.py
- Portal pages: bot_consent, bot_kb (edit), bot_settings, bot_test, bot_tickets, portal_settings
- Tests: 21/21 passing, added test_yandex_gpt.py, test_email_sender.py
- Deploy: deploy_full.sh, schema.sql, seed_knowledge_base.sql
2026-05-29 02:30:30 +03:00

278 lines
21 KiB
JSON

[
{
"Id": "32d184af619ee26601e973bd1d9c478e41080c21c37ca0ce4196de4286c724ad",
"Created": "2026-05-22T17:42:32.449068268Z",
"Path": "uvicorn",
"Args": [
"app.main:app",
"--host",
"0.0.0.0",
"--port",
"8000",
"--workers",
"4"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 127,
"Error": "failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting \"/opt/projects/aegisone-py/CHANGELOG.md\" to rootfs at \"/app/CHANGELOG.md\": mount src=/opt/projects/aegisone-py/CHANGELOG.md, dst=/app/CHANGELOG.md, dstFd=/proc/self/fd/14, flags=MS_BIND|MS_REC: not a directory: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type",
"StartedAt": "2026-05-22T17:42:33.610616694Z",
"FinishedAt": "2026-05-23T00:11:21.899237525Z"
},
"Image": "sha256:d775a6517c018eb3dd936b4d353be4fe07497a2979664a21576adcb348356a36",
"ResolvConfPath": "/var/lib/docker/containers/32d184af619ee26601e973bd1d9c478e41080c21c37ca0ce4196de4286c724ad/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/32d184af619ee26601e973bd1d9c478e41080c21c37ca0ce4196de4286c724ad/hostname",
"HostsPath": "/var/lib/docker/containers/32d184af619ee26601e973bd1d9c478e41080c21c37ca0ce4196de4286c724ad/hosts",
"LogPath": "/var/lib/docker/containers/32d184af619ee26601e973bd1d9c478e41080c21c37ca0ce4196de4286c724ad/32d184af619ee26601e973bd1d9c478e41080c21c37ca0ce4196de4286c724ad-json.log",
"Name": "/aegisone-app",
"RestartCount": 0,
"Driver": "overlayfs",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": [
"/opt/projects/aegisone-py/docs:/app/docs:rw",
"/opt/projects/aegisone-py/permissions:/app/permissions:rw",
"/opt/projects/aegisone-py/uploads:/app/uploads:rw",
"/opt/projects/aegisone-py/CHANGELOG.md:/app/CHANGELOG.md:rw",
"/opt/projects/aegisone-py/version.txt:/app/version.txt:rw"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "host",
"PortBindings": {},
"RestartPolicy": {
"Name": "unless-stopped",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
0,
0
],
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": null,
"DnsOptions": null,
"DnsSearch": null,
"ExtraHosts": [],
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": null,
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/acpi",
"/proc/asound",
"/proc/interrupts",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/sched_debug",
"/proc/scsi",
"/proc/timer_list",
"/proc/timer_stats",
"/sys/devices/virtual/powercap",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"Storage": {
"RootFS": {
"Snapshot": {
"Name": "overlayfs"
}
}
},
"Mounts": [
{
"Type": "bind",
"Source": "/opt/projects/aegisone-py/uploads",
"Destination": "/app/uploads",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/projects/aegisone-py/CHANGELOG.md",
"Destination": "/app/CHANGELOG.md",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/projects/aegisone-py/version.txt",
"Destination": "/app/version.txt",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/projects/aegisone-py/docs",
"Destination": "/app/docs",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/opt/projects/aegisone-py/permissions",
"Destination": "/app/permissions",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
"Hostname": "d25564159130.vps.myjino.ru",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"ExposedPorts": {
"8000/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"APP_ENV=production",
"LOG_LEVEL=info",
"PORTAINER_URL=http://81.177.141.34:9001",
"DATABASE_URL=postgresql+asyncpg://aegisone:aegisone_pass@localhost:5432/aegisone",
"SECRET_KEY=change-me-to-random-string",
"SESSION_TTL=3600",
"PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305",
"PYTHON_VERSION=3.12.13",
"PYTHON_SHA256=c08bc65a81971c1dd5783182826503369466c7e67374d1646519adf05207b684"
],
"Cmd": [
"uvicorn",
"app.main:app",
"--host",
"0.0.0.0",
"--port",
"8000",
"--workers",
"4"
],
"Image": "aegisone-py-app",
"Volumes": null,
"WorkingDir": "/app",
"Entrypoint": null,
"Labels": {
"com.docker.compose.config-hash": "deaf74f2e9176ca56ad3c68e8daae57d58bc5a67edfc6ef19aff128ded1e4322",
"com.docker.compose.container-number": "1",
"com.docker.compose.depends_on": "postgres:service_healthy:false",
"com.docker.compose.image": "sha256:d775a6517c018eb3dd936b4d353be4fe07497a2979664a21576adcb348356a36",
"com.docker.compose.oneoff": "False",
"com.docker.compose.project": "aegisone-py",
"com.docker.compose.project.config_files": "/opt/projects/aegisone-py/docker-compose.yml",
"com.docker.compose.project.working_dir": "/opt/projects/aegisone-py",
"com.docker.compose.replace": "aegisone-app",
"com.docker.compose.service": "app",
"com.docker.compose.version": "5.1.3"
}
},
"NetworkSettings": {
"SandboxID": "",
"SandboxKey": "",
"Ports": {},
"Networks": {
"host": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"DriverOpts": null,
"GwPriority": 0,
"NetworkID": "7fda9d8ea237ba7c138b3c73b599cff5d1cd812ada6d7dfe48d6d472da4f51dc",
"EndpointID": "",
"Gateway": "",
"IPAddress": "",
"MacAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DNSNames": null
}
}
},
"ImageManifestDescriptor": {
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"digest": "sha256:5e6cdb40ea8e8ce3b408fc484ff4ec455aee55d077019193281969db7dc529ee",
"size": 2002,
"platform": {
"architecture": "amd64",
"os": "linux"
}
}
}
]