从零到全栈:一个穷逼如何用Cloudflare全家桶白嫖企业级网站

504 阅读3分钟

前言:当穷逼遇上Cloudflare

image.png

"为什么选择Cloudflare?"
因为它就像程序员的乐高积木——免费、模块化,而且拼错了还能重来!


第一章:Cloudflare全家桶点菜指南

1.1 食材准备(注册与安装)

第一步:注册Cloudflare账号

  • 访问Cloudflare官网(别担心,不会要你卖肾)
  • 虽然大部分服务免费,但R2需要信用卡验证(就像超市试吃要先出示会员卡)

第二步:安装Wrangler CLI工具

npm install -g wrangler
wrangler login

温馨提示:如果安装失败,请先检查自己是不是把npm拼成了nmp——这是程序员的第一道智商测试题

1.2 核心组件功能对比

服务名称免费额度相当于餐厅里的使用场景
D1数据库500万行/天读取无限续杯的汤用户数据存储
R2存储10GB空间自助沙拉吧图片/文件存储
Workers10万请求/天自动炒菜机后端API服务
Pages500次构建/月外卖打包台前端部署

第二章:厨房实操(配置详解)

2.1 D1数据库:你的SQL玩具箱

创建数据库(就像在宜家组装家具)

wrangler d1 create my-database

初始化表结构(schema.sql)

CREATE TABLE "User" (
    "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "email" TEXT NOT NULL,
    "name" TEXT,
    "password_hash" TEXT NOT NULL
);

执行迁移(让数据找到自己的家)

wrangler d1 execute my-database --local --file=./schema.sql

踩坑预警:如果报错"table already exists",说明你和我一样手快点了两次——数据库界的"薛定谔的猫"现象

2.2 R2存储:云端的储物间

创建存储桶步骤:

  1. 在Cloudflare控制台进入R2
  2. 创建存储桶(名称如my-media-bucket
  3. 启用公共访问URL(不然你的图片会比国家机密还难访问)

配置示例(wrangler.toml)

[[r2_buckets]]
binding = "MY_BUCKET"  # 前端调用的变量名
bucket_name = "my-media-bucket"  # 你的储物间编号

第三章:魔法烹饪(代码实战)

3.1 Workers后端示例

export default {
  async fetch(request, env) {
    // 当用户访问/api/panic时...
    if (new URL(request.url).pathname === "/api/panic") {
      return new Response("Don't panic! Here's your towel.", {
        headers: { "content-type": "text/plain" }
      });
    }
    
    // 默认返回404,因为程序员最熟悉这个状态码
    return new Response("404 - 页面不存在,就像你的人生目标", { status: 404 });
  }
};

3.2 前端调用Worker

// 获取恐慌安慰语
async function getPanicAdvice() {
  const response = await fetch('/api/panic');
  const advice = await response.text();
  console.log(advice); // 输出:"Don't panic! Here's your towel."
  return advice;
}

// 上传文件到R2(比如你的辞职信)
async function uploadResignationLetter(file) {
  const formData = new FormData();
  formData.append('resignation', file);
  
  await fetch('/api/upload', {
    method: 'POST',
    body: formData
  });
}

第四章:自动化流水线(GitHub Actions)

4.1 创建部署工作流(.github/workflows/deploy.yml)

name: Deploy to Cloudflare

on:
  push:
    branches: [ main ]  # 只在主分支推送时触发

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3  # 第一步:把代码从GitHub仓库拿出来
      
      - name: Install dependencies
        run: npm install  # 第二步:安装依赖(就像做饭前要买菜)
        
      - name: Build project
        run: npm run build  # 第三步:构建项目(把食材做成菜)
        
      - name: Publish to Cloudflare
        uses: cloudflare/wrangler-action@2.0.0
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}  # 厨房门禁卡
          command: publish  # 大喊一声:"上菜!"

如果部署失败,GitHub会给你发邮件,就像你妈催你结婚一样频繁


第五章:前后端分离架构

graph TD
    A[用户浏览器] -->|请求| B(Cloudflare Pages)
    B -->|静态文件| A
    A -->|API调用| C[Cloudflare Workers]
    C -->|查询| D[D1数据库]
    C -->|文件操作| E[R2存储]

架构解析:
前端(Pages)就像餐厅的门面
Workers是厨师兼服务员
D1是冰箱,R2是储物柜
用户就是那个永远不满意菜品的食客


第六章:那些年我们踩过的坑

  1. 坑一:D1查询超时
    症状:你的API比树懒还慢
    解药:给查询加索引,就像给老爷爷配拐杖

  2. 坑二:R2文件权限问题
    症状:你的图片比FBI档案还难访问
    解药:检查桶的公共访问设置,就像检查你家大门锁没锁

  3. 坑三:Worker冷启动延迟
    症状:第一次请求比Windows开机还慢
    解药:设置定期ping保持活跃,就像不让服务器睡懒觉


结语:白嫖者的自我修养

通过这套方案,我的个人网站每月节省了约$50的服务器费用——足够我买两杯奶茶了!虽然免费套餐有限制,但对于个人项目完全够用。记住:

"真正的程序员不是不花钱,而是能把别人的基础设施当成自己的用"