原来的服务器总是莫名其妙的崩溃,迁移到新服务器试试。
出于避免带来原本的故障的原因,这次使用并没有复制原本的数据库和主题插件等,而是建立新站点后通过导出文章重新导入的方式来迁移。除此之外,还将原本使用的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的重定向条件的问题。
Comments NOTHING