跳到主要内容

Linux 使用 rsync 传输文件

· 阅读需 1 分钟
素明诚
Full stack development

配置 SSH 登录

在本地机器生成 SSH 密钥(如果还没有的话)

ssh-keygen -t rsa

按照提示进行操作

将公钥复制到远程机器: 使用 ssh-copy-id 命令将你的公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中:

ssh-copy-id username@B_machine_IP

按提示操作,你会看到Number of key(s) added: 1表示添加成功,完成这一步后,你应该可以无需密码通过 SSH 访问远程服务器。

使用 rsync

确认 rsync 安装:确保两台机器都安装了 rsync

执行 rsync 命令

rsync -avzP /path/to/source/folder/ username@B_machine_IP:/path/to/destination/folder/
  • -a 表示归档模式,确保文件的属性和权限被保留。
  • -v 表示详细模式,会显示传输过程的详细信息。
  • -z 表示启用压缩,减少数据传输量。

Express 中使用 Winston 记录日志

· 阅读需 1 分钟
素明诚
Full stack development

首先,你需要在你的 Node.js 项目中安装 Winston 和 winston-daily-rotate-file(实现日志滚动

npm install winston
npm install winston-daily-rotate-file

示例:编写一个 logger 实例导出使用

import winston from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
import fs from 'fs';
import path from 'path';

function ensureLogDirectory() {
const logDirectory = path.join(process.cwd(), 'logs');
if (!fs.existsSync(logDirectory)) {
fs.mkdirSync(logDirectory, {recursive: true});
}
return logDirectory;
}

// 创建日志文件传输配置
function createFileTransport(logDirectory) {
return new DailyRotateFile({
filename: path.join(logDirectory, 'admin-%DATE%.log'),
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
format: winston.format.combine(
winston.format.colorize(),
winston.format.timestamp({format: 'YYYY-MM-DD HH:mm:ss'}),
winston.format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
),
});
}

// 创建控制台传输配置
function createConsoleTransport() {
return new winston.transports.Console({
level: 'debug',
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
});
}

const logDirectory = ensureLogDirectory();
const transport = createFileTransport(logDirectory);
const consoleTransport = createConsoleTransport();

// 初始化并导出logger
export const logger = winston.createLogger({
transports: [
transport,
consoleTransport
]
});

编写中间件

export const logMiddleware = (req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
const logLevel = res.statusCode >= 400 ? 'error' : 'info';
const message = `${req.method} ${req.url} - Status Code: ${res.statusCode} - ${duration}ms `;
logger[logLevel](message);
});
next();
};

注册中间件

const app = express();
app.use(cors());
app.use(express.json());
app.use(express.static('dist'));
app.use(logMiddleware); // 这里

效果

ca9b705e4e51a672c2938357f93fd824## 项目地址
https://github.com/winstonjs/winston

docker 查看 volume 位置

· 阅读需 1 分钟
素明诚
Full stack development

列出所有卷:首先确保卷 logs 已被正确创建。

docker volume ls

检查卷的详情:使用以下命令来查看 logs 卷的详细信息,包括它的实际存储路径。

docker volume inspect logs 卷名

这个命令将返回一个包含卷详细信息的 JSON 数组。其中的 "Mountpoint" 键值对应的值就是卷在宿主机上的存储路径。例如:

[
{
"CreatedAt": "2024-06-20T13:47:04+08:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "mysql-redis",
"com.docker.compose.version": "2.27.1",
"com.docker.compose.volume": "mysql"
},
"Mountpoint": "/var/lib/docker/volumes/mysql-redis_mysql/_data",
"Name": "mysql-redis_mysql",
"Options": null,
"Scope": "local"
}
]

在这个示例中,logs 卷的存储路径是 /var/lib/docker/volumes/mysql-redis_mysql/_data。您可以通过访问这个路径来查看和管理存储在卷中的日志文件。

Linux Micro 使用和常用插件配置

· 阅读需 2 分钟
素明诚
Full stack development

安装 Micro

Linux/macOS:可以通过包管理器安装,如在 macOS 上使用 Homebrew: brew install micro

