搭建 Git 或 SVN 服务器并通过 Samba 共享
Published in:2025-03-18 |
Words: 2.4k | Reading time: 9min | reading:

一、搭建 Git 服务器并通过 Samba 共享

这种方式下,Git 服务器本身处理版本控制逻辑,Samba 只负责共享 Git 仓库所在的目录。

1. 安装 Git 和 Samba

1
2
sudo apt update
sudo apt install git samba

2. 创建 Git 仓库

  • 创建一个用于存放 Git 仓库的目录(例如 /srv/git):

    1
    sudo mkdir -p /srv/git
  • 进入该目录并初始化一个裸仓库(bare repository):

    1
    2
    cd /srv/git
    sudo git init --bare myproject.git # "myproject" 是你的项目名称

    裸仓库只包含版本控制信息,没有工作目录。

  • 设置权限

    1
    2
    sudo chown -R www-data:www-data /srv/git/myproject.git #假设你的samba用户是www-data
    sudo chmod -R 775 /srv/git/myproject.git

3. 配置 Samba 共享

  • 编辑 Samba 配置文件:

    1
    sudo vim /etc/samba/smb.conf
  • 在文件末尾添加以下内容(根据你的实际情况修改):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [git-repos]
    comment = Git Repositories
    path = /srv/git
    browseable = yes
    read only = no
    guest ok = no # 如果需要匿名访问,设置为 yes
    valid users = @gitusers # 允许访问的用户组 (见下一步)
    create mask = 0664
    directory mask = 0775
    force group = gitusers #强制组
    • [git-repos]: 共享名称,客户端访问时使用。
    • path: Git 仓库所在的目录。
    • valid users: 允许访问的用户或用户组(需要先创建用户/组)。
    • guest ok: 是否允许匿名访问(不推荐)。
  • 创建一个 Samba 用户组(例如 gitusers)并将用户添加到该组:

    1
    2
    3
    sudo groupadd gitusers
    sudo usermod -aG gitusers nas
    sudo smbpasswd -a nas

    重复usermodsmbpasswd命令,添加多个用户。

  • 重启 Samba 服务:

    1
    sudo systemctl restart smbd

4. 客户端访问

  • 在 Windows 上:

    • 打开文件资源管理器,在地址栏输入 \\your_server_ip\git-repos (将 your_server_ip 替换为你的服务器 IP 地址或主机名)。
    • 输入你的 Samba 用户名和密码。
    • 你应该能看到 myproject.git 目录。
  • 在 Linux/macOS 上:

    • 可以使用命令行或图形界面的 SMB/CIFS 客户端访问。
    • 挂载 Samba 共享:
      1
      sudo mount -t cifs //your_server_ip/git-repos /mnt/git -o username=yourusername,password=yourpassword
      (将 /mnt/git 替换为你想要挂载到的本地目录)。
  • 使用 Git 客户端克隆仓库:

    1
    2
    3
    git clone smb://your_server_ip/git-repos/myproject.git
    # 或者, 如果已经挂载:
    git clone /mnt/git/myproject.git

    之后就可以像使用普通的 Git 仓库一样进行 addcommitpushpull 等操作。

二、搭建 SVN 服务器并通过 Samba 共享

与 Git 类似,SVN 服务器处理版本控制,Samba 共享 SVN 仓库目录。

1. 安装 SVN 和 Samba

1
2
sudo apt update
sudo apt install subversion samba libapache2-mod-svn

libapache2-mod-svn 提供了通过 Apache 进行 SVN 访问的功能 (可选, 但更安全, 推荐)

2. 创建 SVN 仓库

  • 创建一个用于存放 SVN 仓库的目录(例如 /srv/svn):

    1
    sudo mkdir -p /srv/svn
  • 进入该目录并创建一个 SVN 仓库:

    1
    2
    cd /srv/svn
    sudo svnadmin create myproject # "myproject" 是你的项目名称
  • 设置权限

