openproject.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/bin/bash
  2. function usage() {
  3. echo "USAGE:
  4. $(basename $0) --help # 使用帮助
  5. $(basename $0) --run # 运行 openproject
  6. $(basename $0) --backup # 备份 openproject
  7. $(basename $0) --clean # 清理 openproject 备份文件
  8. "
  9. exit 1
  10. }
  11. # 判断参数个数
  12. if [ $# -eq 0 ]; then
  13. usage
  14. fi
  15. # 数据保存在如下目录
  16. DATA_PATH=/home/kylin/data1/openproject
  17. if [ ! -d "${DATA_PATH}" ]; then
  18. mkdir -pv ${DATA_PATH}/{pgdata,assets}
  19. fi
  20. # 备份路径
  21. BACKUP_TO_DIR=/home/kylin/data2/backup/openproject
  22. if [ ! -d "${BACKUP_TO_DIR}" ]; then
  23. mkdir -pv ${BACKUP_TO_DIR}
  24. fi
  25. # 镜像备份名称
  26. IMAGE_FILENAME=openproject_community_12-image-backup.tar
  27. # 容器备份名称
  28. CONTAINER_FILENAME=openproject-container-backup.tar
  29. # 时间戳
  30. timestamp=$(date '+%Y-%m-%d')
  31. ARGS=$(getopt -a -o h -l help,run,backup,restore,clean,cron -- "$@")
  32. eval set -- "${ARGS}"
  33. while true; do
  34. case "$1" in
  35. -h | --help)
  36. usage
  37. ;;
  38. --run)
  39. if ! docker ps | grep -q openproject; then
  40. docker run --restart=always -d --privileged=true -it -p 9000:80 --name openproject \
  41. -e SERVER_HOSTNAME=kylinos.openproject.com \
  42. -e SECRET_KEY_BASE=kylinos \
  43. -v ${DATA_PATH}/pgdata:/var/openproject/pgdata \
  44. -v ${DATA_PATH}/assets:/var/openproject/assets \
  45. openproject/community:12
  46. else
  47. echo "openproject is running"
  48. fi
  49. shift
  50. ;;
  51. --backup)
  52. # 镜像备份
  53. if [ ! -f "${BACKUP_TO_DIR}/${IMAGE_FILENAME}" ]; then
  54. echo "backup openproject/community:12 image"
  55. docker save docker.io/openproject/community:12 -o ${BACKUP_TO_DIR}/${IMAGE_FILENAME}
  56. else
  57. echo "${BACKUP_TO_DIR}/${IMAGE_FILENAME} already backup"
  58. fi
  59. # 容器备份
  60. if [ ! -f "${BACKUP_TO_DIR}/${CONTAINER_FILENAME}" ]; then
  61. echo "backup openproject container"
  62. docker export openproject -o ${BACKUP_TO_DIR}/${CONTAINER_FILENAME}
  63. else
  64. echo "${BACKUP_TO_DIR}/${CONTAINER_FILENAME} already backup"
  65. fi
  66. # 数据备份
  67. tar zcf ${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz -C ${DATA_PATH} .
  68. echo "backup openproject data -> ${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz"
  69. shift
  70. ;;
  71. --restore)
  72. echo "do nothing"
  73. # ## 镜像恢复
  74. # docker load -i ${BACKUP_TO_DIR}/${IMAGE_FILENAME}
  75. # ## 导入容器
  76. # docker import ${BACKUP_TO_DIR}/${CONTAINER_FILENAME}
  77. # # 解压到指定目录,不存在则自动创建
  78. # if [ -f "${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz" ]; then
  79. # tar xvf ${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz --one-top-level=${DATA_PATH}
  80. # echo "restore openproject-data-${timestamp}.tar.gz"
  81. # else
  82. # echo "${BACKUP_TO_DIR}/openproject-data-${timestamp}.tar.gz not exist"
  83. # fi
  84. shift
  85. ;;
  86. --clean)
  87. # 保留最近 10 天的备份文件
  88. KEEP=$(for i in {0..9}; do
  89. date -d "$i day ago" '+%Y-%m-%d'
  90. done | xargs | tr ' ' '|')
  91. # 要删除的文件
  92. NEED_DELETE=$(ls ${BACKUP_TO_DIR}/openproject-data-*.tar.gz | grep -E -v "${KEEP}")
  93. if [ -n "${NEED_DELETE}" ]; then
  94. echo "clean backup data ten days ago"
  95. rm -v -rf ${NEED_DELETE}
  96. else
  97. echo "nothing to clean"
  98. fi
  99. shift
  100. ;;
  101. --cron)
  102. # 设置cronta: 每天0点备份, 每月清理一下备份文件
  103. (
  104. crontab -l
  105. echo "# 每天0点备份"
  106. echo "0 0 * * * bash openproject.sh --backup"
  107. echo "# 每月清理一下备份文件"
  108. echo "0 0 1 * * bash openproject.sh --clean"
  109. ) | crontab
  110. # 查看
  111. crontab -l
  112. shift
  113. ;;
  114. --)
  115. shift
  116. break
  117. ;;
  118. esac
  119. done