草庐IT

博客从 CloudBase 迁移至云主机

程序员翔仔 2023-03-28 原文

迁移起因

原来的博客

其实从很久以前就想要写博客,但总是断断续续的,一直都没有认真地开始。

最终,决定使用静态博客工具作为自己博客的承载体。在多种工具的比较下,最终选择了 Hugo 并部署到 Github Pages 上,并同时部署到腾讯云的 CloudBase 以供国内用户访问。

自此,2022 年 5 月 15 日,翔仔的个人博客 终于部署到公网上了。

出现了变故

但是,才经过大概 2 个月的时间,收到了腾讯云发送的 CloudBase 计费模式变更的消息。

简单来说,CloudBase 出了一个最低消费,像我这样的,原本从几毛钱的无感消费要升级到几十块,这个变动对于我来说还是挺大的。

思路变更

此处要赶爷,爷自有去处。

突然想到,曾经自己用 299 买的云服务器一直荒废没有使用,毕竟还有好几个月的期限呢,一定要利用起来。

就决定是你了,我的博客暂时先放置在云服务器上,顺便了解一下如何部署静态博客到云服务器上。

第一版方案

不可否认,现在流行的自动化部署真的是用一次就爱上了,尤其是,还有 Github Action 这样的免费资源可以薅,哈哈哈。

Github Pages 部署

将 Hugo 通过 Github Action 部署到 Github Pages 非常简单,在网上也有很多教程可用,这里就简单地列举一下吧。

第一步,通常就是要建立一个私有库存储博客的源文件,再建立一个 Github Pages 库存储 Hugo 构建后的文件。

第二步,自然就是在 Hugo 博客项目下编写 workflow 文件,这里有使用到 CheckoutHugo setupGitHub Pages action 三种 Action 步骤,当时的配置如下:

on:
  push:
    branches:
      - master
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 切换分支
      - name: Checkout
        uses: actions/checkout@v3

      # 安装 Hugo 程序
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
           hugo-version: 'latest'
           extended: true

      # Hugo Build
      - name: Build
        run: hugo --minify --gc

      # 部署到 Github Pages 上
      - name: Deploy Github Pages
        uses: peaceiris/actions-gh-pages@v3
        if: ${{ github.ref == 'refs/heads/master' }}
        with:
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          external_repository: fatedeity/fatedeity.github.io
          publish_branch: master
          cname: fatedeity.cn

在这一步,需要配置一个 Actions secrets 以解决安全性问题,可以通过 GitHub Pages action 了解更多。

经过上述两个配置步骤,基本上是已经完成了,之后 Hugo 博客文件再 push 到 Github 时就会自动触发部署,期间基本上能在 20s 左右完成。

CloudBase 部署

使用 Github Action 部署 Github Pages 非常简单,毕竟也算是同出一家,基本上不会出现什么问题。

因为想要通过部署到 CloudBase 以加速国内 IP 访问博客的速度,也不得不研究一下怎么通过 Github Action 部署到 CloudBase 上。

仔细查找了一下,基本上就两种方案:通过 CloudBase CLI 使用命令行部署;通过官方提供的 Tencent CloudBase Github Action 工具部署。

最终,决定使用 Action 工具,相信与 Github Action 更配(实际操作起来并没有 ?),下面是简单的一个配置步骤:

第一步,添加 CloudBase Action v2 所需的配置文件,由于我只使用了 CloudBase 的静态博客部署,配置起来也不麻烦,主要是需要在项目根目录下创建 cloudbaserc.json 文件,填入以下配置:

{
    "envId": "{{ENV_ID}}",
    "region": "ap-guangzhou",
    "$schema": "https://framework-1258016615.tcloudbaseapp.com/schema/latest.json",
    "framework": {
        "name": "hugo-blog",
        "plugins": {
            "client": {
                "use": "@cloudbase/framework-plugin-website",
                "inputs": {
                    "outputPath": "public",
                    "cloudPath": "/"
                }
            }
        }
    }
}

第二步,更新之前的 workflow 文件,将 Cloudbase Action 的步骤配置进去,当时的配置如下:

