博客迁移(重建)记录

发布于 2023-04-03  3104 次阅读


原来的服务器总是莫名其妙的崩溃,迁移到新服务器试试。

出于避免带来原本的故障的原因,这次使用并没有复制原本的数据库和主题插件等,而是建立新站点后通过导出文章重新导入的方式来迁移。除此之外,还将原本使用的Nginx替换为了更简单的Caddy,系统也由Ubuntu更换为了Debian,不过由于使用Docker部署的缘故,更换系统应该不会带来显著的区别。

前期准备

free -h看一下是否存在交换空间,没有的话创建一个,这里创建2G的:

sudo fallocate -l 2G /swapfile

修改权限:

sudo chmod 600 /swapfile

查看创建的文件:

ls -lh /swapfile

将之前创建的文件改为交换文件:

sudo mkswap /swapfile

启用:

sudo swapon /swapfile

看下详细信息:

sudo swapon --show

设置开机自动挂载交换文件:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

完成后用free -h查看是否成功。然后安装Docker:

sudo apt install docker.io

启用Swarm模式,这里主要是为了配置文件管理功能,如果更希望使用本地挂载形式的话,可以使用docker-compose:

sudo docker swarm init

完成,懒得以后每次都输入sudo的话可以把自己的用户加入docker组中。

部署MySQL

首先创建一个docker secret来保存MySQL的root密码:

echo "这里输入密码" | sudo docker secret create mysql_root_password -

创建后记得清理命令历史记录,使用history -c,然后创建一个MySQL.yml文件:

version: '3.2'

services:
  mysql:
    image: mysql
    #这里可以通过标签来限制可以运行的节点,避免使用挂载本地volume时容器移动到其他节点时无法访问存储的文件,由于这里是单节点集群,不存在这个问题所以注释掉了
    #deploy:
      #placement:
        #constraints:
          #- node.labels.标签名 == true
    #挂载secret文件
    secrets:
      - mysql_root_password
    environment:
      #使用挂载的secret作为root密码
      #使用echo "password" | sudo docker secret create mysql_root_password -命令将密码装入secret中
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
    volumes:
      - data:/var/lib/mysql
    networks:
      - network

volumes:
  data:
secrets:
  mysql_root_password:
    external: true
networks:
  network:
    driver: overlay

然后执行:

docker stack deploy -C MySQL.yml MySQL

成功启动后为WordPress或其他程序创建所需的用户和数据库。

部署WordPress

先创建上传限制的配置文件uploads.ini:

file_uploads = On
memory_limit = 500M
upload_max_filesize = 100M
post_max_size = 150M
max_execution_time = 600

提前为之后要用的caddy创建一个网络:

docker network create -d overlay Caddy_network

然后创建WordPress.yml:

version: '3.3'

services:
  wordpress:
    image: wordpress:fpm
    configs:
      - source: upload
        target: /usr/local/etc/php/conf.d/uploads.ini
    volumes:
      - data:/var/www/html
    networks:
      - Caddy_network
      - MySQL_network

configs:
  upload:
    file: ./uploads.ini
volumes:
  data:
networks:
  Caddy_network:
    external: true
  MySQL_network:
    external: true

启动:

docker stack deploy -C WordPress.yml WordPress

部署Caddy

首先创建Caddyfile文件,这个文件会被用来自动生成Caddy配置文件:

{
        email 用于申请证书的邮箱地址
        #acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

WordPress域名 {
        root * /var/www/html
        php_fastcgi * wordpress:9000
        file_server
}

测试时先用Let'sEncrypt的测试服务器,避免重试过快被限制请求。由于WordPress使用PHP,所以这里要设置FastCGI来访问WordPress的容器。

有时候Caddyfile使用时会出现格式错误,可以使用下面的命令来让Caddy预先进行格式化:

docker run -it -v Caddyfile文件路径:/etc/caddy/Caddyfile caddy caddy fmt /etc/caddy/Caddyfile --overwrite

然后创建Caddy.yml:

version: "3.7"

services:
  caddy:
    image: caddy
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    configs:
      - source: caddy
        target: /etc/caddy/Caddyfile
    volumes:
      - Caddy_data:/data
      - Caddy_config:/config
      - WordPress_data:/var/www/html
    networks:
      - Caddy_network

configs:
  caddy:
    file: ./Caddyfile
volumes:
  Caddy_data:
  Caddy_config:
  WordPress_data:
    external: true
networks:
  Caddy_network:
    external: true

然后启动:

docker stack deploy -C Caddy.yml Caddy

启动后访问WordPress的地址进行安装即可。

额外步骤

部署FreshRSS

FreshRSS.yml文件:

version: "3"

services:
  freshrss:
    image: freshrss/freshrss
    logging:
      options:
        max-size: 10m
    volumes:
      - data:/var/www/FreshRSS/data
      - extensions:/var/www/FreshRSS/extensions
    environment:
      TZ: Asia/Shanghai
      CRON_MIN: '1,31'
    networks:
      - Caddy_network
      - MySQL_network

volumes:
  data:
  extensions:
networks:
  Caddy_network:
    external: true
  MySQL_network:
    external: true

除了部署FreshRSS外,还要修改Caddy的配置来使用反向代理。在Caddyfile最后加入:

rss.bloade.com {
        reverse_proxy freshrss:80
}

然后删除Caddy的stack并重新部署Caddy,使配置生效。

使Caddy在重定向中排除指定目录

使Caddy在访问example.com时重定向到www.example.com,但访问example.com/.well-known时不进行重定向:

example.com {
        @not_redirect_well_known {
                not path_regexp ^/\.well-known/.*
        }
        redir @not_redirect_well_known https://www.{host}{uri} 301

        root * /var/www/sigil
        file_server
}

参考文章

How To Add Swap Space on Debian 11 | DigitalOcean

特别鸣谢:ChatGPT帮我解决了如何设置Caddy的重定向条件的问题。