背景:之前不小心把手机的安全中心冻结了,导致加了安全锁的笔记软件麻雀记不能正常使用,然后就在找替代软件,最后综合考虑选择了Obsidian+Gitea的方案

推荐先在C:\Dev\中新建一个目录Obsidian Notes存储所有Obsidian仓库

这里主仓库我就叫ObsidianNote

Obsidian插件

参考https://www.bilibili.com/video/BV1w6421F7pC

[
  "dataview",
  "obsidian-excalidraw-plugin",
  "obsidian-icon-folder",
  "obsidian-style-settings",
  "file-explorer-note-count",
  "obsidian-git"
]

git插件配置https://www.bilibili.com/video/BV1fZCyBYEuT

停止编写文件1min之后自动向远端提交一次

每次启动的时候都先拉取一下远程仓库

.gitignore

/.obsidian/workspace.json
/.obsidian/workspace-mobile.json
/.obsidian/community-plugins.json

补充知识,前面带/表示只忽略当前根目录的,不带表示匹配所有目录的此路径

如果在设置.gitignore之前不小心提交过一次,那么提交过的文件会忽视.gitignore,进行管理,那么需要

移除Git跟踪,但保留本地文件(关键步骤):
在仓库根目录打开终端(命令行),针对每个你想忽略的文件执行:

git rm --cached /.obsidian/community-plugins.json
git commit -m “停止跟踪community-plugins.json本地配置文件”
git push

重要--cached 参数意味着只从Git的跟踪列表里删除,但本地文件原封不动。如果漏了这个参数,会真的删除你的本地文件!

docker搭建gitea

docker-compose简单配置

docker-compose.yml

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.21.1
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=mysql
      - GITEA__database__HOST=db:3306
      - GITEA__database__NAME=【自行修改】
      - GITEA__database__USER=【自行修改】
      - GITEA__database__PASSWD=【自行修改】
      # ★★★ 要想仓库ssh里链接不显示ip,添加这些 ↓↓↓ ★★★
      - GITEA__server__DOMAIN=git.example.com【自行修改】
      - GITEA__server__SSH_DOMAIN=git.example.com【自行修改】
      - GITEA__server__ROOT_URL=https://git.example.com/【自行修改】
      - GITEA__server__SSH_PORT=2221
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - ./timezone:/etc/timezone:ro
      - ./localtime:/etc/localtime:ro
    ports:
      - "8084:3000"
      - "2221:22"
    depends_on:
      - db

  db:
    image: mysql:8
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=【自行修改】
      - MYSQL_USER=【自行修改】
      - MYSQL_PASSWORD=【自行修改】
      - MYSQL_DATABASE=【自行修改】
    networks:
      - gitea
    volumes:
      - ./mysql:/var/lib/mysql

docker-compose更安全的配置方式

.env

# MySQL root用户密码(请改为强密码)
MYSQL_ROOT_PASSWORD=YourStrongRootPassword123!

# Gitea数据库用户密码(请改为强密码)
MYSQL_PASSWORD=YourStrongGiteaPassword456!

# Gitea连接数据库的密码(与上面一致)
GITEA_DATABASE_PASSWORD=YourStrongGiteaPassword456!

# 数据库名和用户名(可以保持不变)
DB_NAME=gitea
DB_USER=gitea

最后设置一下文件权限

chmod 600 .env

