Docker 加持的安卓手机:随身携带的知识库(一)
这篇文章聊聊,如何借助 Docker ,尝试将一台五年前的手机,构建成一个随身携带的、本地化的知识库。
写在前面
本篇文章,我使用了一台去年从二手平台购入的五年前的手机,K20 Pro。
为了让它能够稳定持续的运行,我还为它准备了一个“加强版”的散热壳。
设想中的平时使用场景也非常简单,不需要插卡、不需要联网,一根 Type-C 数据线把它和电脑连在一起,就可以通过“本地连接”来访问手机中运行的提供服务的软件。
因为手机本身自带“UPS”(电池),所以即使突然断电,也不会出现数据的丢失,除此之外,因为手机已经是五年前的规格了,即使大手笔的购入顶配中的至尊版,成本也并不高,但是却可以比较轻松的获得一台 8核心、12GB 内存、500GB 的硬盘设备。甚至还有一块可以用来调试或者展示内容的“全面屏”,没有任何摄像头打孔的完整玻璃屏幕。
至于性能,如果能够完全配置正常,应该是非常有性价比,但是这应该需要一些折腾,所以本篇文章是第一篇,先验证可行性。
本文中的许多资料来自开源项目 CGCL-codes/Android-Container,感谢作者的辛苦劳动。不过项目距今为止已有三年没有更新,我个人推荐只做验证使用,一如本文中的使用方案。
为什么选择这台 K20 Pro
翻阅之前的文章,我发现我差不多每年都会折腾一下小米的手机。
- 今年早些时候,聊过使用搭载 8Gen3 的红米 K70 Pro 跑模型《使用搭载骁龙 8 Gen 3 的安卓手机运行 AI 大模型》
- 2023 年的时候,折腾过闲置的小米 12 Pro《小米 12 PRO 刷 MIUI 14 海外版(Android 12)》
- 2022 年的时候,折腾过红米 11T Pro 《红米 11T PRO 刷机 MIUI 13 海外版》
- 2021 年的时候,折腾过 K30 Pro《小米 K30 PRO 刷机 MIUI 12.5 海外版》
- 2019 年的时候,折腾过 K20 Pro《小米 K20Pro 体验 Android 10》
因为种种原因,目前的小米开发者生态没有了过去的开放,开发者难以获取 Bootloader 权限,各种有趣的功能要排队内测,甚至 GitHub 上都出现了一些离谱的项目,比如 “小米高考题库”,来解决解锁刷机权限必须度过的大量八股测试题;“小米解锁项目”,“小米解锁方案合集” 等等项目。
**虽然,看起来现在的小米手机型号已经不再适合折腾。**但是,过去的手机,有没有可能变成一台比较有趣的设备,做一些比较有趣的事情呢?
毕竟,过去的小米手机还是很顶的!“守门员”、“焊门员”、“小金刚”这些产品形容词不光包含了营销成分,也有来自粉丝们的赞许。
准备工作
这次的准备工作非常简单,首先是“适合折腾的手机”,我选择的是 K20 Pro,你可以选择你喜欢的设备。
然后,是一台协助手机重获新生的“电脑”,Windows 或者 macOS 桌面系统的设备会比较方便,我使用的是 macOS。
最后,需要一根 Type-C 口的数据线,能够将手机连到电脑上。
第一步:解锁手机 Bootloader 权限
你可以参考上文中,我分享的之前的相关手机折腾记录,来将手机解锁,以便我们能够刷入 TWRP,并在后续过程中刷入验证 Docker 使用的新的安卓系统镜像。
如果你使用的设备也是 K20 Pro(Mi 9T Pro),可以从这里下载该设备的 TWRP 引导镜像。
更新设备的 BootLoader 非常简单,只需要电脑侧执行下面两条命令即可:
fastboot flash recovery twrp.img
fastboot reboot
第二步:按顺序刷入设备使用的系统镜像
在项目子目录文档的底部,我们能够找到用于验证的安卓镜像。
我们需要先刷入来自小米官方的 miui_RAPHAEL_V12.0.5.0.QFKCNXM_d03168fb55_10.0.zip
镜像,这个镜像发布自 2020 年 10 月 18 日,基于 Android 10 构建。如果项目页面下载比较慢,你可以从这里下载官方镜像。
在刷入官方镜像后,我们就可以刷入项目作者构建好的镜像 PixelExperience_raphael-10.0-20201204-0354-UNOFFICIAL-48bit-docker-criu.zip
,来进行功能验证了。
在这个文档的上面,作者简单解释了如何进行镜像构建,而在另外一个目录中文档,则包含了另外一些比较重要的信息,包括如何给镜像内核做调整,来让 Docker 能够运行起来。
当我们完成镜像的更新后,就需要手动来完善运行环境,让 Docker 运行起来啦。
第三步:修复 Docker 运行环境
首先在一个命令行终端中执行:
adb shell
在进入一个交互式终端后,输入下面的命令,让我们能够修改系统中的只读目录:
mount -o rw,remount /
接着,我们将项目 Docker 目录和项目 files 目录的 files/dockerd.sh 使用 adb push
命令,传送到手机的 /system/bin/
目录下,一个基本的 Docker 运行环境就就绪啦。
# adb push ./dockerd.sh /system/bin/dockerd.sh./dockerd.sh: 1 file pushed, 0 skipped. 7.7 MB/s (4016 bytes in 0.000s)...
为了我们操作 Docker 程序更方便,我们可以手动修复 docker-compose
命令,在 Compose 项目的发布页面,我们找到最新版本的 docker-compose-linux-aarch64
文件,下载,并使用上面的方式传送到手机环境中,并设置正确的执行权限。
# adb push ./docker-compose-linux-aarch64 /system/bin/docker-compose./docker-compose-linux-aarch64: 1 file pushed, 0 skipped. 32.2 MB/s (61276577 bytes in 1.815s)adb shell su -c "chmod +x /system/bin/docker-compose"
改进的 dockerd.sh
我对原始项目的 dockerd.sh
做了一些简单调整:
#!/system/bin/shmount -o rw,remount /# 创建 Docker 相关的目录
root_dirs=("/var" "/run" "/tmp" "/opt" "/usr" "/system/etc/docker")
for dir in "${root_dirs[@]}"; doif [ ! -d "$dir" ]; thenmkdir "$dir"fi
done# 创建 /data 目录相关的目录
data_dirs=("/data/var:/var" "/data/run:/run" "/data/tmp:/tmp" "/data/opt:/opt" "/data/etc/docker:/etc/docker")
for dir in "${data_dirs[@]}"; do# 分割目录路径和挂载点paths=$(echo "$dir" | tr ':' ' ')data_dir=$(echo "$paths" | cut -d ' ' -f 1)mount_dir=$(echo "$paths" | cut -d ' ' -f 2)# 如果 /data/var 目录存在,清理目录中的 ./run 目录if [ "$data_dir" = "/data/var" ] && [ -d "$data_dir" ]; thenrm -rf /data/var/runfi# 尝试创建并挂载目录mkdir -p "$data_dir"mount --bind "$data_dir" "$mount_dir"echo "mount $data_dir to $mount_dir"
done# 创建 /dev 目录相关的目录,并挂载 cgroup
cgroup_dirs=("cpu" "cpuacct" "devices" "freezer" "hugetlb" "net_cls" "net_prio" "perf_event" "pids" "rdma")
for dir in "${cgroup_dirs[@]}"; doif [ ! -d "/dev/$dir" ]; thenmkdir -p "/dev/$dir"case "$dir" in"cpu"|"cpuacct");;*)echo "mount -t cgroup -o $dir none /dev/$dir"mount -t cgroup -o $dir none /dev/$dir;;esacfi
done# 为 Docker 添加路由表
ip_rule1=$(ip rule | grep "from all lookup main" | wc -l)
if [ "$ip_rule1" -ne 1 ]; thenip rule add pref 1 from all lookup main
fi
ip_rule2=$(ip rule | grep "from all lookup default" | wc -l)
if [ "$ip_rule2" -ne 1 ]; thenip rule add pref 2 from all lookup default
fi# 设置 Docker 镜像加速
echo "{\"registry-mirrors\":[\"https://mirror.baidubce.com\"],\"experimental\":true}" > /etc/docker/daemon.json
# 关闭默认防火墙,允许外部访问 Docker 容器端口
setenforce 0
# 启动 Docker
export DOCKER_RAMDISK=true
dockerd --add-runtime crun=/bin/crun -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock > /dev/null 2>&1 &
搭配注释,做了什么应该都非常清楚啦,这里就不展开赘述了。等到重新构建镜像的时候,我们再进行进一步的优化(内置 & 精简)。
第四步:启动 Docker 后台进程
当我们将所有文件都传输到手机上之后,在 adb shell
环境中把 docker
进行拉起来,Docker 运行环境就准备就绪啦。
# dockerd.sh mount /data/var to /var
mount /data/run to /run
mount /data/tmp to /tmp
mount /data/opt to /opt
mount /data/etc/docker to /etc/docker
mount -t cgroup -o devices none /dev/devices
mount -t cgroup -o freezer none /dev/freezer
mount -t cgroup -o hugetlb none /dev/hugetlb
mount -t cgroup -o net_cls none /dev/net_cls
mount -t cgroup -o net_prio none /dev/net_prio
mount -t cgroup -o perf_event none /dev/perf_event
mount -t cgroup -o pids none /dev/pids
mount -t cgroup -o rdma none /dev/rdma
这个时候,执行 docker info
就能够看到 docker 的基础运行环境状况啦:
# docker infoClient:Debug Mode: falseServer:Containers: 1Running: 1Paused: 0Stopped: 0Images: 7Server Version: 19.03.13Storage Driver: overlay2Backing Filesystem: extfsSupports d_type: trueNative Overlay Diff: falseLogging Driver: json-fileCgroup Driver: cgroupfsPlugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: runc crunDefault Runtime: runcInit Binary: docker-initcontainerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175runc version: dc9208a3303feef5b3839f4323d9beb36df0a9ddinit version: fec3683Security Options:seccompProfile: defaultKernel Version: 4.14.180-F1xy-0.19-pe-ten/71771c10beOSType: linuxArchitecture: aarch64CPUs: 8Total Memory: 11.25GiBName: localhostID: LLQY:OOXR:BKTQ:M2ZP:MGUJ:Q3NY:RPZL:EV7D:YGQY:H45D:BKUY:RXMADocker Root Dir: /var/lib/dockerDebug Mode: falseRegistry: https://index.docker.io/v1/Labels:Experimental: trueInsecure Registries:127.0.0.0/8Registry Mirrors:https://mirror.baidubce.com/Live Restore Enabled: falseProduct License: Community EngineWARNING: API is accessible on http://0.0.0.0:2375 without encryption.Access to the remote API is equivalent to root access on the host. Referto the 'Docker daemon attack surface' section in the documentation formore information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
第五步:创建一个 Docker 应用
Docker 环境就绪后,我们来测试 Docker 应用能否运行。先创建一个目录,用于后续存放 Docker 应用数据:
mkdir -p kb
cd kb
随后,在目录中创建一个内容如下的 docker-compose.yml
配置文件:
version: '3'services:wordpress:image: soulteary/sqlite-wordpress:6.5.2restart: alwaysports:- 8080:80volumes:- ./wordpress:/var/www/html
没错,这个配置来自项目 soulteary/docker-sqlite-wordpress,在之前的文章《WordPress 告别 MySQL:Docker SQLite WordPress》、《WordPress SQLite Docker 镜像封装细节》中,讲的比较详尽了,就不在此展开啦。
当我们准备好 docker-compose.yml
后,执行 docker-compose up -d
:
# docker-compose up -d
WARN[0000] /kb/docker-compose.yml: `version` is obsolete
[+] Running 1/0✔ Container kb-wordpress-1 Running
WordPress 就很快的通过容器的方式启动起来啦。
启动应用后,我们使用下面的命令,可以简单验证服务是否正常运行:
docker exec kb-wordpress-1 curl -L http://0.0.0.0:80
不出意外,我们将得到类似下面的结果:
上面的图片中,我们使用命令行来验证了 WordPress 中的程序渲染出了 HTML 页面,虽然执行时间非常长(需要排查或重新构建 Android 验证),但是证明了 Android 上运行 Docker 程序是可行的。
第六步:如何在电脑侧访问手机的应用
Android Debug Bridge(ADB)中有一个很有用的命令叫做 forward
,我们可以通过这个命令,将电脑上的端口和手机上应用的端口进行打通。
forward --list list all forward socket connectionsforward [--no-rebind] LOCAL REMOTEforward socket connection using:tcp:<port> (<local> may be "tcp:0" to pick any open port)localabstract:<unix domain socket name>localreserved:<unix domain socket name>localfilesystem:<unix domain socket name>dev:<character device name>jdwp:<process pid> (remote only)vsock:<CID>:<port> (remote only)acceptfd:<fd> (listen only)forward --remove LOCAL remove specific forward socket connectionforward --remove-all remove all forward socket connections
命令支持四种参数调用方法,分别是:
- 以列表形式获取所有的转发映射
- 进行本地和远程端口的转发映射
- 撤销一个本地端口的转发映射
- 撤销所有的转发映射
我们以实际的情况举例,上文中,我们在手机上将 WordPress 默认运行的 80
端口,映射到了手机的 8080
端口。如果我们将电脑的 8088
端口和手机上的 8080
端口打通,那么我们需要执行下面的命令:
adb forward tcp:8088 tcp:8080
当命令执行完毕后,我们就可以在浏览器中访问 http://localhost:8088
来访问手机上的应用啦。
当然,这里也会遇到和上面一样的问题,访问应用的时间会比较长。这是一个需要继续排查和解决的问题。毕竟除了 PHP
程序执行外的资源路径的响应都在 ms
级别。
当然,如果你希望这台设备上运行的 Docker 程序,能够在局域网共享,只需要让手机连上 Wi-Fi,然后在浏览器中访问手机在局域网中的 IP 地址,和对应的程序端口即可。
是不是十分简单,如果你想离线本地化使用,就不需要给手机网络,如果你想局域网共享,得到一台低成本、高性价比的 Linux 服务器,就让它连上 Wi-Fi。
最后
写到这里,本文提到的验证目标就结束啦。接下来相关的文章里,我们来聊聊本文遇到的性能问题,以及如何在 2024 年更简单的构建支持 Docker 运行的安卓内核和镜像。
我们下篇文章再见。
–EOF
我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。
我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。
关于交友的标准,请参考下面的文章:
苏洋:致新朋友:为生活投票,不断寻找更好的朋友
当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄
苏洋:关于折腾群入群的那些事
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
本文作者: 苏洋
创建时间: 2024年05月03日
统计字数: 9721字
阅读时间: 20分钟阅读
本文链接: https://soulteary.com/2024/05/03/docker-powered-android-phone-knowledge-base-you-can-carry-with-you-1.html
相关文章:

