This is a detached fork of
预览 Preview
Web version:
更多演示请前往官网体验(谢绝灌水)
桌面端 Desktop version:
(back to top)
🛠 技术栈 Tech Stacks
PaoPao主要由以下优秀的开源项目/工具构建
后端 backend:
前端 frontend:
🏗 快速开始 Getting Started
环境要求 Environment
- Go (最低1.22+)
- Node.js (最低14+)
- MySQL (最低5.7+)
- Redis
- Zinc
Zinc是一款轻量级全文搜索引擎,可以查阅 https://zincsearch-docs.zinc.dev/installation/ 安装
Local environment: Darwin/Arm64
- Go v1.23.0
- Node.js v22.4.1
- MariaDB v11.5.2
- Redis v7.2.5
- Zinc v0.4.10
安装说明 Installation
方式一. 手动安装(推荐) Manual Installation (Suggested)
克隆代码库
Clone this repo
git clone https://github.com/waydxd/paopao-ce.git
后端 Backend
-
Import the scripts/paopao.sql
file into the MySQL database
-
Copy the config.yaml.sample
file to config.yaml
and complete the configuration editing according to the comments.
-
Compile the backend
Compile the api service with separate frontend (you can change how to bundle the frontend in the config.yaml):
make build
This will generate a executable file in the release directory.
release/paopao [command]
Then you can run the backend using the following command:
release/paopao serve
-
Directly run the backend
Run the api service:
make run
Note: If you need to embed the web frontend ui, please first build the web frontend (set web/.env to VITE_HOST="").
-
Use the built-in Migrate mechanism to automatically upgrade and maintain the SQL DDL:
# Add Migration feature to Features to enable migrate function
vim config.yaml
# file: config.yaml
# Features:
# Default: ["Base", "MySQL", "Zinc", "MinIO", "LoggerZinc", "Migration"]
# Compile with migration tag to generate executable file with migrate function
make build TAGS='migration'
release/paopao
# Or run with migration tag directly
make run TAGS='migration'
Note: The default compiled executable file does not have migrate function, you need to compile with migration tag to support migrate function.
Frontend
-
Enter the frontend directory web
, copy .env
to .env.local
, edit the .env.local
file to set the backend service address and other configuration items, and download the dependency package
cd ./web && cp .env .env.local
vim .env.local
yarn
-
Compile the frontend
yarn build
After build, you can get the compiled output in the dist directory, and configure nginx to point to that directory.
-
You may also run a development build separately
yarn run dev
Desktop (Not maintained)
-
进入前端目录 web
,拷贝.env
到 .env.local
,编辑 .env.local
文件中后端服务地址及其他配置项,下载依赖包
cd ./web && cp .env .env.local
vim .env.local
yarn
-
编译前端
yarn build
-
构建桌面端
yarn tauri build
桌面端是使用Rust + tauri编写
的,需要安装tauri的依赖,具体参考https://tauri.studio/v1/guides/getting-started/prerequisites.
方式二. 使用Docker构建、运行 (deprecated)
# 默认参数构建, 默认内嵌web ui并设置api host为空
docker build -t your/paopao-ce:tag .
# 内嵌web ui并且自定义API host参数
docker build -t your/paopao-ce:tag --build-arg API_HOST=http://api.paopao.info .
# 内嵌web ui并且使用本地web/.env中的API host
docker build -t your/paopao-ce:tag --build-arg USE_API_HOST=no .
# 内嵌web ui并且使用本地编译的web/dist构建
docker build -t your/paopao-ce:tag --build-arg USE_DIST=yes .
# 只编译api server
docker build -t your/paopao-ce:tag --build-arg EMBED_UI=no .
# 运行
mkdir custom && docker run -d -p 8008:8008 -v ${PWD}/custom:/app/paopao-ce/custom -v ${PWD}/config.yaml.sample:/app/paopao-ce/config.yaml your/paopao-ce:tag
# 或者直接运行构建好的docker image
mkdir custom && docker run -d -p 8008:8008 -v ${PWD}/custom:/app/paopao-ce/custom -v ${PWD}/config.yaml.sample:/app/paopao-ce/config.yaml bitbus/paopao-ce:latest
cd web
# 默认参数构建
docker build -t your/paopao-ce:web .
# 自定义API host 参数构建
docker build -t your/paopao-ce:web --build-arg API_HOST=http://api.paopao.info .
# 使用本地编译的dist构建
docker build -t your/paopao-ce:web --build-arg USE_DIST=yes .
# 运行
docker run -d -p 8010:80 your/paopao-ce:web
方式三. 使用 docker-compose 运行 (deprecated)
git clone https://github.com/waydxd/paopao-ce.git
cd paopao-ce && docker compose up -d
# visit http://localhost:8008 👀 paopao-ce
# visit http://localhost:8001 👀 RedisInsight
# visit http://localhost:8080 👀 phpMyAdmin
默认是使用config.yaml.sample的配置,如果需要自定义配置,请拷贝默认配置文件(比如config.yaml),修改后再同步配置到docker-compose.yaml如下:
# file: docker-compose.yaml
...
backend:
image: bitbus/paopao-ce:latest
restart: always
depends_on:
- db
- redis
- zinc
# modify below to reflect your custom configure
volumes:
- ./config.yaml:/app/paopao-ce/config.yaml
ports:
- 8008:8008
networks:
- paopao-network
....
注意:默认提供的 docker-compose.yaml 初衷是搭建本机开发调试环境,如果需要产品部署供外网访问,请自行调优配置参数或使用其他方式部署。
开发文档
Docs文档说明
docs
目录提供了各种开发文档,包括:
比如,关于paopao-ce的设计定位,可以参考docs/proposal/001-关于paopao-ce的设计定位,简要阐述了paopao-ce是如何定位自身的。
API文档
开发者可以在本地开启Docs
服务,浏览后端导出的API服务接口文档。
...
Features:
Default: ["Base", "MySQL", "Option", "LocalOSS", "LoggerFile", "Docs"]
Docs: ["Docs:OpenAPI"]
...
make run TAGS='docs'
# visit http://127.0.0.1:8011/docs/openapi
配置说明
config.yaml.sample
是一份完整的配置文件模版,paopao-ce启动时会读取./custom/config.yaml
、./config.yaml
任意一份配置文件(优先读取最先找到的文件)。
cp config.yaml.sample config.yaml
vim config.yaml # 修改参数
paopao serve
配置文件中的 Features
小节是声明paopao-ce运行时开启哪些功能项:
...
Features:
Default: ["Base", "MySQL", "Option", "LocalOSS", "LoggerFile"]
Develop: ["Base", "MySQL", "Option", "Sms", "AliOSS", "LoggerZinc"]
Demo: ["Base", "MySQL", "Option", "Sms", "MinIO", "LoggerZinc"]
Slim: ["Base", "Sqlite3", "LocalOSS", "LoggerFile"]
Base: ["Zinc", "Redis", "Alipay",]
Option: ["SimpleCacheIndex"]
Sms: "SmsJuhe"
...
如上:
Default/Develop/Demo/Slim 是不同 功能集套件(Features Suite), Base/Option 是子功能套件, Sms是关于短信验证码功能的参数选项。
这里 Default
套件 代表的意思是: 使用Base/Option
中的功能,外加 MySQL/LocalOSS/LoggerFile
功能,也就是说开启了Zinc/Redis/Alipay/SimpleCacheIndex/MySQL/LocalOSS/LoggerFile
7项功能;
Develop
套件依例类推。
使用Feautures:
release/paopao serve --help
Usage of release/paopao:
-features value
use special features
-no-default-features
whether use default features
# 默认使用 Default 功能套件
release/paopao serve
# 不包含 default 中的功能集,仅仅使用 develop 中声明的功能集
release/paopao serve --no-default-features --features develop
# 使用 default 中的功能集,外加 sms 功能
release/paopao serve --features sms
# 手动指定需要开启的功能集
release/paopao serve --no-default-features --features sqlite3,localoss,loggerfile,redis
目前支持的功能集合:
功能项 |
类别 |
状态 |
备注 |
Web |
子服务 |
内测 |
开启Web服务 |
Admin |
子服务 |
WIP |
开启Admin后台运维服务 |
SpaceX |
子服务 |
WIP |
开启SpaceX服务 |
Bot |
子服务 |
WIP |
开启Bot服务 |
NativeOBS |
子服务 |
WIP |
开启NativeOBS服务 |
Docs |
子服务 |
WIP |
开启开发者文档服务 |
Frontend:Web |
子服务 |
稳定 |
开启独立前端服务 |
Frontend:EmbedWeb |
子服务 |
稳定 |
开启内嵌于后端Web API服务中的前端服务 |
Gorm |
数据库 |
稳定(默认) |
使用gorm作为数据库的ORM,默认使用 Gorm + MySQL 组合 |
Sqlx |
数据库 |
WIP |
使用sqlx作为数据库的ORM |
Sqlc |
数据库 |
WIP |
使用sqlc自动生成ORM代码 |
MySQL |
数据库 |
稳定(默认) |
使用MySQL作为数据库 |
Postgres |
数据库 |
稳定 |
使用PostgreSQL作为数据库 |
Sqlite3 |
数据库 |
稳定 |
使用Sqlite3作为数据库 |
AliOSS |
对象存储 |
稳定(推荐) |
阿里云对象存储服务 |
COS |
对象存储 |
内测 |
腾讯云对象存储服务 |
HuaweiOBS |
对象存储 |
内测 |
华为云对象存储服务 |
MinIO |
对象存储 |
稳定 |
MinIO对象存储服务 |
S3 |
对象存储 |
内测 |
AWS S3兼容的对象存储服务 |
LocalOSS |
对象存储 |
内测 |
提供使用本地目录文件作为对象存储的功能,仅用于开发调试环境 |
OSS:Retention |
对象存储 |
内测 |
基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能 |
OSS:TempDir |
对象存储 |
内测 |
基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能 |
Redis |
缓存 |
稳定 |
Redis缓存功能 |
SimpleCacheIndex |
缓存 |
Deprecated |
提供简单的 广场推文列表 的缓存功能 |
BigCacheIndex |
缓存 |
Deprecated |
使用BigCache缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面 |
RedisCacheIndex |
缓存 |
Deprecated |
使用Redis缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面 |
Zinc |
搜索 |
稳定(推荐) |
基于Zinc搜索引擎提供推文搜索服务 |
Meili |
搜索 |
稳定(推荐) |
基于Meilisearch搜索引擎提供推文搜索服务 |
Bleve |
搜索 |
WIP |
基于Bleve搜索引擎提供推文搜索服务 |
Sentry |
监控 |
内测 |
使用Sentry进行错误跟踪与性能监控 |
LoggerFile |
日志 |
稳定 |
使用文件写日志 |
LoggerZinc |
日志 |
稳定(推荐) |
使用Zinc写日志 |
LoggerMeili |
日志 |
内测 |
使用Meilisearch写日志 |
LoggerOpenObserve |
日志 |
内测 |
使用OpenObserve写日志 |
Friendship |
关系模式 |
内置 Builtin |
弱关系好友模式,类似微信朋友圈 |
Followship |
关系模式 |
内置 Builtin |
关注者模式,类似Twitter的Follow模式 |
Lightship |
关系模式 |
弃用 Deprecated |
开放模式,所有推文都公开可见 |
Alipay |
支付 |
稳定 |
开启基于支付宝开放平台的钱包功能 |
Sms |
短信验证 |
稳定 |
开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机 |
Docs:OpenAPI |
开发文档 |
稳定 |
开启openapi文档功能,提供web api文档说明(visit http://127.0.0.1:8008/docs/openapi) |
Pyroscope |
性能优化 |
内测 |
开启Pyroscope功能用于性能调试 |
Pprof |
性能优化 |
内测 |
开启Pprof功能收集Profile信息 |
PhoneBind |
其他 |
稳定 |
手机绑定功能 |
UseAuditHook |
其他 |
内测 |
使用审核hook功能 |
DisableJobManager |
其他 |
内测 |
禁止使用JobManager功能 |
Web:DisallowUserRegister |
功能特性 |
稳定 |
不允许用户注册 |
功能项状态详情参考 features-status.
搭建依赖环境
# 创建用于存放zinc数据的目录
mkdir -p data/zinc/data
# 使用Docker运行zinc
docker run -d --name zinc --user root -v ${PWD}/data/zinc/data:/data -p 4080:4080 -e ZINC_FIRST_ADMIN_USER=admin -e ZINC_FIRST_ADMIN_PASSWORD=admin -e DATA_PATH=/data public.ecr.aws/zinclabs/zinc:latest
# 查看zinc运行状态
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41465feea2ff getmeili/meilisearch:v0.27.0 "tini -- /bin/sh -c …" 20 hours ago Up 20 hours 0.0.0.0:7700->7700/tcp paopao-ce-meili-1
7daf982ca062 public.ecr.aws/prabhat/zinc:latest "/go/bin/zinc" 3 weeks ago Up 6 days 0.0.0.0:4080->4080/tcp zinc
# 使用docker compose运行
docker compose up -d zinc
# visit http://localhost:4080 打开自带的ui管理界面
# features中加上 Zinc 和 LoggerZinc
Features:
Default: ["Zinc", "LoggerZinc", "Base", "Sqlite3", "BigCacheIndex","MinIO"]
...
LoggerZinc: # 使用Zinc写日志
Host: 127.0.0.1:4080 # 这里的host就是paopao-ce能访问到的zinc主机
Index: paopao-log
User: admin
Password: admin
Secure: False # 如果使用https访问zinc就设置为True
...
Zinc: # Zinc搜索配置
Host: 127.0.0.1:4080
Index: paopao-data
User: admin
Password: admin
Secure: False
mkdir -p data/meili/data
# 使用Docker运行
docker run -d --name meili -v ${PWD}/data/meili/data:/meili_data -p 7700:7700 -e MEILI_MASTER_KEY=paopao-meilisearch getmeili/meilisearch:v0.29.0
# visit http://localhost:7700 打开自带的搜索前端ui
# 使用docker compose运行,需要删除docker-compose.yaml中关于meili的注释
docker compose up -d meili
# 查看meili运行状态
docker compose ps
NAME COMMAND SERVICE STATUS PORTS
paopao-ce-meili-1 "tini -- /bin/sh -c …" meili running 0.0.0.0:7700->7700/tcp
# features中加上 Meili 和 LoggerMeili
Features:
Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex","MinIO"]
...
LoggerMeili: # 使用Meili写日志
Host: 127.0.0.1:7700
Index: paopao-log
ApiKey: paopao-meilisearch
Secure: False
MinWorker: 5 # 最小后台工作者, 设置范围[5, 100], 默认5
MaxLogBuffer: 100 # 最大log缓存条数, 设置范围[10, 10000], 默认100
...
Meili: # Meili搜索配置
Host: 127.0.0.1:7700 # 这里的host就是paopao-ce能访问到的meili主机
Index: paopao-data
ApiKey: paopao-meilisearch
Secure: False # 如果使用https访问meili就设置为True
mkdir -p data/minio/data
# 使用Docker运行
docker run -d --name minio -v ${PWD}/data/minio/data:/data -p 9000:9000 -p 9001:9001 -e MINIO_ROOT_USER=minio-root-user -e MINIO_ROOT_PASSWORD=minio-root-password -e MINIO_DEFAULT_BUCKETS=paopao:public bitnami/minio:latest
# 使用docker compose运行, 需要删除docker-compose.yaml中关于minio的注释
docker compose up -d minio
# features中加上 MinIO
Features:
Default: ["MinIO", "Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex"]
...
MinIO: # MinIO 存储配置
AccessKey: Q3AM3UQ867SPQQA43P2F # AccessKey/SecretKey 需要登入minio管理界面手动创建,管理界面地址: http://127.0.0.1:9001
SecretKey: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
Secure: False
Endpoint: 127.0.0.1:9000 # 根据部署的minio主机修改对应地址
Bucket: paopao # 如上,需要在管理界面创建bucket并赋予外部可读写权限
Domain: 127.0.0.1:9000 # minio外网访问的地址(如果想让外网访问,这里需要设置为外网可访问到的minio主机地址)
...
# 使用Docker运行
mkdir data && docker run -v $PWD/data:/data -e ZO_DATA_DIR="/data" -p 5080:5080 \
-e ZO_ROOT_USER_EMAIL="root@paopao.info" -e ZO_ROOT_USER_PASSWORD="paopao-ce" \
public.ecr.aws/zinclabs/openobserve:latest
# 使用docker compose运行, 需要删除docker-compose.yaml中关于openobserve的注释
docker compose up -d openobserve
# visit http://loclahost:5080
# features中加上 LoggerOpenObserve
Features:
Default: ["Meili", "LoggerOpenObserve", "Base", "Sqlite3", "BigCacheIndex"]
...
LoggerOpenObserve: # 使用OpenObserve写日志
Host: 127.0.0.1:5080
Organization: paopao-ce
Stream: default
User: root@paopao.info
Password: tiFEI8UeJWuYA7kN
Secure: False
...
mkdir -p data/minio/data
# 使用Docker运行
docker run -it -p 4040:4040 pyroscope/pyroscope:latest server
# 使用docker compose运行, 需要删除docker-compose.yaml中关于pyroscope的注释
docker compose up -d pyroscope
# visit http://loclahost:4040
# features中加上 Pyroscope
Features:
Default: ["Meili", "LoggerMeili", "Base", "Sqlite3", "BigCacheIndex", "Pyroscope"]
...
Pyroscope: # Pyroscope配置
AppName: "paopao-ce"
Endpoint: "http://localhost:4040" # Pyroscope server address
AuthToken: # Pyroscope authentication token
Logger: none # Pyroscope logger (standard | logrus | none)
...
源代码分支管理
主代码库github.com/waydxd/paopao-ce
git branch
main
beta
dev
feature/bleve
feature/followship
feature/mir
feature/localoss
jc/alimy
r/paopao-plus
r/paopao-pro
x/sqlc
x/sqlx
分支说明
名称 |
说明 |
备注 |
main |
主分支 |
分支main 是主分支,也是paopao-ce的稳定版本发布分支,只有经过内部测试,没有重大bug出现的稳定代码才会推进到这个分支;该分支主要由beta 分支代码演进而来,原则上只接受bug修复PR。rc版本/稳定版本 发布都应该在main 主分支中进行。 |
beta |
公测分支 |
分支beta 是公测分支,代码推进到main 主分支的候选分支;该分支主要由alpha 分支代码演进而来,接受bug修复以及新功能优化的PR,原则上不接受新功能PR。beta版本 发布都应该在beta 公测分支下进行。 |
alpha |
内测分支 |
分支alpha 是内测分支,代码推进到beta 分支的候选分支;该分支主要由dev 分支代码演进而来,接受bug修复以及新功能相关的PR,接受新功能PR。分支代码演进到一个里程碑式的阶段后冻结所有新功能,合并代码到beta 公测分支进行下一阶段的持续演进。alpha版本 发布都应该在alpha 内测分支下进行。 |
dev |
开发分支 |
分支dev 是开发分支,不定期频繁更新,接受 新功能PR、代码优化PR、bug修复PR;新功能PR 都应该首先提交给dev 分支进行合并,bug修复/新功能开发/代码优化 阶段性冻结 后将代码演进合并到alpha 分支。 |
feature/* |
子功能分支 |
feature/* 是新功能子分支,一般新功能子分支都是 从dev 开发分支fork出来的;子功能分支 只专注于该新功能 代码的开发/优化,待开发接近内测阶段 提交新功能PR给dev 分支进行review/merge,待新功能代码演进到beta 分支后,原则上是可以删除该分支,但也可以保留到稳定版本发布。该分支专注于新功能的开发,只接受新功能的bug修复/优化PR。 |
jc/* |
维护者的开发分支 |
jc/* 是代码库维护者的开发分支,一般包含一些局部优化或者bug修复代码,有时可以直接将代码merge到dev/beta 分支,原则上不允许直接merge代码到main 主分支。 |
x/* |
实验分支 |
x/* 是技术实验分支,某些技术的引入需要经过具体的代码实现与真实场景的测评,考量评估后如果某项技术适合引入到paopao-ce,就fork出一个feature/* 分支,作为新功能引入到paopao-ce。一般一些比较激进的技术,从dev 分支fork出一个新的x/* 分支,各种尝试、考量、评估后,或丢弃、或引入到paopao-ce。 |
t/* |
临时分支 |
t/* 是临时发版本分支,一般 beta 分支演进到正式版本发布前的最后某个beta版本(比如v0.2.0-beta)就从beta分支fork出一个 t/* 分支用于向 main 分支提交 PR 用于Review,待 PR Reviewed 合并到 main 分支后,可以删除这个临时创建的分支。这样设计主要是考虑到有时合并到 main 分支时,需要Review的时间可能会长一些,而dev分支的代码又急需推进到beta分支以发布下一个alpha版本用于内测,相当于为下一个测试版本发布腾地方。 |
r/* |
发行版本分支 |
r/* 是不同发行版本分支,不同发行版本各有不同的侧重点,可以根据需要选择适合的发行版本。 |
发行版本分支说明
代码分支演进图
部署站点信息
具体部署站点信息请查阅 deployed-sites. 欢迎站长将已部署PaoPao实例的站点信息添加到 deployed-sites 列表中。
Collaborator's paopao account
其他说明
建议后端服务使用 supervisor
守护进程,并通过 nginx
反向代理后,提供API给前端服务调用。
短信通道使用的聚合数据,如果申请不下来,可以考虑替换其他服务商。
代码结构比较简单,很方便扩展,开发文档请参阅docs.
👯♀️ 贡献
paopao-ce 是一个利用 业余时间 本着 "Just for fun just do it." 的心态 持续有序 开发/优化/维护的开源项目,没有KPI考核、没有Roadmap进度压力、没有技术支持日程安排,或许有些许不足之处,但是重在精神可嘉。 借用网络中的话 "F*k talk, f*k of tech innovation, Shut up and show me your code." 一切都因更好的体验,一切都是为了爱好,一切都在代码里;期待老铁们加入,一起开发、一起折腾、一起快乐。
喜欢的朋友记得给个Star,欢迎贡献PR。
License
Distributed under the MIT License. See LICENSE
for more information.