Pintree

Pintree
Photo by Marita Kavelashvili / Unsplash

Pintree 是基于 Next.js(App Router + React Server Components)、TypeScript、Prisma、Tailwind CSS 和 PostgreSQL 构建的开源项目,支持完全自托管到自己的服务器。目前官方 GitHub 仓库(https://github.com/Pintree-io/pintree)尚未提供官方的 Docker 镜像或一键部署脚本,也没有详细的自托管专用文档,但由于其为标准 Next.js + Prisma 项目,您可以按照以下标准流程手动部署到任何支持 Node.js 的 VPS 或服务器(如 Ubuntu、Debian、CentOS 等)。

部署前提条件

  • 服务器系统:Linux(推荐 Ubuntu 22.04 或更高)
  • Node.js:v18 或更高(推荐 v20+)
  • 数据库:PostgreSQL 15+(可安装在同一服务器或使用云数据库,如 Supabase、Neon、Railway 等)
  • 域名 + SSL(推荐使用 Nginx + Let’s Encrypt)
  • Git、pnpm(或 npm/yarn)

详细部署步骤

  1. 完成
    访问 https://yourdomain.com,即可注册账号并开始使用。 // 这表示部署完成,用户可以通过域名访问应用。

配置 Nginx 反向代理 + HTTPS
创建配置文件 /etc/nginx/sites-available/pintree

server {
    listen 80;  # 监听 80 端口(HTTP)。
    server_name yourdomain.com;  # 指定服务器域名。

    location / {  # 对于根路径的请求。
        proxy_pass http://localhost:3000;  # 将请求代理到本地 3000 端口(应用运行端口)。
        proxy_http_version 1.1;  # 使用 HTTP/1.1 协议。
        proxy_set_header Upgrade $http_upgrade;  # 支持 WebSocket 升级。
        proxy_set_header Connection 'upgrade';  # 处理连接升级。
        proxy_set_header Host $host;  # 传递主机头。
        proxy_cache_bypass $http_upgrade;  # 绕过缓存以支持升级。
    }
}

启用并获取 SSL:

sudo ln -s /etc/nginx/sites-available/pintree /etc/nginx/sites-enabled/  # 创建符号链接,启用站点配置。
sudo nginx -t && sudo systemctl reload nginx  # 测试 Nginx 配置并重载服务。
sudo certbot --nginx -d yourdomain.com  # 使用 certbot 为域名自动获取和配置 SSL 证书,实现 HTTPS。

启动应用(推荐使用 PM2 守护进程)

npm install -g pm2  # 全局安装 PM2,用于进程管理和守护应用。
pm2 start npm --name "pintree" -- start  # 使用 PM2 启动应用,指定名称为 pintree,并运行 npm start 命令。
pm2 save  # 保存当前 PM2 配置,以便重启时恢复。
pm2 startup          # 生成开机自启脚本并执行  # 设置 PM2 开机自启动,确保服务器重启后应用自动运行。

数据库迁移与构建

pnpm prisma:migrate   # 或 npx prisma migrate deploy  # 执行 Prisma 迁移,应用数据库 schema 变更,确保表结构正确。
pnpm build            # 构建生产版本  # 编译项目为生产环境优化版本,生成静态文件和服务器代码。

配置环境变量
复制示例配置文件:

cp .env.example .env  # 复制环境变量模板文件到 .env,用于自定义配置。

编辑 .env 文件(使用 nano 或 vim),关键配置如下:

DATABASE_URL="postgresql://pintree:your-strong-password@localhost:5432/pintree?schema=public"  # 数据库连接字符串,指定用户、密码、主机、端口和数据库名。

NEXTAUTH_SECRET="生成一个长随机字符串"  # 用 openssl rand -hex 32 生成  # NextAuth 的密钥,用于身份验证和会话加密。
NEXTAUTH_URL="https://yourdomain.com"     # 你的部署域名  # 应用的基础 URL,用于回调和重定向。

# 可选:如果要启用 Google/GitHub 登录  # 这些是可选的 OAuth 配置,用于第三方登录。
GOOGLE_CLIENT_ID=xxx
GOOGLE_CLIENT_SECRET=xxx
GITHUB_ID=xxx
GITHUB_SECRET=xxx

克隆代码并安装依赖

git clone https://github.com/Pintree-io/pintree.git  # 从 GitHub 克隆 Pintree 项目代码仓库到本地。
cd pintree  # 进入项目目录。
pnpm install  # 安装项目的所有依赖包,包括 Next.js、Prisma 等。

安装并配置 PostgreSQL

sudo apt install -y postgresql postgresql-contrib  # 安装 PostgreSQL 数据库及其扩展包。
sudo systemctl start postgresql  # 启动 PostgreSQL 服务。
sudo systemctl enable postgresql  # 设置 PostgreSQL 开机自启动。

创建数据库和用户:

sudo -u postgres psql  # 以 postgres 用户身份进入 PostgreSQL 命令行界面。
CREATE DATABASE pintree;  # 创建名为 pintree 的数据库,用于存储应用数据。
CREATE USER pintree WITH ENCRYPTED PASSWORD 'your-strong-password';  # 创建数据库用户 pintree,并设置加密密码。
GRANT ALL PRIVILEGES ON DATABASE pintree TO pintree;  # 授予用户 pintree 对数据库的所有权限。
\q  # 退出 PostgreSQL 命令行界面。

安装 Node.js(使用 NodeSource 官方源)

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -  # 下载并执行 Node.js v20 的安装脚本,配置官方源。
sudo apt install -y nodejs  # 安装 Node.js 核心包。
node -v   # 确认 ≥ v20  # 检查 Node.js 版本是否正确安装。
npm install -g pnpm   # 项目使用 pnpm  # 全局安装 pnpm 作为依赖管理器,因为项目推荐使用它。

准备服务器环境

sudo apt update && sudo apt upgrade -y  # 更新软件源并升级所有已安装的软件包,确保系统最新。
sudo apt install -y git curl nginx certbot python3-certbot-nginx  # 安装必需工具:Git 用于版本控制,curl 用于网络请求,Nginx 作为 Web 服务器,certbot 用于获取 SSL 证书。

推荐简化方案(使用 Docker + Docker Compose)

虽然官方没有提供 docker-compose.yml,但社区和类似 Next.js 项目常用以下方式(您可以自行创建):

创建 docker-compose.yml

version: '3.8'  # 指定 Docker Compose 文件版本。
services:  # 定义服务列表。
  db:  # 数据库服务。
    image: postgres:16  # 使用 PostgreSQL 16 镜像。
    restart: always  # 设置总是重启。
    environment:  # 环境变量。
      POSTGRES_USER: pintree  # 数据库用户名。
      POSTGRES_PASSWORD: your-strong-password  # 数据库密码。
      POSTGRES_DB: pintree  # 数据库名。
    volumes:  # 卷挂载。
      - postgres_data:/var/lib/postgresql/data  # 持久化数据卷。

  app:  # 应用服务。
    image: node:20-alpine  # 使用 Node.js 20 Alpine 镜像,轻量版。
    working_dir: /app  # 设置工作目录。
    volumes:  # 卷挂载。
      - .:/app  # 将当前目录挂载到容器 /app。
    ports:  # 端口映射。
      - "3000:3000"  # 映射容器 3000 端口到主机。
    depends_on:  # 依赖。
      - db  # 依赖数据库服务。
    environment:  # 环境变量。
      DATABASE_URL: postgresql://pintree:your-strong-password@db:5432/pintree  # 数据库连接,使用容器间网络。
      NEXTAUTH_SECRET: your-secret  # NextAuth 密钥。
      NEXTAUTH_URL: https://yourdomain.com  # 应用 URL。
    command: >  # 启动命令。
      sh -c "pnpm install && pnpm prisma:migrate && pnpm build && pnpm start"  # 安装依赖、迁移数据库、构建并启动应用。
volumes:  # 定义卷。
  postgres_data:  # 数据卷名称。

然后 docker compose up -d 即可启动(后续仍需 Nginx 反向代理)。 // 这是一个容器化部署方案,简化环境管理,使用 docker compose up -d 在后台启动服务。

  1. Node.js:v18 或更高(推荐 v20+) // Node.js 是运行 JavaScript 后端的必需运行时环境。
  2. 数据库:PostgreSQL 15+(可安装在同一服务器或使用云数据库,如 Supabase、Neon、Railway 等) // PostgreSQL 是项目使用的关系型数据库,用于存储数据。
  3. 域名 + SSL(推荐使用 Nginx + Let’s Encrypt) // 域名用于访问应用,SSL 提供 HTTPS 安全加密。
  4. Git、pnpm(或 npm/yarn) // Git 用于克隆代码仓库,pnpm 是包管理器,用于安装依赖。