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站点。

Share

You may also like...

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注