环境准备

Docker 安装见:安装 Docker

Docker Compose 的安装见:安装 Docker Compose

创建目录

用于部署 WordPress ,同时网站备份或者迁移的话备份或迁移该文件即可,即 wordpress 目录

1
mkdir wordpress && cd wordpress && touch docker-compose.yml && mkdir volumes

编辑 yml 文件

1
vim docker-compose.yml

docker-compose.yml 的内容需要自己修改,尝试的话用下面默认的也行

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
version: '3.9'

networks:
wordpress:

services:
mysql:
image: mysql:5.7
container_name: mysql
volumes:
- ./volumes/mysql:/var/lib/mysql
restart: always
# 下方的四个信息自行修改
environment:
# MySQL root账户密码
MYSQL_ROOT_PASSWORD: root
# MySQL 数据库名
MYSQL_DATABASE: wordpress
# MySQL 新用户的用户名
MYSQL_USER: wordpress
# MySQL 新用户的密码
MYSQL_PASSWORD: wordpress
networks:
- wordpress

wordpress:
depends_on:
- mysql
image: wordpress
volumes:
- ./volumes/wordpress:/var/www/html
restart: always
# 需要与上方的数据库信息对应
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
networks:
- wordpress

nginx:
depends_on:
- wordpress
image: nginx
container_name: nginx
volumes:
- ./volumes/nginx/conf.d:/etc/nginx/conf.d
networks:
- wordpress
ports:
- '80:80'
- '443:443'
restart: always

配置 Nginx

首先在前台启动容器

1
docker-compose up

等待运行起来,屏幕不再有输出的时候 Ctrl + C 停止运行

开始配置 Nginx

1
cd volumes/nginx/conf.d/ && mkdir certs && touch wordpress.conf

其中 certs目录 用于存放 SSL 证书,wordpress.conf 是 Nginx 的配置文件

编辑wordpress.conf

1
vim wordpress.conf

下方的内容同样需要自行修改

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
server {
listen 80;
listen [::]:80;
# 自己的域名
server_name example.com;
# 客户端请求服务器最大允许大小
client_max_body_size 100M;
sendfile on;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_tokens off;
keepalive_timeout 5;

# 自己的域名
server_name example.com;
# SSL证书和key的绝对路径,只需要修改最后的文件名
# 对应的就是宿主机 /volumes/nginx/conf.d/certs 目录下的文件
ssl_certificate /etc/nginx/conf.d/certs/example.com.crt;
ssl_certificate_key /etc/nginx/conf.d/certs/example.com.key;

ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 客户端请求服务器最大允许大小
client_max_body_size 100M;
sendfile on;

location / {
proxy_pass http://wordpress;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
}

配置 SSL 证书

如果已经有 SSL 证书,可以直接放到 certs目录 下,在上方 Nginx 的配置文件中只需要修改文件名为自己的即可

如果没有 SSL 证书,可以使用 acme.sh 脚本申请,详细见:使用 acme.sh 快速申请 SSL 证书

同样最后证书安装到 certs目录 下,下方的域名和路径自行修改

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /root/wordpress/volumes/nginx/conf.d/certs/example.com.key \
--fullchain-file /root/wordpress/volumes/nginx/conf.d/certs/example.com.crt \
--reloadcmd "docker exec nginx service nginx force-reload"

修改上传大小

有些自定的主题需要自己手动上传,上面只修改了 Nginx 的允许上传大小为 100M,php 的也需要修改一下(注意一下自己的目录,我的在用户家目录下部署的)

1
2
cd ~/wordpress/volumes/wordpress/
vim .htaccess

在最后加入

1
2
3
php_value upload_max_filesize 100M
php_value post_max_size 100M
php_value memory_limit 100M

效果

从新启动容器

wordpress/ 目录下从新启动容器,首先尝试启动以下

1
docker-compose up

访问自己的网站

如果可以正常访问的话, Ctrl + C 停止运行,然后从新后台运行容器

1
docker-compose up -d

定时备份

可以考虑备份到网盘或者 GitHub 上,这里以备份到天翼云盘为例

1、配置天翼云

下载项目,并移动可执行文件到 /usr/local/bin/ 目录下

1
curl -L https://github.com/gowsp/cloud189/releases/download/v0.5.3/cloud189_0.5.3_linux_amd64.tar.gz -o ~/cloud189.tar.gz && mkdir ~/cloud189 && tar -zxvf  ~/cloud189.tar.gz -C ~/cloud189 && mv ~/cloud189/cloud189 /usr/local/bin/ && rm -rf ~/cloud189.tar.gz ~/cloud189

登录天翼云,输入自己的账户密码

1
cloud189 login

2、配置脚本

创建脚本 autobackup.sh

这里一开始还遇到一个问题,因为天翼云这个上传脚本是 golang 写的,遇到了前台执行脚本一切正常,后台定时任务 go 程序不运行的问题,加上程序全路径解决问题。

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
31
32
33
34
35
36
#!/bin/bash
echo "-------------------------------------------------------------------"
echo "备份开始(`date +"%Y-%m-%d %H:%M:%S"`)"

# 站点名
WebsiteName=wordpress
Date=$(date +"%Y%m%d")

# 创建备份目录(按天)
mkdir -p /data/backup/$WebsiteName/$Date

cd /data/backup/$WebsiteName

# 备份文件,后面的 /root/wordpress 修改为自己的路径
tar -zcPf /data/backup/$WebsiteName/$Date/$WebsiteName.tar.gz /root/wordpress

echo "备份成功(`date +"%Y-%m-%d %H:%M:%S"`),文件夹为:/data/backup/$WebsiteName/$Date"
echo "-------------------------------------------------------------------"

echo "同步开始(`date +"%Y-%m-%d %H:%M:%S"`)"

# 同步文件
/usr/local/bin/cloud189 up /data/backup/$WebsiteName/$Date /Website/$WebsiteName/$Date

echo "同步完成(`date +"%Y-%m-%d %H:%M:%S"`)"

# 删除本地备份
echo "删除本地备份(`date +"%Y-%m-%d %H:%M:%S"`)"
rm -rf /data/backup/$WebsiteName

# 删除服务器旧备份
DELTIME=`date -d "7 days ago" +%Y%m%d`
echo "开始删除云盘旧备份,删除七天前($DELTIME)的备份版本"
/usr/local/bin/cloud189 rm /Website/$WebsiteName/$DELTIME

echo "-------------------------------------------------------------------"

授予可执行权限

1
chmod +x autobackup.sh

可以测试执行一下

1
./autobackup.sh

3、加入定时任务

1
crontab -e

自行修改脚本位置所在的位置

该脚本每天凌晨 2:30 执行,并记录执行日志

1
30 2 * * * /root/autobackup.sh >> /data/backup/autobackup.log