<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh_CN">
  <title>XiaoMai</title>
  <subtitle>博客</subtitle>
  <link href="https://xiaomai.bot.cd/" rel="alternate" type="text/html"/>
  <link href="https://xiaomai.bot.cd/atom.xml" rel="self" type="application/atom+xml"/>
  <id>https://xiaomai.bot.cd/</id>
  <updated>2026-09-08T00:00:00.000Z</updated>
  <entry>
    <title>JumpServer部署教程</title>
    <link href="https://xiaomai.bot.cd/posts/jumpserver/" rel="alternate" type="text/html"/>
    <id>https://xiaomai.bot.cd/posts/jumpserver/</id>
    <published>2026-09-08T00:00:00.000Z</published>
    <updated>2026-09-08T00:00:00.000Z</updated>
    <summary>JumpServer是一款开源堡垒机，是符合 4A 规范的专业运维安全审计系统。JumpServer 帮助企业以更安全的方式管控和登录所有类型的资产，实现事前授权、事中监察、事后审计，满足等保合规要求。</summary>
    <content type="html"><![CDATA[<p>在一台服务器上部署 JumpServer 集群模式，主要通过 Docker 容器模拟多节点环境。以下是详细步骤：</p>
<h2>1. 环境准备</h2>
<h3>1.1 系统要求</h3>
<ul>
<li>Rocky Linux 9.5</li>
<li>最小配置：8核CPU，16GB内存，200GB硬盘</li>
<li>开放端口：80, 2222, 3306, 6379, 5000</li>
</ul>
<h3>1.2 安装必要软件</h3>
<p>bash</p>
<pre><code># 更新系统
dnf update -y
#自动安装 vim（编辑器）、wget/curl（网络工具）、net-tools（网络管理）、epel-release（扩展软件源）、git（版本控制）
dnf install -y vim wget curl net-tools epel-release git

# 安装 Docker
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io

# 启动 Docker
systemctl enable docker
systemctl start docker

# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#安装 Docker Compose国内源
sudo curl -L "https://mirrors.aliyun.com/docker-toolbox/linux/compose/2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#赋予执行权限
chmod +x /usr/local/bin/docker-compose

# 验证安装
docker --version
docker-compose --version
</code></pre>
<h3>1.3 关闭 SELinux 和防火墙</h3>
<p>bash</p>
<pre><code># 临时关闭 SELinux
setenforce 0

# 永久关闭 SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 配置防火墙（开放必要端口）
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=6379/tcp
firewall-cmd --permanent --add-port=5000/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
</code></pre>
<h2>2. 创建集群部署目录结构</h2>
<p>bash</p>
<pre><code># 创建主目录
mkdir -p /opt/jumpserver-cluster
cd /opt/jumpserver-cluster

# 创建子目录结构
mkdir -p {core,web1,web2,lb}/{config,data,logs}
mkdir -p shared/{media,tmp,static}
</code></pre>
<h2>3. 部署核心服务</h2>
<h3>3.1 创建核心服务 docker-compose.yml</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/core/docker-compose.yml &lt;&lt; 'EOF'
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: jms_mysql
    environment:
      MYSQL_ROOT_PASSWORD: JumpServer123
      MYSQL_DATABASE: jumpserver
      MYSQL_USER: jumpserver
      MYSQL_PASSWORD: JumpServer123
    volumes:
      - ../shared/mysql:/var/lib/mysql
      - ./config/mysql.cnf:/etc/mysql/conf.d/custom.cnf
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --innodb_buffer_pool_size=1G
    restart: unless-stopped
    networks:
      - jumpserver-net

  redis:
    image: redis:7.0-alpine
    container_name: jms_redis
    command: redis-server --requirepass JumpServer123 --maxmemory 512mb --maxmemory-policy allkeys-lru
    volumes:
      - ../shared/redis:/data
    restart: unless-stopped
    networks:
      - jumpserver-net

  core:
    image: jumpserver/jms_core:${VERSION}
    container_name: jms_core
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_NAME=jumpserver
      - DB_USER=jumpserver
      - DB_PASSWORD=JumpServer123
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - REDIS_PASSWORD=JumpServer123
      - SECRET_KEY=${SECRET_KEY}
      - BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
      - LOG_LEVEL=INFO
      - SESSION_COOKIE_DOMAIN=.jumpserver.local
    volumes:
      - ../shared/media:/opt/jumpserver/data/media
      - ../shared/static:/opt/jumpserver/data/static
      - ../shared/tmp:/opt/jumpserver/data/tmp
      - ./logs/core:/opt/jumpserver/logs
    depends_on:
      - mysql
      - redis
    restart: unless-stopped
    networks:
      - jumpserver-net

networks:
  jumpserver-net:
    driver: bridge
    name: jumpserver-core-net
EOF
</code></pre>
<h3>3.2 创建核心服务环境变量文件</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/core/.env &lt;&lt; 'EOF'
VERSION=v3.10.5
SECRET_KEY=your-super-secret-key-change-in-production-123456
BOOTSTRAP_TOKEN=your-bootstrap-token-change-this-789
EOF
</code></pre>
<h3>3.3 生成安全的密钥</h3>
<p>bash</p>
<pre><code>cd /opt/jumpserver-cluster/core

# 生成随机密钥
export SECRET_KEY=$(openssl rand -base64 48)
export BOOTSTRAP_TOKEN=$(openssl rand -base64 24)

# 更新环境变量文件
sed -i "s/your-super-secret-key-change-in-production-123456/${SECRET_KEY}/" .env
sed -i "s/your-bootstrap-token-change-this-789/${BOOTSTRAP_TOKEN}/" .env

echo "生成的密钥:"
echo "SECRET_KEY: ${SECRET_KEY}"
echo "BOOTSTRAP_TOKEN: ${BOOTSTRAP_TOKEN}"
</code></pre>
<h2>4. 部署 Web 节点 1</h2>
<h3>4.1 创建 Web1 docker-compose.yml</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/web1/docker-compose.yml &lt;&lt; 'EOF'
version: '3.8'

services:
  web:
    image: jumpserver/jms_web:${VERSION}
    container_name: jms_web1
    environment:
      - CORE_HOST=core
      - BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
      - SESSION_COOKIE_DOMAIN=.jumpserver.local
    volumes:
      - ../shared/media:/opt/jumpserver/data/media
      - ../shared/static:/opt/jumpserver/data/static
      - ../shared/tmp:/opt/jumpserver/data/tmp
      - ./logs/web:/opt/jumpserver/logs
    ports:
      - "8081:80"
    depends_on:
      - core
    restart: unless-stopped
    networks:
      - jumpserver-net

  koko:
    image: jumpserver/jms_koko:${VERSION}
    container_name: jms_koko1
    environment:
      - CORE_HOST=core
      - BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
      - LOG_LEVEL=INFO
    volumes:
      - ../shared/tmp:/opt/jumpserver/data/tmp
      - ./logs/koko:/opt/koko/logs
    ports:
      - "22221:2222"
    depends_on:
      - core
    restart: unless-stopped
    networks:
      - jumpserver-net

networks:
  jumpserver-net:
    external: true
    name: jumpserver-core-net
EOF
</code></pre>
<h3>4.2 创建 Web1 环境变量</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/web1/.env &lt;&lt; EOF
VERSION=v3.10.5
BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
EOF
</code></pre>
<h2>5. 部署 Web 节点 2</h2>
<h3>5.1 创建 Web2 docker-compose.yml</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/web2/docker-compose.yml &lt;&lt; 'EOF'
version: '3.8'

services:
  web:
    image: jumpserver/jms_web:${VERSION}
    container_name: jms_web2
    environment:
      - CORE_HOST=core
      - BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
      - SESSION_COOKIE_DOMAIN=.jumpserver.local
    volumes:
      - ../shared/media:/opt/jumpserver/data/media
      - ../shared/static:/opt/jumpserver/data/static
      - ../shared/tmp:/opt/jumpserver/data/tmp
      - ./logs/web:/opt/jumpserver/logs
    ports:
      - "8082:80"
    depends_on:
      - core
    restart: unless-stopped
    networks:
      - jumpserver-net

  koko:
    image: jumpserver/jms_koko:${VERSION}
    container_name: jms_koko2
    environment:
      - CORE_HOST=core
      - BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
      - LOG_LEVEL=INFO
    volumes:
      - ../shared/tmp:/opt/jumpserver/data/tmp
      - ./logs/koko:/opt/koko/logs
    ports:
      - "22222:2222"
    depends_on:
      - core
    restart: unless-stopped
    networks:
      - jumpserver-net

networks:
  jumpserver-net:
    external: true
    name: jumpserver-core-net
EOF
</code></pre>
<h3>5.2 创建 Web2 环境变量</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/web2/.env &lt;&lt; EOF
VERSION=v3.10.5
BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN}
EOF
</code></pre>
<h2>6. 部署负载均衡器</h2>
<h3>6.1 创建 Nginx 配置</h3>
<p>bash</p>
<pre><code>mkdir -p /opt/jumpserver-cluster/lb/conf.d

cat &gt; /opt/jumpserver-cluster/lb/nginx.conf &lt;&lt; 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 上游服务器配置
    upstream jumpserver_web {
        least_conn;
        server web1:80 weight=1 max_fails=3 fail_timeout=30s;
        server web2:80 weight=1 max_fails=3 fail_timeout=30s;
    }

    upstream jumpserver_koko {
        least_conn;
        server web1:2222 weight=1 max_fails=3 fail_timeout=30s;
        server web2:2222 weight=1 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;
        server_name _;

        client_max_body_size 5000m;

        # 静态文件
        location /static/ {
            alias /opt/jumpserver/data/static/;
            expires 30d;
            add_header Cache-Control "public";
        }

        location /media/ {
            alias /opt/jumpserver/data/media/;
            expires 30d;
            add_header Cache-Control "public";
        }

        # Web 服务
        location / {
            proxy_pass http://jumpserver_web;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_buffering off;
            proxy_request_buffering off;
        }

        # WebSocket 支持
        location /ws/ {
            proxy_pass http://jumpserver_web;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    # Koko SSH 服务
    server {
        listen 2222;
        server_name _;

        location / {
            proxy_pass http://jumpserver_koko;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_http_version 1.1;
            proxy_buffering off;
        }
    }
}
EOF
</code></pre>
<h3>6.2 创建负载均衡器 docker-compose.yml</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/lb/docker-compose.yml &lt;&lt; 'EOF'
version: '3.8'

services:
  nginx:
    image: nginx:1.24-alpine
    container_name: jms_lb
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ../shared/static:/opt/jumpserver/data/static
      - ../shared/media:/opt/jumpserver/data/media
      - ./logs/nginx:/var/log/nginx
    ports:
      - "80:80"
      - "2222:2222"
    depends_on:
      - web1
      - web2
    restart: unless-stopped
    networks:
      - jumpserver-net

networks:
  jumpserver-net:
    external: true
    name: jumpserver-core-net
EOF
</code></pre>
<h2>7. 修改主机 hosts 文件</h2>
<p>bash</p>
<pre><code># 添加本地域名解析
echo "127.0.0.1 web1 web2 core mysql redis" &gt;&gt; /etc/hosts
</code></pre>
<h2>8. 启动 JumpServer 集群</h2>
<h3>8.1 启动核心服务</h3>
<p>bash</p>
<pre><code>cd /opt/jumpserver-cluster/core
docker-compose up -d mysql redis

# 等待数据库启动
sleep 30

# 启动核心服务
docker-compose up -d core

# 等待核心服务初始化
sleep 60
</code></pre>
<h3>8.2 初始化数据库</h3>
<p>bash</p>
<pre><code># 进入核心容器执行初始化
docker exec -it jms_core bash -c "cd /opt/jumpserver &amp;&amp; ./jms upgrade"

# 重启核心服务
docker-compose restart core
</code></pre>
<h3>8.3 启动 Web 节点</h3>
<p>bash</p>
<pre><code># 启动 Web1
cd /opt/jumpserver-cluster/web1
docker-compose up -d

# 启动 Web2
cd /opt/jumpserver-cluster/web2
docker-compose up -d
</code></pre>
<h3>8.4 启动负载均衡器</h3>
<p>bash</p>
<pre><code>cd /opt/jumpserver-cluster/lb
docker-compose up -d
</code></pre>
<h2>9. 验证部署</h2>
<h3>9.1 检查服务状态</h3>
<p>bash</p>
<pre><code># 检查所有容器状态
docker ps

# 检查网络
docker network ls

# 检查端口监听
netstat -tlnp | grep -E ':(80|2222|8081|8082)'

# 查看服务日志
docker logs jms_core
docker logs jms_web1
docker logs jms_web2
</code></pre>
<h3>9.2 测试负载均衡</h3>
<p>bash</p>
<pre><code># 测试 Web 服务
curl -I http://localhost
curl -I http://localhost:8081
curl -I http://localhost:8082

# 测试 SSH 服务
telnet localhost 2222
</code></pre>
<h3>9.3 访问 JumpServer</h3>
<p>text</p>
<pre><code>访问地址: http://服务器IP
默认账号: admin
默认密码: admin
</code></pre>
<h2>10. 创建管理脚本</h2>
<h3>10.1 创建启动脚本</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/start-cluster.sh &lt;&lt; 'EOF'
#!/bin/bash
echo "正在启动 JumpServer 集群..."

cd /opt/jumpserver-cluster/core
docker-compose up -d mysql redis
sleep 30
docker-compose up -d core
sleep 60

cd /opt/jumpserver-cluster/web1
docker-compose up -d

cd /opt/jumpserver-cluster/web2
docker-compose up -d

cd /opt/jumpserver-cluster/lb
docker-compose up -d

echo "JumpServer 集群启动完成"
echo "Web 访问地址: http://$(hostname -I | awk '{print $1}')"
echo "SSH 访问地址: $(hostname -I | awk '{print $1}'):2222"
EOF

chmod +x /opt/jumpserver-cluster/start-cluster.sh
</code></pre>
<h3>10.2 创建停止脚本</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/stop-cluster.sh &lt;&lt; 'EOF'
#!/bin/bash
echo "正在停止 JumpServer 集群..."

cd /opt/jumpserver-cluster/lb &amp;&amp; docker-compose down
cd /opt/jumpserver-cluster/web2 &amp;&amp; docker-compose down
cd /opt/jumpserver-cluster/web1 &amp;&amp; docker-compose down
cd /opt/jumpserver-cluster/core &amp;&amp; docker-compose down

echo "JumpServer 集群已停止"
EOF

chmod +x /opt/jumpserver-cluster/stop-cluster.sh
</code></pre>
<h3>10.3 创建状态检查脚本</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/status-cluster.sh &lt;&lt; 'EOF'
#!/bin/bash
echo "=== JumpServer 集群状态 ==="
echo "核心服务:"
docker ps | grep jms_core
docker ps | grep jms_mysql
docker ps | grep jms_redis

echo -e "\nWeb 节点:"
docker ps | grep jms_web
docker ps | grep jms_koko

echo -e "\n负载均衡:"
docker ps | grep jms_lb

echo -e "\n网络信息:"
docker network ls | grep jumpserver

echo -e "\n服务端口:"
netstat -tlnp | grep -E ':(80|2222)' | grep LISTEN
EOF

chmod +x /opt/jumpserver-cluster/status-cluster.sh
</code></pre>
<h2>11. 备份和监控</h2>
<h3>11.1 创建备份脚本</h3>
<p>bash</p>
<pre><code>cat &gt; /opt/jumpserver-cluster/backup.sh &lt;&lt; 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/jumpserver-cluster/backup"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

echo "开始备份 JumpServer 集群数据..."

# 备份数据库
docker exec jms_mysql mysqldump -u root -pJumpServer123 jumpserver &gt; $BACKUP_DIR/jumpserver_db_$DATE.sql

# 备份共享数据
tar -czf $BACKUP_DIR/jumpserver_shared_$DATE.tar.gz -C /opt/jumpserver-cluster shared

# 备份配置文件
tar -czf $BACKUP_DIR/jumpserver_config_$DATE.tar.gz -C /opt/jumpserver-cluster core/web1 web2 lb

# 保留最近7天备份
find $BACKUP_DIR -type f -mtime +7 -delete

echo "备份完成: $BACKUP_DIR"
EOF

chmod +x /opt/jumpserver-cluster/backup.sh
</code></pre>
<h2>12. 故障排查</h2>
<h3>12.1 常见问题解决</h3>
<p>bash</p>
<pre><code># 查看特定服务日志
docker logs jms_core -f
docker logs jms_web1 -f
docker logs jms_lb -f

# 检查网络连通性
docker exec jms_web1 ping core
docker exec jms_web2 ping core

# 重启单个服务
cd /opt/jumpserver-cluster/core &amp;&amp; docker-compose restart core
</code></pre>
<h3>12.2 性能监控</h3>
<p>bash</p>
<pre><code># 监控 Docker 资源使用
docker stats

# 查看系统资源
htop
df -h
free -h
</code></pre>
<p>这个单机集群部署方案提供了完整的 JumpServer 高可用环境，所有服务都运行在 Docker 容器中，通过负载均衡实现流量分发。您可以根据实际需求调整资源配置和副本数量。</p>
<p>192.168.61.129:15839/da22dd7e48</p>
<p>面板用户:  31a2957b90
面板密码:  94459e27fc</p>
]]></content>
    <author><name>XiaoMai</name></author>
    <category term="教程"/>
  </entry>
  <entry>
    <title>Openlist部署教程</title>
    <link href="https://xiaomai.bot.cd/posts/openlist/" rel="alternate" type="text/html"/>
    <id>https://xiaomai.bot.cd/posts/openlist/</id>
    <published>2026-09-08T00:00:00.000Z</published>
    <updated>2026-09-08T00:00:00.000Z</updated>
    <summary>OpenList 是一款基于 AList 的开源文件列表和网盘聚合管理工具，支持多种存储服务并可自建私有云。</summary>
    <content type="html"><![CDATA[<p>前置操作</p>
<pre><code>#放行openlist端口5244
firewall-cmd --add-port=5244/tcp --permanent
#重启防火墙
firewall-cmd --reload
#查看防火墙放行端口
firewall-cmd --list-ports
#查看完整全部规则（端口 + 服务 + 网卡信息，排查首选）
firewall-cmd --list-all
</code></pre>
<h3><strong>1.手动安装</strong></h3>
<p>官网：<a href="https://github.com/OpenListTeam/OpenList/releases">Openlist</a></p>
<h4><strong>1.1下载Openlist</strong></h4>
<pre><code>#使用curl下载Openlist
curl -L -O https://github.com/OpenListTeam/OpenList/releases/download/v4.2.5/openlist-linux-musl-amd64.tar.gz

#curl下载失败试试wget
wget https://github.com/OpenListTeam/OpenList/releases/download/v4.2.5/openlist-linux-musl-amd64.tar.gz
</code></pre>
<h4><strong>1.2解压和安装</strong></h4>
<pre><code>#解压下载的文件
tar -zxvf openlist-linux-musl-amd64.tar.gz

#给予特殊执行权限
chmod +x openlist

#将程序移动到系统目录
mv openlist /usr/bin/

#创建数据目录
mkdir -p /etc/openlist
</code></pre>
<h4><strong>1.3测试运行并获取密码</strong></h4>
<pre><code># 直接运行OpenList
openlist server --data /etc/openlist

配置文件：/etc/openlist/config.json

运行后你会看到类似这样的输出：
INFO[2026-08-21 13:40:35] reading config file: /usr/bin/data/config.json
INFO[2026-08-21 13:40:35] config file not exists, creating default config file
INFO[2026-08-21 13:40:35] load config from env with prefix: OPENLIST_
INFO[2026-08-21 13:40:35] total memory: 7904MB, available: 7336MB
INFO[2026-08-21 13:40:35] min free memory: 790MB
INFO[2026-08-21 13:40:35] max block limit: 64MB
INFO[2026-08-21 13:40:35] auto memory limit: 4MB
INFO[2026-08-21 13:40:35] init logrus...
#密码
Successfully created the admin user and the initial password is: kZGfUg3l
start HTTP server @ 0.0.0.0:5244
</code></pre>
<h4><strong>1.4创建系统服务(Openlist后台运行)</strong></h4>
<pre><code>#创建服务配置文件
vi /etc/systemd/system/openlist.service

</code></pre>
<p>在文件中输入以下内容</p>
<pre><code>[Unit]
Description=OpenList service
Wants=network.target
After=network.target network.service

[Service]
Type=simple
WorkingDirectory=/etc/openlist
ExecStart=/etc/openlist server
KillMode=process

[Install]
WantedBy=multi-user.target

</code></pre>
<p>启动并启用服务</p>
<pre><code># 重新加载systemd配置
systemctl daemon-reload
 
# 设置开机自启
systemctl enable openlist
 
# 立即启动服务
systemctl start openlist
 
# 检查服务状态
systemctl status openlist

● openlist.service - OpenList Service
     Loaded: loaded (/etc/systemd/system/openlist.service; enabled; preset: disabled)
     Active: active (running) since Fri 2026-08-21 09:35:18 CST; 4h 23min ago
   Main PID: 3004 (openlist)
      Tasks: 9 (limit: 50296)
     Memory: 26.8M (peak: 28.8M)
        CPU: 640ms
     CGroup: /system.slice/openlist.service
             └─3004 /usr/bin/openlist server --data /etc/openlist

8月 21 09:35:18 test systemd[1]: Started OpenList Service.
8月 21 09:35:18 test openlist[3004]: INFO[2026-08-21 09:35:18] reading config file: /etc/openlist/config.json
8月 21 09:35:18 test openlist[3004]: INFO[2026-08-21 09:35:18] load config from env with prefix: OPENLIST_
8月 21 09:35:18 test openlist[3004]: INFO[2026-08-21 09:35:18] total memory: 7904MB, available: 7363MB
8月 21 09:35:18 test openlist[3004]: INFO[2026-08-21 09:35:18] min free memory: 790MB
8月 21 09:35:18 test openlist[3004]: INFO[2026-08-21 09:35:18] max block limit: 64MB
8月 21 09:35:18 test openlist[3004]: INFO[2026-08-21 09:35:18] auto memory limit: 4MB
8月 21 09:35:18 test openlist[3004]: INFO[2026-08-21 09:35:18] init logrus...
8月 21 09:35:18 test openlist[3004]: start HTTP server @ 0.0.0.0:5244

如果状态显示"active (running)"，说明服务启动成功

</code></pre>
<p>如果查看状态出现</p>
<pre><code>systemctl status openlist

● openlist.service - OpenList Service
     Loaded: loaded (/etc/systemd/system/openlist.service; enabled; preset: disabled)
     Active: activating (auto-restart) (Result: exit-code) since Fri 2026-08-21 09:31:02 CST; 1s ago
    Process: 1437 ExecStart=/usr/bin/openlist server --data /etc/openlist (code=exited, status=203/EXEC)
   Main PID: 1437 (code=exited, status=203/EXEC)
        CPU: 665us

解决办法：
	1.临时关闭SELinux
		setenforce 0
	2.恢复默认文件标签
		restorecon -v /usr/bin/openlist
	该命令会根据 /etc/selinux/targeted/contexts/files/file_contexts 中的规则恢复默认标签

</code></pre>
<h4><strong>1.5访问Openlist</strong></h4>
<ol>
<li>浏览器访问：http://服务器地址:5244</li>
<li>用户名：admin</li>
<li>密码：第三步中获取的初始密码</li>
<li>登录后立即修改密码</li>
</ol>
<h3><strong>2、一键脚本安装</strong></h3>
<pre><code>curl -fsSL https://res.oplist.org/script/v4.sh &gt; install-openlist-v4.sh &amp;&amp; sudo bash install-openlist-v4.sh
</code></pre>
<pre><code>欢迎使用 OpenList 管理脚本

基础功能：
1、安装 OpenList
2、更新 OpenList
3、卸载 OpenList
-------------------
服务管理：
4、查看状态
5、密码管理
6、启动 OpenList
7、停止 OpenList
8、重启 OpenList
-------------------
配置管理：
9、备份配置
10、恢复配置
-------------------
高级选项：
11、Docker 管理
12、定时更新
13、系统状态
14、关于
-------------------
0、退出脚本

请输入选项 [0-14]: 1
检查系统空间...
安装目录准备就绪：/opt/openlist
是否使用 GitHub 代理？（默认无代理）
代理地址必须为 https 开头，斜杠 / 结尾
例如：https://ghproxy.net/
请输入代理地址或直接按 Enter 继续:
使用默认 GitHub 地址进行下载

下载 OpenList ...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  2 46.6M    2 1317k    0     0  56936      0  0:14:19  0:00:23  0:13:56 28794

</code></pre>
<pre><code>┌────────────────────────────────────────────────────┐
│ OpenList 安装成功！                           │
│                                                    │
│ 版本信息：v4.2.5                              │
│                                                    │
│ 访问地址：                                    │
│   局域网：http://XXX.XXX.XXX.XXX:5244/         │
│   公网：  http://XXX.XXX.XXX.XXX:5244/           │
│ 配置文件：/opt/openlist/data/config.json      │
│                                                    │
│ 账号信息：                                    │
│ 默认账号：admin                               │
│ 初始密码：r4tUrEAl                            │
└────────────────────────────────────────────────────┘
命令行工具安装成功！

现在你可以使用以下命令：
1. openlist          - 快捷命令
2. openlist-manager  - 完整命令

启动服务中...
管理: 在任意目录输入 openlist 打开管理菜单

温馨提示：如果端口无法访问，请检查服务器安全组、防火墙和服务状态

</code></pre>
<h3><strong>3、使用docker安装</strong></h3>
<h4><strong>3.1安装docker(安装过docker可跳过)</strong></h4>
<p><strong>3.1.1卸载旧版本(可选，干净系统可跳过)</strong></p>
<pre><code>dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
</code></pre>
<p><strong>3.1.2安装依赖工具</strong></p>
<pre><code>dnf install -y dnf-plugins-core
</code></pre>
<p><strong>3.1.3添加docker软件源</strong></p>
<pre><code>#添加仓库
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 替换源地址为阿里云
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

#更新 dnf 软件源的本地缓存
dnf makecache
</code></pre>
<p><strong>3.1.4安装 Docker 全套（包含 docker‑compose 插件）</strong></p>
<pre><code>dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
</code></pre>
<p><strong>3.1.5启动服务&amp;设置开机自启</strong></p>
<pre><code># 启动docker
sudo systemctl start docker

# 设置开机自启
sudo systemctl enable docker

# 查看状态
sudo systemctl status docker
</code></pre>
<p><strong>3.1.6验证安装</strong></p>
<pre><code># 查看 docker 版本

docker --version


#显示 docker 版本号
Docker version 29.7.2, build a7dcaa6


#查看 docker compose 版本
docker compose version

#显示 docker compose 版本号
Docker Compose version v5.5.0


</code></pre>
<p><strong>3.1.7配置国内镜像加速(解决拉镜像慢)</strong></p>
<p>&lt;span style="background-color:rgb(255,255,255);color:rgb(51,51,51);"&gt;编辑 <code>/etc/docker/daemon.json</code>&lt;/span&gt;</p>
<pre><code>#在etc目录下创建docker目录
mkdir -p /etc/docker


#将加速源写入daemon.json文件
tee /etc/docker/daemon.json &lt;&lt;-'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1ms.run"
  ],
  "log-driver":"json-file",
  "log-opts":{"max-size":"100m","max-file":"3"}
}
EOF
</code></pre>
<p>重载并重启 docker 生效：</p>
<pre><code># 重新加载systemd配置
systemctl daemon-reload