on:
  push:
    branches:
      - master
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 切换分支
      - name: Checkout
        uses: actions/checkout@v3

      # 安装 Hugo 程序
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
           hugo-version: 'latest'
           extended: true

      # Hugo Build
      - name: Build
        run: hugo --minify --gc

      # 部署到 CloudBase 上
      - name: Deploy Tencent CloudBase
        uses: TencentCloudBase/cloudbase-action@v2.0.1
        if: ${{ github.ref == 'refs/heads/master' }}
        with:
          secretId: ${{ secrets.SECRET_ID }}
          secretKey: ${{ secrets.SECRET_KEY }}
          envId: ${{ secrets.ENV_ID }}

通过上述的步骤,基本上也算是完成了 Github Action 到 CloudBase 的配置。

但是,使用起来并不是很顺利,经常性地出现 Github Action 运行超时的情况,应该是 Github Action 机器在美国,而 CloudBase 服务器在国内的原因。

当时也没有找到什么好的解决办法,只能通过每次报失败之后再手动去运行一遍(从自动化部署变成了半自动化 ?)。

第二版方案

云服务器部署

将项目部署到自己的云服务器上,方法就变得更多了,既有使用 SSH Remote Commands 通过 ssh 工具运行命令,也有使用 SCP、Rsync、SFTP 等工具将文件直接上传,还有更多其他的办法等等。

对比之后,还是采用了理解起来最简单的办法,通过 SSH Remote Commands 连接到云服务器上执行命令,这个命令也很容易理解,就是通过 Git 命令拉取 Github Pages 的代码。

第一步,先在云服务上做好准备,安装好 Git 程序,确定能手动拉取到 Github Pages 的代码。

第二步,当然还是要更新 workflow 文件,将 SSH Remote Commands Action 的步骤替换掉原来的 CloudBase Action 的步骤,具体的配置如下:

on:
  push:
    branches:
      - master
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 切换分支
      - name: Checkout
        uses: actions/checkout@v3

      # 安装 Hugo 程序
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
           hugo-version: 'latest'
           extended: true

      # Hugo Build
      - name: Build
        run: hugo --minify --gc

      # 部署到 Github Pages 上
      - name: Deploy Github Pages
        uses: peaceiris/actions-gh-pages@v3
        if: ${{ github.ref == 'refs/heads/master' }}
        with:
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          external_repository: fatedeity/fatedeity.github.io
          publish_branch: master
          cname: fatedeity.cn

      # 部署到 Server 上
      - name: Deploy Tecent Server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KEY }}
          port: ${{ secrets.PORT }}
          script: rm -rf fatedeity.github.io/ && git clone https://ghproxy.com/https://github.com/fatedeity/fatedeity.github.io.git && rm -rf fatedeity.github.io/.[!.]*

这里有个小技巧,将 Github 通过 GitHub Proxy 代理加速 访问,原本比较慢的拉取代码步骤变得飞快,综合下来,这个静态博客部署完成只需花费 30ms 左右的时间。

第三步,代码被自动拉取到服务器上之后,还需要配置一个反向代理的服务器以供外网访问。最常用的自然就是 Nginx 服务器了,安装 Nginx 的步骤就直接忽略吧,下面是我这边访问静态博客的反向代理配置:

log_format main escape=json '{"remote_addr":"$remote_addr","timestamp":"$time_iso8601","request":"$request","size":$body_bytes_sent,"status":$status,"request_time":$request_time,"referer":"$http_referer","user_agent":"$http_user_agent"}';

server {
    listen      80;
    listen      [::]:80;

    server_name fatedeity.cn;

    return      301 https://$host$request_uri;
}

server {
    listen      443 ssl;
    listen      [::]:443 ssl;

    server_name fatedeity.cn;

    # 证书
    ssl_certificate             cert/fatedeity.cn_bundle.crt;
    # 私钥
    ssl_certificate_key         cert/fatedeity.cn.key;
    ssl_session_timeout         5m;
    ssl_protocols               TLSv1.2 TLSv1.3;
    ssl_ciphers                 ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers   on;

    location / {
        root        /home/fatedeity/fatedeity.github.io/;
        index       index.html;
    }

    error_page 404  /404.html;

    access_log /var/log/nginx/hugo-blog-access.log main;
}