Windows:可以通过 Scoop 或 Chocolatey 安装:scoop install microchoco install micro

启动编辑器

在终端中输入 micro 后跟文件名即可打开文件进行编辑,例如:micro example.txt

常用操作

Ctrl-D 输入 quit 退出

Ctrl-S保存

查找操作

查找下一个

在查找模式下,按下 Enter 将会查找下一个匹配项。

或者,按下 Ctrl-N 在查找结果中向下移动到下一个匹配项。

查找上一个

在查找模式下,按下 Ctrl-P 在查找结果中向上移动到上一个匹配项。

取消查找

在查找模式下,按下 Esc 键或者 Ctrl-C 可以取消当前的查找操作,回到正常的编辑模式。

配置 Micro

Micro 的配置文件通常存放在用户目录下的 .config/micro/settings.json 文件中。

可以通过修改这个文件来改变默认的设置,例如设置 tab 的大小,是否自动缩进等。

自定义快捷键

你可以在 ~/.config/micro/bindings.json 中定义自己的键绑定,以覆盖默认的快捷键配置。

使用命令面板

可以通过 Ctrl-E 启动,然后输入任何内置命令或自定义命令来执行。

使用插件

Micro 支持插件来扩展功能。可以通过 micro -plugin install [plugin_name] 来安装插件。

常用插件如 go, python 提供了语言特定的语法高亮和其他功能。

插件地址### go 开发推荐插件

micro -plugin install go quickfix lsp autofmt snippets

注意,下载需要一段时间

5d7bd5a36ee5ff33659f7eb7b6edc093

Ubuntu 2004 更换国内镜像源

· 阅读需 1 分钟
素明诚
Full stack development

备个份

sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

编辑文件

sudo nano /etc/apt/sources.list

清华源

把下面内容替换进去

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

升级软件包

sudo apt upgrade

Docker 提示Too many requests You have reached your pull rate limit

· 阅读需 2 分钟
素明诚
Full stack development

Docker Hub 为了管理资源消耗,对镜像的拉取次数设有限制。对于未认证的用户,这一限制较低,而对于已认证的用户,限制相对较高。一旦超出这个限制,就会收到 HTTP 状态码 429(Too Many Requests)

Docker Hub 登录

最简单的方法是登录到您的 Docker Hub 账户。通过执行下面的命令来登录

docker login

登录后,Docker Hub 将提高您的 API 调用频率限制,已认证的用户每 6 小时 200 个拉取请求

其他方法

升级 Docker Hub 账户

如果您是高频用户,建议考虑升级到 Docker Hub 的付费账户。付费账户提供更高的数据拉取限额,满足更频繁的开发需求。

使用其他镜像仓库

考虑使用其他公共镜像仓库,如 Google Container Registry (GCR)、Amazon Elastic Container Registry (ECR),或者建立您自己的私有镜像仓库。这些选择可以分散对 Docker Hub 的依赖,减少受限的风险。

本地缓存常用镜像

尽量缓存您经常使用的镜像。当您的 CI/CD 流程或开发环境需要使用这些镜像时,直接从本地缓存拉取,减少对 Docker Hub 的请求。

Linux 安装 MinIO

· 阅读需 1 分钟
素明诚
Full stack development

官网地址

https://min.io/download?license=agpl&platform=docker## Docker 安装

创建一个 docker-compose.yml

services:
minio:
image: quay.io/minio/minio
container_name: minio
ports:
- "9000:9000"
- "9001:9001" # MinIO的管理界面(Console)端口
volumes:
- minio_data:/data
- minio_config:/root/.minio
environment:
MINIO_ROOT_USER: admin # 设置MinIO的用户名
MINIO_ROOT_PASSWORD: admin123456 # 设置MinIO的密码
MINIO_REGION: "cn-north-1"
MINIO_BROWSER: "on" # 是否开启浏览器访问
command: server /data --console-address ":9001"
healthcheck:
test:
[
"CMD",
"curl",
"-f",
"http://localhost:9000/minio/health/live"
]
interval: 30s
timeout: 20s
retries: 3
networks:
- minio_network
volumes:
minio_data:
minio_config:
networks:
minio_network:
driver: bridge