123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- #!/bin/bash
- function usage() {
- echo "USAGE:
- $(basename $0) --help # 使用帮助
- $(basename $0) --run # 运行 openproject
- $(basename $0) --backup # 备份 openproject
- $(basename $0) --clean # 清理 openproject 备份文件
- "
- exit 1
- }
- # 判断参数个数
- if [ $# -eq 0 ]; then
- usage
- fi
- # 数据保存在如下目录
- DATA_PATH=/home/kylin/data1/openproject
- if [ ! -d "${DATA_PATH}" ]; then
- mkdir -pv ${DATA_PATH}/{pgdata,assets}
- fi
- # 备份路径
- BACKUP_TO_DIR=/home/kylin/data2/backup/openproject
- if [ ! -d "${BACKUP_TO_DIR}" ]; then
- mkdir -pv ${BACKUP_TO_DIR}
- fi
- # 镜像备份名称
- IMAGE_FILENAME=openproject_community_12-image-backup.tar
- # 容器备份名称
- CONTAINER_FILENAME=openproject-container-backup.tar
- # 时间戳
- timestamp=$(date '+%Y-%m-%d')
- ARGS=$(getopt -a -o h -l help,run,backup,restore,clean,cron -- "$@")
- eval set -- "${ARGS}"
- while true; do
- case "$1" in
- -h | --help)
- usage
- ;;
- --run)
- if ! docker ps | grep -q openproject; then
- docker run --restart=always -d --privileged=true -it -p 9000:80 --name openproject \
- -e SERVER_HOSTNAME=kylinos.openproject.com \
- -e SECRET_KEY_BASE=kylinos \
- -v ${DATA_PATH}/pgdata:/var/openproject/pgdata \
- -v ${DATA_PATH}/assets:/var/openproject/assets \
- openproject/community:12
- else
- echo "openproject is running"
- fi
- shift
- ;;
- --backup)
- # 镜像备份
- if [ ! -f "${BACKUP_TO_DIR}/${IMAGE_FILENAME}" ]; then
- echo "backup openproject/community:12 image"
- docker save docker.io/openproject/community:12 -o ${BACKUP_TO_DIR}/${IMAGE_FILENAME}
- else
- echo "${BACKUP_TO_DIR}/${IMAGE_FILENAME} already backup"
- fi
- # 容器备份
- if [ ! -f "${BACKUP_TO_DIR}/${CONTAINER_FILENAME}" ]; then
- echo "backup openproject container"
- docker export openproject -o ${BACKUP_TO_DIR}/${CONTAINER_FILENAME}
- else
- echo "${BACKUP_TO_DIR}/${CONTAINER_FILENAME} already backup"
- fi
- # 数据备份
- tar zcf ${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz -C ${DATA_PATH} .
- echo "backup openproject data -> ${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz"
- shift
- ;;
- --restore)
- echo "do nothing"
- # ## 镜像恢复
- # docker load -i ${BACKUP_TO_DIR}/${IMAGE_FILENAME}
- # ## 导入容器
- # docker import ${BACKUP_TO_DIR}/${CONTAINER_FILENAME}
- # # 解压到指定目录,不存在则自动创建
- # if [ -f "${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz" ]; then
- # tar xvf ${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz --one-top-level=${DATA_PATH}
- # echo "restore openproject-data-${timestamp}.tar.gz"
- # else
- # echo "${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz not exist"
- # fi
- shift
- ;;
- --clean)
- # 保留最近 10 天的备份文件
- KEEP=$(for i in {0..9}; do
- date -d "$i day ago" '+%Y-%m-%d'
- done | xargs | tr ' ' '|')
- # 要删除的文件
- NEED_DELETE=$(ls ${BACKUP_TO_DIR}/openproject-data-*.tar.gz | grep -E -v "${KEEP}")
- if [ -n "${NEED_DELETE}" ]; then
- echo "clean backup data ten days ago"
- rm -v -rf ${NEED_DELETE}
- else
- echo "nothing to clean"
- fi
- shift
- ;;
- --cron)
- # 设置cronta: 每天0点备份, 每月清理一下备份文件
- (
- crontab -l
- echo "# 每天0点备份"
- echo "0 0 * * * bash openproject.sh --backup"
- echo "# 每月清理一下备份文件"
- echo "0 0 1 * * bash openproject.sh --clean"
- ) | crontab
- # 查看
- crontab -l
- shift
- ;;
- --)
- shift
- break
- ;;
- esac
- done
|