日志统计

经过上述的操作记录,基本就完成了 Hugo 到 Github Pages 和 Cloud Server 的配置,其实到这里也就结束了。

但是,突然想要看一下自己服务器的访问量,之前都没有搞过这些东西,都是在公司有现成的工具可以使用。发现自己的服务器配置并不是很高,搞不来 ELK 那一套,只能另辟蹊径。

还好,简单一搜,发现有 GoAccess 这样的开源实时日志工具可用,非常适合我这样简单看看日志的用户。

第一步,自然就是安装 GoAccess 工具啦,也很简单,使用 apt install goaccess 命令安装一下即可。

第二步,配置好 .goaccessrc 文件,我这边的配置很简单,只是需要配置好日志格式、输入输出文件即可:

time-format %H:%M:%S
date-format %Y-%m-%d
log-format %^:"%h",%^:"%dT%t+%^",%^:"%r",%^:%b,%^:%D,%^:"%R",%^:"%u"

log-file /var/log/nginx/hugo-blog-access.log
output /home/fatedeity/logs/hugo-blog.html

第三步,这边主要是想要通过浏览器访问一下日志,每次想访问的时候使用下面的命令生成一下,也不麻烦,当然也可以定时更新:

goaccess -p /home/fatedeity/.goaccessrc

这样就大功告成了,展示一下 GoAccess 的空页面:

有关博客从 CloudBase 迁移至云主机的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  4. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  5. ruby - 允许主机名包含下划线的 URI.parse 的替代方法 - 2

    我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:

  6. ruby-on-rails - 在现有数据库上进行 Rails 迁移 - 2

    我正在创建一个新的Rails3.1应用程序。我希望这个新应用程序重用现有数据库(由以前的Rails2应用程序创建)。我创建了新的应用程序定义模型,它重用了数据库中的一些现有数据。在开发和测试阶段,一切正常,因为它在干净的表数据库上运行,但是当尝试部署到生产环境时,我收到如下消息:PGError:ERROR:column"email"ofrelation"users"alreadyexists***[err::localhost]:ALTERTABLE"users"ADDCOLUMN"email"charactervarying(255)DEFAULT''NOTNULL但是我在迁移中有这

  7. Ruby 服务器在本地主机(teambox)之外非常慢 - 2

    我刚刚在我的Ubuntu9.10服务器上安装了TeamBox。我使用提供的服务器脚本在端口3000上启动并运行它。它的运行速度非常慢,从另一台计算机连接时每个HTTP请求最多需要30秒。我使用链接从shell加载TeamBox,一点也不花时间。然后我设置了一个SSH隧道,它再次运行得非常快。我通过此服务器上的apache以及SAMBA等运行了大约30个虚拟主机,没有任何问题。我该如何解决这个问题? 最佳答案 我的redmine(ruby,webrick)太慢了。现在我解决了这个问题:apt-getinstallmongrelruby

  8. ruby-on-rails - Rails 迁移中的 PostgreSQL 点类型 - 2

    我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom

  9. ruby-on-rails - Rails 3 : belongs_to, has_one 和迁移 - 2

    我是Rails的新手,我是从Django背景开始接触它的。我已经接受了这样一个事实,即模型和数据库模式在Rails和在线Django中是分开的。但是,我仍在努力处理迁移。我的问题很简单-如何使用迁移向模型添加关系?例如,我现在有Artist和Song作为ActiveRecord::Base子类的空模型,没有任何关系。我需要开始做这件事:classArtist但是我如何使用railsgmigrate更改架构以反射(reflect)这一点?我正在使用Rails3.1.3。 最佳答案 现在,在Rails4中,您可以:classAddPro

  10. ruby-on-rails - Rails 4 从迁移索引中删除迁移 ID - 2

    如何在rakedb:migrate:status中删除带有“**NOFILE**”的迁移ID列表?例如:StatusMigrationIDMigrationName--------------------------------------------------up20131017204224Createusersup20131218005823**********NOFILE**********up20131218011334**********NOFILE**********我不明白为什么当我自己手动删除它时它仍然保留旧的迁移文件,因为我正在研究迁移的工作原理。这是为了记录吗?但

随机推荐