# 重启docker
systemctl restart docker
</code></pre>
<p>校验加速是否生效：</p>
<pre><code># 查看 Docker 系统全局信息
docker info
#输出内容往下看 Registry Mirrors 能看到上面配置的地址即成功
Client: Docker Engine - Community
 Version:    29.7.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.36.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v5.5.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 29.7.2
 Storage Driver: overlayfs
  driver-type: io.containerd.snapshotter.v1
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 CDI spec directories:
  /etc/cdi
  /var/run/cdi
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: aad11006b869517fcd3009450b6f82da282e1a9b
 runc version: v1.4.3-0-gbb14dabe
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.14.0-687.10.1.el9_8.0.1.x86_64
 Operating System: Rocky Linux 9.8 (Blue Onyx)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.72GiB
 Name: test
 ID: a4e9e10f-f157-4f20-9507-d4010ff321fd
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  ::1/128
  127.0.0.0/8
 Registry Mirrors:
  https://docker.m.daocloud.io/
  https://docker.1ms.run/
 Live Restore Enabled: false
 Firewall Backend: iptables+firewalld
  EnableUserlandProxy: true
  UserlandProxyPath: /usr/bin/docker-proxy

</code></pre>
<p><strong>3.1.8免 sudo 执行 docker（可选，普通用户）</strong></p>
<p>把你的用户加入 docker 组，不用每次敲 sudo</p>
<pre><code>sudo usermod -aG docker $USER
</code></pre>
<blockquote>
<p>[!WARNING]
 <strong>需要重新登录 SSH 会话才生效</strong></p>
