Files

177 строки
3.7 KiB
Markdown

# Update bundle workflow
This project can be updated manually by copying an update bundle to the VPS and running a controlled updater script.
The VPS has FastPanel, so updates must not manage domains or global web server configs.
## Goal
The assistant can prepare a versioned update bundle file. The user uploads it to the VPS. The updater applies updates to:
- admin panel static files
- widget static files
- backend/API source on Raspberry Pi or deployment instructions for Raspberry Pi
- docs/config templates
## Recommended VPS directory layout
Use one project directory on VPS:
```text
/opt/raspi-chat/
source/ # git clone or unpacked project source
updates/ # uploaded update bundles
backups/ # previous static builds/config backups
logs/ # updater logs
build/ # temporary build output
```
FastPanel still owns public website directories:
```text
/var/www/<fastpanel-user>/data/www/admin.example.ru
/var/www/<fastpanel-user>/data/www/widget.example.ru
```
The API subdomain is not a static directory. It should be a reverse proxy:
```text
api.example.ru -> VPS FastPanel/Nginx -> WireGuard -> Raspberry Pi backend
```
## One project directory, three subdomains
Recommended mapping:
```text
admin.example.ru
public files from /opt/raspi-chat/source/admin-panel/dist
copied to /var/www/<user>/data/www/admin.example.ru
widget.example.ru
public files from /opt/raspi-chat/source/widget/dist
copied to /var/www/<user>/data/www/widget.example.ru
api.example.ru
no static deploy
reverse proxy to http://10.8.0.2:3000
```
If FastPanel forces every subdomain to have a webroot, create one for `api.example.ru`, but do not publish project files there. Configure it as proxy-only where possible.
## Update bundle format
Preferred bundle name:
```text
raspi-chat-update-YYYYMMDD-HHMMSS.tar.gz
```
Preferred structure inside bundle:
```text
manifest.json
source/
package.json
backend/
admin-panel/
widget/
deploy/
docs/
scripts/
apply-update.sh
```
Example `manifest.json`:
```json
{
"project": "raspi-chat",
"version": "0.1.0",
"commit": "unknown",
"requires": {
"node": ">=20",
"fastpanelSafeMode": true
},
"targets": {
"admin": true,
"widget": true,
"api": true
}
}
```
## Manual updater flow on VPS
```text
1. Upload bundle to /opt/raspi-chat/updates
2. Extract bundle into temporary directory
3. Validate manifest
4. Backup current admin/widget webroots
5. Build admin-panel
6. Build widget
7. Copy static files into FastPanel webroots
8. Do not touch FastPanel global configs
9. Print API/backend update notes
```
## API/backend updates
The backend runs on Raspberry Pi, not on the FastPanel VPS. Therefore API updates have two safe modes:
### Mode A: Git pull on Raspberry Pi
```bash
cd ~/apps/chat
git pull --ff-only origin main
npm install
pm2 restart raspi-chat-backend
```
### Mode B: update bundle for Raspberry Pi
Copy backend files from the update bundle to Raspberry Pi and restart PM2.
Recommended Raspberry Pi path:
```text
~/apps/chat
```
## FastPanel-safe rule
The updater may write only to:
```text
/opt/raspi-chat/source
/opt/raspi-chat/updates
/opt/raspi-chat/backups
/opt/raspi-chat/logs
/var/www/<fastpanel-user>/data/www/admin.example.ru
/var/www/<fastpanel-user>/data/www/widget.example.ru
```
The updater must not write to:
```text
/etc/nginx
/etc/apache2
/usr/local/fastpanel2
/var/www
/var/www/<fastpanel-user>
/var/www/<fastpanel-user>/data/www
```
## Future admin button
When manual updates are stable, the admin panel can get a button:
```text
Upload update bundle
Validate bundle
Apply frontend update
Show backend update instructions
```
For MVP, manual terminal execution is safer.