使用自定义域名激活Vercel部署的Waline服务

近期对于部分 Waline 评论插件的用户来说,或许是非常的困扰时期。先是服务商 LeanCloud 发布国内提供的服务,从8月份起需要绑定自有案例域名才能正常运行。而这两天 Vercel (Waline 官方提供的免费部署方案,也是大部用户的选择)旗下的 vercel.app 域名又遭受 DNS 污染攻击,在国内无法直接访问此域名,导致众多 Waline 用户的服务直接陷入“宕机”状态,真可谓是雪上加霜。

有句话说的好:“只要思想不滑坡,办法总比困难多”。接下来就是给大家分享下,如何通过自定义域名的方式来解决上面遇到的2个问题,此方法仅供各位网友参考参考。 😄

确定方案

由于 vercel.app 域名已经被 DNS 污染,那么国内网络应该都是无法进行访问的,所以原本想直接通过已有域名 DNS 的 CNAME 对vercel.app域名转发的想法是不能实现的。通过多次验证后,确认如下 2 套方案:

  • 方案1: 有备案可用域名,直接转发Vercel DNS Server地址
  • 方案2: 申请免费域名,配置 Vercel 提供的 DNS 服务器

方案1

DNS Server转发

在自有域名的 DNS 服务中添加一条记录,选择 CNAME 类型转发,记录值填写为:cname.vercel-dns.com,参考如下:

DNS Records

然后在 Vercel 中找到 Waline 后端服务的项目,点击Settings标签卡,跳转页面后点击左侧的Domains菜单项,输入你自己定义的域名点击Add`按钮即可。

Domains

方案2

申请免费域名

可以参考之前发布的文章: 创建属于你自己的org永久域名 ,不过这里不需要借助 DNSPOD 提供的解析服务,所以在申请域名时可以直接填写 Vercel 提供的 DNS 服务,默认地址为:

  • ns1.vercel-dns.com
  • ns2.vercel-dns.com

域名申请下来后,访问 Vercel 的域名控制面板 Domains Dashboard 点击右上角的Add按钮选择你的 Waline 项目点击Continue按钮,再输入申请好的域名确认即可。

评论搬迁

除了域名访问的问题外,还需要注意当使用 LeanCloud 国内版作为存储时需要有自定义的备案域名,要是没有的话就只好选择国际版本。那么就要对于已有的数据进行迁移,但 Waline 自带的导入导出功能还是有些问题 #1148 ,建议最好还是使用 LeanCloud 自带的导入导出功能,不过需要进行手动的调整。

第一步是对数据进行导出,这里只需选取CounterCommentUsers三个 Schema 文件,参考如下:

Export Data

第二步是对数据进行调整,需要在 Date 类型的字段中都加上 _type 标识,避免导入后 Waline 无法插入新的评论数据,为此写了个 Python 脚本进行批量的修改,参考如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def append_date_type(source, target):
  """修改waline date 类型
  :param source: 原始文件
  :param target: 目标文件
  """
  with open(source, "wb+") as tf:
    with open(target, "rb+") as sf:
      print("Current File: %s" % os.path.basename(sf.name))
      while True:
        try:
          line = sf.readline()
          line_splits = line.decode().splitlines()
          if len(line_splits) <= 0:
            break;
          line_str = line_splits[0].strip(',')
          if 'createdAt' in line_str:
            new_ca = '"createdAt": {"__type":"Date","iso":'+line_str.split(': ')[1]+'},\r\n'
            tf.write(new_ca.encode())
          elif 'insertedAt' in line_str:
            new_ia = '"insertedAt": {"__type":"Date","iso":'+line_str.split(': ')[1]+'},\r\n'
            tf.write(new_ia.encode())
          elif 'updatedAt' in line_str:
            new_ua = '"updatedAt": {"__type":"Date","iso":'+line_str.split(': ')[1]+'},\r\n'
            tf.write(new_ua.encode())
          else:
            tf.write(line)
        except:
          print('Somethings wrong!!!')
          traceback.print_exc()
          break

把修改好的 json 数据,使用 LeandCloud 的导入功能重新导入,然后在 Waline 后台管理界面就能看到数据,前端也能正常的提交新评论。

吐槽感言

相信经过上述的折腾后,此时此刻的你,应该对那句“免费的东西总是最贵的”话语有种深刻的体验了吧。但是这番的折腾也还算是值得的,学习到不少的新知识,又一次锤炼的了自己的技术,也正是验证开头说的那句话“办法总比困难多”,对吧!😁