Docker 加持的安卓手机:随身携带的知识库(一)
这篇文章聊聊,如何借助 Docker ,尝试将一台五年前的手机,构建成一个随身携带的、本地化的知识库。 写在前面 本篇文章,我使用了一台去年从二手平台购入的五年前的手机,K20 Pro。 为了让它能够稳定持续的运行…...

本地连接服务器Jupyter【简略版】
首先需要在你的服务器激活conda虚拟环境: 进入虚拟环境后使用conda install jupyter命令安装jupyter: 安装成功后先不要着急打开,因为需要设置密码,使用jupyter notebook password命令输入自己进入jupyter的密码: …...

sql 注入 1
当前在email表 security库 查到user表 1、第一步,知道对方goods表有几列(email 2 列 good 三列,查的时候列必须得一样才可以查,所以创建个临时表,select 123 ) 但是你无法知道对方goods表有多少列 用order …...

Excel中实现md5加密
1.注意事项 (1)在Microsoft Excel上操作 (2)使用完,建议修改的配置全部还原,防止有风险。 2.准备MD5宏插件 MD5加密宏插件放置到F盘下(直接F盘下,不用放到具体某一个文件夹下) 提示:文件在文章顶部&…...

写SQL的心得
1、统计 COUNT(列名) 和COUNT(*)均可,区别是前者只会统计非NULL。 2、where后面不能跟聚合函数,用的话应该在Having使用,因此需要先分组GroupBy where是基于行过滤,having是基于分…...

