Skip to content

Commit 534c9db

Browse files
author
TryBin03
committed
支持配置文件进行配置
添加七牛云推送日志
1 parent 8ebbc64 commit 534c9db

File tree

10 files changed

+192
-50
lines changed

10 files changed

+192
-50
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
node_modules
2-
package-lock.json
2+
package-lock.json
3+
backup-*.conf
4+
5+
.idea

README.md

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,46 @@
22
在操作数据过程中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。使用本仓库加上`crontab`可以实现定时备份MySQL
33

44
## 配置
5-
### bf.sh
6-
```sh
7-
# 程序路径
8-
path=/backup
9-
# 备份数据保存地址
10-
backUpFolder="$path/data/$dbName"
5+
### 默认配置(`backup.conf`
6+
修改成你的配置,还可以在通过传入配置文件名称的方式实现多配置(后面会讲到)。
7+
```
8+
# 需要备份的数据库名称
9+
dbName=bf_test
10+
# 文件路径(实际路径会加上dbName)
11+
dataPath=/bf/data
12+
# zip包密码,建议设置复杂一点
13+
zipPwd=myPassword
14+
1115
# MySQL用户
12-
MySQLUser=MySQL
16+
MySQLUser=root
1317
# MySQL用户密码
14-
MySQLPwd=MySQL
15-
# zip包密码,建议设置复杂一点
16-
zipPwd=password
18+
MySQLPwd=MySQLPwd
19+
20+
# 桶名称
21+
bucketName=你的七牛云桶名称
22+
# 七牛云ak
23+
qiniuAccessKey=你的七牛云ak
24+
# 七牛云sk
25+
qiniuSecretKey=你的七牛云sk
1726
```
18-
### qiniu_config.js
19-
```js
20-
//七牛云ak
21-
var accessKey = 'XXX';
22-
//七牛云sk
23-
var secretKey = 'XXX';
27+
## 使用
28+
### 默认配置
29+
默认使用 `backup.conf` 作为配置文件
30+
```sh
31+
bash bf.sh
2432
```
25-
### upload.js
26-
```js
27-
// 桶名称
28-
const uploadToken = getToken("bucket")
33+
### 指定配置文件
34+
使用 `backup-test.conf` 作为配置文件
35+
```sh
36+
bash bf.sh backup-test.conf
2937
```
38+
> ## 注意!!!:配置文件需要和`bf.sh`放在同一目录
39+
### `crontab`中使用
40+
```sh
41+
# 每天3点备份test数据库
42+
0 3 * * * bash bf.sh backup-test.conf
43+
# 每天3点15分备份dev数据库
44+
15 3 * * * bash bf.sh backup-dev.conf
45+
# 每天3点30分备份job数据库
46+
30 3 * * * bash bf.sh backup-job.conf
47+
```

backup.conf

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# 需要备份的数据库名称
2+
dbName=bf_test
3+
# 文件路径(实际路径会加上dbName)
4+
dataPath=/bf/data
5+
# zip包密码,建议设置复杂一点
6+
zipPwd=myPassword
7+
8+
# MySQL用户
9+
MySQLUser=root
10+
# MySQL用户密码
11+
MySQLPwd=MySQLPwd
12+
13+
# 桶名称
14+
bucketName=你的七牛云桶名称
15+
# 七牛云ak
16+
qiniuAccessKey=你的七牛云ak
17+
# 七牛云sk
18+
qiniuSecretKey=你的七牛云sk

bf.sh

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
1-
# 需要备份的数据库名称
2-
dbName=$1
3-
# 程序路径
4-
path=/backup
5-
# MySQL用户
6-
MySQLUser=MySQL
7-
# MySQL用户密码
8-
MySQLPwd=MySQL
9-
# zip包密码,建议设置复杂一点
10-
zipPwd=password
1+
#!/bin/bash
2+
3+
# 获取当前脚本的目录路径
4+
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
5+
6+
DEFAULT_CONFIG="backup.conf"
7+
8+
# 如果用户提供了配置文件路径,则使用用户的配置文件
9+
if [ "$1" ]; then
10+
CONFIG_FILE="$1"
11+
else
12+
CONFIG_FILE="$DEFAULT_CONFIG"
13+
fi
14+
15+
CONFIG_FILE="$SCRIPT_DIR/$CONFIG_FILE"
16+
17+
# 检查文件是否存在
18+
if [ ! -f "$CONFIG_FILE" ]; then
19+
echo "错误: 配置文件 $CONFIG_FILE 不存在"
20+
exit 1
21+
fi
22+
23+
# 读取配置文件
24+
source $CONFIG_FILE
1125

1226
# 设定 文件夹
13-
backUpFolder="$path/data/$dbName" #定时保存打包数据库的文件 的位置
27+
backUpFolder="$dataPath/$dbName" #定时保存打包数据库的文件 的位置
1428
date_now=`date +%Y_%m_%d_%H%M`
1529
backFileName=$dbName_$date_now
1630

@@ -20,12 +34,16 @@ if [ ! -d $backUpFolder ];then
2034
fi
2135
cd $backUpFolder
2236

23-
mysqldump -u$MySQLUser -p$MySQLPwd $dbName > $backFileName
37+
mysqldump -h 127.0.0.1 -P 33711 -u$MySQLUser -p$MySQLPwd $dbName > $backFileName
2438

2539
#打包备份数据库
26-
zip -rP $zipPwd $backFileName.zip $backFileName
40+
zip -rP $zipPwd $backFileName.zip $backFileName
2741

2842
# 移除临时文件
2943
rm -rf $backFileName
3044

31-
NODE_ENV=$backUpFolder@$backFileName@$dbName node $path/start.js # 此程序位置
45+
# 备份文件位置@备份文件名称(无后缀)@数据库名称@桶名称@七牛云Ak@七牛云SK
46+
NODE_ENV=$backUpFolder@$backFileName@$dbName@$bucketName@$qiniuAccessKey@$qiniuSecretKey node $SCRIPT_DIR/src/start.js # 此程序位置
47+
48+
# 删除90天前的备份文件
49+
find $backUpFolder -type f -name "*.zip" -mtime +90 -exec rm -f {} \;

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
{
22
"dependencies": {
33
"bcryptjs": "^2.4.3",
4-
"qiniu": "^7.9.0"
4+
"qiniu": "^7.9.0",
5+
"winston": "^3.17.0",
6+
"winston-daily-rotate-file": "^5.0.0"
57
},
68
"devDependencies": {
79
"babel-preset-env": "^1.7.0",
810
"babel-register": "^6.26.0",
911
"cross-env": "^7.0.3"
1012
},
1113
"scripts": {
12-
"dev": "cross-env NODE_ENV=文件路径@文件名称不带后缀 node start.js"
14+
"dev": "cross-env NODE_ENV=备份文件位置@备份文件名称(无后缀)@数据库名称@桶名称@七牛云Ak@七牛云SK node src/start.js"
1315
}
1416
}

bcrypt.js renamed to src/bcrypt.js

File renamed without changes.

src/log.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
const fs = require('fs'); // 添加这行代码
2+
const winston = require('winston');
3+
const DailyRotateFile = require('winston-daily-rotate-file');
4+
const path = require('path');
5+
6+
class Logger {
7+
constructor(options = {}) {
8+
// 默认配置
9+
const defaultOptions = {
10+
level: 'info', // 默认日志级别
11+
logDir: path.join(__dirname, '../logs'), // 默认日志目录
12+
filename: 'app-%DATE%.log', // 默认日志文件名
13+
datePattern: 'YYYY-MM-DD', // 按天分割日志
14+
maxSize: '20m', // 每个文件最大 20MB
15+
maxFiles: '14d', // 保留最近 14 天的日志
16+
format: winston.format.combine(
17+
winston.format.timestamp(), // 添加时间戳
18+
winston.format.printf(({ level, message, timestamp }) => {
19+
return `${timestamp} [${level}]: ${message}`;
20+
})
21+
),
22+
};
23+
24+
// 合并用户配置和默认配置
25+
this.options = Object.assign({}, defaultOptions, options);
26+
// this.options = { ...defaultOptions, ...options };
27+
28+
// 确保日志目录存在
29+
if (!fs.existsSync(this.options.logDir)) {
30+
fs.mkdirSync(this.options.logDir, { recursive: true });
31+
}
32+
33+
// 创建 Logger 实例
34+
this.logger = winston.createLogger({
35+
level: this.options.level,
36+
format: this.options.format,
37+
transports: [
38+
new DailyRotateFile({
39+
dirname: this.options.logDir,
40+
filename: this.options.filename,
41+
datePattern: this.options.datePattern,
42+
maxSize: this.options.maxSize,
43+
maxFiles: this.options.maxFiles,
44+
}),
45+
new winston.transports.Console({ // 同时输出到控制台
46+
format: winston.format.combine(
47+
winston.format.colorize(), // 控制台日志添加颜色
48+
winston.format.simple() // 简单格式
49+
),
50+
}),
51+
],
52+
});
53+
}
54+
55+
// 记录日志的方法
56+
log(level, message, meta = {}) {
57+
this.logger.log(level, message, meta);
58+
}
59+
60+
// 快捷方法
61+
info(message, meta) {
62+
this.log('info', message, meta);
63+
}
64+
65+
warn(message, meta) {
66+
this.log('warn', message, meta);
67+
}
68+
69+
error(message, meta) {
70+
this.log('error', message, meta);
71+
}
72+
73+
debug(message, meta) {
74+
this.log('debug', message, meta);
75+
}
76+
}
77+
78+
// 导出工具类
79+
module.exports = Logger;

qiniu_config.js renamed to src/qiniu_config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as qiniu from 'qiniu'
22

3-
export const getToken = (bucket) => {
4-
var accessKey = 'XXX'; //七牛云ak
5-
var secretKey = 'XXX'; //七牛云sk
3+
export const getToken = (bucket, ak, sk) => {
4+
var accessKey = ak; //七牛云ak
5+
var secretKey = sk; //七牛云sk
66
var bucket = bucket
77
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
88

start.js renamed to src/start.js

File renamed without changes.

upload.js renamed to src/upload.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,38 @@
11
import * as qiniu from 'qiniu'
22

3-
import {getToken} from './qiniu_config.js'
3+
import {getToken} from './qiniu_config.js'
4+
const Logger = require('./log'); // 使用 require 导入
5+
const logger = new Logger(); // 初始化日志对象
46

5-
const uploadToken = getToken("bucket") // 桶名称
67

7-
console.log(uploadToken)
8+
const parts = process.env.NODE_ENV.split('@')
9+
10+
const uploadToken = getToken(parts[3], parts[4], parts[5]) // 桶名称
11+
12+
logger.info(uploadToken)
813

914
const config = new qiniu.conf.Config();
1015
config.zone = qiniu.zone.Zone_z2; // 空间对应的机房,需自行更改
1116
const formUploader = new qiniu.form_up.FormUploader(config);
1217
const putExtra = new qiniu.form_up.PutExtra();
1318

14-
15-
const parts = process.env.NODE_ENV.split('@')
1619
const file = parts[1] + '.zip'
1720
const filePath = parts[0] + '/' + file
1821

1922
const key=parts[2] + '/' + file; //上传到服务器的名称
2023
const localFile = filePath; // 本地文件路径
24+
logger.info("上传文件【"+ localFile + "】...")
2125
formUploader.putFile(uploadToken, key, localFile, putExtra, function (respErr,
2226
respBody, respInfo) {
2327
if (respErr) {
2428
throw respErr;
2529
}
26-
if (respInfo.statusCode == 200) {
27-
console.log('上传成功')
28-
console.log(respBody);
30+
if (respInfo.statusCode === 200) {
31+
logger.info('上传成功(' + respInfo.statusCode + ')');
32+
logger.info(JSON.stringify(respInfo));
2933
} else {
30-
console.log(respInfo.statusCode);
31-
console.log(respBody);
34+
logger.error('上传失败(' + respInfo.statusCode + ')');
35+
logger.error(JSON.stringify(respInfo));
3236
}
3337
});
3438

0 commit comments

Comments
 (0)