</blockquote>
<p><strong>3.1.9常用命令速查</strong></p>
<pre><code># 查看运行容器
docker ps
# 查看全部容器
docker ps -a
# 本地镜像列表
docker images
# 后台启动compose项目
docker compose up -d
# 停止删除compose容器
docker compose down
#停止docker容器
docker stop 容器名或容器id
#删除docker容器
docker rm 容器名或容器id
</code></pre>
<h4><strong>3.2使用docker安装openlist</strong></h4>
<p>&lt;span style="background-color:rgb(255,255,255);color:rgb(0,0,0);"&gt;安装好 Docker 后，执行以下命令：&lt;/span&gt;</p>
<blockquote>
<p>[!CAUTION]
&lt;span style="color:rgb(60,60,67);"&gt;请注意：&lt;/span&gt;&lt;span style="background-color:hsl(0,0%,90%);"&gt;<code>/etc/openlist</code>&lt;/span&gt; &lt;span style="color:rgb(60,60,67);"&gt;仅为默认映射的目录，您可以根据需要修改为其他目录。&lt;/span&gt;</p>
</blockquote>
<blockquote>
<p>[!TIP]
&lt;span style="color:rgb(60,60,67);"&gt;如果您希望使用当前用户运行和管理 OpenList 及其配置目录，请使用以下命令：&lt;/span&gt;</p>
</blockquote>
<pre><code>#在etc目录下创建openlist目录
mkdir -p /etc/openlist