经典权限五张表功能实现
文章目录 用户模块(未使用框架)查询功能实现步骤代码 新增功能实现步骤代码 修改功能实现步骤代码实现 删除功能实现步骤代码实现 用户模块会了,其他两个模块与其类似 用户模块(未使用框架) 查询功能 这里将模糊查询和分页查询写在一起 实现步骤 前端࿱…...

实验八 Linux虚拟内存 实验9.1:统计系统缺页次数成功案例
运行环境: VMware17.5.1 build-23298084Ubuntu 16.04LTS ubuntu版本下载地址Linux-4.16.10 linux历史版本下载地址虚拟机配置:硬盘一般不少于40G就行 内核版本不同内核文件代码也有出入,版本差异性令c文件要修改,如若要在linux6.7…...

SD-WAN提升Microsoft 365用户体验
随着数字化时代的到来,SaaS应用如Microsoft 365已经成为各类企业的主流选择。在这一趋势下,企业需要以更加灵活、高效的方式使用Microsoft 365,以满足日益增长的业务需求。而传统的网络基础设施可能无法满足这一需求,因此…...

C#中的异步编程模型
在C#中,async和await关键字是用于异步编程的重要部分,它们允许你以同步代码的方式编写异步代码,从而提高应用程序的响应性和吞吐量。这种异步编程模型在I/O密集型操作(如文件读写、网络请求等)中特别有用,因…...