docker-compose.yml

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.21.1
    container_name: gitea

    # ★ 新增这一行
    env_file:
      - .env

    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=mysql
      - GITEA__database__HOST=db:3306
      # 修改这里,使用环境变量
      - GITEA__database__NAME=${DB_NAME}
      - GITEA__database__USER=${DB_USER}
      - GITEA__database__PASSWD=${GITEA_DATABASE_PASSWORD}
      # ★★★ 要想仓库ssh里链接不显示ip,添加这些 ↓↓↓ ★★★
      - GITEA__server__DOMAIN=git.example.com【自行修改】
      - GITEA__server__SSH_DOMAIN=git.example.com【自行修改】
      - GITEA__server__ROOT_URL=https://git.example.com/【自行修改】
      - GITEA__server__SSH_PORT=2221
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - ./timezone:/etc/timezone:ro
      - ./localtime:/etc/localtime:ro
    ports:
      - "8084:3000"
      - "2221:22"
    depends_on:
      - db

  db:
    image: mysql:8
    restart: always
    environment:
      # 修改为使用环境变量
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${DB_NAME}
    networks:
      - gitea
    volumes:
      - ./mysql:/var/lib/mysql

注意与解释

.env文件权限设置

对于包含数据库密码等敏感信息的 .env 文件,最安全且标准的权限是 600(即 -rw-------),这意味着只有文件的所有者(Owner)可以进行读取和写入,其他任何用户均无权访问。

这个设置的核心原则是:在保证Docker Compose能正常读取的前提下,权限尽可能最小化。

密码特殊符号注意

设置的密码尽量不要带$ ,不然docker compose 解析时:

MYSQL_PASSWORD=abc$123

会被解析成:

  • abc + 环境变量 ${123}
    导致错误警告 "The "123" variable is not set"

❗解决方法 1(推荐):对 $ 进行转义

.env 里写成:

MYSQL_PASSWORD=abc$$123

一个 $$$

❗解决方法 2:给密码加引号(compose v3 可用)
MYSQL_PASSWORD="abc$$123"

env_file在yml中位置

报错:additional properties 'env_file' not allowed

原因:

env_file: 写在 version: "3" 的同级位置,但这是不允许的

env_file 只能写在 service 下(per-service),不能全局使用。

下面写法是错误结构:

version: "3"

# ❌错误:env_file 在这里是非法的
env_file:
  - .env
正确写法应该是:service 下使用 env_file

例如:

services:
  server:
    env_file:
      - .env

或者在 db 下也加:

  db:
    env_file:
      - .env

NPM的Advanced配置

# 在NPM的Advanced选项卡中添加
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;

它的作用是:

  • proxy_set_header Host $host;:确保 Gitea 接收到的是原始域名(如 git.example.com),而不是 NPM 转发时使用的内部主机名或 IP。这样 Gitea 才能生成正确的仓库克隆 URL。

  • proxy_set_header X-Forwarded-Proto $scheme;:告诉 Gitea 用户最初访问使用的是 http 还是 https 协议。这能保证 Gitea 在生成网页链接和重定向时,都使用正确的协议(尤其是 HTTPS)。

修改现有 MySQL 密码(重要步骤)

如果docker-compose.yml中使用的账号密码需要修改,但是由于已经有数据了,不能直接删除容器,需要手动修改密码:

步骤1:获取容器ID

docker ps

找到MySQL容器的ID或名称(应该是 gitea_db 或类似名称)。

步骤2:进入MySQL容器修改密码

# 进入MySQL命令行(使用旧密码 gitea)
docker exec -it gitea-db-1 mysql -u root -p

输入旧密码

步骤3:执行SQL修改密码

在MySQL命令行中依次执行:

