<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Corey Chiu</title>
        <link>https://coreychiu.com</link>
        <description>Corey Chiu's blog</description>
        <lastBuildDate>Tue, 28 Apr 2026 09:02:48 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Corey Chiu</title>
            <url>https://coreychiu.com/favicon.ico</url>
            <link>https://coreychiu.com</link>
        </image>
        <copyright>All rights reserved Corey Chiu 2026</copyright>
        <item>
            <title><![CDATA[n8n自部署极速版教程（Dokploy版）]]></title>
            <link>https://coreychiu.com/blogs/how-to-install-n8n-on-dokploy</link>
            <guid>https://coreychiu.com/blogs/how-to-install-n8n-on-dokploy</guid>
            <pubDate>Wed, 09 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[简单几个步骤，教你几分钟部署好自己的永久免费的n8n]]></description>
            <content:encoded><![CDATA[


n8n是一个强大的开源工作流自动化工具，可以帮你连接各种应用和服务，实现业务流程自动化。相比于付费的Zapier等工具，n8n完全免费且可以自己部署，拥有完全的数据控制权。

本教程将教你如何使用Dokploy在几分钟内快速部署自己的n8n实例，让你拥有一个永久免费、功能完整的工作流自动化平台。

> 推荐配置：2C2G以上的VPS服务器，支持Docker环境


# 目录
- n8n简介
  - 什么是n8n
- Dokploy简介
  - 什么是Dokploy
- 安装Dokploy
  - 正常安装（推荐）
  - 国内服务器安装
- 安装n8n
  - 使用模板安装
  - 配置访问域名
- n8n注册使用
  - 注册账号
  - 激活许可证
  - 开始使用


----

# 什么是n8n

[n8n](https://n8n.io) 是一个开源的工作流自动化工具，让你可以通过可视化的方式连接不同的应用和服务，实现自动化任务处理。

![n8n工作流界面](/images/blog/n8n-1.png)

简单来说，n8n就像是一个"数字管家"，可以帮你自动完成重复性的工作。比如：
- 当有人在你的网站填写表单时，自动发送邮件通知并保存到数据库
- 定时从不同网站抓取数据并整理成报表
- 监控社交媒体提及，自动回复或转发到团队群聊
- 同步不同平台的数据，比如将新订单信息同步到财务系统

n8n的优势：
- **完全免费开源**：可以自己部署，数据完全掌控
- **可视化操作**：拖拽式界面，不需要复杂编程
- **丰富的集成**：支持400+种应用和服务连接
- **灵活扩展**：可以用JavaScript编写自定义逻辑

与Dify、Coze等AI平台不同，n8n专注于工作流自动化和系统集成，而不是AI对话或智能体构建，更适合处理数据流转和业务流程自动化。


----
# 什么是Dokploy
[Dokploy](https://dokploy.com) 是一个开源的应用部署解决方案，提供一站式项目、数据的管理以及系统监控。

![Dokploy](/images/blog/dokploy-1.png)


Dokploy自带多种一键部署模板，可以像Vercel一样地在自己的服务器上部署网站和应用，也可以部署各种数据库（PostgreSQL、MySQL、Redis等）、Docker Compose服务，以及热门的开源工具如n8n、Supabase、Grafana等。最重要的是，所有这些都可以通过可视化界面轻松管理，无需复杂的命令行操作。

![Dokploy预设多种一键部署开源模版](/images/blog/dokploy-2.png)


# 安装Dokploy
## 正常安装
如果你的服务器能直接访问到Dockerhub,直接拉Docker镜像，比如服务器是阿里云/腾讯云等国内云服务器厂商的境外区域服务器，或者是国外的云服务器厂商，比如Hostinger，那你就可以直接使用官方的安装脚本

```
curl -sSL https://dokploy.com/install.sh | sh
```


> 如果你还没买服务器，或者对服务器区域没有要求，那么我更建议你直接购买国外的云服务器，安装过程、后续维护都更方便，免去很多潜在的问题。
> 
> 我自己就买了一台[Hostinger](https://www.hostinger.com/cart?product=vps%3Avps_kvm_2&period=12&referral_type=cart_link&REFERRALCODE=SMCIAMCORWTX&referral_id=0195d1ac-4d34-709b-a1cf-da5744f200e0)的VPS服务器，2C8G配置，100GB的存储空间，8T的带宽，日常卖6.99刀一个月，经常会有搞活动两年只需800多rmb，对比之下还是很实惠的。这个配置也足够个人项目使用了，部署多个应用也不是问题。
>
> 并且hostinger服务器自带多种系统模板，**我就是直接选择带dokploy的ubuntu系统安装好就可以了，不需要自己手动安装配置dokploy**。

安装之后的访问域名等dokploy相关配置，可以参考我之前发过的文章，这里就不展开了。

[阿里云ECS国内服务器部署Dokploy教程](https://coreychiu.com/blogs/how-to-install-dokploy-on-aliyun-ecs-server)


## 国内服务器安装
如果你因为个人需求，必须使用国内的服务器部署，也可以参考我之前发过的文章。

[阿里云ECS国内服务器部署Dokploy教程](https://coreychiu.com/blogs/how-to-install-dokploy-on-aliyun-ecs-server)


# 安装n8n

## 安装
进入dokploy后台，选择Project - Create Project - Create Service - Template - 选择n8n template

![新建Service](/images/blog/n8n-2.png)


![搜索选择n8n Template](/images/blog/n8n-3.png)


## 配置访问域名
deploy这个n8n service，会自动给你分配一个traefik的域名，然后你就可以通过这个域名访问n8n了。可以通过点击Domains看到具体的域名。如果要添加自己的域名，也是在Domains中配置。

添加自己的域名还需要更改Enviroment中Environment Settings中的环境变量，将`N8N_HOST`修改为你的域名，然后保存，重新deploy一遍。里面的`N8N_PORT`就是这个service的端口，也是在Domains中配置域名中的`Container port`。


![配置域名](/images/blog/n8n-4.png)

![配置环境变量](/images/blog/n8n-5.png)

![配置域名](/images/blog/n8n-6.JPG)





# n8n注册使用
访问前面配置的域名，或者traefik的域名，然后按照提示注册即可。

然后会弹窗提示获取license key，点击send后，会在注册邮箱收到一个n8n的license key，填入即可解锁永久免费的n8n使用。

![n8n注册](/images/blog/n8n-7.png)

![n8n激活](/images/blog/n8n-8.png)

然后恭喜你，你已经成功安装并配置了n8n，可以愉快地使用了！

![n8n使用](/images/blog/n8n-9.png)

官方提供了很多的workflow template供使用，可以直接点击左下角的[template](https://n8n.io/workflows/)访问使用～后面我也会专门再写一篇关于n8n的使用教程与各种实用小技巧，欢迎大家持续关注～
]]></content:encoded>
            <author>iamcoreychiu@gmail.com (Corey Chiu)</author>
        </item>
        <item>
            <title><![CDATA[阿里云ECS国内服务器部署Dokploy教程]]></title>
            <link>https://coreychiu.com/blogs/how-to-install-dokploy-on-aliyun-ecs-server</link>
            <guid>https://coreychiu.com/blogs/how-to-install-dokploy-on-aliyun-ecs-server</guid>
            <pubDate>Wed, 26 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[本文介绍如何在阿里云的国内区域ECS服务器上安装、配置dokploy，使用dokploy部署NextJS等应用，并实现GitHub代码更新后自动编译构建镜像并部署上线。]]></description>
            <content:encoded><![CDATA[

这两天因为一些第三方项目需求，要在一台阿里云的国内ECS服务器上安装Dokploy并且部署NextJS应用，在安装Dokploy的过程中遇到很多坑，并且没有找到什么很好的教程能有效解决我的问题，折腾了好久终于装好，遂把我遇到的坑以及完整的安装过程记录下来，以供有需要的朋友参考。
> 我的配置环境：阿里云ECS服务器，配置：2C2G，区域：华东1（杭州），系统：Ubuntu24.04


# 目录
- Dokploy简介
  - 什么是Dokploy？
- 安装Dokploy
  - 正常安装
  - 国内服务器安装
    - 修改安装脚本
    - 配置Docker镜像源
    - 运行安装脚本
    - 配置防火墙
    - 访问后台
  - 安装常见问题
- 配置后台
  - 绑定域名
- 配置应用
  - 配置GitHub
  - 新建应用
  - 直接Deploy
  - 利用GitHub Action来Deploy
    - 新建GitHub Token
    - 配置Registry
    - 配置Provider
    - 配置项目Workflow
    - 配置环境变量
  - 配置应用域名
- 常见问题
- 参考代码


----



# 什么是Dokploy？
[Dokploy](https://dokploy.com) 是一个开源的应用部署解决方案，提供一站式项目、数据的管理以及系统监控。

![Dokploy](/images/blog/dokploy-1.png)


简单来说就是可以像Vercel一样地在自己的服务器上部署网站，并且还能部署数据库、Docker Compose等开源服务，例如Supabase，并且可以很方便地监控系统及应用日志


![Dokploy预设多种一键部署开源模版](/images/blog/dokploy-2.png)


# 安装Dokploy
## 正常安装
如果你的服务器能直接访问到Dockerhub,直接拉Docker镜像，比如服务器是阿里云/腾讯云等国内云服务器厂商的境外区域服务器，或者是国外的云服务器厂商，比如Hostinger，那你就可以直接使用官方的安装脚本

```
curl -sSL https://dokploy.com/install.sh | sh
```


> 如果你还没买服务器，或者对服务器区域没有要求，那么我更建议你直接购买国外的云服务器，安装过程、后续维护都更方便，免去很多潜在的问题。
> 
> 我自己就买了一台[Hostinger](https://www.hostinger.com/cart?product=vps%3Avps_kvm_2&period=12&referral_type=cart_link&REFERRALCODE=SMCIAMCORWTX&referral_id=0195d1ac-4d34-709b-a1cf-da5744f200e0)的VPS服务器，2C8G配置，100GB的存储空间，8T的带宽，日常卖6.99刀一个月，经常会有搞活动两年只需800多rmb，对比之下还是很实惠的。这个配置也足够个人项目使用了，部署多个应用也不是问题。


## 国内服务器安装
如果你因为个人需求，必须使用国内的服务器部署，那么就可能会经历跟我一样的问题，你可以按以下步骤来。


1. 先把官方install脚本下载下来
```
wget https://dokploy.com/install.sh
```


然后修改以下部分
```
docker pull postgres:16
docker pull redis:7
docker pull traefik:v3.1.2
docker pull dokploy/dokploy:latest

# Installation
docker service create \
  --name dokploy \
  --replicas 1 \
  --network dokploy-network \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  --mount type=bind,source=/etc/dokploy,target=/etc/dokploy \
  --mount type=volume,source=dokploy-docker-config,target=/root/.docker \
  --publish published=3000,target=3000,mode=host \
  --update-parallelism 1 \
  --update-order stop-first \
  --constraint 'node.role == manager' \
  -e ADVERTISE_ADDR=$advertise_addr \
  dokploy/dokploy:latest
```

修改为
```
docker pull postgres:16
docker pull redis:7
docker pull traefik:v3.1.2

# 修改以下部分
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/dokploy/dokploy:latest
docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/dokploy/dokploy:latest  docker.io/dokploy/dokploy:latest

# Installation
docker service create \
  --name dokploy \
  --replicas 1 \
  --network dokploy-network \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
  --mount type=bind,source=/etc/dokploy,target=/etc/dokploy \
  --mount type=volume,source=dokploy-docker-config,target=/root/.docker \
  --publish published=3000,target=3000,mode=host \
  --update-parallelism 1 \
  --update-order stop-first \
  --constraint 'node.role == manager' \
  -e ADVERTISE_ADDR=$advertise_addr \
  # 修改以下部分
  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/dokploy/dokploy
```


2. 修改docker镜像源为阿里云国内源
运行以下命令
```
# 1. 创建空的daemon.json
echo >/etc/docker/daemon.json

# 2. 写入docker镜像源
cat>/etc/docker/daemon.json <<END
{
  "registry-mirrors": [
    "https://mirrors-ssl.aliyuncs.com/"
  ]
}
END

# 3. 重启docker
systemctl restart docker
```


3. 运行Dokoloy的install脚本
```
sh install.sh
```

当看到以下输出的时候，说明安装完成了
```
Congratulations, Dokploy is installed!
Wait 15 seconds for the server to srart
Please go to http://{服务器公网ip}:3000
```


4. 配置ip防火墙白名单


在安全组中新增一条针对3000、80、443端口的防火墙白名单
![阿里云安全组](/images/blog/dokploy-3.png)

具体配置如下，来源是ipv4的全部地址
![新增安全组配置](/images/blog/dokploy-4.png)




5. 进入Dokploy后台管理界面


访问`http://{服务器公网ip}:3000`，看到以下界面，就说明安装成功了。接下来就是到了注册管理员、配置后台的环节。
![Dokploy后台管理系统](/images/blog/dokploy-5.png)


## 安装常见问题

1. 如果在运行install.sh的时候输出了以下
```
Error response from daemon: Get "https://registry01.docker.io/v2/": context deadline exceeded
Error response from daemon: Get "https://registry01.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded whileawaiting headers)
```
说明你拉Docker镜像失败了，参考上面的换docker镜像源为国内源


2. 如果在安装完成后，打开`http://{服务器公网ip}:3000`访问，页面出现502

用命令`docker ps`看看起了的镜像，是不是有4行，分别为`redis:7, traefik:v3.1.2, postgres:16, dokploy/dokploy:latest`，如果不是，说明启动失败了，看`dokploy/dokploy:latest`前面对应的`CONTAINER ID`，然后输入命令`docker logs {CONTAINER ID}`看启动日志


# 配置后台

## 绑定域名
1.Dokploy后台系统左边边栏选择Server，Server Domain中的Domain中填入你想用来当Dokploy后台页面的域名
![Dokploy绑定域名](/images/blog/dokploy-6.png)


2. 新增一条域名dns记录，类型是A记录，记录名是dokploy，值是你的服务器的ip


# 配置应用

## 配置GitHub
Dokploy后台系统左边边栏选择Git，Git Provider选择GitHub，创建应用，创建完之后授权仓库
![Dokploy绑定GitHub](/images/blog/dokploy-7.png)


## 新建应用
左边边栏选择Projects
![新建Projects](/images/blog/dokploy-8.png)


Create Service - Application
![新建Application](/images/blog/dokploy-9.png)

选择对应的GitHub仓库与分支。如果是NextJS应用，Build Type可以跟我一样选择Dockerfile，配置好对应的Dockerfile文件路径，以及在Environment页配置相应的环境变量，然后点击Deploy即可。

### 直接Deploy
可以点击Deploy，然后等待成功即可。后续每次代码Push到GitHub仓库中，都会自动触发Deploy。


但也有可能存在网络问题，出现不能从GitHub拉取代码，或者npm安装依赖失败等问题，可以考虑使用GitHub Action构建镜像来部署，如下。


### 利用GitHub Action来Deploy
Github Actions Deploy即利用GitHub Action来构建Docker镜像，镜像托管在Github镜像Registry，服务器上的Dokploy只负责从GitHub拉取最新镜像然后部署上线。具体步骤如下


1. 新建GitHub Token
访问[获取GitHub Token](https://github.com/settings/tokens/new)，如下图配置新建一个GitHub Token
![新建GitHub Token](/images/blog/dokploy-11.png)




2. Dokploy内配置Registry
左边边栏选择Registry，点击Add Registry，`Username`是你的Github账号，`Password`是前面创建的Token，`Registry URL`是`https://ghcr.io`。
![新建Registry](/images/blog/dokploy-12.png)



3. 新建应用
Projects中重新新建一个Application或者修改前面建好的Application，Advanced中Cluster Settings中Select a Registry选上刚刚创建的Registry
![配置Registry](/images/blog/dokploy-13.png)



4. 配置Provider
回到General中，Provider选择Docker，`Docker Image`中填入`ghcr.io/{Github账号}/{Repository项目名}:{分支名}`，然后保存。这样部署应用的时候，Dokploy就会去GitHub的Registry中拉你这个项目的Docker镜像用于部署。
![配置Docker Provider](/images/blog/dokploy-14.png)



5. 配置项目Workflow
然后还要在此GitHub项目的Action新增一个Workflow（workflow是GitHub中的一个工作流，配置GitHub Action的workflow可以配置GitHub仓库的自动化操作）。



我们要创建一个workflow，用于每次push代码到仓库main分支的时候都自动用你的Dockerfile构建一个Docker镜像到GitHub Registry上，这样Dokploy就会去拉这个最新的镜像用于部署应用。



记得在workflow的yml中最后加上触发Dokploy重新部署的步骤。其中需要填入一个Dokploy的`webhook`，在deployments中的`Webhook URL`中获取



我放了一个我在我的项目用到的`workflow.yml`以及`Dockerfile`在本文最后以供参考。



6. 配置环境变量
注意：使用这个方法的话，项目如果有环境变量，要配置到仓库中去，具体配置方法有两种：


- 简单粗暴法
直接将`.env`文件上传到GitHub仓库中去


- 配置法
在workflow的yml文件中build的阶段配置相关变量，Dockerfile也要添加相关的环境变量


然后登录 GitHub 仓库
进入 Settings -> Secrets and variables -> Actions
点击 "New repository secret"
添加以下信息：
Name: `{环境变量名}`
Value: `{环境变量值}`
这样设置后，GitHub Actions 在构建 Docker 镜像时就会使用这个环境变量了。





## 配置应用域名
在Domains页配置想要的域名，然后映射到应用对应的端口，(例如通常NextJS应用是`3000`, Astro应用是`4321`),注意把HTTPS打开，也可以点击右边的骰子按钮来生成一个`xxx.traefik.me`域名，但注意`traefik.me`域名只能用HTTP访问，不要把HTTPS打开。
![配置应用域名](/images/blog/dokploy-10.png)



然后即可使用域名访问。


# 常见问题

1. 用`ip:端口`访问应用/dokploy后台是正常，但用域名访问失败，页面返回`502 currently unable to handle this request.`，请检查你的域名DNS解析是否正常，服务器防火墙是否打开80/443端口，Linux服务器内是否开启了防火墙




# 参考代码

`workflow.yml`参考

```
# https://docs.github.com/zh/actions/use-cases-and-examples/publishing-packages/publishing-docker-images
name: Create and publish a Docker image

# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
  push:
    branches: ['main']

# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.
env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
    permissions:
      contents: read
      packages: write
      attestations: write
      id-token: write
      # 
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
      # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
      # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
      # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          # environment variables
          build-args: |
            NEXT_PUBLIC_ARG1=${{ secrets.NEXT_PUBLIC_ARG1 }}
            SEC_ARG2=${{ secrets.SEC_ARG2 }} 
            
      
      # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see "[AUTOTITLE](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)." 
      # - name: Generate artifact attestation
      #   uses: actions/attest-build-provenance@v1
      #   with:
      #     subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
      #     subject-digest: ${{ steps.push.outputs.digest }}
      #     push-to-registry: true

      # Trigger redeploy on dokploy => project webhooks settings
      - name: Trigger dokploy redeploy
        run: |
          curl -X GET {dokploy_webhook}
      
```


`Dockerfile`参考
```
# https://github.com/nextauthjs/next-auth-example/blob/main/Dockerfile
# syntax=docker/dockerfile:1
FROM node:20-alpine AS base

# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app

# Install dependencies
COPY package.json pnpm-lock.yaml* ./
RUN npm install -g pnpm && pnpm i --frozen-lockfile

# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# 声明构建参数
ARG ARG1

# 设置环境变量
ENV ARG1=$ARG1

# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN npm install -g pnpm \
  && mv next.config.docker.mjs next.config.mjs \
  && pnpm build

# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app

ENV NODE_ENV production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder /app/public ./public

# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next

# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs

EXPOSE 3000

ENV PORT 3000
ENV HOSTNAME "0.0.0.0"

# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
CMD ["node", "server.js"]
```
]]></content:encoded>
            <author>iamcoreychiu@gmail.com (Corey Chiu)</author>
        </item>
        <item>
            <title><![CDATA[网站收录终极指南！让你的网站流量起飞！]]></title>
            <link>https://coreychiu.com/blogs/ultimate-guide-to-search-engine-submission</link>
            <guid>https://coreychiu.com/blogs/ultimate-guide-to-search-engine-submission</guid>
            <pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[想让你的网站获得更多流量，被更多人发现？谷歌只是众多搜索引擎之一，全球还有那么多的搜索引擎，一个也不能放过]]></description>
            <content:encoded><![CDATA[
🔥 **网站收录终极指南！除了谷歌，把这些搜索引擎都提交上，实现流量起飞！** 🚀  


想让你的网站获得更多流量，被更多人发现？谷歌只是众多搜索引擎之一，全球还有那么多的搜索引擎，一个也不能放过


### 🌍 **国外搜索引擎**  

🔍 **Google**（全球最大搜索引擎）  
👉 使用Google Search Console → 添加你的网站  
🔗 https://search.google.com/search-console  

🔍 **Bing**（微软旗下，欧美常用）  
👉 进入Bing Webmaster → 提交网站  
🔗 https://www.bing.com/webmasters  

🔍 **Yandex**（俄罗斯流量王）  
👉 Yandex Webmaster → 添加你的网站  
🔗 https://webmaster.yandex.com/  

🔍 **Naver**（韩国主流搜索引擎）  
👉 Naver站长工具 → 提交网站  
🔗 https://searchadvisor.naver.com  

🔍 **DuckDuckGo**（隐私友好型搜索引擎）  
👉 虽然DuckDuckGo没有站长工具，但它的结果来自Bing和Yandex，提交到Bing和Yandex即可覆盖！  

🔍 **Seznam**（捷克主流搜索引擎）  
👉 Seznam站长工具 → 添加网站  
🔗 https://napoveda.seznam.cz  

---

### 🇨🇳 **国内搜索引擎**  

🔍 **百度**（中国最大搜索引擎）  
👉 百度搜索平台 → 提交链接  
🔗 快速提交：https://ziyuan.baidu.com/linksubmit/url  
✨ 高阶玩法：用百度站长工具深度优化！  
🔗 进阶入口：https://ziyuan.baidu.com  

🔍 **360搜索**（中国常用搜索引擎）  
👉 360站长平台 → 提交链接  
🔗 https://zhanzhang.so.com  

🔍 **Sogou**（搜狗搜索）  
👉 搜狗站长平台 → 提交网站  
🔗 https://zhanzhang.sogou.com  

---

📈 提交后别忘了定期检查收录状态哦！  
]]></content:encoded>
            <author>iamcoreychiu@gmail.com (Corey Chiu)</author>
        </item>
        <item>
            <title><![CDATA[GitHub登录配置教程极简版]]></title>
            <link>https://coreychiu.com/blogs/github-oauth-setup</link>
            <guid>https://coreychiu.com/blogs/github-oauth-setup</guid>
            <pubDate>Sun, 26 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[简单几个步骤，教你从零开始配置GitHub OAuth登录]]></description>
            <content:encoded><![CDATA[
我们在上线面向开发者的网站，一般都需要集成GitHub登录，因为GitHub账户在开发者群体中的普及率相当高。

GitHub登录的配置相对简单直接，当做的是面向开发者群体的网站时，我的建议是接入Google以及GitHub登录。

虽然整个流程相对简单，但有一些细节需要注意，因此我今天借一个新站接入GitHub登录的机会，把全流程详细地记录下来分享给大家。

只要跟着做，小白也能在三分钟内配置好～


![GitHub OAuth应用注册页面](/images/blog/github-oauth-setup-1.png)


## 第一步：注册GitHub OAuth应用

1. 访问 [GitHub Developer Settings](https://github.com/settings/developers)
2. 点击"OAuth Apps"标签
3. 点击"New OAuth App"按钮
4. 填写应用信息：
   - Application name：你的应用名称
   - Homepage URL：你的网站首页地址
   - Application description：应用描述，会展示在授权界面
   - Authorization callback URL：授权回调地址(样例)
     - 开发环境：`http://localhost:3000/api/auth/callback/github`
     - 生产环境：`https://你的域名/api/auth/callback/github`
   - Enable Device Flow : 不用管

⚠️ 注意：URL只能填写一个，所以开发环境和生产环境需要申请两个不同的Application.


![GitHub OAuth应用信息填写页面](/images/blog/github-oauth-setup-2.png)


## 第二步：获取OAuth凭据

1. 创建应用后，你会看到应用详情页面
2. 记录下 Client ID（客户端ID）
3. 点击"Generate a new client secret"生成新的客户端密钥
4. 立即保存生成的Client Secret（客户端密钥），因为它只会显示一次。
5. 将Client ID和Client Secret填写到环境变量
6. 上传网站logo，点击"Update Application"

⚠️ 注意：如果你不小心丢失了Client Secret，只能重新生成一个新的。


## 常见问题解答

### 1. 为什么我的登录按钮点击没反应？
- 检查环境变量是否正确配置
- 确认回调URL是否与GitHub OAuth应用中设置的完全一致
- 查看浏览器控制台是否有错误信息

### 2. 登录后页面一直加载怎么办？
- 检查NEXTAUTH_URL是否与你的实际网站URL匹配
- 确认数据库连接是否正常（如果使用了数据库）
- 验证GitHub OAuth应用的回调URL是否正确配置

### 3. 生产环境部署注意事项
- 更新环境变量为生产环境的值
- 在GitHub OAuth应用设置中添加生产环境的回调URL
- 确保域名已经配置SSL证书（https）

## 安全提示

1. 永远不要在代码中硬编码客户端密钥
2. 使用环境变量存储敏感信息
3. 定期更新依赖包以修复安全漏洞
4. 在生产环境中使用HTTPS
5. 定期检查GitHub OAuth应用的权限设置
6. 如果怀疑凭据泄露，立即重新生成Client Secret
]]></content:encoded>
            <author>iamcoreychiu@gmail.com (Corey Chiu)</author>
        </item>
        <item>
            <title><![CDATA[三分钟配置好Google登录教程小白版]]></title>
            <link>https://coreychiu.com/blogs/google-oauth-setup</link>
            <guid>https://coreychiu.com/blogs/google-oauth-setup</guid>
            <pubDate>Sun, 26 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[只需三分钟，一步一步教你从零开始设置Google OAuth登录]]></description>
            <content:encoded><![CDATA[

我们在新上线一个网站时，特别是出海的网站，一般都需要集成Google登录，因为Google账户在国外的普及率相当高。

并且Google登录配置简单，我认为Google登录的优先级在所有的登录方式中甚至可以排到第一位。在网站上线初期，花三分钟先配置一个Google登录尽快上线，是性价比最高的。

虽然但是，整个流程需要配置的步骤还是不少，并且有一些很重要的细节，会影响效率从而影响到上站的速度，因此我今天借一个新站接入Google登录的机会，把全流程详细地记录下来分享给大家。

只要跟着做，小白也能在三分钟内配置好～



## 第一步：创建Google Cloud项目


1. 访问 [Google Cloud Console](https://console.cloud.google.com/apis/dashboard)
2. 点击右上角的"创建项目"按钮
3. 输入你的项目名称（比如"我的网站"）
4. 点击"创建"完成项目创建
5. 切换到新创建的项目


![Google Cloud Console创建项目](/images/blog/google-oauth-setup-1.png)


## 第二步：配置OAuth权限请求页面

1. 在左侧菜单中找到"API和服务" → "OAuth权限请求页面"
2. 用户类型（User Type）选择"外部"
3. 填写应用名称、支持邮箱等基本信息 
  注意⚠️：这里不要上传应用徽标，否则会有一个验证的时间
4. 添加你的应用域名，privacy policy和terms of service的页面地址(需要提前在网站做好相关内容页)
5. 已获授权的网域 - 网站域名(不用写localhost)
5. 选择需要的权限范围 - 一般是用户的基本信息，比如`userinfo.email`, `userinfo.profile`，不知道选啥的话一般这俩就够了，按需自选
6. 测试用户把自己添加上
7. 测试完成后点击"发布应用"，然后就可以让任意用户使用了，也就是正式上线


![Oauth权限请求页面](/images/blog/google-oauth-setup-2.png)



## 第三步：配置OAuth凭据

1. 在左侧菜单中找到"API和服务" → "凭据"
2. 点击"创建凭据" → 选择"OAuth客户端ID"
1. 选择应用类型（Web应用）
2. 设置应用名称
3. 设置已获授权的 JavaScript 来源
   - 开发环境： (样例)`http://localhost:3000/`
   - 生产环境： (样例)`https://你的域名/`
3. 添加授权的重定向URI：
   - 开发环境： (样例)`http://localhost:3000/api/auth/callback/google`
   - 生产环境： (样例)`https://你的域名/api/auth/callback/google`
4. 点击"创建"，你将获得：
   - 客户端ID（Client ID）
   - 客户端密钥（Client Secret）
5. 填入环境变量中

⚠️ 重要提示：请安全保存这些凭据，特别是客户端密钥，千万不要泄露或直接写在代码中！

## 常见问题解答

### 1. 为什么我的登录按钮点击没反应？
- 检查环境变量是否正确配置
- 确认重定向URI是否正确设置
- 查看浏览器控制台是否有错误信息

### 2. 登录后页面一直加载怎么办？
- 检查NEXTAUTH_URL是否与你的实际网站URL匹配
- 确认数据库连接是否正常（如果使用了数据库）

### 3. 生产环境部署注意事项
- 更新环境变量为生产环境的值
- 在Google Cloud Console中添加生产环境的重定向URI
- 确保域名已经配置SSL证书（https）

## 安全提示

1. 永远不要在代码中硬编码客户端密钥
2. 使用环境变量存储敏感信息
3. 定期更新依赖包以修复安全漏洞
4. 在生产环境中使用HTTPS
5. 定期检查OAuth同意屏幕的设置

]]></content:encoded>
            <author>iamcoreychiu@gmail.com (Corey Chiu)</author>
        </item>
        <item>
            <title><![CDATA[Next.js webpack.cache.PackFileCacheStrategy打包失败问题解决]]></title>
            <link>https://coreychiu.com/blogs/webpack-caching-failed-for-pack</link>
            <guid>https://coreychiu.com/blogs/webpack-caching-failed-for-pack</guid>
            <pubDate>Thu, 09 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[解决Next.js项目pnpm dev/build时webpack缓存失败的问题实录]]></description>
            <content:encoded><![CDATA[

最近在运行本地的一些next.js项目时，经常出现

```
<w> [webpack.cache.PackFileCacheStrategy] Caching failed for pack: Error: Unable to snapshot resolve dependencies
```
的问题。

我的项目环境：
- Next.js 14.2.9
- pnpm 9.12.3
- node v23.5.0

经过排查，问题有这些特征
- 本地pnpm build/dev时都会有，但线上版本不会有
- 多个项目都有这个问题
- 只在我的笔记本上有，同一个项目在家里的电脑就不会有

因此初步断定为本机pnpm/webpack配置的问题，非项目的问题


经过网上多番搜索、问AI、以及群友寻求帮助，一共试了多个方案，最后终于成功解决，以下记录一下我的经历，希望对大家有帮助。

## 解决方案

1. 清除缓存重新构建（对我没用）
```
# 清理构建缓存
rm -rf .next
rm -rf node_modules/.cache

# 清理依赖
rm -rf node_modules
rm pnpm-lock.yaml

# 清理 pnpm 存储
pnpm store prune

# 重新安装依赖
pnpm install

# 清理构建缓存后重新构建
pnpm build
```
这个方案对我不生效，使用完后还是会出现这个问题

2. 删除重复的依赖包，优化依赖树结构（对我没用）
```
# 删除重复的依赖包
pnpm dedupe

# 重新安装依赖
pnpm install

# 重新构建
pnpm build
```
这个方案对我不生效，使用完后还是会出现这个问题

3. 使用turbopack而不是webpack（对我没用）

修改**next.config.mjs**配置文件
```
{{ ... }}
const configWithMDX = {
  ...nextConfig,
  experimental: {
    mdxRs: true,
    turbo: {
      // 启用 Turbopack
      enabled: true
    }
  },
};
{{ ... }}
```
这个方案对我不生效，使用完后还是会出现这个问题


4. 修改webpack配置,禁用webpack缓存（有用）

修改**next.config.mjs**配置文件
```
{{ ... }}
const nextConfig = {
  output: "standalone",
  reactStrictMode: false,
  pageExtensions: ["ts", "tsx", "js", "jsx", "md", "mdx"],
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "*",
      },
    ],
  },
  webpack: (config, { isServer }) => {
    // 禁用 webpack 缓存以解决构建问题
    config.cache = false;
    return config;
  },
  async redirects() {
    return [];
  },
};
{{ ... }}
```
这个方案是有用的


5. 换用yarn，不用pnpm（没尝试）

理论上可以直接规避问题，不过我一直用的pnpm，所以未尝试]]></content:encoded>
            <author>iamcoreychiu@gmail.com (Corey Chiu)</author>
        </item>
        <item>
            <title><![CDATA[出海做导航站应该如何盈利，如何定价？]]></title>
            <link>https://coreychiu.com/blogs/directory-monetization-and-pricing</link>
            <guid>https://coreychiu.com/blogs/directory-monetization-and-pricing</guid>
            <pubDate>Wed, 04 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[关于出海导航站如何盈利及定价的一些思考]]></description>
            <content:encoded><![CDATA[

最近在独立开发/出海开发圈，导航站开发愈发火热，我认为主要原因有几个
- 国人开发的AI导航站Toolify上线不过一两年，已经成为全球知名的AI导航站，每月流量达到几百万
- 哥飞社区的带动
- Tap4AI等开源导航站的传播
- 以及最近Jacob的导航站建站模板 [Mkdirs](https://mkdirs.com/?via=coreychiu) 的火爆等

我自己也在今年做了好几个导航站
- [AIBest.tools](https://aibest.tools/)
- [BestDirectories.org](https://bestdirectories.org/)
- [MagicBox.tools](https://magicbox.tools/)
- [DevToolset](https://devtoolset.net/)

其中Devtoolset是开源的，无数据库的导航站([仓库地址](https://github.com/iAmCorey/devtoolset))，也收获了不少的star。
MagicBox目前上线了大半年（几乎没怎么运营），DR也达到了40。Best Directories及AI Best Tools作为我最近主推的导航站，上线一个月时间，DR也都达到30。


随着导航站流量的增加以及DR的增高，并且目前导航站赛道也越来越卷，我开始在思考如何才是一个导航站正确的盈利模式，以及如何定价，才能更符合出海的需求。毕竟我们独立开发，赚钱才是王道。


我整理归纳了一些导航站适用的盈利方式及定价策略：

- Affiliate Link
- Feature Listing
- Banner Ad
- Blog Advertising
- Newsletter Advertising
- Social Media Advertising
- Sponsorship
- Ads
- 付费解锁完整清单
- 付费解锁item完整信息
- 提供付费API
- 卖Backlink
- 给自己的产品引流
- 开商店
- Donate

## 1. Affiliate Link
- **模式**：将导航站中的所有工具和服务链接尽可能替换为 affiliate link。
- **收益**：用户通过这些链接购买或注册后，我们可获得分成。
- **适用场景**：适用于推荐SaaS工具、在线课程、IaaS平台等一切有affiliate link的产品。

## 2. Feature Listing
- **模式**：提供Feature Listing，例如首页推荐、分类优先展示、搜索排名靠前。
- **策略**：限制总量以保持稀缺性。
- **定价**：视导航站流量/DR等而定，建议 **$19/月 起**。

## 3. Banner Ad
- **模式**：提供显眼的banner广告位。
- **策略**：主要针对B2B，比如向目标客户是导航站用户的企业。
- **定价**：视导航站流量/DR等而定，建议是feature listing 的 2 倍以上。
- **注意**：banner要足够显眼，给客户带来足够多的流量

## 4. Blog Advertising
- **模式**：通过博客或站内文章提供外链
- **策略**：确保内容质量，同时优化 SEO 效果。
- **定价**：视导航站流量/DR等而定，建议 **$19/月 起**。

## 5. Newsletter Advertising
- **模式**：给订阅用户发送邮件，其中带有宣传链接
- **适用场景**：帮助品牌讲述故事，吸引用户注意。

## 6. Social Media Advertising
- **模式**：通过社交媒体提供宣传服务。例如推特、reddit, facebook, linkedin,youtube 等。
- **定价**：视社媒影响力而定

## 7. Sponsorship
- **模式**：更高级的赞助形式，确保项目出现在所有重要页面，例如：
  - 网站首页
  - 用户后台
  - 邮件推送
- **定价**：应比所有的feature/ad定价更高

## 6. Ads
- **模式**：接入广告平台，如 Google AdSense等。
- **注意**：
  - 如果是 B2C 导航站，可以接入 AdSense 或类似平台。
  - 如果是 B2B 导航站，建议避免广告，以免影响专业性。

## 7. 给自己的 SaaS 产品引流
- **模式**：如果导航站是推广自家产品的渠道，则应优先给自己的产品引流，而非卖广告位。
- **策略**：
  - 设计显眼的推荐区域。
  - 提供用户路径优化，提升转化率。

## 8. 免费展示部分清单，付费展示全部
- **模式**：
  - 免费展示部分内容，例如 Job Board 上的部分职位或外链清单。
  - 付费解锁完整清单

## 9. 部分信息付费展示
- **模式**：针对特定信息提供付费访问，例如：
  - 项目的所有者信息（Owner Information）。
  - 高级数据或统计信息。

## 10. 提供付费 API
- **模式**：提供获取导航站数据的 API并收费。
- **应用场景**：如 Job Board 提供职位信息。

## 11. 卖 Backlink
- **模式**：在网站提供到客户网站的外链，按链接位置或权重收费。
- **策略**：确保内容质量，同时优化 SEO 效果。

## 12. 开商店
- **模式**：售卖与主题相关的产品，如：
  - 开发工具
  - 数字资源
  - 定制化模板或插件

## 13. Donate/Buy Me a Coffee
- **模式**：用户捐赠支持。
- **策略**：
  - 提供简单便捷的捐赠路径。
  - 在用户社区中建立忠诚度。

在如今的独立开发与出海开发市场中，导航站虽然赛道已经变得越来越卷，但我认为导航站还有很大发挥的舞台。它作为一个信息的提供平台、聚合渠道，除了目前火热的 AI 产品导航站外，还大有所为，所有的有大量信息的方向都有机会做一个优质信息的导航站并且收获流量，实现盈利。



我们作为出海开发者，导航站开发者，在将导航站实现流量增长、用户增长的同时，更要学会如何将其转化为实实在在的收入。通过精心设计的盈利模式和定价策略，如Affiliate Link、Feature Listing、Banner Ad等，我们可以有效地实现这一目标。



未来，导航站的成功将不仅仅取决于内容的丰富度，更重要的是如何在竞争中脱颖而出，通过更多更全面的盈利方式和对市场需求的精准把握，实现更高的盈利。


---

]]></content:encoded>
            <author>iamcoreychiu@gmail.com (Corey Chiu)</author>
        </item>
    </channel>
</rss>