分类 DevOps 下的文章

云服务器中通过Docker镜像的方式使用Mysql数据库,数据安全考量定期备份数据库到阿里云OSS中

本文主要实现在阿里云ECS服务器中,通过脚本的方式实现将Docker中的Mysql数据库备份到阿里云OSS中。其他云服务商和其他环境的MySQL也可以使用类似的方式。具体方式不再赘述。

环境和工具

  1. 阿里云ECS服务器,安装Ubuntu或任何带有定时任务cron的Linux操作系统
  2. 阿里云OSS bucket和相应访问的账户
  3. 阿里云OSS命令行工具ossutil,可以到这里下载或查看详情
  4. MySQL镜像

具体步骤

开通OSS和相应子账号

  1. 进入阿里云OSS(对象存储)控制台,如果没有开通OSS服务可能会提示权限和开通确认。
  2. 创建bucket/存储桶,输入名字,比如xxxxbackup,记住这个名字以及界面中出现的Endpoint(地域节点),后续会用到。
    WX20220720-115411.png
  3. 创建一个有API的阿里云子账号,并赋予OSS读写权限。记住该账号的API和Secret,后续会用到。帮助文档
    WX20220720-115547.png

下载OSS命令行工具ossutil到本地系统

  1. 通过wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64下载到本地。这里是64位操作系统,32位可以去下载界面查看对应的下载地址。
  2. 增加运行权限:chmod +x ossutil64
  3. 移动到Path中:sudo mv ossutil64 /bin/

编写脚本

这里需要注意docker容器的名称,容器中应该有MYSQL用户名和密码的环境变量;示例中使用的是root作为用户名;另外备份临时文件夹也需要提前使用mkdir建好

脚本内容示例:

#!/bin/sh 

mysql_dump_path=备份文件临时目录,如/var/dbbackup/ 

#oss-config 
oss_endpoint="阿里云OSS Endpoint" 
oss_bucket="阿里云OSS bucket名称" 
oss_accesskeyid="子账号AccessKeyId" 
oss_accesskeysecret="子账号 AccessKey Secret" 
backup_name=`date +%Y%m%d%H%M%S`
cd ${mysql_dump_path} 

# 使用 mysqldump 备份整个数据库到临时文件夹中
# 注意docker修改docker镜像名称,这里是some-mysql
docker exec some-mysql sh -c 'mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases' > ${backup_name}.sql

# 打包/pack 
tar zcf ${backup_name}.tar.gz ${backup_name}.sql 
rm -f ${backup_name}.sql 

# 备份到OSS
ossutil64 cp ${backup_name}.tar.gz oss://${oss_bucket}/mysql/backup/${backup_name}.tar.gz -f -e ${oss_endpoint} -i ${oss_accesskeyid} -k ${oss_accesskeysecret} 
rm -f ${backup_name}.tar.gz 
echo "备份完成"

将脚本保存至任意一个不错的位置,比如/var/backup/dbbackup.sh,赋予可执行权限:sudo chmod +x /var/backup/dbbackup.sh

试着运行一下脚本文件sudo /var/backup/dbbackup.sh,再去oss控制台该bucket下-文件管理处查看是否有备份文件存入。如果一切没有问题,则就可以加入cron了。

加入cron计划任务

注:如果脚本位置和临时备份文件夹位置是当前用户无法直接编辑的,则应使用一下方法,在系统级别运行计划任务;用户级别会因为权限问题出错

使用你喜欢的编辑器打开/etc/crontab文件,并在文件末尾加上这行:

23 2 * * * root /var/backup/dbbackup.sh

这表示在每天的02:23:00运行我们的备份脚本。

重新启动cron计划任务:sudo service cron reload

在次日2:23分之后检查OSS控制台后台,即可发现整个数据库已经备份到阿里云OSS。

参考

  1. 使用ossutil定时备份自建mysql数据库到阿里云OSS
  2. Cron介绍
  3. docker hub: mysql

问题和原因

jupyter notebook通过nbconvert调用Latex导出PDF,由于nvconvert中转换模版中并不包含中文支持的package申明,导致Latex渲染时无法识别中文字符和对应的字体。出现类似:

LaTeX Error: Unicode character 正 (U+6B63) not set up for use with LaTeX.

的报错。导出的PDF文件中,所有中文字符都显示为空白。

解决方案

有两种方法可以解决:

  1. 先从Notebook导出为Latex,再使用如TexShop等工具打开Latex文件并添加中文支持,之后导出
  2. 修改nbconvert的模版,直接添加中文支持,这样即可直接导出PDF

