Dimitri's Journal工作日记 & 文档

构建与部署

项目构建、打包、服务器部署完整流程

概述

本项目基于 Next.js 16 + Fumadocs 构建, 部署到 Debian 13, 使用 Nginx 反向代理 + SSL.

本地构建

先清理旧的开发缓存, 再执行生产构建:

cd ~/docs/myself-docs/my-self-app
rm -rf .next
pnpm build

打包传输

以下文件需要传到服务器:

文件/目录说明
.next/构建产物 (必需)
public/静态资源
package.json依赖声明
pnpm-lock.yaml锁定版本
.env.local生产环境变量

打包命令:

tar -czf deploy.tar.gz .next package.json pnpm-lock.yaml .env.local
scp deploy.tar.gz user@server:/opt/myself-docs/

服务器部署

1. 解压安装

ssh user@server
cd /opt/myself-docs
tar -xzf deploy.tar.gz
pnpm install --prod --ignore-scripts

2. PM2 进程管理

# 安装 pm2 (全局)
pnpm add -g pm2

# 启动
pm2 start pnpm --name "myself-docs" -- start

# 查看状态
pm2 status

# 查看日志
pm2 logs myself-docs

# 保存进程列表, 开机自启
pm2 save
pm2 startup

3. Nginx 反向代理 + SSL

创建 /etc/nginx/sites-available/myself-docs:

# HTTP → HTTPS
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/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    add_header Strict-Transport-Security "max-age=63072000" always;

    location / {
        proxy_pass http://127.0.0.1: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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 50m;
    }

    location /_next/static {
        proxy_pass http://127.0.0.1:3000;
        proxy_cache_valid 200 365d;
        add_header Cache-Control "public, immutable";
    }
}

启用:

ln -s /etc/nginx/sites-available/myself-docs /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

4. SSL 证书 (Let's Encrypt)

apt install certbot python3-certbot-nginx
certbot --nginx -d your-domain.com
certbot renew --dry-run

更新部署

# 本地
pnpm build
tar -czf deploy.tar.gz .next public package.json pnpm-lock.yaml .env.local
scp deploy.tar.gz user@server:/opt/myself-docs/

# 服务器
cd /opt/myself-docs
tar -xzf deploy.tar.gz
pnpm install --prod --ignore-scripts
pm2 restart myself-docs

环境变量

生产 .env.local:

# Supabase 密码验证 (可选)
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=eyJh...

# HMAC token 密钥
AUTH_SECRET=your-random-32-char-secret

# 本地密码 (没有 Supabase 时的 fallback)
# NEXT_PUBLIC_DOCS_PASSWORD=journal2026

On this page