我们有 apache 服务器,它为 public_html/site/ 上的站点提供服务,我们希望在同一个目录中有一个 mercurial repo,这样我们就可以将更改直接推送到服务器。
到目前为止,我设置了一个 hgweb.wsgi 脚本,并且可以毫无问题地从 repo 中推送和拉取。
当我想添加身份验证时,问题就开始了。未经授权的用户对存储库的读写访问都应该被禁止。Mercurial 帮助提到使用 HTTP 身份验证,好吧,我可以用 .htpasswd 创建 .htaccess,并将它们放在 public_html/site/ 中,但这会使网站无法访问。
请帮忙。
更新(解决方案): 也许虚拟主机解决方案也可以,但我找到了一个更简单的解决方案。您不必将身份验证放在站点目录中,而必须将其放在 hgweb 脚本所在的位置。然后只需禁止访问站点目录中的 .hg 目录即可!
现在,拉取和推送仅通过 hgweb 脚本进行,并带有身份验证。
答案1
您可以在服务器上设置两个指向同一文档根目录的虚拟主机。一个虚拟主机为网站提供服务,另一个虚拟主机使用 hgweb.wscgi 为 mercurial 存储库提供服务。这样,您可以在第二个虚拟主机配置中设置身份验证。
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /www/domain/public_html/site/
</VirtualHost>
<VirtualHost *:80>
ServerName repo.example.com
DocumentRoot /www/domain/public_html/site/
# auth setup
....
</VirtualHost>
如果您更喜欢使用 .htaccess,那么您也可以通过在 vhost 配置中使用 AccessFileName 指令为 htaccess 文件使用不同的名称。
例如:
访问文件名 .acl
答案2
我通常的做法是使用 SSH 而不是 hgweb 进行推送和拉取。如果直接推送到站点目录,该方案同样有效,但是出于以下几个原因,我不建议这样做。首先,推送到非裸存储库仍然需要签出(可以使用传入钩子轻松修复此问题);其次,如果您搞砸了部署,如果站点目录与存储库目录分开,则更容易修复,此外,拥有单独的目录允许您推送到共享存储库而无需部署(例如,当您需要将尚未准备好上线的代码从一台开发机器移动到另一台开发机器时)。
这个方案的工作原理如下:
- 服务器
- “裸”存储库目录:共享存储库
- “实时”站点目录:hg pull /path/to/bare(在 hgrc 中为其创建一个 [paths] 条目)
- 脚本/别名从裸机拉到实时并执行其他部署任务
- ~/.ssh/authorized_keys 包含用于 ssh 访问的公钥
- 当地的
- “本地”开发目录: hg push ssh://[电子邮件保护]/path/to/bare(在 hgrc 中为此创建一个 [paths] 条目)
- ~/.ssh/rsa_id 用于安全、无密码推送
使用 SSH 也比使用 hgweb 更安全,因为 Apache 进程不能写入“实时”站点目录或“裸”存储库目录。通过 SSH 推送意味着只有 SSH 用户需要对这些目录具有写访问权限。
如果没有裸存储库,它看起来会稍微简单一些,如下所示:
- 服务器
- “实时”站点目录
- ~/.ssh/authorized_keys 包含用于 ssh 访问的公钥
- 当地的
- “本地”开发目录: hg push ssh://[电子邮件保护]/path/to/live(在 hgrc 中为此创建一个 [paths] 条目)
- ~/.ssh/rsa_id 用于安全、无密码推送
但你会失去我上面提到的优势。