内容型网站后端一把梭

Web 全栈工程师经常遇到一些内容型网站的开发需求,比如个人博客、机构官网、新闻门户。这些虽是 Web 1.0、2.0 时代就烂大街的典型 Web-site,但面对不同的甲方,看似雷同的需求往往又有各种细节的定制化。

虽然 WordPress、Discuz!X 等建站系统早已非常成熟,但在人们更看重 UI/UX 设计的今天,它们专用的模板引擎反而成了二次开发最大的障碍。只要是近两年做过 Web 前端开发的同学就知道,不能利用基于 Node.js 的现代化工具链的项目,开发起来有多蛋疼。

Web 前后端分离催生了 Web 前端岗位,也让 WordPress、Ghost 这些老牌 CMS 系统开放了 RESTful API。但有的开源项目做得更加激进 —— Headless CMS,前台界面都省了,只有后端 API 和后台界面,普通用户看啥你们自己写~

这其中最为优秀的便是 Strapi,因为它的后台设计不局限于传统的博客、门户,而是:

  1. 数据模型灵活可配置(可用 Git 管理 JSON 配置文件)
  2. RESTful API 完全支持 CRUD(增删查改)和 RBAC(角色权限)
  3. 自身是个标准的 Node.js 后端项目,并有留有二次开发接口
  4. 包括 Swagger Documentation 在内的插件生态

这使得它既像 BaaS 中的 LeanCloud,又像 Python 开发框架 Django,在简单易用的同时,又不束缚专业开发者。

本地开发

创建项目

以下命令会一键创建项目骨架、安装依赖包、启动开发模式:

npm init strapi-app ~/my-project --quickstart

开发模式启动

下次继续开发时,则执行以下命令:

cd ~/my-project
npm run develop

如果执行 npm start,启动的后台系统只能添加数据,不能修改数据结构,是线上生产模式。

创建代码库

在 GitHub 上创建代码库后,把生成的代码传上去:

git init
git remote add origin https://github.com/my-id/my-project.git
git add .
git commit -m "[add] Strapi framework"
git push

服务器部署

下面以 Linux (Ubuntu 20.04) 为例,简介线上部署。

安装容器环境

# 更新包管理器数据库
apt update
# 安装 Python PIP
apt install python-pip
# 安装 Docker
curl -fsSL https://get.docker.com | sh
# 安装 Docker Compose
pip install docker-compose

初始化 Git

为了后面自动化部署的方便,需要生成好 SSH 密钥对:

# 生成 SSH Key
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# 启动 SSH 后台服务
eval `ssh-agent -s`

cd ~/.ssh
# 添加 SSH Key 私钥
ssh-add id_rsa
# 信任 SSH Key 公钥
cat id_rsa.pub > authorized_keys

部署配置文件

将以下两个文件放在代码库相应路径中,并提交:

Docker 服务编排

~/my-project/docker-compose.yml

version: '3'

services:
  strapi:
    image: strapi/strapi
    volumes:
      - ./:/srv/app
    ports:
      - '1337:1337'
    environment:
      - NODE_ENV=production

以上配置的是最简单的 SQLite 数据库,小型网站完全足够。

GitHub Actions 持续部署

以下配置让我们无需每次更新 Strapi 配置、代码时,登录服务器手动部署新版本:

~/my-project/.github/workflows/main.yml

name: Deploy Server
on:
  push:
    branches:
      - master
jobs:
  SSH:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@master
      - name: Clean
        run: |
          rm -rf .git/ .gitignore .github/ .editorconfig .eslint*
      - name: Transport
        uses: garygrossgarten/github-action-scp@release
        with:
          local: ./
          remote: ${{ secrets.PATH }}
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          privateKey: ${{ secrets.SSH_KEY }}
      - name: Deploy
        uses: garygrossgarten/github-action-ssh@release
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          privateKey: ${{ secrets.SSH_KEY }}
          command: |
            cd ${{ secrets.PATH }}
            echo BASE_URL=${{ secrets.BASE_URL }} > .env
            docker-compose down
            docker-compose up -d

【注意】在推送代码前,务必去 https://github.com/my-id/my-project/settings/secrets 页面创建好上述配置中的变量:

名称 内容
PATH 服务器代码目录
HOST 服务器 IP 地址或域名
USER 服务器用户名
SSH_KEY ssh-keygen 命令生成的私钥,通常存在 ~/.ssh/id_rsa
BASE_URL 服务器 HTTP 访问根地址

HTTPS 一键搞定

网站上线时,服务器配置 HTTPS 一直是非常难搞的事 ——

幸得网友推荐一神器 —— Caddy,老子又可以一把梭了!

安装 Caddy

echo "deb [trusted=yes] https://apt.fury.io/caddy/ /" \
    | sudo tee -a /etc/apt/sources.list.d/caddy-fury.list
sudo apt update
sudo apt install caddy

启用 Caddy

只要映射好域名 A 记录,官网上的一条示例命令就能自动申请证书并配置好,80、443 端口即刻可用:

caddy reverse-proxy --from example.com --to localhost:1337

当然,日常使用肯定得扔后台了:

sudo -i
nohup caddy reverse-proxy --from example.com --to localhost:1337 > /tmp/caddy.log 2>&1 &

扩展插件

推荐一些日常项目中常用的扩展设置、外部插件,让 Strapi 用起来更爽:

总结

经过前面的一顿折腾,开发者只需在本机浏览器中点点鼠标、轻敲键盘,就能实现网站数据结构的设计;推送代码到 GitHub,就能实现网站后台的更新。而运营专员访问的线上后台锁定了数据结构,他们只能在现有数据表中添加具体数据。这样一来,面对单纯的数据存取,后端 API 和后台 UI 都不用开发了~

最后,推荐一些后续学习资料:

参考文档

  1. https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
  2. https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script
  3. https://yq.aliyun.com/articles/514624
  4. https://strapi.io/documentation/v3.x/installation/docker.html
  5. https://cgo.gitbook.io/my-it-blog/linux-1/caddy-de-xia-zai-an-zhuang-pei-zhi-qi-dong

上一篇
Web 前端“像素级还原”的真相 Web 前端“像素级还原”的真相
freeCodeCamp 中文社区 首次直播分享会 互联网公司“金句” 这个很简单,技术我不懂,明天我就要! —— 产品经理 前端应该“像素级还原”设计图! —— UI 设计师 Web 前端开发的真相 几乎不用“像素”这个
2020-05-22
下一篇
安徒生童话:技术人的群聊 安徒生童话:技术人的群聊
加过技术群的同学想必听过一句话 —— 技术人不谈政治~ 不少群公告还直接明文规定 —— 不要讨论敏感话题! 最初我以为,大家真的不喜欢探讨政治,直到最近我所在的 FCC 成都社区遭受一次网络暴力…… 事件原文前两天我的一篇技术博文被
2020-04-01
目录