#拉取openlist镜像并运行
docker run --user $(id -u):$(id -g) -d --restart=unless-stopped -v /etc/openlist:/opt/openlist/data -p 5244:5244 -e UMASK=022 --name="openlist" openlistteam/openlist:latest
</code></pre>
<blockquote>
<p>[!TIP]
&lt;span style="color:rgb(60,60,67);"&gt;如果您希望使用 1001，即容器内置的默认&lt;/span&gt; &lt;span style="background-color:hsl(0,0%,90%);"&gt;<code>openlist</code>&lt;/span&gt; &lt;span style="color:rgb(60,60,67);"&gt;用户运行和管理 OpenList 及其配置目录，请使用以下命令：&lt;/span&gt;</p>
</blockquote>
<pre><code>chown -R 1001:1001 /etc/openlist

docker run -d --restart=unless-stopped -v /etc/openlist:/opt/openlist/data -p 5244:5244 -e UMASK=022 --name="openlist" openlistteam/openlist:latest
</code></pre>
<p>首次运行</p>
<pre><code>docker logs openlist
</code></pre>
<p>你将在日志中看到密码</p>
<pre><code>Successfully created the admin user and the initial password is: 6zlCeP5E
</code></pre>
<h4><strong>3.3使用docker compose安装</strong></h4>
<p>创建 <code>docker-compose.yml</code> 文件。</p>
<pre><code>mkdir -p /opt/openlist
cd /opt/openlist
vim docker-compose.yml
</code></pre>
<p>写入以下内容，然后保存并退出：</p>
<pre><code># docker-compose.yml
services:
  openlist:
    image: 'openlistteam/openlist:latest'
    container_name: openlist
    user: '0:0' # Please replace `0:0` with the actual user ID and group ID you want to use to run OpenList.
    volumes:
      - './data:/opt/openlist/data'
    ports:
      - '5244:5244'
    environment:
      - UMASK=022
    restart: unless-stopped
