首页
关于
壁纸
直播
留言
友链
统计
Search
1
《吞食天地1》金手指代码
8,038 阅读
2
白嫖Emby
7,007 阅读
3
Emby客户端IOS破解
6,950 阅读
4
《三国志英杰传》攻略
6,800 阅读
5
破解emby-server
4,598 阅读
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
登录
Search
标签搜索
ubuntu
mysql
openwrt
zerotier
springboot
centos
openvpn
jdk
吞食天地2
synology
spring
idea
windows11
吞食天地1
transmission
google-play
Japanese
xcode
群晖
kiftd
MoonjerX
累计撰写
383
篇文章
累计收到
466
条评论
首页
栏目
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
页面
关于
壁纸
直播
留言
友链
统计
搜索到
383
篇与
moonjerx
的结果
2024-09-11
Ollama本地私有化部署
Ollama 是一个用于在本地或私有环境中部署大型语言模型(LLMs)的工具。本文将详细介绍如何通过一个一键安装脚本在本地环境中部署 Ollama,并集成联网搜索功能。1. 前提条件1.1 系统要求操作系统:Linux(推荐Ubuntu)Docker:必须安装 Docker 和 Docker ComposeGit:用于克隆 Ollama 仓库1.2 硬件要求CPU:至少4核RAM:根据模型大小至少需要8GB RAM,更大的模型可能需要更多硬盘:至少需要50GB的存储空间来保存模型和数据2. 一键安装脚本我们将使用一个一键安装脚本 ollama_install.sh 来自动化整个安装流程。该脚本将自动下载 Ollama 仓库、安装所需依赖、下载模型,并集成联网搜索功能。2.1 一键安装脚本 ollama_install.sh#!/bin/bash # 设置变量 OLLAMA_DIR="$HOME/programs/ollama" SEARCH_PROXY_PATH="$HOME/programs/search_proxy" MODEL_NAME="ollama-base" PORT="8080" # 更新系统包索引 sudo apt-get update # 检查是否已安装Docker if ! command -v docker &> /dev/null; then # 如果未安装,则安装Docker echo "Docker not found, installing..." sudo apt-get install docker.io -y sudo systemctl start docker sudo usermod -aG docker $USER newgrp docker else echo "Docker already installed." fi # 检查是否已安装Docker Compose if ! command -v docker-compose &> /dev/null; then # 如果未安装,则安装Docker Compose echo "Docker Compose not found, installing..." sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose else echo "Docker Compose already installed." fi # 检查是否已安装Python 3 if ! command -v python3 &> /dev/null; then # 如果未安装,则安装Python 3 echo "Python 3 not found, installing..." sudo apt-get install python3 -y else echo "Python 3 already installed." fi # 创建Ollama目录 mkdir -p $OLLAMA_DIR # 克隆Ollama仓库 git clone https://github.com/ollama/ollama.git $OLLAMA_DIR # 切换到Ollama目录 cd $OLLAMA_DIR # 下载默认模型 echo "Downloading default model..." ollama pull $MODEL_NAME # 创建.env文件 echo "MODEL=$MODEL_NAME" > .env echo "PORT=$PORT" >> .env # 创建搜索代理脚本 mkdir -p $SEARCH_PROXY_PATH cat <<EOF > $SEARCH_PROXY_PATH/search_proxy.py import requests import sys def search_web(query): url = f'https://html.duckduckgo.com/html/?q={query}' response = requests.get(url) if response.status_code == 200: return response.text else: return None if __name__ == "__main__": if len(sys.argv) > 1: query = ' '.join(sys.argv[1:]) result = search_web(query) print(result) EOF chmod +x $SEARCH_PROXY_PATH/search_proxy.py # 创建搜索代理的服务文件 cat <<EOF > /etc/systemd/system/search_proxy.service [Unit] Description=Search Proxy Service [Service] User=$USER WorkingDirectory=$SEARCH_PROXY_PATH ExecStart=/usr/bin/env python3 \$PWD/search_proxy.py \${QUERY} Restart=always [Install] WantedBy=multi-user.target EOF # 启动搜索代理服务 sudo systemctl daemon-reload sudo systemctl enable search_proxy.service sudo systemctl start search_proxy.service # 构建并运行Ollama容器 docker-compose up --build & echo "Ollama installation and setup complete. The search proxy is running in the background."2.2 使用方法保存脚本:将上述脚本保存为 ollama_install.sh 文件。赋予执行权限:在终端中运行 chmod +x ollama_install.sh。执行脚本:在终端中运行 sudo ./ollama_install.sh。3. 安装后使用说明3.1 访问 Ollama Web UI脚本执行完成后,Ollama 将会在后台运行。你可以通过 Web 浏览器访问 Ollama 的 Web UI。打开浏览器:使用你喜欢的浏览器。访问地址:输入 http://localhost:8080 或者根据你的实际 IP 地址和端口号输入 http://your_server_ip:8080。3.2 使用联网搜索功能Ollama 现在已经集成了联网搜索功能。当你在 Ollama 的 Web UI 中输入查询时,它将利用 DuckDuckGo API 进行搜索,并显示搜索结果。3.3 日常维护停止服务:如果需要停止 Ollama 服务,可以在终端中运行 docker-compose down。重启服务:如果需要重启 Ollama 服务,可以在终端中运行 docker-compose up --build。查看日志:可以查看 Ollama 的日志文件来诊断问题。日志通常位于 $OLLAMA_DIR/logs 目录下。4. 总结通过上述步骤,你已经成功地在本地环境中部署了 Ollama,并且集成联网搜索功能。Ollama 不仅简化了大型语言模型的部署流程,还提供了高度的灵活性和可扩展性。随着技术的进步,私有化部署将成为越来越多企业和个人的选择。
2024年09月11日
111 阅读
0 评论
0 点赞
2024-09-10
Ubuntu环境中配置JDK环境变量
在Ubuntu系统中配置JDK环境变量是一项常见的任务。本文将指导你如何通过一行命令来设置环境变量,并确保其在系统范围内生效。此外,本文还将解决在配置过程中可能遇到的一些常见问题。前言在开发环境中,正确配置JDK环境变量是非常重要的。本文将展示如何在Ubuntu系统中持久化地设置环境变量,并确保其立即生效。步骤一:确定JDK安装路径首先,确保你知道JDK的安装路径。例如,假设JDK安装在以下路径:/home/$USER/programs/soft/jdk1.8.0_381这里的$USER变量会自动扩展为当前用户的用户名。步骤二:设置环境变量接下来,我们将使用一行命令来设置环境变量,并将其追加到系统的/etc/profile文件中。这将使得环境变量对所有用户都生效。一行命令设置环境变量使用以下命令来设置环境变量,并确保内容在文件中以合适的格式显示:echo -e 'export JAVA_HOME="/home/$USER/programs/soft/jdk1.8.0_381"\nexport PATH="$JAVA_HOME/bin:$PATH"' | sudo tee -a /etc/profile && source /etc/profile命令解析创建环境变量设置:echo -e 'export JAVA_HOME="/home/$USER/programs/soft/jdk1.8.0_381"\nexport PATH="$JAVA_HOME/bin:$PATH"'这条命令创建了一个包含环境变量设置的字符串,并使用\n插入换行符,以确保内容在文件中以合适的格式显示。追加到/etc/profile:| sudo tee -a /etc/profile使用tee命令将上述字符串追加到/etc/profile文件末尾,并使用sudo以管理员权限执行。使更改立即生效:&& source /etc/profile执行source /etc/profile命令使更改立即生效。解决可能的问题在配置过程中,你可能会遇到一些问题。下面列出了一些常见问题及其解决方案。问题1:vim命令不可用如果你尝试使用vim编辑器来编辑/etc/profile文件时遇到以下错误:vim profile Command 'vim' is available in the following places * /bin/vim * /usr/bin/vim The command could not be located because '/bin:/usr/bin' is not included in the PATH environment variable. vim: command not found你可以通过临时添加/bin和/usr/bin到PATH变量来解决这个问题。执行以下命令:export PATH="/bin:/usr/bin:$PATH"然后,你可以使用vim或其他编辑器来编辑/etc/profile:vim /etc/profile或者使用nano编辑器:nano /etc/profile在编辑器中,添加以下行到文件末尾:export JAVA_HOME="/home/$USER/programs/soft/jdk1.8.0_381" export PATH="$JAVA_HOME/bin:$PATH"保存并退出编辑器后,再次使更改立即生效:source /etc/profile验证设置设置完成后,你可以通过以下命令验证环境变量是否已正确设置:echo $JAVA_HOME echo $PATH确保输出的路径符合预期。结语通过以上步骤,你可以轻松地在Ubuntu系统中设置JDK环境变量,并确保其对所有用户都生效。希望这篇文章对你有所帮助!
2024年09月10日
124 阅读
0 评论
0 点赞
2024-09-10
如何在Docker容器中管理服务端口及SSH服务
在使用Docker容器时,了解容器内运行的服务及其占用的端口是非常重要的。本文将指导您如何列出容器内所有服务名称和占用的端口,并检查容器是否运行着OpenSSH服务。1. 列出容器内所有服务名称和占用的端口要找出当前容器内运行的服务及其绑定的端口,可以使用netstat或ss命令。使用netstat命令如果您容器中有安装netstat,可以使用以下命令来查找所有监听的TCP和UDP端口:netstat -tuln命令输出可能类似于:Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:63322 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:888 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN tcp6 0 0 :::63322 :::* LISTEN 使用ss命令如果您的容器使用的是ss命令,可以这样操作:ss -tuln输出看起来与netstat类似。2. 检查容器是否运行着OpenSSH服务要检查容器内是否正在运行OpenSSH服务,可以使用pgrep或者ps命令加上grep来查找。使用pgrep命令如果您有pgrep命令,可以直接这样查询:pgrep sshd如果有ssh服务正在运行,它将返回一个或多个进程ID。如果没有返回任何东西,则意味着没有ssh服务正在运行。使用ps命令结合grep如果没有pgrep,可以使用ps命令结合grep来查找:ps aux | grep sshd这将显示所有包含sshd关键词的进程列表。如果没有任何输出(除了grep自身的进程),则表示没有运行OpenSSH服务。3. 查看具体服务占用端口的情况假设您已经知道某个端口被某个服务占用,但不确定是哪个具体服务,可以使用lsof命令来查找打开文件和IPC节点(例如网络套接字)。lsof -i :端口号例如,要找到占用端口63322的服务,可以这样做:lsof -i :63322这将会显示类似于以下的输出:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 20 root 3u IPv4 29903991 0t0 TCP *:63322 (LISTEN) sshd 20 root 4u IPv6 29903993 0t0 TCP *:63322 (LISTEN) BT-Panel 849 root 16u IPv4 41302087 0t0 TCP localhost:53958->localhost:63322 (ESTABLISHED) sshd 47399 root 3u IPv4 41299442 0t0 TCP localhost:63322->localhost:53958 (ESTABLISHED)这里可以看到sshd进程使用PID 20占用着端口63322,并且有两个监听端口的文件描述符,一个是IPv4,另一个是IPv6。4. 永久禁用IPv6连接如果您希望永久禁用IPv6连接,可以通过修改OpenSSH的配置文件来实现这一点。打开sshd_config文件编辑器:sudo nano /etc/ssh/sshd_config在文件中添加或修改以下行:# ListenAddress :: (这行可以注释掉) ListenAddress 0.0.0.0保存并关闭文件。重启OpenSSH服务使更改生效:sudo systemctl restart ssh结论通过上述步骤,您可以轻松地管理和监控Docker容器内的服务端口及SSH服务的状态。这对于保证系统的安全性和稳定性至关重要。希望本文能够帮助您更好地理解和控制您的容器环境。
2024年09月10日
136 阅读
0 评论
0 点赞
2024-09-06
Shell命令while和IFS
while IFS='=' read -r key value; do case $key in C) C="${C:-$value}" ;; ST) ST="${ST:-$value}" ;; L) L="${L:-$value}" ;; O) O="${O:-$value}" ;; OU) OU="${OU:-$value}" ;; CN) CN="${CN:-$value}" ;; emailAddress) emailAddress="${emailAddress:-$value}" ;; PKCS12Password) PKCS12Password="${PKCS12Password:-$value}" ;; esac done < <(grep -v '^#' "$INFO_FILE" | awk -F '=' '{print $1 $2}' | tr -d '[:space:]')逐行解析IFS='=':IFS (Internal Field Separator) 是 Shell 的一个环境变量,用于定义字段分隔符。设置 IFS='=' 表示将等号 = 作为字段分隔符。read -r key value:read 命令用于从标准输入中读取一行。-r 参数防止 read 命令将反斜杠 \ 解释为转义字符。key value 表示从输入行中读取两个字段,并分别赋值给 key 和 value 变量。case $key in:case 命令用于模式匹配。$key 是从输入行中读取的第一个字段(配置项的键)。;; 用于结束每个模式匹配分支。模式匹配分支:每个 ;; 前面的部分表示一个模式匹配条件。如果 $key 匹配某个模式,则执行对应的命令。"${C:-$value}":${C:-$value} 是 Shell 的参数扩展语法,表示如果 C 已经设置了值,则保留其值;否则使用 $value 的值。这种写法确保即使 $value 为空也不会覆盖已有的非空值。进程替换<(grep -v '^#' "$INFO_FILE" | awk -F '=' '{print $1 $2}' | tr -d '[:space:]'):grep -v '^#' "$INFO_FILE":grep 是一个用于文本模式搜索的工具。-v 参数表示反转选择,即显示不匹配模式的行。'^#' 是一个正则表达式,表示以 # 开头的行。"$INFO_FILE" 表示从 info.txt 文件中读取数据。整个命令的意思是从 info.txt 中过滤掉所有以 # 开头的注释行。awk -F '=' '{print $1 $2}':awk 是一个用于文本处理的工具。-F '=' 设置字段分隔符为等号 =。'{print $1 $2}' 指定输出第一个和第二个字段(即等号两边的内容)。整个命令的意思是从前面过滤出来的行中提取配置项的键和值,并去除等号。tr -d '[:space:]':tr 是一个用于翻译或删除字符的工具。-d 参数表示删除某些字符。'[:space:]' 是一个字符类,表示空白字符(包括空格、制表符等)。整个命令的意思是删除从 awk 输出的行中的所有空白字符。结合起来这段脚本的目的是从 info.txt 文件中读取配置项,并更新相应的变量。具体步骤如下:读取配置项:从 info.txt 文件中读取每一行,并去除注释行。提取每行中的键和值,并去除空白字符。解析配置项:使用 IFS='=' 将每行分割成键和值。使用 read 命令将键和值分别赋值给 key 和 value 变量。更新变量:根据键名更新相应的变量。如果变量已有值,则保留原值;否则使用新读取的值。示例假设 info.txt 文件内容如下:# 国家代码(两个字母) C=US # 省份或州 ST=California # 城市 L=San Francisco O=Nexus OU=IT CN=10.10.12.72 emailAddress=nexus@example.com # PKCS12 文件密码 PKCS12Password=mysecretpassword这段脚本会读取 info.txt 文件中的每一行,去除注释行,并更新相应的变量。最终,变量的值将如下所示:C=US ST=California L=San Francisco O=Nexus OU=IT CN=10.10.12.72 emailAddress=nexus@example.com PKCS12Password=mysecretpassword
2024年09月06日
74 阅读
0 评论
0 点赞
2024-09-05
sed命令
让我们详细解释一下这条 sed 命令:sed -i '' '/^#\?C=/c\C='${C:-$default_C}'' "$INFO_FILE.tmp"这条命令的作用是在 INFO_FILE.tmp 文件中查找匹配特定模式的行,并将其替换为新的值。具体来说:sed -i '':-i 表示就地编辑(in-place editing)。也就是说,sed 命令会直接修改文件内容而不是输出到标准输出。'' 是一个后缀模板,表示在修改文件后不会添加任何后缀到备份文件名中。如果你省略了这个部分,sed 会在修改文件的同时创建一个备份文件,通常是以 .bak 结尾。/^#\?C=/:这是一个正则表达式模式,用于匹配行。/^#\?C=/ 表示匹配以 C= 开始的行,其中 # 是可选的(#\? 表示 # 字符出现零次或一次)。这意味着这条命令将匹配如下两种情况:C=value (没有注释符 # 的行)#C=value (带有注释符 # 的行)c\:c\ 是 sed 命令的一部分,表示替换整个匹配的行。${C:-$default_C}`:如前所述,${C:-$default_C} 提供了一个默认值。如果 C 变量未定义或为空,则使用 default_C 的值;否则使用 C 的值。'$INFO_FILE.tmp':这是指定要编辑的文件名。综上所述,这条命令的完整含义是:如果 INFO_FILE.tmp 文件中存在一条形如 C=value 或者 #C=value 的行,那么将其替换为 C=${C:-$default_C},其中 ${C:-$default_C} 会根据 C 是否有值来决定实际使用的值。因此,这条命令实现了以下功能:如果命令行中有传入 C 参数,那么使用传入的值。如果没有传入 C 参数,但 info.txt 文件中已经有了一个 C 的值,那么保留该值。如果既没有传入 C 参数,info.txt 文件中也没有 C 的值,那么使用默认值 default_C。这种方式确保了在 info.txt 文件中记录的是最新的值,无论是来自命令行还是默认值。让我们详细解释一下 sed 命令中的 s/^#\?C=.*/C='"${C:-$default_C}"'' 部分:sed 命令详解s/.../.../sed 命令中的 s 表示替换命令(substitute)。基本格式是 s/pattern/replacement/flags,其中:pattern 是正则表达式,用来匹配需要替换的文本。replacement 是替换后的文本。flags 是可选标志,比如 g 表示全局替换,i 表示忽略大小写等。s/^#\?C=.*/C='"${C:-$default_C}"'/让我们逐部分来解释这条命令:s/:表示替换命令开始。^#\?C=.*:^ 表示行首。#\? 表示可选的 # 字符。这里的 ? 是一个量词,表示前面的字符(在这里是 #)出现零次或一次。C= 匹配 C= 这个字符串。.* 表示任意数量的字符(. 表示任意字符,* 表示零次或多次)。总结起来,^#\?C=.* 匹配行首的 C= 或者带注释符 #C= 的行。/C='"${C:-$default_C}"':C=' 表示替换后的文本以 C= 开头。${C:-$default_C} 是一个 shell 展开语法,表示如果 C 变量已设置且非空,则使用 C 的值;否则使用 $default_C 的值。' 用于关闭单引号内的字符串。完整解释这条 sed 命令的作用是:查找 info.txt 文件中形如 C=value 或 #C=value 的行。将找到的行替换为 C=${C:-$default_C},其中 ${C:-$default_C} 会根据 C 变量是否有值来决定实际使用的值。示例假设 C 变量在命令行中被设置为 US,则 ${C:-$default_C} 展开为 US。如果 C 变量没有被设置,那么它会展开为默认值 $default_C,假设默认值是 CN。完整的 sed 命令在脚本中,完整的 sed 命令如下:sed -i '' -e 's/^#\?C=.*/C='"${C:-$default_C}"'' \ -e 's/^#\?ST=.*/ST='"${ST:-$default_ST}"'' \ -e 's/^#\?L=.*/L='"${L:-$default_L}"'' \ -e 's/^#\?O=.*/O='"${O:-$default_O}"'' \ -e 's/^#\?OU=.*/OU='"${OU:-$default_OU}"'' \ -e 's/^#\?CN=.*/CN='"${CN:-$default_CN}"'' \ -e 's/^#\?emailAddress=.*/emailAddress='"${emailAddress:-$default_emailAddress}"'' \ -e 's/^#\?PKCS12Password=.*/PKCS12Password='"${PKCS12Password:-$default_PKCS12Password}"'' "$INFO_FILE.tmp"每一条 sed 命令都遵循类似的模式,只是替换的目标和值不同。调试建议如果您仍然遇到 sed 命令的错误,请检查以下几点:命令行参数:确保所有命令行参数正确传递,并且变量赋值正确。sed 命令的格式:确保每条命令都正确结束,并且命令之间用分号分隔。文件内容:检查 info.txt 文件中的内容是否符合预期。如果您可以提供更多调试信息或具体的 info.txt 文件内容,可以帮助进一步排查问题。
2024年09月05日
92 阅读
0 评论
0 点赞
1
...
5
6
7
...
77
您的IP: