From dea1346094e22bcf255cdf67ef36e1e87f20c3b5 Mon Sep 17 00:00:00 2001 From: "azykov@mail.ru" Date: Mon, 20 Jul 2026 20:57:55 +0300 Subject: [PATCH] data-migrate utility --- clusters/base/apps/radicale/secret.enc.yaml | 16 ++++++------- .../base/apps/vaultwarden/secret.enc.yaml | 18 +++++++------- .../base/apps/zigbee2mqtt/secret.enc.yaml | 16 ++++++------- utils/data-migrate/README.md | 11 +++++++++ utils/data-migrate/install.yaml | 24 +++++++++++++++++++ 5 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 utils/data-migrate/README.md create mode 100644 utils/data-migrate/install.yaml diff --git a/clusters/base/apps/radicale/secret.enc.yaml b/clusters/base/apps/radicale/secret.enc.yaml index 9154897..98a4ded 100644 --- a/clusters/base/apps/radicale/secret.enc.yaml +++ b/clusters/base/apps/radicale/secret.enc.yaml @@ -4,19 +4,19 @@ metadata: name: radicale-secrets namespace: radicale stringData: - users: ENC[AES256_GCM,data:dFoE2mjx/6RI4ExttguKxUb3VOhbZhE5z9lYe/XVAAmB8LeAPt6ikV+05ZdIPRjJeuC7ay/OV7dl7Xq2n8e/2RRc36aBvrIUE+1mgsWh5gulLm3ij8XmxNFUik/sdwSAr6+8DyYYB6a1/2TmeyzmKPxhzl1sdBm8C1XDe6DsN8vg9dM6m/HCuQ==,iv:2M7ZeAku2t/T33WLz+9cFFxkgKbTF4jf7+Nbu/s+bik=,tag:9cdCQqwcw2Xi/50Gu1TORQ==,type:str] + users: ENC[AES256_GCM,data:SVe+X2tOO1skqK47Y8HrSmSXTRFhEVEB0my54448d3F/JwgboEG+hwnKcVOpKzXFINkIpvVOi5Y6eZJ4LRiTt69zLT2zG9GVZS5HLA8X2BDAU9Im4vbyQhFX72wBYRAzSQHJYuipgl+iyttaP8VwWoHO/16OY3HPhbxHes6g6Y+JlybCHbzvrw==,iv:KmlVYIrdwUZ+CpGx1k9D66aKdf7UaruQwGSLuCHTQ4M=,tag:t3BmeBQknv4QVzaOM7P3Hw==,type:str] sops: age: - recipient: age1nqjekn6qk8uqunyv5cl88nx9g3y8a94h5qr0u53q5dsdsmhr7g2syy6fsd enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSByNDBKcE55a0E5MHdWTnYz - Qzd1SitRWVduWVMrSDFUUUtkOWZLNFVLdUFzCkdJbW1jc0U4Z0tTSXlPbjY3REZL - Um1iNW4vcDNuRStTZGVYYkxWK0NDOUUKLS0tIG1ORllYNnlDell4TnkvanBGTW13 - azVwMUk4Mk9pMkJTL1RwK1A2ajEzcXcKf8O4WrUGYIYVEKGC0K5jj5YzxpKj4C48 - XJZwkghwu1Feek4OplfkZvPJ4TIjUt9IKuHMFA+xh35q0j02BKKXzg== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4YVN4Q2N3d216LzJrVEwy + SHRSR3EwZUwzbkNEdHhEN1ZaTmkwM2NZL0cwCkh4b2RGYXc3QVhFaE41T0V1YlY4 + R01yTEs2SDhZbzVYdDhzMHBtTTdsOGcKLS0tIERtN3U5T054VFQ1bVM0cGUyUzFK + UTF2cnFwZWtGRGxSblBnZERQT1drcE0KpXz/psOXMH5/Ikl7UQ0W5LTesLv0wOFd + UHtwITdFJpXpVmyz3nJPzl/T+c+GKpfjNThcqY1iXYdeubSPFl/Iuw== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-08-26T10:17:48Z" - mac: ENC[AES256_GCM,data:uF+TeD8ovIkbd9z/OfOiEikvHoJR62z9mAsekVk3KwDMLZ7YdpbyR/GKHX0RXGPbJUAL+C0OVflp027mt0hjfGO6yD4hKvzLhaazNlOHgVJh30yc6/0QVc5BwMYb+U3WKPnZwXCIUkqEZYAVpmIM+UhKk6W7599KjBjfVJtFx5E=,iv:9j913XVhXm26MI6Ba2cfs/VCjSz+P+garnLRtL2HW2c=,tag:uSj6PX1Z02wIRe8AFT9gzg==,type:str] + lastmodified: "2026-08-26T10:17:51Z" + mac: ENC[AES256_GCM,data:eO2TYUDwsaQXvDQgvuXayJ96/bjHnqkQFyc+0JQImTDG3g5JAFzWkyIInXo03IcDf4PrlNL1VKB3jJrO8YrASwfC53r2PqFuggkFCquHPeQQaF5ZkOg3QELsypuccT1mWzfDdX2MPflpc4IoSF5luGvaoA6yZC+4QEBaA1RWfOI=,iv:Cx6Q+EAoNjtDJe8nsK47CWVGI5rYAPS5ZJU2AuLs/Go=,tag:fCwkOJQO4T3BlK2n+/wHKA==,type:str] encrypted_regex: ^(data|stringData)$ version: 3.11.0 diff --git a/clusters/base/apps/vaultwarden/secret.enc.yaml b/clusters/base/apps/vaultwarden/secret.enc.yaml index 9005f99..e137660 100644 --- a/clusters/base/apps/vaultwarden/secret.enc.yaml +++ b/clusters/base/apps/vaultwarden/secret.enc.yaml @@ -4,20 +4,20 @@ metadata: name: vaultwarden-secrets namespace: vaultwarden stringData: - #ENC[AES256_GCM,data:jp2kdvwxPjG8rrYikVm8nXnuZeNpQsf88p7Q5L+xFabJSKuDB5wJrYj3LHV4f3XvMxo5dIcl35wM,iv:8B5dc9BKGGbampxf5ks7c7HpwPpj3kmqyiSfoX7jCuo=,tag:7eEiJIKLLOHmXqN1iQI+0w==,type:comment] - ADMIN_TOKEN: ENC[AES256_GCM,data:Si0uO4J8HuJTB1lyFJ8T96YXqaJf06zcYCfpIHbKGHy8NEhzD3Y558GQANUS2myaYMl59kHB5Vn450M3z2jVHlB7A3+5iJJhrWLdu1rqha0DeZiRFfuFf6xoZbZZ3wRZfigps2Fqft+32E68OSn/9GJWdXsD7Q==,iv:HsAe8YGphRS4oN/zcLlNjKq1r9+0TNtgq9hmCpTkePk=,tag:MmivEEtZd5geXjm6+c24Ug==,type:str] + #ENC[AES256_GCM,data:+pADpFTk7bOhY/qxT0Gz1GSKFW38PK0EOn0zm1LD0D4tJ8cd+rvRdF3aNsj1EoKC3ONwAXGScsd9,iv:dHg8i4m/156oFXjeZoBSeHbUHa8jEMKbznQH1sk69aE=,tag:f3ROFD2UsJk2HaVQIUgvgg==,type:comment] + ADMIN_TOKEN: ENC[AES256_GCM,data:tvNeaxVILprFBMElHkUGSV/+LQ4lRItPi0adrPDAA2LjsxGjaSRqznWMAskgRPhvFoD9fGfjaduDyJLFLyIx0sQT0QniRWzNPTst8arj6745+pxYs6jfTmt1FmqgrvkDfbV6TQF2tGtKg6qPuw6wQFRLOeA1jA==,iv:LmbjBV7zyzUZw0ryiYtTncDqqm3B/5D+G9UNNEEEQSw=,tag:BBUjxwWeuhvjk1Y7cv/s4g==,type:str] sops: age: - recipient: age109zta6l0cwpkxn5wek82kvauxn6yqrq80rsz4mvu5atdnpcn9pusuvnqk5 enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLMEgwSUhoNS9MSS9kYzdX - OHNiRDA4U1hyK2pQOUw3Nk9MUDhMVnNSZDJZCkJBSzNURlBwSVBXeXMwcldzQkdr - aFlob056U2RvanQ3anVCQm5mdCtFVWcKLS0tIHRmWi9JaUtEd3BCZVBDeTd1NWJQ - VmhEbnNEZVN4eDUzUWFjVEtqejBISkUKSwCxyNlNP/ooQEtgX/aVK53NoVXyd8tH - r1tny5l6KyWAYClOqYXWwwf8tp5Gro3YOfTYxsQdaWeb02HkW6vjOg== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHRDNxRnFJNXFEcTlHZklJ + cmlzWTR2NFRaUkNVV3pISlpJTEVHSUV5VFIwCnd0NHYvS3A0c21JSTF6V2lvdnJG + ZjNCdk9vOEtKdWJuZnpYWE9kZnQ4YWMKLS0tIDNNMFV0VkJ3Qm5ybFViV2o4cVRt + aVZHWitsemcrU05td21YK01Kc1NGSE0KRs4ulUT2+qEvEf589RczFZSuK7joxqHo + X2DIlKkkgcPapPKzQv2wFb3ZOtpACKf28z4zbXzqML7uHcpwBbzrQw== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-08-26T10:17:48Z" - mac: ENC[AES256_GCM,data:zGMJ2UWeqx/0S8APQ5+sijt68ntvhLF37ER5qxyhKcx4OyZhO/bjYGo7Nwvk4sAhYSq+nixiDWKUW2XaDWE1TTE2xiOtUmRv6Yao72WicRzT1RkaeL3GPUKrVFmX0rIVRQwOuCMxLVNewMmTx3DlHearBxIXVO6BVYOU2EiDIJs=,iv:8UUEnjl5VWKjxCRzvoc1hkpxaxnnaCtqCBPVsS402N8=,tag:WePuujjk5tLl109ssYlH7w==,type:str] + lastmodified: "2026-08-26T10:17:52Z" + mac: ENC[AES256_GCM,data:QiULStHctOOXKs77VrxGlusBxd4+80kJzZx7IPHaQ5jferre8NQx3wl+rQwLJmYiiri1ifVV5PuptQvniFNrs7tH3SH9WowJgvR+FCPbN8H72CtQRppwNj2mzMoik0RN+gXnRAtPYDJdz1L7HKg8COLjGNbwBtBCVnKMn6C2mqA=,iv:OEYB9U9CjVEnRo26UTl1A8WgIC0WZWoc4zABSngm5Aw=,tag:/Iyk7tztL8Vgh/alTBMHBQ==,type:str] encrypted_regex: ^(data|stringData)$ version: 3.11.0 diff --git a/clusters/base/apps/zigbee2mqtt/secret.enc.yaml b/clusters/base/apps/zigbee2mqtt/secret.enc.yaml index 8d66269..a86559e 100644 --- a/clusters/base/apps/zigbee2mqtt/secret.enc.yaml +++ b/clusters/base/apps/zigbee2mqtt/secret.enc.yaml @@ -4,19 +4,19 @@ metadata: name: zigbee2mqtt-secrets namespace: zigbee2mqtt stringData: - secret.yaml: ENC[AES256_GCM,data:W8OSElMPX5j+lu5kVfn+eouGeN0g3PuCkjTOI+2Coltegt80kBGXy1lzuC7t/B0Wf4iVpM7miGLscgK2uRLBmPWAmzk9KkU8p06G4XqhvtVmFEhL66fFk3d113P3bbb9UDNjgwNrE85BAvCMdM92Vs7lUogi+2d6Xko1pu0=,iv:YioWooOrpokFfV6mHWcTOK2wvXl+0Ys/opyIrYRYb48=,tag:pcTAwqwPbxoZkbClhHEsyg==,type:str] + secret.yaml: ENC[AES256_GCM,data:aW2sz89BvgbMHHYcTqpKdt1zYmTOXneb5tlPIeWbJyWMt9zJtCn7Jn5uxQCj/1IKt+z7jCQdW6Yb/CPkQo36cVGfz6SLpvLPqfupDd/RDCrjcj6zK1CXY7OPejp6F0CRfFm3D/dMoiU+4ngpSYy7Pde5nuLsCMo9tAKECHk=,iv:+6rzGzV/lcBpmyeowRZgNbNzKWk3/HQAffx62iRJC6Q=,tag:YG8nUAyO1Nlv3LFVj9fpag==,type:str] sops: age: - recipient: age1tu4xgfefvgdda0vn2thaqndq4p9tuydq2ud6qa98tzzgnff6749qnlcx29 enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4OGNFa2VyRFNhK0d0Y0xz - S2tyN2V4REFtbER1dHVCRXV2RjNSbEFXZG13CkljL2RTdmhjbDJRR3pUN09sWEkw - SzVwdGxZeDhNbGpHR09sNXNHYzJXWGsKLS0tIHlWSVJ6OFZVZVl4M2VRWkRkRGhl - R01tK2dPMWtrdi9EL0hBSHhsOXh1MGsKPt12B452HLP8R7DdAptL3nJ+/s3QMrSP - dM4YfL6YnCFKreP9MhTev00FP9cFDZRwN2fBvklPq/AP/HXAqw9Pjg== + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBEMUJuVFA4NnI0UjJlNTZx + ZTF0dkJGMWEyd2ZNWjAzV1BDY1RoNmI5TUV3CkhSTGlsbFJTU283VnA4NUNjYk02 + Z3E2T0NSTVBteWt3RVhKTlhnU0tjSlUKLS0tIGc0V1lYUy9mcDJsL0N5bmZRT1Bn + WUZrNDZvREZ3ZFRIWGptVGRhRzMrOWsKoSlR+NGPPWC03CEloEAfThUu5GLRKf55 + zc6zi76KdGo4apDZ0Ikd2qjlWL/9IrpFxD7j5zIEsljTnKJZVH7YTg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2026-08-26T10:17:49Z" - mac: ENC[AES256_GCM,data:b9/Ype3gv8sptpyiR7gF6LTMWxsB8WO+/Y7GY84o0/adkedVDpxE4z03NECcVHbCXqqOy37wLfj2BKAnFejyOHTbGlRmWkVHsQ0jlekhP9gZhAv0pA/JGVftT4AuM/pL9/Ciha1KyeBHSGLDVON5YE9W5i1E+TCH464jD/OMz0M=,iv:mBcS3TXcrSj5FvuNs6RDEHlxO9qimqokYKZFWhqgacY=,tag:uHhUFzGKoTaXz3n10B1RAg==,type:str] + lastmodified: "2026-08-26T10:17:53Z" + mac: ENC[AES256_GCM,data:BIOhrUPLRJ0Ltpsi9L4ZSsZzT+I2m7B04FUNqS9GbIOGtMjFxVXSyhfNFDw3D+7Q4oeG4NdTSQ+2wvK88D4QN/szXagZjmY7kHRtF9Hn33vcoz7HVTOAkSnw0gFUvVKmd31yT/yK62HkSFnscQNqyXGglBrsutcYdAf56S8e7iE=,iv:GCIJRqyHJRagXO0eNcKmb9io3TvcKOOlSLVHZRoUS/w=,tag:gY1PBP6vAKkAwL9AVeXngw==,type:str] encrypted_regex: ^(data|stringData)$ version: 3.11.0 diff --git a/utils/data-migrate/README.md b/utils/data-migrate/README.md new file mode 100644 index 0000000..38457ef --- /dev/null +++ b/utils/data-migrate/README.md @@ -0,0 +1,11 @@ +1. run the application you need +2. wait for its PVs to be created +3. suspend the application: `kubectl scale deployment/statefulset/... NAME -n NAMESPACE --replicas=0` +4. wait for it to scale down so that the ReadWriteOnce PVs are released (or data-migrate will not be able to mount them) +5. look up the destination PVC name you need: `kubectl get pvc NAME -n NAMESPACE` +6. put the source host(node) and dir and destination PVC name to `install.yaml` +7. install the data-migrate: `kubectl create namespace data-migrate && kubectl delete pod data-migrate -n data-migrate --ignore-not-found=true && kubectl apply -f install.yaml` +8. run the migration: `kubectl exec data-migrate -n data-migrate -- cp -a /old/. /new/` or anything you need instead of `cp` +9. validate you have everything migrated: `kubectl exec data-migrate -n data-migrate -- ls -laR /new` +10. uninstall the data-migrate: `kubectl delete pod data-migrate -n data-migrate` +11. resume the application back: `kubectl scale deployment/statefulset/... NAME -n NAMESPACE --replicas=1` \ No newline at end of file diff --git a/utils/data-migrate/install.yaml b/utils/data-migrate/install.yaml new file mode 100644 index 0000000..e800337 --- /dev/null +++ b/utils/data-migrate/install.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Pod +metadata: + name: data-migrate + namespace: data-migrate +spec: + restartPolicy: Never + containers: + - name: migrate + image: busybox + command: ["sleep", "3600"] + volumeMounts: + - name: old-data + mountPath: /old + - name: new-data + mountPath: /new + nodeName: + volumes: + - name: old-data + hostPath: + path: + - name: new-data + persistentVolumeClaim: + claimName: \ No newline at end of file