2025年6月3日,qnap上wordpress从docker备份迁移至k3s
一 k3s wordpress安装:
1 qnap上启用k3轻量级kubernetes,注意Kubernetes集群内的应用程序只能使用主机端口61000-62000。

此时qnap会生成一个k3s目录,路径为 /share/Container/container-station-data/lib/k3s,里面有etc和var两个文件夹,个人认为相当生成了一个轻量级k3s系统
2 k3s环境下部署wordpress,参考搭建你的 K3s 环境 — 部署 WordPress
2.1 ***/share/Container/container-station-data/lib/k3s***目录下创建***k3s-wordpress***目录
2.2 ***k3s-wordpress***下创建***mysql***和***wordpress***两个目录,用于存储接下来的k3s资源配置文件
- mysql
- configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
my.cnf: |
[mysqld]
max_connections = 200
- pv-claim.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /var/lib/rancher/k3s/storage/mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
username: SmVmZmVyeQ==
password: YXNkZkcmMjcz
- service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
clusterIP: None
selector:
app: mysql
- statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
serviceName: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-pv
mountPath: /var/lib/mysql
volumes:
- name: mysql-pv
persistentVolumeClaim:
claimName: mysql-pvc
请注意secret.yaml中username/password采用base64 encode format,可以在BASE64 Decode and Encode编解码。
- wordpress
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: mysql
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 80
volumeMounts:
- name: wordpress-pv
mountPath: /var/www/html
volumes:
- name: wordpress-pv
persistentVolumeClaim:
claimName: wordpress-pvc
- pv-claim.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-pv
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /var/lib/rancher/k3s/storage/wordpress
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- service.yaml
apiVersion: apps/v1
kind: Service
metadata:
name: wordpress-service
spec:
type: NodePort
selector:
app: wordpress
ports:
- port: 80
targetPort: 80
nodePort: 61080
2.3 在/var/lib目录创建软连接rancher
[/var/lib] # ln -s /share/CACHEDEV1_DATA/.qpkg/container-station/var/lib/k3s/var/lib/rancher rancher
2.4 在/share/Container/container-station-data/lib/k3s/var/lib/rancher/k3s/storage下创建mysql, wordpress目录(也可以不创建,部署时会自动生成),用于存储msql数据库和wordpress生成的持久化数据及内容
2.5 检查无误后,在/share/Container/container-station-data/lib/k3s/k3s-wordpress中先执行以下命令
[/share/Container/container-station-data/lib/k3s/k3s-wordpress] # kubectl apply -f ./mysql/ -n wordpress
2.6 检查pv, pvc状态,以及mysql数据库服务状态正常
[/share/Container/container-station-data/lib/k3s/k3s-wordpress] # kubectl get pv,pvc -A
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mysql-pv 10Gi RWO Retain Bound wordpress/mysql-pvc manual 18h
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
wordpress persistentvolumeclaim/mysql-pvc Bound mysql-pv 10Gi RWO manual 18h
[/share/Container/container-station-data/lib/k3s/k3s-wordpress] # kubectl get svc,pod,statefulset -n wordpress -l app=mysql
NAME READY STATUS RESTARTS AGE
pod/mysql-0 1/1 Running 0 18h
[/share/Container/container-station-data/lib/k3s/k3s-wordpress] # kubectl get all -n wordpress -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/mysql-0 1/1 Running 0 19h 10.42.0.142 qnap-k3s-q193b07635 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/mysql ClusterIP None <none> 3306/TCP 19h app=mysql
NAME READY AGE CONTAINERS IMAGES
statefulset.apps/mysql 1/1 19h mysql mysql:5.7
2.7 再执行以下命令部署wordpress服务
[/share/Container/container-station-data/lib/k3s/k3s-wordpress] # kubectl apply -f ./wordpress/ -n wordpress
2.8 检查wordpress服务状态正常,k3s部署完成
[/share/Container/container-station-data/lib/k3s/k3s-wordpress] # kubectl get all -n wordpress -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/mysql-0 1/1 Running 0 19h 10.42.0.142 qnap-k3s-q193b07635 <none> <none>
pod/wordpress-75f886bb69-76z7s 1/1 Running 0 19h 10.42.0.143 qnap-k3s-q193b07635 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/mysql ClusterIP None <none> 3306/TCP 19h app=mysql
service/wordpress-service NodePort 10.43.75.114 <none> 80:61080/TCP 19h app=wordpress
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/wordpress 1/1 1 1 19h wordpress wordpress:latest app=wordpress
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/wordpress-75f886bb69 1 1 1 19h wordpress wordpress:latest app=wordpress,pod-template-hash=75f886bb69
NAME READY AGE CONTAINERS IMAGES
statefulset.apps/mysql 1/1 19h mysql mysql:5.7
[/share/Container/container-station-data/lib/k3s/k3s-wordpress] #
2.9 访问WordPress页面:访问 http://<qnap-nas-ip>:61080/
并进行验证,提示选择语言安装wordpress为正常。
2.10 安装过程中设置wordpress后台用户名及密码、站点名称、邮箱地址最好与需要迁移的站点相同,wordpress服务成功部署后的数据和文件安装位置
<3f76a5ca59d7d1a72490b93cf025c48cfff4b54da3f0d5caae/volumes/4b96dbc509318042c7d916deb031375cefb62c0e25ef29253553114d9c4d034a] # pwd
/share/Container/container-station-data/lib/k3s/var/lib/rancher/k3s/agent/containerd/io.containerd.grpc.v1.cri/containers/392e0d7bb696d13f76a5ca59d7d1a72490b93cf025c48cfff4b54da3f0d5caae/volumes/4b96dbc509318042c7d916deb031375cefb62c0e25ef29253553114d9c4d034a
<3f76a5ca59d7d1a72490b93cf025c48cfff4b54da3f0d5caae/volumes/4b96dbc509318042c7d916deb031375cefb62c0e25ef29253553114d9c4d034a] # ll
total 264K
drwxr-xr-x 5 33 33 4.0K 2025-06-02 21:57 ./
drwxr-xr-x 3 admin administrators 4.0K 2025-06-02 21:26 ../
-rw-r--r-- 1 33 33 492 2025-06-02 22:29 .htaccess
-rw-r--r-- 1 33 33 405 2020-02-06 14:33 index.php
-rw-r--r-- 1 33 33 20K 2025-03-06 22:24 license.txt
-rw-r--r-- 1 33 33 7.3K 2025-03-07 16:45 readme.html
-rw-r--r-- 1 33 33 7.3K 2024-02-13 22:19 wp-activate.php
drwxr-xr-x 9 33 33 4.0K 2025-05-01 00:41 wp-admin/
-rw-r--r-- 1 33 33 351 2020-02-06 14:33 wp-blog-header.php
-rw-r--r-- 1 33 33 2.3K 2023-06-14 22:11 wp-comments-post.php
-rw-r--r-- 1 33 33 5.7K 2025-05-22 07:36 wp-config-docker.php
-rw-r--r-- 1 33 33 5.8K 2025-06-02 21:26 wp-config.php
-rw-r--r-- 1 33 33 3.3K 2024-10-15 23:24 wp-config-sample.php
drwxr-xr-x 11 33 33 4.0K 2025-06-03 16:56 wp-content/
-rw-r--r-- 1 33 33 5.5K 2024-08-03 03:40 wp-cron.php
drwxr-xr-x 30 33 33 16K 2025-05-01 00:41 wp-includes/
-rw-r--r-- 1 33 33 2.5K 2022-11-27 05:01 wp-links-opml.php
-rw-r--r-- 1 33 33 3.9K 2024-03-11 18:05 wp-load.php
-rw-r--r-- 1 33 33 51K 2025-02-04 00:55 wp-login.php
-rw-r--r-- 1 33 33 8.6K 2025-02-09 00:00 wp-mail.php
-rw-r--r-- 1 33 33 30K 2025-03-04 21:06 wp-settings.php
-rw-r--r-- 1 33 33 34K 2025-03-11 02:16 wp-signup.php
-rw-r--r-- 1 33 33 5.0K 2024-10-18 23:56 wp-trackback.php
-rw-r--r-- 1 33 33 3.2K 2024-11-08 23:52 xmlrpc.php
<3f76a5ca59d7d1a72490b93cf025c48cfff4b54da3f0d5caae/volumes/4b96dbc509318042c7d916deb031375cefb62c0e25ef29253553114d9c4d034a] #
2.11 由于wordpress默认限制上传文件最大为2M,需要修改.htaccess文件改为300M,为站点迁移备份作准备