博通Broadcom (VMware VCP)注册约考下载证书操作手册
博通Broadcom(VMware) CertMetrics 注册约考下载证书等操作指导手册(发布日期:2024-5-11) 目录 一、原 Mylearn 账号在新平台的激活… 1 二、在新平台查看并下载证书… 5 三、在新平台注册博通账号… 6 四、在新平台下注册考试… 10 一、原…...

Xilinx FPGA底层逻辑资源简介(1):关于LC,CLB,SLICE,LUT,FF的概念
LC:Logic Cell 逻辑单元 Logic Cell是Xilinx定义的一种标准,用于定义不同系列器件的大小。对于7系列芯片,通常在名字中就已经体现了LC的大小,在UG474中原话为: 对于7a75t芯片,LC的大小为75K,6输…...

SSH(安全外壳协议)简介
一、引言 SSH(Secure Shell)是一种加密的网络传输协议,用于在不安全的网络中提供安全的远程登录和其他安全网络服务。SSH最初由芬兰程序员Tatu Ylnen开发,用于替代不安全的telnet、rlogin和rsh等远程登录协议。通过SSH࿰…...

JavaScript异步编程——08-Promise的链式调用【万字长文,感谢支持】
前言 实际开发中,我们经常需要先后请求多个接口:发送第一次网络请求后,等待请求结果;有结果后,然后发送第二次网络请求,等待请求结果;有结果后,然后发送第三次网络请求。以此类推。…...