这里说第二种办法:

首先通过jupyter --paths获得Jupyter相关路径,

% jupyter --paths

输出类似:

config:
    /Users/xxx/.jupyter
    /Users/xxx/custom_path/venv/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /Users/xxx/Library/Jupyter
    /Users/xxx/custom_path/venv/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /Users/xxx/Library/Jupyter/runtime

找到...share/jupyter文件夹所在位置,并定位到...share/jupyter/nbconvert/templates/latex文件夹,里面有nbconvert转换LaTex模版,
nvconvert-latex.png
通过修改base.tex.j2模版文件,添加xeCJK包申明和相关字体即可影响所有相关模版:

    \usepackage{xeCJK}
    \setCJKmainfont{STSong}

添加完成后,模版文件应类似:

((*- block header -*))
    ((* block docclass *))\documentclass[11pt]{article}((* endblock docclass *))

    ((* block packages *))
    \usepackage{xeCJK}
    \setCJKmainfont{STSong}
    \usepackage{iftex}
    ...

注意,字体部分可以通过Mac的字体书(Font Book)找到合适的中文字体名称,不一定非得使用宋体(STSong)。另外除了主要字体,也可以定义其他情况的字体,若加粗和倾斜时应用的字体。

相关文章

github:jupyter/nbconvert
Mac环境下jupyter notebook导出PDF显示中文的解决方案 (nbconvert 6, python 3.9)
convert notebook (contains Chinese words) to PDF successfully but those Chinese words are missing

总体步骤

类似把大象关进冰箱分为3步:

  1. 把冰箱门打开
  2. 把大象放到冰箱里
  3. 把冰箱门关上

将物理机迁移至ESXi 7.0虚拟机也需要3步:

  1. VMware vCenter Converter Standalone Client将物理机打包成VMware Workstation兼容的vmdk文件;
  2. 将vmdk文件上传至ESXi系统存储,并通过vmkfstools转换其为ESXi7.0兼容的格式;
  3. 用上一步转换而来的虚拟硬盘文件创建虚拟机。

1 打包物理机

  1. WMware官网下载VMware vCenter Converter Standalone Client,可能需要注册一个账号
  2. 在需要打包的物理机上安装并运行VMware vCenter Converter Standalone Client
  3. 点击Convert machine,弹窗中选择source typeThis local machine进入下一步:
    WX20220106-103415-1.png
  4. 在目标系统中按照以下界面选择,建议存储位置这里可以通过插入一个移动硬盘并选择这个盘,以方便后续上传到ESXi:
    WX20220106-103534-2.png
  5. 在选项/Options步骤,编辑Data copy type,只选择需要的打包的分区,比如引导分区、系统盘等
    WX20220106-104151-3.png
  6. 继续点击Next/Finish直到完成转换,稍候片刻,即可获得导出的VMware Workstation兼容的vmdk文件

2 上传vmdk,使用vmkfstools转换格式

由于打包的vmdk是兼容VMware Workstation的版本,是不兼容ESXi的。如果不转换格式的话,会出现类似报错:

无法打开磁盘 scsi0:m: 磁盘类型 n 不受支持或无效。请确保磁盘已导入。
  1. 进入ESXi Web终端,通过存储 -> 数据存储浏览器进入并打开/创建相关文件夹,并上传上一步打包出来的vmdk文件:
    迁移1.png
  2. 找到数据存储所在位置:
    迁移2.png
  3. 主机 -> 管理 -> 服务 中打开SSH服务,详见启用对 ESXi Shell 的访问
  4. 通过终端SSH连接到ESXi服务器
  5. cd到第2步存储所在的文件夹,再进一步cd到上传的vmdk文件所在的文件夹
  6. 执行vmkfstools转换格式命令,记得最后要使用-d thin来使用精简置备模式,以节省空间

    # 进入导入vmdk文件所在的文件夹
    cd /vmfs/volumes/xxxxx248-xxxx75d-07eb-xxxxd6c0/xxxx
    # 转换格式,假定原文件名为orginal.vmdk,转换后的文件名为dest.vmdk
    vmkfstools -i orginal.vmdk dest.vmdk -d thin
  7. 等待片刻,即可享用转换出来的vmdk文件

3 创建虚拟机