</code></pre>
<h4><strong>3.4使用docker compose 一键部署Openlist+Meilisearch索引</strong></h4>
<p>为meilisearch生成密钥</p>
<pre><code>openssl rand -hex 16
</code></pre>
<p>使用docker compose部署</p>
<pre><code>services:
  openlist:
    image: 'openlistteam/openlist:latest'
    container_name: openlist
    user: '0:0' # Please replace `0:0` with the actual user ID and group ID you want to use to run OpenList.
    volumes:
      - './data:/opt/openlist/data'
    ports:
      - '5244:5244'
    environment:
      - UMASK=022
    networks:
      - openlist
    restart: unless-stopped
    
  meilisearch:
    image: getmeili/meilisearch:v1.53
    container_name: meilisearch
    ports:
      - '7700:7700'
    volumes:
      - /tmp/data/Docker/meilisearch/meili_data:/meili_data
    command: meilisearch --schedule-snapshot --snapshot-dir /meili_data/snapshots
    environment:
      - MEILI_MASTER_KEY=刚刚生成的密钥
    tty: true
    stdin_open: true
    networks:
      - openlist
    restart: unless-stopped

networks:
  openlist:
    driver: bridge
</code></pre>
<p>在openlist中设置使用meilisearch</p>
<p>如何在openlist设置meilisearch</p>
<p>首先你需要修改config.json,在这个示例中，它应该位于<code>/tmp/data/Docker/OpenList/config.json</code>。</p>
<p>修改下文的部分，填写meilisearch的ip地址与端口，以及你在<code>MEILI_MASTER_KEY</code>设置的密钥</p>
<pre><code>  "meilisearch": {
    "host": "http://meilisearch:7700",
    "api_key": "your_master_key_here",
    "index": "openlist"
  },
