895

0

PaoPao

一个清新文艺的微社区

Logo

PaoPao

🔥一个清新文艺的微社区
View Demo · Pull Request · Features


预览

Web端: 明色主题

暗色主题

更多演示请前往官网体验(谢绝灌水)

桌面端:

(back to top)

🛠 技术栈

PaoPao主要由以下优秀的开源项目/工具构建

🏗 快速开始

环境要求

  • Go (1.17+)
  • Node.js (14+)
  • MySQL (5.7+)
  • Redis
  • Zinc

* Zinc是一款轻量级全文搜索引擎,可以查阅 https://zincsearch.com/ 安装

以上环境版本为PaoPao官方的开发版本,仅供参考,其他版本的环境未进行充分测试

安装说明

方式一. 手动安装(推荐)

克隆代码库

git clone https://github.com/rocboss/paopao-ce.git

后端

  1. 导入项目根目录下的 scripts/paopao.sql 文件至MySQL数据库

  2. 拷贝项目根目录下 config.yaml.sample 文件至 config.yaml,按照注释完成配置编辑

  3. 编译后端编译api服务:

    make build

    编译api服务、内嵌web前端ui:

    make build TAGS='embed'

    编译后在 release目录可以找到对应可执行文件。

    release/paopao-ce
  4. 直接运行后端运行api服务:

    make run

    运行api服务、web前端ui服务:

    make run TAGS='embed'

    提示: 如果需要内嵌web前端ui,请先构建web前端(建议设置web/.env为VITE_HOST="")。

  5. 使用内置的Migrate机制自动升级维护SQL DDL:

    # 添加 Migration 功能到 Features 中 开启migrate功能
    vim config.yaml
    # file: config.yaml
    # Features:
    #   Default: ["Base", "MySQL", "Zinc", "MinIO", "LoggerZinc", "Migration"]
    
    # 编译时加入migration tag编译出支持migrate功能的可执行文件
    make build TAGS='migration'
    release/paopao-ce
    
    # 或者 带上migration tag直接运行
    make run TAGS='migration'

    注意:默认编译出来的可执行文件是不内置migrate功能,需要编译时带上migration tag才能内置支持migrage功能。

前端

  1. 进入前端目录 web,拷贝 .env.env.local,编辑 .env.local 文件中后端服务地址及其他配置项,下载依赖包

    cd ./web && cp .env .env.local
    vim .env.local
    yarn
  2. 编译前端

    yarn build

    build完成后,可以在dist目录获取编译产出,配置nginx指向至该目录即可

桌面端

  1. 进入前端目录 web,拷贝 .env.env.local,编辑 .env.local 文件中后端服务地址及其他配置项,下载依赖包

    cd ./web && cp .env .env.local
    vim .env.local
    yarn
  2. 编译前端

    yarn build
  3. 构建桌面端

    yarn tauri build

    桌面端是使用Rust + tauri编写 的,需要安装tauri的依赖,具体参考https://tauri.studio/v1/guides/getting-started/prerequisites.

方式二. 使用Docker构建、运行

  • 后端:
# 默认参数构建, 默认内嵌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 .

# 运行
docker run -d -p 8008:8008 -v ${PWD}/config.yaml.sample:/app/paopao-ce/config.yaml your/paopao-ce:tag
  • 前端:
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 运行

git clone https://github.com/rocboss/paopao-ce.git
docker compose up --build
# visit paopao-ce(http://127.0.0.1:8008) and phpMyadmin(http://127.0.0.1:8080)

默认是使用config.yaml.sample的配置,如果需要自定义配置,请拷贝默认配置文件(比如config.yaml),修改后再同步配置到docker-compose.yaml如下:

# file: docker-compose.yaml
...
  backend:
    build:
      context: .
    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 初衷是搭建本机开发调试环境,如果需要产品部署供外网访问,请自行调优配置参数或使用其他方式部署。

API 文档

构建时将 docs 添加到TAGS中:

make run TAGS='docs'

# visit http://127.0.0.1:8008/docs

配置说明

config.yaml.sample 是一份完整的配置文件模版,paopao-ce启动时会读取 ./configs/config.yaml./config.yaml任意一份配置文件(优先读取最先找到的文件)。

cp config.yaml.sample config.yaml
vim config.yaml # 修改参数
paopao-ce