现代制造之数控机床篇
现代制造 有现代技术支撑的制造业,即无论是制造还是服务行业,添了现代两个字不过是因为有了现代科学技术的支撑,如发达的通信方式,不断发展的互联网,信息化程度加强了,因此可以为这两个行业增加了不少优势…...

Rust的协程机制:原理与简单示例
在现代编程中,协程(Coroutine)已经成为实现高效并发的重要工具。Rust,作为一种内存安全的系统编程语言,也采用了协程作为其并发模型的一部分。本文将深入探讨Rust协程机制的实现原理,并通过一个简单的示例来…...

学习成长分享-以近红外光谱分析学习为例
随着国家研究生招生规模的扩大,参与或接触光谱分析方向的研究生日益增多,甚至有部分本科生的毕业设计也包含以近红外光谱分析内容。基于对近红外光谱分析的兴趣,从2018年开始在CSDN博客(陆续更新自己学习的浅显认识,到…...

Linux makefile进度条
语法 在依赖方法前面加上就不会显示这一行的命令 注意 1.make 会在当前目录下找名为“makefile” 或者 “Makefile” 的文件 2.为了生成第一依赖文件,如果依赖文件列表有文件不存在,则会到下面的依赖关系中查找 3..PHONY修饰的依赖文件总是被执行的 …...

Ollama 可以设置的环境变量
Ollama 可以设置的环境变量 0. 引言1. Ollama 可以设置的环境变量 0. 引言 在Ollama的世界里,环境变量如同神秘的符文,它们是控制和定制这个强大工具的关键。通过精心设置这些环境变量,我们可以让Ollama更好地适应我们的需求,就像…...

基于Python+Django+MySQL实现Web版的增删改查
Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web。 开发环境 开发工具:Pycharm 2020.1开发语言:Python 3.8.0Web框架:Django 3.0.6数据库:…...

Map、Set和Object的区别
Set ES6提供了新的数据结构Set,类似于数组,但成员值是唯一的,没有重复的值 Set本身是一个构造函数(要 new),用来生成Set数据结构 Set 对象允许你储存任何类型的唯一值,无论是原始值或者是对象引用 每个值在 Set 中…...

Web 安全之盗链(Hotlinking)攻击详解
目录 什么是盗链 盗链原理 盗链类型 盗链的危害 如何发现盗链 盗链防范措施 法律法规与应对策略 小结 盗链(Hotlinking)攻击,作为互联网安全领域的一个重要话题,涉及到侵犯版权、滥用资源和网络安全等多个层面。盗链现象普…...
leetcode算法笔记-算法复杂度
对于时间复杂度,主要包括三种情况: 渐进紧确界: O渐进上界: 渐进下界: 加法原则:不同的时间复杂度相加取阶数最高的 乘法原则:不同的时间复杂度相乘,结果为时间复杂度的乘积 阶乘…...

推荐算法详解
文章目录 推荐算法引言基于内容的推荐原理算法步骤注意点可以优化的地方示例代码讲解 协同过滤推荐原理算法步骤注意点可以优化的地方示例代码讲解 混合推荐系统原理算法步骤注意点可以优化的地方示例1代码讲解1示例2代码讲解2 基于知识的推荐原理算法步骤注意点可以优化的地方…...

Java找不到包解决方案
在跟着教程写Spingboot后端项目时,为了加快效率,有时候有的实体文件可以直接粘贴到目录中,此时运行项目会出现Java找不到包的情况,即无法找到导入的实体文件,这是项目没有更新的原因。解决方法: 刷新Maven:…...

vue的css深度选择器 deep /deep/
作用及概念 当 <style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素,父组件的样式将不会渗透到子组件。在vue中是这样描述的: 处于 scoped 样式中的选择器如果想要做更“深度”的选择,也即:影响到子…...

2024年华为OD机试真题-计算三叉搜索树的高度-(C++)-OD统一考试(C卷D卷)
题目描述: 定义构造三叉搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。 查找的规则是: 1. 如果数小于节点的数减去500,则将数插入节点的左子树 2. 如果数大于节点的数加上500,则将…...

# ERROR: node with name “rabbit“ already running on “MS-ITALIJUXHAMJ“ 解决方案
ERROR: node with name “rabbit” already running on “MS-ITALIJUXHAMJ” 解决方案 一、问题描述: 1、启动 rabbitmq-server.bat 服务时,出错 Error 2、查询 rabbitmqctl status 状态时,出错 Error 3、停止 rabbitmqctl stop 服务时&a…...

class常量池、运行时常量池和字符串常量池详解
类常量池、运行时常量池和字符串常量池这三种常量池,在Java中扮演着不同但又相互关联的角色。理解它们之间的关系,有助于深入理解Java虚拟机(JVM)的内部工作机制,尤其是在类加载、内存分配和字符串处理方面。 类常量池…...

Meilisearch使用过程趟过的坑
Elasticsearch 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求,极快,单文件,超轻量。 所以,对于中小型项目来说…...

全面升级企业网络安全 迈入SASE新时代
随着数字化业务、云计算、物联网和人工智能等技术的飞速发展,企业的业务部署环境日渐多样化,企业数据的存储由传统的数据中心向云端和SaaS迁移。远程移动设备办公模式的普及,企业多分支机构的加速设立,也使得企业业务系统的用户范…...