一站式数字产品交易平台,集商城、拼团、抽奖、积分系统于一体。
| 模块 | 功能 |
|---|---|
| 🛒 商城 | 商品分类/二级分类、热门标记、库存管理、订单追踪 |
| 👥 拼团 | 自动进度计算、锁单管理、自动续期、参与统计 |
| 🎁 抽奖 | 积分抽奖、自动延期、中奖通知、历史记录 |
| 💰 积分 | 每日签到、邀请奖励、消费返积分、流水查询 |
| 👤 用户 | 邀请码分享、用户名修改、联系方式管理 |
| 🔧 后台 | 交易统计、订单/商品/拼团/抽奖管理、网站配置 |
git clone https://github.com/XShen-Jason/zhshop.git
cd zhshop/frontend
npm install
cp .env.example .env.local # 填入 Supabase 配置
npm run dev环境变量 (.env.local)
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
NEXT_PUBLIC_SITE_URL=https://your-domain.com| 分类 | 技术 |
|---|---|
| 前端 | Next.js 15, React 19, TypeScript, Tailwind CSS |
| 后端 | Next.js API Routes, Supabase |
| 数据库 | PostgreSQL (Supabase) |
| 部署 | PM2 + Nginx |
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 配置 2G Swap (防止构建时内存不足)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 更新系统
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git nginx unzip# Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# PM2
sudo npm install -g pm2
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
# 创建目录
sudo mkdir -p /var/www/zhshop
sudo chown $USER:$USER /var/www/zhshop
# 克隆代码
cd /var/www/zhshop && git clone https://github.com/XShen-Jason/zhshop.git .cat > /var/www/zhshop/frontend/.env.local << 'EOF'
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
NEXT_PUBLIC_SITE_URL=https://your-domain.com
EOFcd /var/www/zhshop/frontend
npm install && npm run build
# PM2 启动 (2G内存用1300M,4G用2500M)
pm2 start npm --name "zhshop" --max-memory-restart 1300M -- start
# 开机自启
pm2 startup systemd -u $USER --hp $HOME
pm2 savesudo tee /etc/nginx/sites-available/zhshop > /dev/null << 'EOF'
server {
listen 80;
server_name your-domain.com;
client_max_body_size 5M;
gzip on;
gzip_types text/plain text/css application/json application/javascript;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
EOF
sudo ln -sf /etc/nginx/sites-available/zhshop /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl restart nginx
# 防火墙
sudo ufw allow 22/tcp && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp
sudo ufw enable- DNS 记录:添加 A 记录指向服务器 IP,开启代理 ☁️
- SSL 设置:选择 Full
# 创建 Cloudflare Origin 证书目录
sudo mkdir -p /etc/ssl/cloudflare
# 保存证书 (从 Cloudflare SSL/TLS → Origin Server 获取)
sudo nano /etc/ssl/cloudflare/cert.pem
sudo nano /etc/ssl/cloudflare/key.pem
sudo chmod 600 /etc/ssl/cloudflare/key.pem更新 Nginx (HTTPS)
sudo tee /etc/nginx/sites-available/zhshop > /dev/null << 'EOF'
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/ssl/cloudflare/cert.pem;
ssl_certificate_key /etc/ssl/cloudflare/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
client_max_body_size 20M;
gzip on;
gzip_types text/plain text/css application/json application/javascript;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
EOF
sudo nginx -t && sudo systemctl restart nginxcd /var/www/zhshop
git pull
cd frontend && npm install && npm run build
pm2 restart zhshop强制同步远程
git fetch origin && git reset --hard origin/main
cd frontend && npm install && npm run build && pm2 restart zhshop| 操作 | 命令 |
|---|---|
| 查看状态 | pm2 status |
| 查看日志 | pm2 logs zhshop |
| 重启应用 | pm2 restart zhshop |
| Nginx 日志 | sudo tail -f /var/log/nginx/error.log |
清理未验证用户 (每日凌晨3点)
crontab -e
# 添加:
0 3 * * * curl -X POST http://localhost:3000/api/cron/cleanup-unverified >> /var/log/zhshop-cleanup.log 2>&1MIT License