refactor(deploy): separate Dev/UAT into independent full-stack environments

- Each environment now runs its own PB + LiveKit + Voice Token + frontend
- UAT LiveKit: 7890, Voice Token: 7893 (separate from Dev 7880/7883)
- Remove docker-compose.backend.yml, merge into dev compose
- Delete duplicate bulletin migration files that caused PB crash on startup
- Update CLAUDE.md, nginx configs, and .env files accordingly

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
congsh
2026-04-21 16:12:18 +08:00
parent 01412a0a94
commit 7f17dc826e
15 changed files with 124 additions and 281 deletions
@@ -1,122 +0,0 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
const collection = new Collection({
"id": "bulletin_posts",
"created": "2026-04-21 00:00:00.000Z",
"updated": "2026-04-21 00:00:00.000Z",
"name": "bulletin_posts",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "bp_group",
"name": "group",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "es63bkyiblpnxdf",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "bp_creator",
"name": "creator",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "_pb_users_auth_",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "bp_title",
"name": "title",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 1,
"max": 200,
"pattern": ""
}
},
{
"system": false,
"id": "bp_content",
"name": "content",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": 1,
"max": 5000,
"pattern": ""
}
},
{
"system": false,
"id": "bp_priority",
"name": "priority",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": ["low", "normal", "high", "urgent"]
}
},
{
"system": false,
"id": "bp_pinned",
"name": "pinned",
"type": "bool",
"required": false,
"presentable": false,
"unique": false,
"options": {}
},
{
"system": false,
"id": "bp_expires_at",
"name": "expiresAt",
"type": "date",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": "",
"max": ""
}
}
],
"indexes": [],
"listRule": "@request.auth.id != \"\" && group.members ~ @request.auth.id",
"viewRule": "@request.auth.id != \"\" && group.members ~ @request.auth.id",
"createRule": "@request.auth.id != \"\" && group.members ~ @request.auth.id",
"updateRule": "creator = @request.auth.id || group.owner = @request.auth.id",
"deleteRule": "creator = @request.auth.id || group.owner = @request.auth.id",
"options": {}
});
return Dao(db).saveCollection(collection);
}, (db) => {
const dao = new Dao(db);
const collection = dao.findCollectionByNameOrId("bulletin_posts");
return dao.deleteCollection(collection);
})
@@ -1,60 +0,0 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
const collection = new Collection({
"id": "bulletin_reads",
"created": "2026-04-21 00:00:01.000Z",
"updated": "2026-04-21 00:00:01.000Z",
"name": "bulletin_reads",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "br_post",
"name": "post",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "bulletin_posts",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "br_user",
"name": "user",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "_pb_users_auth_",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
}
],
"indexes": [
"CREATE UNIQUE INDEX `idx_bulletin_reads_post_user` ON `bulletin_reads` (\n `post`,\n `user`\n)"
],
"listRule": "@request.auth.id != \"\" && user = @request.auth.id",
"viewRule": "@request.auth.id != \"\" && user = @request.auth.id",
"createRule": "@request.auth.id != \"\" && user = @request.auth.id",
"updateRule": null,
"deleteRule": "user = @request.auth.id || post.group.owner = @request.auth.id",
"options": {}
});
return Dao(db).saveCollection(collection);
}, (db) => {
const dao = new Dao(db);
const collection = dao.findCollectionByNameOrId("bulletin_reads");
return dao.deleteCollection(collection);
})
@@ -0,0 +1,16 @@
/// <reference path="../pb_data/types.d.ts" />
migrate((db) => {
const dao = new Dao(db)
const collection = dao.findCollectionByNameOrId("gblacklist_col")
collection.updateRule = "reporter = @request.auth.id"
return dao.saveCollection(collection)
}, (db) => {
const dao = new Dao(db)
const collection = dao.findCollectionByNameOrId("gblacklist_col")
collection.updateRule = null
return dao.saveCollection(collection)
})