创建一个新的虚拟机,添加上一步转换出来的vmdk文件为新的硬盘

  1. 进入ESXi终端,通过虚拟机 -> 新建虚拟机 -> 创建新虚拟机
    迁移3.png
  2. 自定义设置,硬盘选择那里添加一个现有硬盘,选择刚才创建的vmdk文件(dest.vmdk
    迁移4.png
  3. 安装常规步骤创建好虚拟机
  4. 理论上你可以运行你的虚拟机了

参考

LEDE的vmdk在esxi下提示scsi0:0的磁盘类型不受支持或无效_Jian Sun_的博客-程序员宝宝
WorkStation 虚拟机迁移到 ESXi的后续处理. 转载

目录

  1. 安装和配置Jenkins
  2. 构建和发布Docker镜像

安装和配置Jenkins

  1. 准备一个操作系统,并安装Docker,具体可以参考Docker文档

    • 若是Linux操作系统,应增加docker用户组并将当前作业用户添加进组,否则必须使用sudo升权执行

      sudo groupadd docker
      sudo usermod -aG docker ${USER}

      退出登陆或重启系统后即可直接运行docker

  2. 拉取Jenkins相关Docker镜像并运行

    • 拉取并运行blueocean版本的Jenkins镜像:

      docker run -p 8080:8080 -p 50000:50000 -v jenkins_data:/var/jenkins_home jenkinsci/blueocean
    • 为了支持SSH操作,拉取并运行jenkins/ssh-agent镜像:

      cat pub.key | docker run jenkins/ssh-agent

      * pub.key配置相关证书密钥中Jenkins容器的公钥

  3. 配置Jenkins:

    • 浏览器打开Jenkins镜像宿主机IP地址所在8080端口,如:http://localhost:8080
    • 使用上一步启动Jenkins获得的初始密码进入系统并创建用户
    • 进入Manage Jenkins -> Manage Plugins添加Maven Integration pluginGitLab PluginSSH pluginDocker Pipeline这些插件
    • 进入Manage Jenkins -> Global Tool Configuration配置JDK、Git、Maven、Docker
      jenkins-jdk.png
      Jenkins- Git.png
      Jenkins- Maven.png
      Jenkins-Docker.png
  4. 配置相关证书密钥和用户名密码,为连接GitHub、Gitlab,Docker私服、远程服务器做准备:

    • 配置Jenkins自身的证书:进入Jenkins所在容器,创建SSH密钥/证书,并添加进Jenkins系统中(用来从Github/Gitlab下载源码)

      # 进入jenkins容器,假设容器ID为abc
      docker exec -it abc /bin/bash
      # 生成证书,默认在/var/jenkins_home/.ssh/下有id_rsa和id_rsa.pub两个密钥和公钥
      ssh-keygen -t rsa
    • 将公钥作为Deploy Key添加进对应的Github或者Gitlab项目中
    • Manage Jenkins -> Credentials中添加此密钥(Jenkins自身密钥)
    • 继续添加Docker私服的用户名密码
    • 继续添加远程服务器SSH登陆的用户名密码
  5. 创建Jenkins构建脚本

    • 若是Maven项目,可以选择Maven项目构建;若是纯Docker构建,直接选择Freestyle
    • 配置source为Git,输入repo地址([email protected]开头),并选择Jenkins自身密钥作为凭证(Credentials)
    • 添加构建步骤,选择Docker构建和发布,输入Dockerfile所在文件夹,若就在根目录则不必输入
    • 选择使用Docker构建,设置镜像名称为Docker私服地址/用户/镜像名,勾选发布镜像,并选择Docker私服的凭证
    • 在触发条件出选择push event,将对应的Webhook填写到GitHub/Gitlab对应项目的Webhook设置中去
  6. 测试构建脚本(略)
  7. 在远程服务器上线
    通过布置一个脚本,进行远程登录+拉取并运行docker镜像,即可实现在远程服务器上上线的操作。

参考

  1. 高效部署Springboot的三种方式,知乎

Nginx settings:

/etc/nginx/sites-available/domain.name.com

include        /etc/nginx/proxy.conf;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server_tokens  off;

upstream corshapi {
        server localhost:5001;
}

add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;


limit_req  zone=one burst=10 nodelay;

location /api {
        proxy_pass         http://localhost:5001;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
}

Reference

  1. Publishing to local IIS failed to include JS files for Pages when using 'abp-script' Tag
  2. Configure IdentityServer4 behind nginx reverse-proxy
  3. Enforce HTTPS in ASP.NET Core
  4. Host ASP.NET Core on Linux with Nginx
  5. Depoloyment Problem: invalid_request
  6. ABP Framework to Azure! - Part 10
  7. Sign-in - IdentityServer 4
  8. Authorization in Angular UI