Files
chat/.sw
T

509 строки
13 KiB
XML

# Development state snapshot
Project: WSChat
Repository: https://github.com/viktor138irk/chat
Owner: viktor138irk
Default branch: main
This file is a compact project memory for continuing development in a new chat/dialog.
## Product idea
Build a self-hosted live chat system similar to Jivo, but with Telegram as the operator interface.
Website visitors use an embeddable widget. Messages go to selected Telegram operators. Operators reply in Telegram, and replies return to the website widget.
## Current architecture
The architecture is VPS-only.
```text
Website with embedded widget
-> widget.example.ru static widget.js on VPS/FastPanel
-> api.example.ru public HTTPS endpoint on VPS/FastPanel
-> local reverse proxy to Node.js backend on VPS
-> SQLite on VPS
-> Telegram bot API / optional SOCKS5
-> Telegram operators
Admin user
-> admin.example.ru static admin panel on VPS/FastPanel
-> api.example.ru backend on same VPS
```
## Architecture decision update
The architecture was changed from Raspberry Pi backend to VPS-only deployment.
Reason:
- Raspberry Pi 3B caused repeated low-level system issues.
- 32-bit OS had NodeSource `armhf` incompatibility.
- 64-bit OS with NodeSource arm64 produced `Illegal instruction` on Node.js.
- APT/DPKG then showed corrupted archives and `/var/lib/dpkg/diversions` issues.
- Continuing on Raspberry Pi would waste time and increase operational risk.
New decision:
```text
VPS with FastPanel runs everything:
- backend API
- WebSocket
- Telegram bot
- SQLite database initially
- admin panel static files
- widget static files
```
Raspberry Pi is removed from MVP architecture. It can be revisited later as an optional edge node, but not for the first production version.
## Deployment decisions
- Project name: WSChat.
- Main project directory: `/opt/ws-chat`.
- Cloudflare must not be used because of availability issues in Russia.
- Everything runs on VPS with FastPanel.
- FastPanel must manage domains, SSL, and web server configs manually.
- Project scripts must not create domains or edit global FastPanel configs.
- Backend runs locally on VPS, preferably bound to `127.0.0.1:3000`.
- `api.example.ru` is a reverse proxy to `http://127.0.0.1:3000`.
- `admin.example.ru` serves admin panel static files.
- `widget.example.ru` serves embeddable widget static files.
- SQLite database initially lives on VPS under project data directory.
- PostgreSQL can be introduced later if needed.
- WireGuard is no longer required for MVP.
- No Raspberry home networking or port forwarding is required.
## VPS/FastPanel target
VPS with FastPanel manually configured by the user.
Recommended subdomains:
```text
admin.example.ru -> static admin panel
widget.example.ru -> static widget
api.example.ru -> reverse proxy to local backend on VPS
```
DNS A-records for all three point to the VPS IP.
FastPanel webroots are expected to look like:
```text
/var/www/<fastpanel-user>/data/www/admin.example.ru
/var/www/<fastpanel-user>/data/www/widget.example.ru
```
The backend source and runtime should live outside public webroots:
```text
/opt/ws-chat/source
/opt/ws-chat/data
/opt/ws-chat/logs
/opt/ws-chat/backups
/opt/ws-chat/updates
```
`api.example.ru` may have a webroot created by FastPanel, but project files must not be published there. It should proxy to:
```text
http://127.0.0.1:3000
```
## Ports
VPS public ports:
- 80/tcp for HTTP/Let's Encrypt
- 443/tcp for HTTPS admin/widget/api
- SSH port, usually 22/tcp or custom
Backend port:
- Node.js backend listens on `127.0.0.1:3000` only.
- Do not expose port 3000 publicly.
No WireGuard port is required for MVP.
## SOCKS5 requirement
Telegram settings must support optional SOCKS5 proxy:
```env
TELEGRAM_PROXY_ENABLED=false
TELEGRAM_PROXY_TYPE=socks5
TELEGRAM_PROXY_HOST=127.0.0.1
TELEGRAM_PROXY_PORT=9050
TELEGRAM_PROXY_USERNAME=
TELEGRAM_PROXY_PASSWORD=
```
Admin panel should eventually expose:
- enable/disable SOCKS5
- host
- port
- username
- password
- test connection button
## Frontend and backend update decision
The user wants manual-safe installation on VPS first, to avoid breaking FastPanel.
Future update mechanism:
- Assistant can prepare an update bundle file.
- User uploads it to VPS.
- Auto-updater applies changes safely.
- Updates can cover admin, widget, backend/API, docs, and config templates.
Recommended project directory on VPS:
```text
/opt/ws-chat/
source/
updates/
backups/
logs/
build/
data/
```
FastPanel owns public directories:
```text
/var/www/<fastpanel-user>/data/www/admin.example.ru
/var/www/<fastpanel-user>/data/www/widget.example.ru
```
Backend should be managed by PM2:
```text
pm2 process: wschat-backend
entry: /opt/ws-chat/source/backend/src/server.js
```
## FastPanel safety rules
Never from project scripts:
- edit `/etc/nginx/nginx.conf`
- overwrite FastPanel vhost configs
- run broad `systemctl restart nginx`
- install packages that replace FastPanel web stack
- run frontend/backend as root
- bind project services directly to ports 80/443
- delete parent `/var/www` directories
Static deployment should copy files only into exact domain webroots.
Use rsync carefully:
```bash
rsync -av --delete admin-panel/dist/ /var/www/siteuser/data/www/admin.example.ru/
rsync -av --delete widget/dist/ /var/www/siteuser/data/www/widget.example.ru/
```
Never run `rsync --delete` against `/var/www` or parent folders.
## Old Raspberry Pi attempt archive
Raspberry Pi was originally planned as backend host but was removed from MVP.
Issues encountered:
- Raspberry Pi 3B with 32-bit OS: NodeSource does not support `armhf`.
- Raspberry Pi 3B with 32-bit OS: `node -v` and `npm -v` returned `Segmentation fault` after attempted setup.
- 32-bit install also showed dpkg metadata corruption.
- Raspberry Pi 3B with 64-bit OS: NodeSource arm64 installed but `node -v` and `npm -v` returned `Illegal instruction`.
- Later apt/dpkg showed corrupted `.deb` archives and corrupted `/var/lib/dpkg/diversions`.
Conclusion:
```text
Do not use Raspberry Pi 3B for MVP backend.
Use VPS-only deployment.
```
## Current repository structure
```text
.
├── .gitignore
├── .sw
├── README.md
├── package.json
├── backend/
│ ├── .env.example
│ ├── package.json
│ └── src/
│ ├── config.js
│ └── server.js
├── admin-panel/
│ ├── index.html
│ ├── package.json
│ └── src/
│ ├── main.jsx
│ └── styles.css
├── widget/
│ ├── index.html
│ ├── package.json
│ └── src/
│ └── widget.js
├── deploy/
│ ├── deploy-agent/
│ └── vps/
│ ├── .env.example
│ ├── bootstrap.sh
│ └── install.sh
└── docs/
├── FASTPANEL.md
├── FASTPANEL_MANUAL_FRONTEND.md
├── INSTALL.md
├── RASPBERRY_PI.md
├── UPDATE_BUNDLE.md
└── VPS_ONLY_INSTALL.md
```
## Implemented so far
### VPS interactive installer
Added `deploy/vps/install.sh`.
It is an interactive root installer with progress and error logging.
Features:
- shows current step `[01/13]` style;
- writes log file to `/tmp/wschat-install-YYYYMMDD-HHMMSS.log`;
- asks for project path, domains, FastPanel webroots, Telegram token, JWT secret;
- validates FastPanel webroot path shape;
- installs base packages;
- installs Node.js 20 via NodeSource;
- installs PM2;
- creates `/opt/ws-chat` directories;
- clones/updates repo;
- installs npm dependencies;
- writes `backend/.env`;
- writes `/opt/ws-chat/install-state.env`;
- starts/restarts PM2 process `wschat-backend`;
- checks backend health at `http://127.0.0.1:3000/health`;
- builds admin and widget;
- publishes static files if webroots are configured and already exist;
- prints FastPanel reverse proxy instructions for `api.example.ru`.
Installer does not create domains or edit FastPanel configs.
Run on VPS as root:
```bash
cd /opt/ws-chat/source
bash deploy/vps/install.sh
```
If repo is not cloned yet:
```bash
mkdir -p /opt/ws-chat
cd /opt/ws-chat
git clone https://github.com/viktor138irk/chat.git source
cd source
bash deploy/vps/install.sh
```
### Root workspace
- npm workspaces configured.
- Root scripts:
- `dev:backend`
- `dev:admin`
- `build:admin`
- `build:widget`
- `build`
- `deploy:frontend`
### Backend
Stack:
- Node.js
- Fastify
- @fastify/cors
- @fastify/rate-limit
- @fastify/websocket
- better-sqlite3 dependency already added but schema not implemented yet
- telegraf dependency already added but Telegram bridge not implemented yet
Current endpoints:
```text
GET /health
GET /api/config/public
POST /api/widget/message
GET /ws
```
`/api/widget/message` currently validates basic fields and returns accepted. Persistence and Telegram forwarding are not implemented yet.
For VPS-only architecture, backend env should use:
```env
APP_HOST=127.0.0.1
APP_PORT=3000
PUBLIC_API_URL=https://api.example.ru
PUBLIC_WS_URL=wss://api.example.ru/ws
DATABASE_PATH=/opt/ws-chat/data/chat.sqlite
```
### Admin panel
React/Vite shell exists.
It shows:
- project dashboard
- API health check
- FastPanel-safe deployment note
- SOCKS5 note
### Widget
Vanilla JS widget shell exists.
It:
- creates chat button
- opens chat panel
- creates visitorId in localStorage
- sends messages to backend endpoint
Current embed example:
```html
<script
src="https://widget.example.ru/widget.js"
data-site-id="site_xxxxx"
data-api-url="https://api.example.ru">
</script>
```
Need to ensure production Vite build emits stable `widget.js` file.
### Deploy agent
FastPanel-safe deploy script exists:
```text
deploy/deploy-agent/src/deploy-frontend.js
```
It currently focuses on frontend publishing:
- git fetch/pull
- npm ci
- builds admin-panel
- builds widget
- validates FastPanel webroot paths
- rsyncs dist files into admin/widget webroots
- does not touch FastPanel configs
Need to extend deployment process for VPS-only backend:
- install backend deps
- keep `/opt/ws-chat/data` persistent
- restart PM2 process `wschat-backend`
- never expose backend on public port
Important env variable:
```env
FASTPANEL_SAFE_MODE=true
```
## Existing docs
- `docs/VPS_ONLY_INSTALL.md`: current VPS-only install guide.
- `docs/INSTALL.md`: old full install guide for VPS + Raspberry Pi; deprecated.
- `docs/FASTPANEL.md`: FastPanel-safe deployment guide; needs update for backend on same VPS.
- `docs/FASTPANEL_MANUAL_FRONTEND.md`: manual frontend installation through FastPanel.
- `docs/RASPBERRY_PI.md`: now historical/optional, not MVP.
- `docs/UPDATE_BUNDLE.md`: future update bundle workflow; needs update for backend on VPS and `/opt/ws-chat`.
## Important previous commits
- Initial project spec: `aea8a9f49089ffd6b5a8ace365fc4eaa8c4ea154`
- Frontend deployment requirement: `1a914b9e546f6a0d9b60be6f8cf80858b1d25a75`
- FastPanel-safe requirement: `80f0e77e76f6a0b79e875fed5baf2243fbe0a11e`
- Initial project skeleton: multiple commits after that
- Install guide: `4f86690a0118f69243ce4da9b515aaace5b20017`
- Manual FastPanel frontend guide: `ba08112dc628fd276a2f8eade63145b32aa42c95`
- Update bundle workflow: `b1fa5ead43f33e80c7208b98bcea6e0fa68d5682`
- Raspberry armhf bootstrap fix: `fbe84c8b16a51cdd4931ecf0b1e0fa8654edec6a`
- Architecture switched to VPS-only after Raspberry issues: `28b0ca37c4032633811cce4dc096d1c714c5d5a2`
- Project path renamed to `/opt/ws-chat` and PM2 process to `wschat-backend`.
- Interactive VPS installer added: current updates.
## Next development steps
1. Test `deploy/vps/install.sh` on the VPS.
2. Finish updating docs to WSChat/VPS-only architecture.
3. Update package names/descriptions from raspi-chat to wschat where useful.
4. Add VPS backend deploy/update script or extend deploy-agent:
- install backend deps
- create `/opt/ws-chat/data`
- prepare backend env
- build admin/widget
- publish static files safely
- start/restart backend with PM2 `wschat-backend`
5. Fix widget production build so it outputs stable `widget.js`.
6. Add SQLite database layer:
- sites
- operators
- site_operators
- visitors
- conversations
- messages
- settings
7. Persist widget messages.
8. Implement Telegram bot bridge:
- send website messages to allowed operators
- map Telegram replies to conversations
- send replies back to widget via WebSocket
9. Add admin auth.
10. Add admin CRUD:
- sites
- operators
- operator-site permissions
- Telegram settings
- SOCKS5 settings
11. Add origin/domain validation:
- `site_id + Origin` must match configured site.
12. Add manual update section in admin panel.
13. Add update bundle generator and apply script.
14. Prepare Android-ready API later.
## User preferences and constraints
- User wants practical development, not only planning.
- User wants all work in GitHub repository `viktor138irk/chat`.
- User wants to be able to resume development in a new dialog using this `.sw` file.
- User prefers not to risk breaking FastPanel.
- User wants manual control over domains in FastPanel.
- User wants future auto-update file/bundle workflow.
- User changed architecture to VPS-only after Raspberry issues.
- User named the system WSChat and chose `/opt/ws-chat` as the project path.
- VPS currently uses root user by default, so MVP installation can run as root.
## How to continue in a new chat
Open this file first. Then continue from "Next development steps".
Recommended next task:
```text
Test deploy/vps/install.sh on VPS, then implement SQLite schema and message persistence.
```