1
2
3
sudo chown -R www-data:www-data /srv/svn/myproject
sudo chmod -R 775 /srv/svn/myproject

3. (可选, 推荐) 配置 Apache + SVN (更安全)

  • 创建 SVN 的密码文件:

    1
    2
    sudo htpasswd -c /etc/apache2/dav_svn.passwd yourusername  # 创建第一个用户
    sudo htpasswd /etc/apache2/dav_svn.passwd anotheruser # 添加更多用户
  • 创建一个 Apache 配置文件:

    1
    sudo nano /etc/apache2/mods-available/dav_svn.conf

    添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    <Location /svn>
    DAV svn
    SVNParentPath /srv/svn
    AuthType Basic
    AuthName "Subversion Repository"
    AuthUserFile /etc/apache2/dav_svn.passwd
    Require valid-user
    </Location>
  • 启用必要的 Apache 模块并重启 Apache:

    1
    2
    3
    sudo a2enmod dav
    sudo a2enmod dav_svn
    sudo systemctl restart apache2
    • 现在, 可以通过 http://your_server_ip/svn/myproject 来访问 SVN 仓库 (需要用户名和密码).

4. 配置 Samba 共享 (如果不用 Apache, 可以通过 Samba 共享)

  • 编辑 Samba 配置文件:

    1
    sudo nano /etc/samba/smb.conf
  • 在文件末尾添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [svn-repos]
    comment = SVN Repositories
    path = /srv/svn
    browseable = yes
    read only = no
    guest ok = no # 如果需要匿名访问,设置为 yes
    valid users = @svnusers #同上,需要创建svnusers组和用户
    create mask = 0664
    directory mask = 0775
    force group = svnusers
  • 创建 Samba 用户组和用户 (参考 Git 部分的步骤)。

  • 重启 Samba 服务:

    1
    sudo systemctl restart smbd

5. 客户端访问

  • 如果使用 Apache + SVN, 使用 SVN 客户端通过 http://your_server_ip/svn/myproject 访问.
  • 如果使用 Samba 共享:
    • Windows: \\your_server_ip\svn-repos
    • Linux/macOS: smb://your_server_ip/svn-repos (或挂载)
    • 使用 SVN 客户端(如 TortoiseSVN、svn 命令行工具)进行 checkoutcommitupdate 等操作。

smb 启用回收站

Samba 的 vfs_recycle 模块提供了一个简单但实用的回收站功能,可以防止用户意外删除共享文件。当用户通过 Samba 删除文件时,文件不会被立即从服务器上永久删除,而是会被移动到一个特殊的回收站目录中。管理员可以配置回收站的保留策略,例如文件保留时间、回收站最大容量等。

下面是关于 vfs_recycle 模块的详细说明和配置方法:

1. 工作原理

  • 当用户通过 Samba 客户端删除文件时,vfs_recycle 模块会拦截删除操作。
  • 文件不会被真正删除,而是被移动到预先配置好的回收站目录中。
  • 移动到回收站的文件会保留一段时间(可配置),超过保留时间后才会被自动删除。
  • 管理员可以手动清理回收站,或者恢复回收站中的文件。

2. 配置方法

vfs_recycle 模块的配置主要在 Samba 的配置文件 (/etc/samba/smb.conf) 中完成。你可以在全局配置部分 ([global]) 中设置默认的回收站参数,也可以在单个共享配置部分中为特定的共享设置不同的回收站参数。

以下是一个配置示例,添加到你的 smb.conf 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[global]
# ... 其他全局配置 ...

vfs objects = recycle # 在全局配置中启用 recycle 模块

recycle:repository = .recycle/%U # 回收站目录,%U 代表用户名
recycle:keeptree = Yes # 保留原始目录结构
recycle:versions = Yes # 启用版本控制 (如果文件名相同)
recycle:touch = Yes # 更新文件的访问时间
recycle:maxsize = 0 # 回收站最大容量 (0 表示无限制)
recycle:exclude = *.tmp, *.temp # 排除的文件类型
recycle:exclude_dir = /tmp, /cache # 排除的目录
recycle:noversions = *.doc # 不保留版本的文件类型
# recycle:minsize = 1024 # 最小文件大小 (单位: 字节)
# recycle:days_kept = 30 # 文件保留天数

