<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh_CN">
  <title>一只 creeper 的 Blog</title>
  <subtitle>are you ok ?</subtitle>
  <link href="https://blog.st.onecreeper.cn/" rel="alternate" type="text/html"/>
  <link href="https://blog.st.onecreeper.cn/atom.xml" rel="self" type="application/atom+xml"/>
  <id>https://blog.st.onecreeper.cn/</id>
  <updated>2026-08-16T00:00:00.000Z</updated>
  <entry>
    <title>大折叠单手使用指南</title>
    <link href="https://blog.st.onecreeper.cn/posts/%E5%A4%A7%E5%8F%A0%E5%8D%95%E6%89%8B%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/" rel="alternate" type="text/html"/>
    <id>https://blog.st.onecreeper.cn/posts/%E5%A4%A7%E5%8F%A0%E5%8D%95%E6%89%8B%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</id>
    <published>2026-08-16T00:00:00.000Z</published>
    <updated>2026-08-16T00:00:00.000Z</updated>
    <summary>vivo X Fold 5 的大屏与单手使用体验记录。</summary>
    <content type="html"><![CDATA[<h1>设备信息</h1>
]]></content>
    <author><name>一只 creeper</name></author>
    <category term="教程与经验分享"/>
  </entry>
  <entry>
    <title>2026年 RSS 不完全使用指南</title>
    <link href="https://blog.st.onecreeper.cn/posts/2026%E5%B9%B4rss%E4%B8%8D%E5%AE%8C%E5%85%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/" rel="alternate" type="text/html"/>
    <id>https://blog.st.onecreeper.cn/posts/2026%E5%B9%B4rss%E4%B8%8D%E5%AE%8C%E5%85%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</id>
    <published>2026-07-22T00:00:00.000Z</published>
    <updated>2026-07-22T00:00:00.000Z</updated>
    <summary>用 RSS 聚合高质量内容，摆脱推荐算法的信息茧房。</summary>
    <content type="html"><![CDATA[<blockquote>
<p>[!信息]-
可能有用的：<a href="https://bailian.console.aliyun.com/cn-beijing/?spm=5176.29619931.J_XNqYbJaEnpB5_cCJf7e6D.1.3e8110d7ZYcJlm&amp;tab=model#/model-market/detail/qwen-flash">大模型服务平台百炼控制台</a></p>
</blockquote>
<h1>背景/引言</h1>
<p>无论是帖子还是短视频都隐藏着推荐算法，这些算法把我们困在信息茧房中，为了破除这些信息茧房，我想到了“失传已久”的RSS。</p>
<h1>实现</h1>
<h2>需求分析</h2>
<ol>
<li>能够推送高质量内容 -&gt; 需要对内容进行选择</li>
<li>能够实现内容聚合 -&gt; 利用RSS很容易实现</li>
</ol>
<h2>问题与解决方案</h2>
<ol>
<li>现在几乎没有网站提供RSS内容了</li>
<li>高质量内容难找</li>
</ol>
<h2>扩展需求</h2>
<ol>
<li>每日pixiv</li>
<li>英语新闻阅读</li>
</ol>
<h2>我的方案</h2>
<pre><code>graph TD
    subgraph A [服务器]
        direction TB
        A1[Docker] --&gt; A2[RSSHub]
        A1 --&gt; A3[FreshRSS]
    end

    subgraph B [电脑端]
        B1[Mr RSS]
    end

    subgraph C [手机端]
        C1[FeedMe]
    end

    subgraph D [RSS源]
        D1[RSSHub源]
        D2[其他RSS源]
    end

    D1 --&gt; A2
    D2 --&gt; A3
    A2 --&gt; A3
    
    A3 -- 双向同步 --&gt; B1
    A3 -- 双向同步 --&gt; C1

</code></pre>
<h3>服务说明</h3>
<pre><code>RSSHUB: 一个中间件，可以将不支持RSS的站点转出RSS，例如: bilibili,贴吧,pixiv等，具体可以去[路由列表 | RSSHub](https://docs.rsshub.app/zh/routes/)查看
FreshRSS: 一个RSSweb平台，便于我们多端同步并且支持插件
	PS: 两者皆支持arm架构设备部署，也许可以用电视盒子实现？
</code></pre>
<h3>部署</h3>
<h4>RSSHUB:</h4>
<pre><code>vim docker-compose.yml
</code></pre>
<pre><code>services:
  rsshub:
    image: diygod/rsshub
    restart: always
    ports:
      - '1200:1200'
    # 加载 .env 文件中的配置 (GitHub Token, OpenAI Key 等)
    env_file: .env
    environment:
      # --- 覆盖网络配置以匹配 Docker 内部网络 ---
      # 注意：Docker 内部通信使用容器名和内部端口，不需要使用宿主机映射的端口
      NODE_ENV: production
      CACHE_TYPE: redis
      # 内部连接 Redis 标准端口 6379
      REDIS_URL: 'redis://redis:6379/'
      # 连接 Browserless 标准端口 3000
      PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000'
      # 连接 Real-Browser 标准端口 3000
      PUPPETEER_REAL_BROWSER_SERVICE: 'http://real-browser:3000'
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:1200/healthz']
      interval: 30s
      timeout: 10s
      retries: 3
    depends_on:
      - redis
      - browserless
      - real-browser

  # 新版 RSSHub 推荐搭配，用于绕过 Cloudflare
  real-browser:
    image: ghcr.io/hyoban/puppeteer-real-browser-hono
    restart: always
    ports:
      - '3002:3000' # 如果你需要在宿主机调试，访问 localhost:3002
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:3000']
      interval: 30s
      timeout: 10s
      retries: 3

  # 标准 Puppeteer 服务
  browserless:
    image: browserless/chrome
    restart: always
    ulimits:
      core:
        hard: 0
        soft: 0
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:3000/pressure']
      interval: 30s
      timeout: 10s
      retries: 3

  redis:
    image: redis:alpine
    restart: always
    ports:
      - '6380:6379' # 宿主机 6380 -&gt; 容器 6379。配合你之前的习惯
    volumes:
      - redis-data:/data
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 5s

volumes:
  redis-data:
</code></pre>
<pre><code>vim .env
</code></pre>
<pre><code># =============================================================================
# 基础配置
# =============================================================================

# --- 系统环境 ---
NODE_ENV=production

# --- 缓存配置 (Redis) ---
CACHE_TYPE=redis
REDIS_URL=redis://redis:6380/

# --- Puppeteer (浏览器服务) ---
PUPPETEER_WS_ENDPOINT=ws://browserless:3002

# =============================================================================
# 未配置项 (已全部注释)
# 如需启用，请删除行首的 "#" 并填入对应值
# =============================================================================

# --- 网络配置 ---
# PORT=1200
# LISTEN_INADDR_ANY=1
# REQUEST_RETRY=2
# REQUEST_TIMEOUT=3000
# NO_RANDOM_UA=

# --- 跨域设置 ---
# ALLOW_ORIGIN=*

# --- 缓存设置 (默认/内存) ---
# CACHE_EXPIRE=300
# CACHE_CONTENT_EXPIRE=3600
# MEMORY_MAX=256

# --- 代理配置 (Proxy) ---
# PROXY_URI=https://rsshub.ser.onecreeper.cn
# PROXY_AUTH=
# PROXY_URL_REGEX=.*

# --- 访问控制 (Access Control) ---
ACCESS_KEY=250250250c_RSSHUB

# --- 日志配置 ---
# DEBUG_INFO=true
# LOGGER_LEVEL=info
# SENTRY=

# --- 其他应用配置 ---
# DISALLOW_ROBOT=true
# ENABLE_CLUSTER=false
# TITLE_LENGTH_LIMIT=150
# OPENAI_TEMPERATURE=0.2

# --- OpenAI (ChatGPT) ---
# OPENAI_API_KEY=
# OPENAI_API_ENDPOINT=
# OPENAI_MODEL=


# =============================================================================
# 路由特定配置可以参考官方 [配置 | RSSHub](https://docs.rsshub.app/zh/deploy/config)
# =============================================================================

</code></pre>
<h4>FreshRSS</h4>
<pre><code>mkdir data freshrss_data freshrss_extensions
vim docker-compose.yml
</code></pre>
<pre><code>version: '3.8'

services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    restart: unless-stopped
    ports:
      - "1244:80"
    # 左边是你想暴露的端口
    environment:
      - TZ=Asia/Shanghai
      - CRON_MIN=4,34
      - FRESHRSS_ENV=production
      # 核心配置：设置您的外部访问域名
      - BASE_URL=https://rss.ser.onecreeper.cn
      # 核心配置：信任反向代理。
      # 必须允许私有网段，以便 FreshRSS 正确读取 X-Forwarded-Proto: https 头
      - TRUSTED_PROXY=172.16.0.0/12 192.168.0.0/16 10.0.0.0/8 127.0.0.1
    volumes:
      # 将 FreshRSS 的数据映射到本地的 ./data/freshrss 目录
      - ./data/freshrss:/var/www/FreshRSS/data
      # 将 FreshRSS 的扩展映射到本地的 ./data/freshrss_extensions 目录
      - ./data/freshrss_extensions:/var/www/FreshRSS/extensions
    depends_on:
      - db

  db:
    image: postgres:15-alpine
    container_name: freshrss-db
    restart: unless-stopped
    volumes:
      # 将 PostgreSQL 的数据映射到本地的 ./data/db 目录
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=freshrss
      - POSTGRES_USER=freshrss
      - POSTGRES_PASSWORD=freshrss_password # 建议修改此密码
</code></pre>
<h3>RSS源</h3>
<ol>
<li>pixiv可通过RSShub实现，需要配置refresh_token</li>
<li>每日英语新闻学习 ，利用现成的网站，news in levels ，每日按照分级提供新闻 ，地址 https://www.newsinlevels.com/feed</li>
</ol>
<h3>效果</h3>
<p><img src="./assets/864406f643f10ae38f3d9c9aa68fea1a_MD5.jpg" alt="" /></p>
]]></content>
    <author><name>一只 creeper</name></author>
    <category term="教程与经验分享"/>
  </entry>
  <entry>
    <title>Wallos 个人订阅管理工具</title>
    <link href="https://blog.st.onecreeper.cn/posts/wallos%E4%B8%AA%E4%BA%BA%E8%AE%A2%E9%98%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/" rel="alternate" type="text/html"/>
    <id>https://blog.st.onecreeper.cn/posts/wallos%E4%B8%AA%E4%BA%BA%E8%AE%A2%E9%98%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/</id>
    <published>2026-02-11T00:00:00.000Z</published>
    <updated>2026-02-11T00:00:00.000Z</updated>
    <summary>使用开源自托管工具管理网盘、域名和云服务订阅。</summary>
    <content type="html"><![CDATA[<p>随着订阅的服务越来越多，我总是会在想不到的时候收到“续费通知”，网盘会员，手机号，域名，云服务器。我曾经购买过小厂的云服务器，快过期的时候给我发送了续费邮件，但是被归到垃圾箱分类了。云服务器过期，数据也没了。我发觉有一个工具来管理自己的订阅是很重要的，另外我也不喜欢绑卡自动续费。</p>
<h1>简单介绍</h1>
<p><strong>Wallos</strong>是一款开源的个人订阅管理工具，<a href="https://wallosapp.com/">官网</a>，<a href="https://github.com/ellite/Wallos">github</a>。对了，官方提供了一个<a href="https://demo.wallosapp.com/">体验demo</a></p>
<blockquote>
<p>Wallos is a powerful, open-source, and self-hostable web application designed to empower you in managing your finances with ease. Say goodbye to complicated spreadsheets and expensive financial software – Wallos simplifies the process of tracking expenses and helps you gain better control over your financial life.</p>
</blockquote>
<p>译文：</p>
<blockquote>
<p>Wallos 是一款强大、开源且自托管的网络应用程序，旨在帮助您轻松管理财务。告别复杂的电子表格和昂贵的财务软件——Wallos 简化了记录开支的过程，帮助您更好地掌控自己的财务生活。</p>
</blockquote>
<p>他不仅可以出色的满足我们管理订阅的需求，中文支持完善，并且提供了<a href="https://api.wallosapp.com/">api接口</a>，意味着我们也可以自己开发(vibe)一些工具来更好的使用。我就在想做一块可以看日历，任务清单，账单，订阅服务的墨水屏。</p>
<p>网页截图：
<img src="./assets/91b5d20e3b69001cf7b118ce8ecc5355_MD5.jpeg" alt="" /> <img src="./assets/cfdde453f4105276ab47090f4367b393_MD5.jpeg" alt="" />
<img src="./assets/c65e2727978c9e704ae274f81efd52e7_MD5.jpeg" alt="" /></p>
<p>因为我还没怎么用，订阅的东西没用完整添加。</p>
<h1>安装</h1>
<h2>安装要求：</h2>
<ul>
<li>直接运行：需要你能够运行nginx网页服务器和php8.3 (摘自github)</li>
<li>docker容器化部署(推荐)：x86电脑/服务器，arm64(仅测试了Apple M4 电视盒子能否支持无法保证)</li>
</ul>
<h2>docker compose部署</h2>
<pre><code>mkdir wallos #创建一个文件夹用于存储wallos数据
cd wallos
vim docker-compose.yml #创建并编辑docker-compose.yml文件
</code></pre>
<p>进入vim后键入<code>i</code>，然后粘贴下面的内容，<code>8282</code>是你想暴露的端口。</p>
<pre><code>services:
  wallos:  # 定义一个名为 "wallos" 的服务
    container_name: wallos  # 指定容器运行时的名称为 "wallos"，便于识别和管理
    image: bellamy/wallos:latest  # 使用的镜像名称及标签：从 Docker Hub 拉取 bellamy/wallos 的最新版本
    ports:
      - "8282:80/tcp"  # 端口映射：将宿主机的 8282 端口映射到容器的 80 端口（TCP协议），用于访问 Web 界面
    environment:
      TZ: "Asia/Shanghai"  # 设置容器内的时区环境变量为上海时区，确保时间显示正确
    # Volumes 用于在容器升级或重启时持久化保存数据
    volumes:
      - './db:/var/www/html/db'
      - './logos:/var/www/html/images/uploads/logos'
    restart: unless-stopped  # 容器重启策略：除非手动停止，否则在 Docker 启动时自动运行该容器
</code></pre>
<p>按下<code>Esc</code>,键入<code>:wq</code></p>
<p>执行。</p>
<pre><code>sudo docker compose up -d   #如果权限组配置了可以不加sudo
</code></pre>
<p>访问 https://serverip:8282</p>
<h1>使用</h1>
<p>大多数基本操作我就不介绍了，很容易摸清楚，官方建议注册一个<a href="https://fixer.io/#pricing_plan">Fixer API</a>用于获取汇率并自动计算，不过我不需要就没弄了而且注册还有填一堆信息。</p>
<p>这里讲下我的邮箱设置，我之前用网易邮箱做wordpress博客的通知邮箱，后来被网易停用了说我发广告，所有我找了个别的方案: <a href="https://resend.com/">Resend</a>。可以参考<a href="https://www.bilibili.com/video/BV1JS411A7se/">这个视频</a>配置下，这样就有了自己的私人邮箱，然后填入 wallos <img src="./assets/873bfd272de4c77d63b5c75dd213a71e_MD5.jpeg" alt="" /></p>
<pre><code>smtp.resend.com
587
resend
you_resend_key
SubscriptionReminder@you_email.com
</code></pre>
<p>这样你就可以收到邮件提醒了。</p>
]]></content>
    <author><name>一只 creeper</name></author>
    <category term="教程与经验分享"/>
  </entry>
  <entry>
    <title>简易密码生成器</title>
    <link href="https://blog.st.onecreeper.cn/posts/%E7%AE%80%E6%98%93%E5%AF%86%E7%A0%81%E7%94%9F%E6%88%90%E5%99%A8/" rel="alternate" type="text/html"/>
    <id>https://blog.st.onecreeper.cn/posts/%E7%AE%80%E6%98%93%E5%AF%86%E7%A0%81%E7%94%9F%E6%88%90%E5%99%A8/</id>
    <published>2025-11-01T00:00:00.000Z</published>
    <updated>2025-11-01T00:00:00.000Z</updated>
    <summary>使用基座密码和域名摘要生成易于推导的专属密码。</summary>
    <content type="html"><![CDATA[<h1>项目起源</h1>
<p>设置密码很多时候都是一个难题，简单密码不安全，困难密码难记。虽然困难密码可以使用bitwarden之类的密码管理软件存储，但是偶尔无法使用这些工具就会很麻烦。于是在我和gemini2.5pro，glm4.6的共同努力下，完成了这个密码生成工具。</p>
<h1>项目特色</h1>
<p><strong>较高安全性</strong>：我虽然没有系统性的学习密码之类的知识，但是我的生成器基本是使用的现有的一些算法（散列值）。每个密码的形式都是 “基座密码” + “网站域名 + 盐 对应的md5值的特定几位”
<strong>易于推导</strong>：简单的算法，只要你能找到一个在线的md5计算网站就能手动推导自己的密码。
<strong>相同网站相同密码</strong>：如果忘记直接重新生成就行，结果始终相等。</p>
<p><img src="./assets/958b8588d96b3b0f27d0d2f897e598cd_MD5.jpeg" alt="" /></p>
<h1>使用方法</h1>
<p><a href="https://github.com/onecreeper/EasyPassGen">EasyPassGen - 智能密码生成器 - github</a></p>
<ol>
<li>下载 windows发布包</li>
<li>解压后双击 <code>EasyPassGen.exe</code></li>
<li>按提示输入域名生成密码</li>
</ol>
<h1>效果</h1>
<p><img src="./assets/5c8da18496bafa6e0a9e4a72cb367227_MD5.jpeg" alt="" /></p>
]]></content>
    <author><name>一只 creeper</name></author>
    <category term="教程与经验分享"/>
  </entry>
  <entry>
    <title>LobeChat + Vercel + Auth0 + 阿里云 OSS 部署教程</title>
    <link href="https://blog.st.onecreeper.cn/posts/lobechat--vercel--auth0--%E9%98%BF%E9%87%8C%E4%BA%91oss-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/" rel="alternate" type="text/html"/>
    <id>https://blog.st.onecreeper.cn/posts/lobechat--vercel--auth0--%E9%98%BF%E9%87%8C%E4%BA%91oss-%E9%83%A8%E7%BD%B2%E6%95%99%E7%A8%8B/</id>
    <published>2025-10-01T00:00:00.000Z</published>
    <updated>2025-10-01T00:00:00.000Z</updated>
    <summary>使用 Vercel、Auth0 和阿里云 OSS 部署私人 LobeChat。</summary>
    <content type="html"><![CDATA[<h1>LobeChat + Vercel + Auth0 + 阿里云OSS 部署教程</h1>
<h2>第 1 步：一键部署 LobeChat</h2>
<p>首先，我们需要将 LobeChat 的官方项目代码复制一份到自己的 GitHub 账号下，然后再通过 Vercel 进行部署。</p>
<ol>
<li>
<p><strong>Fork 项目</strong>：
访问 <a href="https://github.com/lobehub/lobe-chat">LobeChat 的 GitHub 仓库</a>，点击页面右上角的 Fork 按钮，将项目复刻到你自己的 GitHub 账户中。</p>
</li>
<li>
<p><strong>在 Vercel 中创建项目</strong>：
前往 Vercel 控制台，点击 Create a New Project。</p>
</li>
<li>
<p><strong>导入 GitHub 仓库</strong>：
选择 Import Git Repository，并选择你刚刚 Fork 的 lobe-chat 仓库进行导入。Vercel 会自动识别项目类型并为你配置好大部分部署选项。</p>
</li>
<li>
<p><strong>直接部署</strong>：
此时先不要急着修改环境变量，直接点击 Deploy 按钮。Vercel 会开始构建和部署你的应用。这个过程可能需要一些时间（大约 10-20 分钟），请耐心等待。</p>
</li>
</ol>
<p>部署完成后，你将拥有一个可以访问的 LobeChat 站点，你可以在 Vercel 看到它的域名，这个后面要用。但这只是一个基础版本，接下来我们将为它添加数据库和用户系统。</p>
<h2>第 2 步：配置数据库 (Postgres)</h2>
<p>为了让 LobeChat 能够保存用户的对话历史和设置，我们需要一个数据库。Vercel 自带的 Storage 功能可以让我们一键创建一个免费的 Postgres 数据库。</p>
<ol>
<li>
<p><strong>创建数据库</strong>：
回到 Vercel 主页，切换到 Storage 标签页，点击 Create a new Database 并选择 Neon。</p>
</li>
<li>
<p><strong>连接项目</strong>：
选择你的 lobe-chat 项目，并为数据库连接起一个前缀，随便设置就行，然后点击 Connect。</p>
</li>
<li>
<p><strong>配置环境变量</strong>：
连接成功后，Vercel 会自动在你的项目中添加 POSTGRES_* 相关的环境变量。但 LobeChat 使用的是通用的 DATABASE_URL 变量，所以我们需要手动配置一下。</p>
<ul>
<li>进入你的项目设置 Settings -&gt; Environment Variables。</li>
<li>复制 Vercel 自动生成的 POSTGRES_URL_NONPOOLING 的值。</li>
<li>添加以下4个新的环境变量：</li>
</ul>
</li>
</ol>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>DATABASE_URL</td>
<td>粘贴你复制的 POSTGRES_URL_NONPOOLING 值</td>
<td>用于连接数据库的服务端链接</td>
</tr>
<tr>
<td>NEXT_PUBLIC_SERVICE_MODE</td>
<td>server</td>
<td>开启服务端模式，以便使用数据库功能</td>
</tr>
<tr>
<td>KEY_VAULTS_SECRET</td>
<td>运行 openssl rand -base64 32 生成</td>
<td>一个 32 位的随机密钥，用于加密敏感数据</td>
</tr>
<tr>
<td>APP_URL</td>
<td>https://你的应用地址</td>
<td>应用访问地址</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>提示</strong>：KEY_VAULTS_SECRET 是一个用于加密用户 API Key 等敏感信息的密钥。你可以在本地终端（如 PowerShell, Terminal）中运行 openssl rand -base64 32 命令来生成一个足够安全的随机字符串。</p>
</blockquote>
<h2>第 3 步：配置用户认证 (Auth0)</h2>
<p>为了实现多用户登录和隔离，我们需要接入一个身份验证服务。这里我们选用 Auth0。</p>
<p>官方文档已经提供了非常详细的步骤，请直接参考官方文档中关于配置 Auth0 身份验证服务的说明。</p>
<p><strong>关键提示</strong>：</p>
<ul>
<li>按照官方文档一步步操作即可，流程非常清晰。<a href="https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/auth0">在 LobeChat 中配置 Auth0 身份验证服务 - 详细步骤和环... · LobeHub</a></li>
<li>在 Auth0 设置中，请不要开启注册功能。作为私人应用，我们通常是手动在 Auth0 后台为受信任的用户创建账号，以确保服务的私密性和安全性。</li>
<li>完成 Auth0 配置后，别忘了将相关的环境变量（如 AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET, AUTH_SECRET 等）添加到你的 Vercel 项目中。</li>
<li>同时，添加一个关键的环境变量来启用 NextAuth：</li>
</ul>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>NEXT_PUBLIC_ENABLE_NEXT_AUTH</td>
<td>1</td>
<td>在 Vercel 部署中显式开启 NextAuth 认证</td>
</tr>
</tbody>
</table>
<p>此外，还需要配置以下认证相关的环境变量：</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>NEXT_AUTH_SECRET</td>
<td>运行 openssl rand -base64 32 生成</td>
<td>NextAuth 的加密密钥</td>
</tr>
<tr>
<td>NEXT_AUTH_SSO_PROVIDERS</td>
<td>auth0</td>
<td>指定单点登录提供商</td>
</tr>
<tr>
<td>AUTH_AUTH0_ID</td>
<td>你的Auth0客户端ID</td>
<td>Auth0 应用的客户端标识符</td>
</tr>
<tr>
<td>AUTH_AUTH0_SECRET</td>
<td>你的Auth0客户端密钥</td>
<td>Auth0 应用的客户端密钥</td>
</tr>
<tr>
<td>AUTH_AUTH0_ISSUER</td>
<td>你的Auth0发行者URL</td>
<td>Auth0 颁发者地址</td>
</tr>
<tr>
<td>NEXTAUTH_URL</td>
<td>你的应用地址/api/auth</td>
<td>NextAuth 的回调URL</td>
</tr>
</tbody>
</table>
<h2>第 4 步：配置对象存储 (阿里云 OSS)</h2>
<p>如果希望在对话中使用文件上传功能（例如发送图片），你需要配置一个对象存储服务。这里我们以阿里云 OSS 为例，它价格实惠，标准用量下一年仅需⑨块钱。</p>
<p><img src="./assets/e8b7a10b708f387d74a78701f3840e5a_MD5.jpeg" alt="" /></p>
<h3>4.1 创建 OSS Bucket</h3>
<ol>
<li>登录 <a href="https://oss.console.aliyun.com/bucket">OSS管理控制台</a></li>
<li>点击"创建 Bucket"按钮</li>
<li>填写 Bucket 名称（需全局唯一，请认真取名）</li>
<li>选择地域（建议选择距离你较近的区域以获得更快的访问速度）</li>
<li>其他选项暂时保持默认，点击"确定"创建</li>
</ol>
<h3>4.2 配置 Bucket 权限</h3>
<ol>
<li>进入创建好的 Bucket，找到"权限管理" -&gt; "读写权限"</li>
<li>将权限修改为"公共读"（这是为了让应用可以公开访问上传的文件）</li>
<li>确认修改</li>
</ol>
<p><img src="./assets/04af0559a29346aaa22c1044f8d9312c_MD5.jpeg" alt="" /></p>
<h3>4.3 配置跨域规则</h3>
<ol>
<li>在 Bucket 设置中，找到"数据安全" -&gt; "跨域设置"</li>
<li>点击"设置"按钮，然后点击"创建规则"</li>
<li>按以下配置填写：
<ul>
<li>来源(Origin)：填写你 Vercel 应用的域名（如 <code>https://your-app.vercel.app</code>）</li>
<li>允许 Methods(CORS)：GET, POST, PUT, DELETE, HEAD</li>
<li>允许 Headers：*</li>
</ul>
</li>
</ol>
<ul>
<li>点击"确定"保存规则</li>
</ul>
<h3>4.4 创建 RAM 子用户</h3>
<p>为了安全起见，我们不直接使用主账号的 AccessKey。而是创建一个只拥有 OSS 操作权限的子用户。</p>
<ol>
<li>前往 <a href="https://ram.console.aliyun.com/users">访问控制 RAM 控制台</a></li>
<li>点击"创建用户"按钮</li>
<li>填写用户名（可自定义）</li>
<li>点击"确定"创建用户</li>
<li>创建完成后，务必保存好生成的 AccessKey ID 和 AccessKey Secret，这个凭证只会显示一次</li>
<li>返回用户列表，找到刚创建的用户，点击"添加权限"</li>
<li>在"系统策略"中搜索并选择 <code>AliyunOSSFullAccess</code></li>
<li>点击"确定"完成授权</li>
</ol>
<h3>4.5 获取 OSS 连接信息</h3>
<ol>
<li>进入 <a href="https://oss.console.aliyun.com/bucket">OSS管理控制台</a></li>
<li>找到你创建的 Bucket，点击进入</li>
<li>在"概览"页面，记录以下两个信息：
<ul>
<li>Endpoint（地域节点）中的外网访问地址（如 <code>https://oss-cn-beijing.aliyuncs.com</code>）</li>
<li>Bucket 域名（如 <code>https://your-bucket-name.oss-cn-beijing.aliyuncs.com</code>）</li>
</ul>
</li>
</ol>
<h3>4.6 在 Vercel 中添加 OSS 环境变量</h3>
<p>回到 Vercel 项目的环境变量设置页面，添加以下变量：</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Example &amp; Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>S3_ACCESS_KEY_ID</td>
<td>你的 RAM 用户 AccessKey ID</td>
<td>LTAI5t...</td>
</tr>
<tr>
<td>S3_SECRET_ACCESS_KEY</td>
<td>你的 RAM 用户 AccessKey Secret</td>
<td>your-secret-key...</td>
</tr>
<tr>
<td>S3_ENDPOINT</td>
<td>你的 Bucket 外网访问节点</td>
<td>https://oss-cn-beijing.aliyuncs.com</td>
</tr>
<tr>
<td>S3_BUCKET</td>
<td>你的 Bucket 名称</td>
<td>your-unique-bucket-name</td>
</tr>
<tr>
<td>S3_PUBLIC_DOMAIN</td>
<td>你的 Bucket 访问域名</td>
<td>https://your-unique-bucket-name.oss-cn-beijing.aliyuncs.com</td>
</tr>
</tbody>
</table>
<p>示例配置：</p>
<pre><code>S3_ACCESS_KEY_ID=LT123123123123
S3_SECRET_ACCESS_KEY=y524523452345234cG976h822346346gB
S3_ENDPOINT=https://oss-cn-beijing.aliyuncs.com
S3_BUCKET=liujianmeisima
S3_PUBLIC_DOMAIN=https://zhaojiesima.oss-cn-beijing.aliyuncs.com
</code></pre>
<blockquote>
<p><strong>安全警告</strong>：你的 AccessKey 和对象存储 Bucket 信息是高度敏感的资产。切勿泄露给任何人！有恶意用户会扫描网络来刷取他人的 OSS 流量，可能导致高额账单。强烈建议你的私人 LobeChat 应用不要公开给不受信任的人使用。</p>
</blockquote>
<h2>第 5 步：配置自定义域名</h2>
<p>如果你希望使用自己的域名访问 LobeChat，需要进行以下配置：</p>
<h3>5.1 在 Vercel 中配置自定义域名</h3>
<ol>
<li>在 Vercel 项目控制台，进入 Settings -&gt; Domains</li>
<li>点击 Add，输入你的自定义域名（如 chat.yourdomain.com）</li>
<li>根据提示配置 DNS 记录</li>
<li>等待 SSL 证书自动颁发（通常需要几分钟）</li>
</ol>
<h3>5.2 更新 Auth0 配置</h3>
<ol>
<li>登录 Auth0 控制台，进入你的应用设置</li>
<li>找到 "Allowed Callback URLs" 字段，添加你的自定义域名回调地址：<pre><code>https://你的自定义域名/api/auth/callback/auth0
</code></pre>
</li>
<li>保存更改</li>
</ol>
<h3>5.3 更新阿里云 OSS 跨域配置</h3>
<ol>
<li>登录阿里云 OSS 控制台，进入你的 Bucket</li>
<li>找到 "数据安全 -&gt; 跨域设置"</li>
<li>修改或添加跨域规则，将"来源"更新为你的自定义域名：<pre><code>https://你的自定义域名
</code></pre>
</li>
<li>保存配置</li>
</ol>
<h3>5.4 更新环境变量</h3>
<p>在 Vercel 项目设置中，更新以下环境变量：</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>原值</th>
<th>新值</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>APP_URL</td>
<td>Vercel 默认域名</td>
<td>https://你的自定义域名</td>
<td>应用访问地址</td>
</tr>
<tr>
<td>NEXTAUTH_URL</td>
<td>Vercel 默认域名/api/auth</td>
<td>https://你的自定义域名/api/auth</td>
<td>NextAuth 的回调URL</td>
</tr>
</tbody>
</table>
<h2>第 6 步：大功告成</h2>
<p>当你完成以上所有环境变量的配置后，Vercel 会自动进行最后一次重新部署。等待部署成功后，访问你的自定义域名，你将看到 Auth0 的登录页面。登录后，即可开始享受你功能齐全、完全私有的 LobeChat 实例了！</p>
<hr />
<h2>环境变量汇总</h2>
<h3>数据库环境变量</h3>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>DATABASE_URL</td>
<td>粘贴你复制的 POSTGRES_URL_NONPOOLING 值</td>
<td>用于连接数据库的服务端链接</td>
</tr>
<tr>
<td>NEXT_PUBLIC_SERVICE_MODE</td>
<td>server</td>
<td>开启服务端模式，以便使用数据库功能</td>
</tr>
<tr>
<td>KEY_VAULTS_SECRET</td>
<td>运行 openssl rand -base64 32 生成</td>
<td>一个 32 位的随机密钥，用于加密敏感数据</td>
</tr>
<tr>
<td>APP_URL</td>
<td>https://你的自定义域名</td>
<td>应用访问地址</td>
</tr>
</tbody>
</table>
<pre><code>DATABASE_URL=粘贴你复制的POSTGRES_URL_NONPOOLING值
NEXT_PUBLIC_SERVICE_MODE=server
KEY_VAULTS_SECRET=运行openssl rand -base64 32生成
APP_URL=https://你的自定义域名
</code></pre>
<h3>认证环境变量</h3>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>NEXT_PUBLIC_ENABLE_NEXT_AUTH</td>
<td>1</td>
<td>在 Vercel 部署中显式开启 NextAuth 认证</td>
</tr>
<tr>
<td>NEXT_AUTH_SECRET</td>
<td>生成的随机密钥</td>
<td>NextAuth 的加密密钥</td>
</tr>
<tr>
<td>NEXT_AUTH_SSO_PROVIDERS</td>
<td>auth0</td>
<td>指定单点登录提供商</td>
</tr>
<tr>
<td>AUTH_AUTH0_ID</td>
<td>你的Auth0客户端ID</td>
<td>Auth0 应用的客户端标识符</td>
</tr>
<tr>
<td>AUTH_AUTH0_SECRET</td>
<td>你的Auth0客户端密钥</td>
<td>Auth0 应用的客户端密钥</td>
</tr>
<tr>
<td>AUTH_AUTH0_ISSUER</td>
<td>你的Auth0发行者URL</td>
<td>Auth0 颁发者地址</td>
</tr>
<tr>
<td>NEXTAUTH_URL</td>
<td>https://你的自定义域名/api/auth</td>
<td>NextAuth 的回调URL</td>
</tr>
</tbody>
</table>
<pre><code>NEXT_PUBLIC_ENABLE_NEXT_AUTH=1
NEXT_AUTH_SECRET=生成的随机密钥
NEXT_AUTH_SSO_PROVIDERS=auth0
AUTH_AUTH0_ID=你的Auth0客户端ID
AUTH_AUTH0_SECRET=你的Auth0客户端密钥
AUTH_AUTH0_ISSUER=你的Auth0发行者URL
NEXTAUTH_URL=https://你的自定义域名/api/auth
</code></pre>
<h3>对象存储环境变量</h3>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Example &amp; Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>S3_ACCESS_KEY_ID</td>
<td>你的 RAM 用户 AccessKey ID</td>
<td>LTAI5t...</td>
</tr>
<tr>
<td>S3_SECRET_ACCESS_KEY</td>
<td>你的 RAM 用户 AccessKey Secret</td>
<td>your-secret-key...</td>
</tr>
<tr>
<td>S3_ENDPOINT</td>
<td>你的 Bucket 外网访问节点</td>
<td>https://oss-cn-beijing.aliyuncs.com</td>
</tr>
<tr>
<td>S3_BUCKET</td>
<td>你的 Bucket 名称</td>
<td>your-unique-bucket-name</td>
</tr>
<tr>
<td>S3_PUBLIC_DOMAIN</td>
<td>你的 Bucket 访问域名</td>
<td>https://your-unique-bucket-name.oss-cn-beijing.aliyuncs.com</td>
</tr>
</tbody>
</table>
<pre><code>S3_ACCESS_KEY_ID=你的RAM用户AccessKey ID
S3_SECRET_ACCESS_KEY=你的RAM用户AccessKey Secret
S3_ENDPOINT=你的Bucket外网访问节点
S3_BUCKET=你的Bucket名称
S3_PUBLIC_DOMAIN=你的Bucket访问域名
</code></pre>
<hr />
<h2>后记</h2>
<ol>
<li>折腾半天都不能用，发现是NEXT_PUBLIC_ENABLE_NEXT_AUTH没有设置，另外lobechat的环境变量前几天才更新，建议同时参考官方网站进行部署。</li>
<li>云函数有执行时间的限制，建议打开客户端请求模式。</li>
<li>auth0关闭注册：<a href="https://stackoverflow.com/questions/70863967/how-to-disable-enable-sign-ups-for-a-specific-application-with-auth0">如何禁用/启用特定应用程序的注册功能？ - Stack Overflow --- How to disable/enable Sign Ups for a specific application with Auth0? - Stack Overflow</a></li>
<li>自动更新不建议开，不然突然炸了会很难受的。</li>
</ol>
<h2>参考资料：</h2>
<ol>
<li><a href="https://lobehub.com/zh/docs/self-hosting/server-database/vercel">在 Vercel 上部署 LobeChat 的服务端数据库版本 · Lo... · LobeHub</a></li>
<li><a href="https://pzweuj.github.io/posts/LobeChat">Vercel部署LobeChat数据库版简略流程 | 生物信息文件夹</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/29191032890">LobeChat私有化部署教程（带服务端数据库） - 知乎</a></li>
</ol>
]]></content>
    <author><name>一只 creeper</name></author>
    <category term="教程与经验分享"/>
  </entry>
  <entry>
    <title>macOS 开机自动挂载 NAS 脚本分享</title>
    <link href="https://blog.st.onecreeper.cn/posts/macbook%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BDnas%E8%84%9A%E6%9C%AC/" rel="alternate" type="text/html"/>
    <id>https://blog.st.onecreeper.cn/posts/macbook%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BDnas%E8%84%9A%E6%9C%AC/</id>
    <published>2025-09-13T00:00:00.000Z</published>
    <updated>2025-09-13T00:00:00.000Z</updated>
    <summary>使用脚本让 NAS 在 MacBook 开机后自动挂载。</summary>
    <content type="html"><![CDATA[<h1>项目来源</h1>
<p>前段时间购买了MacBook Air，发现想要挂载NAS需要手动挂载，不能自动挂载。与AI对话后，编写了一个自动挂载脚本，现分享出来以帮助有类似需求的用户。</p>
<h2>1. 准备工作</h2>
<h3>1.1 创建脚本文件</h3>
<ol>
<li>
<p>在您的主目录下创建脚本文件夹：</p>
<pre><code>mkdir -p ~/Tools/Scripts
</code></pre>
</li>
<li>
<p>创建脚本文件：</p>
<pre><code>nano ~/Tools/Scripts/mount_nas.sh
</code></pre>
</li>
<li>
<p>将脚本代码复制粘贴到文件中，根据自己的需求修改配置，然后保存并退出。</p>
</li>
</ol>
<pre><code>#!/bin/bash

exec &amp;&gt; "${HOME}/Tools/Scripts/mount_nas_log.txt" 

# ==============================================================================
# --- 开机自动挂载脚本 (在用户主目录创建挂载点) --- 
# ==============================================================================

# --- 配置区 --- 
# 格式: "昵称;服务器IP/路径;用户名" 
CONFIGS=( 
"nas;192.168.10.1/onecreeper_nas;username" 
) 

# --- 准备工作 --- 
# 定义挂载点基准目录 (在用户主目录下) 
BASE_MOUNT_DIR="${HOME}/Mounts" 
echo "将在 ${BASE_MOUNT_DIR} 中创建挂载点..." 
mkdir -p "${BASE_MOUNT_DIR}" # -p 选项确保目录不存在时才创建，存在亦不报错

# --- 网络检查 --- 
UNIQUE_SERVERS=$(for config in "${CONFIGS[@]}"; do echo "$config" | cut -d';' -f2 | cut -d'/' -f1; done | sort -u) 
declare -a REACHABLE_SERVERS=() 
echo "正在检查所有 NAS/服务器是否在线..." 

for SERVER_IP in $UNIQUE_SERVERS; do
    echo -n "正在检查服务器: $SERVER_IP... " 
    if ping -c 2 -W 1 $SERVER_IP &amp;&gt; /dev/null; then
        echo "✅ 在线" 
        REACHABLE_SERVERS+=("$SERVER_IP") 
    else
        echo "❌ 超时" 
    fi
done

echo "服务器在线状态检查完毕。" 

# --- 挂载逻辑 --- 
for config in "${CONFIGS[@]}"; do
    IFS=';' read -r NICKNAME FULL_PATH USERNAME &lt;&lt;&lt; "$config" 
    SERVER_IP=$(echo $FULL_PATH | cut -d'/' -f1) 
    # 使用用户主目录下的挂载点
    MOUNT_POINT="${BASE_MOUNT_DIR}/${NICKNAME}" 
    
    IS_SERVER_REACHABLE=false
    for item in "${REACHABLE_SERVERS[@]}"; do [[ "$item" == "$SERVER_IP" ]] &amp;&amp; IS_SERVER_REACHABLE=true &amp;&amp; break; done
    
    if ! $IS_SERVER_REACHABLE; then
        echo "⏭️ 跳过挂载 '$NICKNAME' (服务器不可达)" 
        continue
    fi
    
    echo "----------------------------------------" 
    echo "正在处理共享: $NICKNAME" 
    
    # 自动创建挂载点文件夹
    mkdir -p "${MOUNT_POINT}" 
    
    if mount | grep -q " on ${MOUNT_POINT} "; then
        echo "状态：已挂载。" 
        continue
    fi
    
    NAS_PASSWORD=$(security find-internet-password -s "$SERVER_IP" -a "$USERNAME" -w) 
    if [ -z "$NAS_PASSWORD" ]; then
        echo "❌ 错误：未能在钥匙串中找到 '$USERNAME@$SERVER_IP' 的密码。" 
        continue
    fi
    
    echo "正在尝试挂载到 ${MOUNT_POINT}" 
    
    if [[ "$USERNAME" == *"@"* ]]; then
        # 对用户名进行URL编码
        ENCODED_USERNAME=$(echo "$USERNAME" | sed 's/@/%40/g') 
        echo "提示: 检测到包含'@'的用户名，已自动编码为: ${ENCODED_USERNAME}" 
        mount_smbfs -N "//${ENCODED_USERNAME}:${NAS_PASSWORD}@${FULL_PATH}" "${MOUNT_POINT}" 
    else
        # 对于不含'@'的标准用户名，使用原始命令
        mount_smbfs -N "//${USERNAME}:${NAS_PASSWORD}@${FULL_PATH}" "${MOUNT_POINT}" 
    fi
    
    if [ $? -eq 0 ]; then
        echo "✅ 成功挂载。" 
    else
        echo "❌ 挂载失败。请检查网络、服务器状态、密码，或Windows端的共享/防火墙设置。" 
    fi
done

echo "----------------------------------------" 
echo "所有挂载任务已执行完毕。" 
exit 0
</code></pre>
<h3>1.2 设置脚本权限</h3>
<p>给脚本添加执行权限：</p>
<pre><code>chmod +x ~/Tools/Scripts/mount_nas.sh
</code></pre>
<h3>1.3 配置NAS密码</h3>
<p>脚本使用macOS的钥匙串来安全存储NAS密码。您需要为每个NAS服务器和用户名组合添加密码到钥匙串：</p>
<ol>
<li>打开“访达”</li>
<li>左上角-前往-连接服务器</li>
<li>输入你的nas地址账号密码，勾选记住密码之类的提示就会自动保存到密钥串中了</li>
</ol>
<h2>2. 测试脚本</h2>
<p>在设置自动运行之前，先手动测试脚本是否正常工作：</p>
<pre><code>~/Tools/Scripts/mount_nas.sh
</code></pre>
<p>检查输出和日志文件 <code>~/Tools/Scripts/mount_nas_log.txt</code>，确认所有NAS共享文件夹都已成功挂载到 <code>~/Mounts</code> 目录下。</p>
<h2>3. 设置开机自动运行</h2>
<h3>使用自动操作将脚本变为程序</h3>
<ol>
<li>打开自动操作</li>
<li>新建文稿 &gt; 应用程序</li>
<li>搜索"运行shell脚本"</li>
<li>脚本填入 <code>Bash /Tools/Scripts/mount_nas.sh</code></li>
</ol>
<h3>使用登录项（用户级）</h3>
<ol>
<li>打开"系统偏好设置" &gt; "用户与群组"</li>
<li>选择您的用户账户，点击"登录项"选项卡</li>
<li>点击左下角的锁图标并输入密码进行解锁</li>
<li>点击"+"按钮添加登录项</li>
<li>在文件选择对话框中，选择您刚刚创建的自动操作程序</li>
<li>确保新添加的登录项旁边的复选框已选中</li>
</ol>
<p>此方法会在您登录用户账户时自动运行脚本。</p>
<h2>4. 验证自动挂载</h2>
<p>重启您的MacBook，登录后检查：</p>
<ol>
<li>打开Finder，查看侧边栏是否出现挂载的NAS共享文件夹</li>
<li>检查<code>~/Mounts</code>目录，确认所有NAS共享文件夹都已挂载</li>
<li>查看日志文件<code>~/Tools/Scripts/mount_nas_log.txt</code>，确认脚本运行正常</li>
</ol>
<h2>常见问题与解决方案</h2>
<h3>1. 挂载失败：密码错误</h3>
<p>如果日志显示"未能在钥匙串中找到密码"的错误，请检查：</p>
<ul>
<li>确保已在钥匙串中正确添加了NAS服务器的密码</li>
<li>检查服务器IP地址和用户名是否与钥匙串中的记录完全匹配</li>
<li>尝试手动运行<code>security find-internet-password -s "服务器IP" -a "用户名" -w</code>命令，确认能获取到密码</li>
</ul>
<h3>2. 挂载失败：网络问题</h3>
<p>如果日志显示服务器不可达或挂载超时，请检查：</p>
<ul>
<li>确保MacBook和NAS在同一网络中</li>
<li>检查NAS设备是否正常运行</li>
<li>确认NAS的IP地址没有变化</li>
<li>检查网络防火墙设置</li>
</ul>
<h3>3. 特殊字符用户名问题</h3>
<p>如果您的用户名包含特殊字符（特别是"@"），脚本会自动处理。但如果仍遇到问题，您可以：</p>
<ul>
<li>手动对用户名进行URL编码（将"@"替换为"%40"）</li>
<li>考虑在NAS/Windows上创建一个不含特殊字符的专用账户用于挂载</li>
</ul>
<h3>4. 挂载点权限问题</h3>
<p>如果挂载成功但无法访问文件，可能是权限问题：</p>
<ul>
<li>检查NAS上的共享权限设置</li>
<li>确保MacBook用户有足够的访问权限</li>
<li>尝试手动挂载并指定权限选项，如<code>mount_smbfs -N -o nobrowse "//user:pass@server/share" ~/Mounts/share</code></li>
</ul>
<h2>AI提问解决法</h2>
<p>你去问问ai把，很强的。</p>
]]></content>
    <author><name>一只 creeper</name></author>
    <category term="教程与经验分享"/>
  </entry>
</feed>