修改前:
<3f76a5ca59d7d1a72490b93cf025c48cfff4b54da3f0d5caae/volumes/4b96dbc509318042c7d916deb031375cefb62c0e25ef29253553114d9c4d034a] # cat .htaccess
# BEGIN WordPress
# 在「BEGIN WordPress」与「END WordPress」之间的指令(行)是
# 动态生成的,只应被 WordPress 过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
<3f76a5ca59d7d1a72490b93cf025c48cfff4b54da3f0d5caae/volumes/4b96dbc509318042c7d916deb031375cefb62c0e25ef29253553114d9c4d034a] #
修改后:
# BEGIN WordPress
# 在「BEGIN WordPress」与「END WordPress」之间的指令(行)是
# 动态生成的,只应被 WordPress 过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
php_value upload_max_filesize 300M
php_value post_max_size 300M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300
</IfModule>
# END WordPress
2.12 k3s新部署站点后台删除所有默认安装的页面和文章
二 迁移wordpress站点导出数据
1 同时检查迁移站点与k3s上新部署wordpress后台wordpress导入工具安装并启用

2 对照迁移站点已安装插件和已启用主题,在k3s上新部署wordpress后台上安装同样插件和主题
3 迁移站点工具→导出→所有内容,然后点击下载导出的文件,导出文件会下载到登录电脑上,文件名为[用户名].WordPress.2025-06-02.xml

三 k3s新部署wordpress站点导入数据
1 新部署wordpress站点工具→导入→运行导入器,然后选择迁移站点导出的下载文件[用户名].wordPress.2025-06-02.xml,点击上传文件并导入
2 勾选将日志分配给现有用户和下载并导入文件附件,然后点击提交

3 等待几分钟或者十几分钟,提示导入成功
4 检查页面,文章以及媒体库都已经导入,其中媒体库最新的日期目录中会多一个[用户名].WordPress.2025-06-02.xml_.txt文件

四 对照迁移站点,外观→自定义,调整主题配置
1 Theme Options和Theme Extensions一一比对


2 主题设置

3 站点身份,颜色,页眉图片,背景图片,菜单,小工具,额外CSS设置成一样
4 站点内容迁移完成
五 将网站域名指向新的站点,完成迁移
五 将网站域名指向新的站点,完成迁移
六 两个小技巧
1 隐藏在浏览站点时显示工具栏,不勾选用户→个人资料→工具栏,然后点击更新个人资料
勾选时:


不勾选时:

2 隐藏Footer Credit,关闭外观 ▸ 自定义 ▸ Theme ▸ OptionsFooter ▸ Footer Credit
关闭前:


关闭后:

3 域名替代IP:PORT访问站点,先在Nginx Proxy Manager设置好proxy host, wordpress后台上设置▸常规▸WordPress 地址(URL),站点地址(URL)修改为域名,然后点击保存更改。可以用域名访问k3s部署wordpress站点。