-- 修改root密码(使用.env文件中的新密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的强密码_123';

-- 修改gitea用户密码(使用.env文件中的新密码)
ALTER USER 'gitea'@'%' IDENTIFIED BY '另一个强密码_456';

-- 刷新权限使修改生效
FLUSH PRIVILEGES;

-- 退出
exit

📌 补充一个非常实用的小知识(以后不会踩坑)

MySQL 用户匹配规则是优先匹配最具体的 host:

  1. 'root'@'localhost'

  2. 'root'@'127.0.0.1'

  3. 'root'@'%'

当你用:

mysql -u root -p

它默认尝试 socket 连接 → host = localhost
所以 MySQL 使用的其实是:

root@localhost

而不是 root@% 或 root@127.0.0.1。

⭐ 想避免以后类似问题,你可以统一 root 用户权限:

你可以让 root 对所有 host 都用同一个密码:

ALTER USER 'root'@'%' IDENTIFIED BY 'xxxx';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxx';
ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'xxxx';
FLUSH PRIVILEGES;

这样无论你从哪里登录都不会出问题。

步骤4:重启服务

# 停止服务
docker-compose down

# 重新启动(使用新的.env配置)
docker-compose up -d

4. 验证是否成功

# 查看日志,确认无错误
docker-compose logs -f

# 测试Gitea是否能正常访问
curl http://localhost:8084

.env文件的查看

.env文件创建后属于隐藏文件,所以查看需要一些步骤

  • ssh中,Xshell

# 查看所有文件,包含隐藏文件
ls -a

# 显示内容(不包括隐藏文件)权限类型、所有者、文件大小等关键信息
ls -l [文件名]

# 显示内容包括隐藏文件、权限类型、所有者、文件大小等关键信息
ls -al

# 同上,条件分开写
la -a -l

  • Xftp中

标准按钮中找到齿轮图标(选项),

勾选显示隐藏的文件 ,确定后就可以看到隐藏文件了

手机端

手机端不推荐使用git插件进行同步,git插件本身也这么说的

这里使用了第三方软件Git Sync

obsidian + git sync + gitea实现

受下面文章启发https://www.cnblogs.com/Pkernel/p/19114666

主要mgit确实挺久没维护了

谷歌商城:https://play.google.com/store/apps/details?id=com.viscouspot.gitsync

GitHub仓库:https://github.com/ViscousPot/GitSync

推荐先在Documents中新建一个目录Obsidian Notes存储所有Obsidian仓库

这里主仓库我就叫ObsidianNote

在pc端配置好插件等等内容后,push到远程私有仓库

然后在Git Sync中配置远程仓库信息

先选择认证

选择https,Git Sync好像不支持ssh来着?

去gitea申请一个令牌

  • 点击右上角头像(个人信息与配置)

  • 点击设置

  • 点击应用

  • 管理Access Token 中生成一个令牌,给个repository权限

填写信息并拉取远端仓库

  • 然后在手机端填写 提交昵称 与 刚刚获取到的 令牌

  • 接着点击设置,完善提交邮箱

  • 然后设置目录

  • 目录为空文件夹或没有被git管理,需要点击克隆

  • 输入要克隆的仓库https的git地址,选择要克隆到的文件夹

  • 点击克隆就可以拉下来远端仓库,私有仓库的克隆通常比较慢,耐心等待

开启插件

因为我们手机端不需要开启git插件,但电脑端需要,所以为了避免冲突,就在.gitignore中忽视了管理插件启用停用的配置文件/.obsidian/community-plugins.json ,插件会同步在手机端,但默认是关闭的,我们需要手动打开除了git插件以外的插件。

设置左边的立即同步 建议 换成手动同步,每次手动拉取远程仓库,定时同步也尽量不要用吧

尽量避免手机与电脑端同时编辑,以免冲突,冲突的时候需要手动处理

最后打开Obsidian 选择Open folder as vault,选择具体的仓库目录,例如ObsidianNote,不要选择Obsidian Notes

添加错了,就点击上面,点击管理仓库,点击要删除的仓库,选择Forget vault ,这个只是从列表中删除,不删除源文件

参考

使用 Docker 安装 | Gitea Documentation

Obsidia Git同步方法(偏安卓) - Pkernel - 博客园

Obsidian邪修用法,免费云同步,AI,手机端,进阶技巧_哔哩哔哩_bilibili

[Gitea] Gitee不能用?手把手教你搭建git服务_哔哩哔哩_bilibili

【有点东西】Obsidian插件排行T1及T0级别,效果演示|知识管理|第二大脑_哔哩哔哩_bilibili