[myshare]
comment = My Shared Folder
path = /path/to/myshare
# ... 其他共享配置 ...

vfs objects = recycle # 也可以在单个共享中启用 recycle 模块
recycle:repository = .recycle/%U #可选,如果需要和全局不一样的配置

参数说明:

  • vfs objects = recycle: 启用 vfs_recycle 模块。可以放在 [global] 部分(对所有共享生效)或单个共享配置部分(只对该共享生效)。
  • recycle:repository = .recycle/%U:
    • 指定回收站目录的位置。
    • .recycle 是回收站目录的名称(可以自定义)。
    • %U 是一个变量,代表删除文件的用户名,这样可以为每个用户创建单独的回收站。
    • 也可以使用绝对路径,例如 /path/to/recycle/%U
    • 如果使用相对路径(如 .recycle),回收站目录会创建在共享目录的根目录下。
  • recycle:keeptree = Yes: 在回收站中保留文件被删除前的原始目录结构。如果设置为 No,所有文件都会被直接放在回收站根目录下。
  • recycle:versions = Yes:
    • 如果回收站中已经存在同名文件,是否创建新版本。
    • 设置为 Yes 时,新版本的文件名会附加一个版本号(例如 file.txt.1file.txt.2)。
    • 设置为 No 时,新文件会覆盖旧文件。
  • recycle:touch = Yes: 当文件被移动到回收站时,更新文件的访问时间(atime)。
  • recycle:maxsize = 0:
    • 设置回收站的最大容量(以字节为单位)。
    • 0 表示无限制。
    • 当回收站达到最大容量时,最早的文件会被自动删除。
  • recycle:exclude = *.tmp, *.temp: 指定不放入回收站的文件类型(使用通配符)。
  • recycle:exclude_dir = /tmp, /cache: 指定不放入回收站的目录(绝对路径)。
  • recycle:noversions = *.doc: 指定不保留版本的文件类型(即使 recycle:versions = Yes)。
  • recycle:minsize = 1024: 指定只有大于此大小(字节)的文件才会被放入回收站。
  • recycle:days_kept = 30: 指定文件在回收站中保留的天数。超过此天数的文件会被自动删除。

3. 注意事项

  • 权限: 确保 Samba 用户对回收站目录有读写权限。
  • 性能: 如果回收站中文件过多,可能会影响 Samba 的性能。建议定期清理回收站。
  • 删除: 回收站中的文件,是真正被删除。
  • 与版本控制的区别: vfs_recycle 模块只是一个简单的回收站功能,它不能像 Git、SVN 那样进行细粒度的版本控制(记录每次修改、回滚到特定版本等)。它只能恢复被删除的文件,而不能恢复文件的历史版本(除非启用了 recycle:versions 并且文件名相同)。
  • 客户端兼容性: 通过smb删除的文件才会进入回收站,直接在服务器上通过rm等命令删除,不会进入回收站。

4. 使用方法

配置完成后,用户通过 Samba 客户端删除文件时,文件会自动进入回收站。管理员可以通过以下方式管理回收站:

  • 直接访问回收站目录: 回收站目录通常位于共享目录的根目录下(如果使用相对路径)或指定的绝对路径下。管理员可以直接访问该目录来查看、恢复或删除回收站中的文件。
  • 使用命令行工具: 可以编写脚本,定期清理回收站中超过保留时间的文件。

通过合理配置 vfs_recycle 模块,你可以为 Samba 共享提供一个简单有效的回收站功能,防止用户误删除文件,提高数据安全性。

about me 个人微信

img

wechat offical 微信公众号

img

Prev:
在ubuntu使用Postfix搭建邮件服务器
Next:
企业级VPN搭建方案对比与指导