配置文件中的 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-ce --help
Usage of release/paopao-ce:
  -features value
        use special features
  -no-default-features
        whether use default features

# 默认使用 Default 功能套件
release/paopao-ce 

# 不包含 default 中的功能集,仅仅使用 develop 中声明的功能集
release/paopao-ce --no-default-features --features develop 

# 使用 default 中的功能集,外加 sms 功能
release/paopao-ce --features sms  

# 手动指定需要开启的功能集
release/paopao-ce --no-default-features --features sqlite3,localoss,loggerfile,redis 

目前支持的功能集合:

  • 数据库: MySQL/Sqlite3/PostgreSQLGorm + MySQL/Sqlite3/PostgreSQL 使用gorm作为数据库的ORM,默认使用 Grom + MySQL组合(目前状态:稳定,默认,推荐使用);Sqlx + MySQL/PostgreSQL 使用sqlx作为数据库的ORM(目前状态:WIP);
  • 对象存储: AliOSS/COS/HuaweiOBS/MinIO/LocalOSSAliOSS 阿里云对象存储服务;COS 腾讯云对象存储服务;HuaweiOBS 华为云对象存储服务;MinIO MinIO对象存储服务;S3 AWS S3兼容的对象存储服务;LocalOSS 提供使用本地目录文件作为对象存储的功能,仅用于开发调试环境;
  • 缓存: Redis/SimpleCacheIndex/BigCacheIndexSimpleCacheIndex 提供简单的 广场推文列表 的缓存功能;BigCacheIndex 使用BigCache缓存 广场推文列表,缓存每个用户每一页,简单做到千人千面(推荐使用);
  • 搜索: Zinc/MeiliZinc 基于Zinc搜索引擎提供推文搜索服务(目前状态: 稳定,推荐使用);Meili 基于Meilisearch搜索引擎提供推文搜索服务(目前状态: 稳定,推荐使用);
  • 日志: LoggerFile/LoggerZinc/LoggerMeiliLoggerFile 使用文件写日志(目前状态: 稳定);LoggerZinc 使用Zinc写日志(目前状态: 稳定,推荐使用);LoggerMeili 使用Meilisearch写日志(目前状态: 内测阶段);
  • 支付: AlipayAlipay 开启基于支付宝开放平台的钱包功能;
  • 短信验证码: SmsJuhe(需要开启sms)Sms 开启短信验证码功能,用于手机绑定验证手机是否注册者的;功能如果没有开启,手机绑定时任意短信验证码都可以绑定手机;
  • 其他: PhoneBind/OSS:Retention/OSS:TempDir PhoneBind 手机绑定功能; OSS:Retention 基于对象存储系统的对象过期自动删除特性实现 先创建临时对象再持久化的功能(目前状态: 内测阶段); OSS:TempDir 基于对象存储系统的对象拷贝/移动特性实现 先创建临时对象再持久化的功能(目前状态: 内测阶段);

搭建依赖环境

Zinc 搜索引擎:

  • Zinc运行
# 创建用于存放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/prabhat/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管理界面
  • 修改Zinc配置
# 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

Meilisearch 搜索引擎:

  • Meili运行
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.27.0
# visit http://localhost:7700 打开自带的搜索前端ui

# 使用docker compose运行,需要删除docker-compose.yaml中关于meili的注释
docker compose up -d meili

# 使用docker运行meilisearch的ui管理前端
docker run -d --name uirecord -p 7701:3000 bitriory/uirecord
# visit http://localhost:7701

# 使用docker compose运行meilisearch的ui管理前端,需要删除docker-compose.yaml中关于uirecord的注释
docker compose up -d uirecord
# visit http://loclahost:7701

# 查看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
paopao-ce-uirecord-1   "docker-entrypoint.s…"   uirecord            running             0.0.0.0:7701->3000/tcp
  • 修改Meili配置
# 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

MinIO 对象存储服务

  • MinIO运行
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
  • 修改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主机地址)
...

其他说明

建议后端服务使用 supervisor 守护进程,并通过 nginx 反向代理后,提供API给前端服务调用。

短信通道使用的聚合数据,如果申请不下来,可以考虑替换其他服务商。

代码结构比较简单,很方便扩展

👯‍♀️ 贡献

喜欢的朋友欢迎给个Star、贡献PR。

License

Distributed under the MIT License. See LICENSE for more information.