</code></pre>
<p>接下来打开管理面板，点击<code>索引</code>，选择<code>meilisearch</code>，点击<code>刷新</code>，即可编制索引</p>
<h4><strong>3.5使用docker compose单部署Meilisearch索引</strong></h4>
<pre><code>services:
  meilisearch:
    image: getmeili/meilisearch:v1.53
    container_name: meilisearch
    ports:
      - '7700:7700'
    volumes:
      - /tmp/data/Docker/meilisearch/meili_data:/meili_data
    command: meilisearch --schedule-snapshot --snapshot-dir /meili_data/snapshots
    environment:
      - MEILI_MASTER_KEY=密钥
    tty: true
    stdin_open: true
    networks:
      - openlist
    restart: unless-stopped

networks:
  openlist:
    driver: bridge

</code></pre>
<h3><strong>4、获取 / 重置管理员密码</strong></h3>
<blockquote>
<p>OpenList 初始 <code>admin</code> 密码是<strong>随机生成</strong>的，不会是固定值。三种获取/重置方式：</p>
</blockquote>
<p><strong>Docker 环境</strong></p>
<pre><code># 重新随机生成并打印密码
docker exec -it openlist ./openlist admin random

# 或手动设置一个强密码
docker exec -it openlist ./openlist admin set 你的强密码
</code></pre>
<p><strong>二进制环境</strong></p>
<pre><code>cd /opt/openlist
./openlist admin random      # 重新生成随机密码（打印到终端）
./openlist admin set 你的强密码   # 直接设置指定密码
</code></pre>
<blockquote>
<p>忘记密码时，用 <code>admin random</code> 重新生成即可；首次安装后请<strong>立即改密</strong>。</p>
</blockquote>
]]></content>
    <author><name>XiaoMai</name></author>
    <category term="教程"/>
  </entry>
  <entry>
    <title>WorkBuddy安装教程</title>
    <link href="https://xiaomai.bot.cd/posts/workbuddy%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/" rel="alternate" type="text/html"/>
    <id>https://xiaomai.bot.cd/posts/workbuddy%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/</id>
    <published>2026-09-08T00:00:00.000Z</published>
    <updated>2026-09-08T00:00:00.000Z</updated>
    <summary>WorkBuddy 是腾讯出品的全场景 AI 办公工作台。说出要求、开始执行任务、交付完整成果。完美连接腾讯办公生态，你的办公好搭子。</summary>
    <content type="html"><![CDATA[<p>:::NOTE[WorkBuddy 是什么？]
WorkBuddy 是腾讯推出的全场景 AI 办公智能体。你用大白话描述需求，它会像同事一样自己拆解任务、操作你电脑里的文件，并把成果（文档 / 表格 / PPT / 海报 / 代码）做出来交给你。与普通聊天 AI 最大的区别是：它不只是「会说」，而是「真动手干活」。无需翻墙、无需复杂配置，微信扫码即可使用，并带有免费额度。
:::</p>
<h2>一、安装前准备（系统要求）</h2>
<table>
<thead>
<tr>
<th><strong>操作系统</strong>  Windows10或Windows11(64 位)。 <strong>Windows7/8/8.1 无法运行，请先升级系统。</strong></th>
<th><strong>架构</strong>  主流 x64 电脑直接安装；官网也提供 Windows x64（兼容 ARM64）版本，适用于 Surface 等 ARM 设备。</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>磁盘空间</strong> 安装包约 150–180 MB，安装后占用约 500 MB 以上，建议预留 1 GB。</td>
<td><strong>网络与账号</strong> 需联网下载；登录使用微信或手机号，建议提前准备好微信。</td>
</tr>
</tbody>
</table>
<hr />
<h2>二、下载安装包</h2>
<h3>1、打开浏览器，在地址栏输入官方下载页：</h3>
<pre><code>https://www.workbuddy.cn/
</code></pre>
<p><a href="https://www.workbuddy.cn/">官网直达</a></p>
<h3>2、官网会自动识别你的系统。在下载区域点击「下载 WorkBuddy」或 Windows 版本的下载按钮，页面会给出 <code>.exe</code> 安装包（Mac 则为 <code>.dmg</code>）</h3>
<p><img src="./images/image.png" alt="image" /></p>
<hr />
<h2>三、安装步骤（一路「下一步」即可）</h2>
<h3>1、找到安装包。下载完成后，在 Chrome 中按 Ctrl + J 打开下载记录；或在文件管理器的「下载」文件夹中找到名称含 <code>WorkBuddy</code>、后缀为 <code>.exe</code> 的文件。</h3>
<p><img src="./images/image1.png" alt="image1" /><img src="./images/image2.png" alt="image2" /></p>
<h3>2、运行安装程序。双击该 <code>.exe</code> 文件，等待几秒。电脑反应慢时不要连续双击，否则可能同时弹出多个安装窗口，一路下一步。</h3>
<p><img src="./images/image3.png" alt="image3" /><img src="./images/image4.png" alt="image4" /></p>
<p><img src="./images/image5.png" alt="image5" /></p>
<hr />
<h2>四、首次启动与登录</h2>
<h3>1、WorkBuddy 启动后，会进入登录界面。使用<strong>微信扫码</strong>或<strong>手机号</strong>登录即可。</h3>
<p><img src="./images/image6.png" alt="image6" /></p>
<h3>2、微信扫码：打开手机微信扫描屏幕上的二维码，在手机上确认登录。</h3>
<p><img src="./images/image7.png" alt="image7" /></p>
<h3>3、登录成功后即可进入主界面。提示：登录的账号后续与积分、用量绑定，请确认登录的账号无误。</h3>
<p><img src="./images/image8.png" alt="image8" /></p>
]]></content>
    <author><name>XiaoMai</name></author>
    <category term="教程"/>
  </entry>
</feed>
