在本地网络中使用Sonatype Nexus

16

我已经成功创建了一个用于Java应用程序的小型软件工程环境(SEE),其中包括基于maven和nexus的其他工具。我的实际问题是(并不意外),nexus通常需要访问互联网才能从中央存储库获取所需的构件。但是,SEE必须严格脱机,并且没有改变它的方法(出于安全原因)。

我的第一个快速解决方案是在连接到互联网的机器上镜像nexus / maven安装程序,运行一些标准POM以填充镜像的nexus,并通过CD-ROM将缓存迁移到目标系统。相当丑陋。我确实不想预测如何适应该过程以获取构件更新或新的构件。事实上,我们现在通常只导入我们需要的库并创建新的构件(使用nexus)而不是使用来自中央和其他地方的正式构件。

有人面对了同样的挑战并找到了更聪明有效的方法吗?

编辑

感谢所有答案,我认为我必须更精确地说明实际问题和我正在考虑的解决方案:我认为我必须创建、填充和同步一个基于互联网上的central和其他存储库的私有“中央”存储库,或者确切地说:两个相同的存储库。一个连接到互联网,另一个连接到本地网络。然后我可以保持与互联网连接的存储库“最新”,并通过DVD将更改复制到本地存储库-该存储库对Nexus可见。

这会起作用吗?是否有关于如何在私有服务器上设置类似“central”的文档?是否有选择性同步构件的机制?

(一开始我不想发表我的想法,因为我希望得到完全不同的想法)

第二次编辑 - “最佳实践” - 应请求添加

我们在完全断开与互联网的情况下使用maven的“最佳实践”:

  • 我们在中央服务器上安装了nexus,以便软件开发工作站有一个服务器可以与之通信(它是我们自己的工件存储库)
  • 我们将POM文件导出到一台有网络访问权限的工作站,清空了该机器上的本地仓库,并执行了dependency:go-offline插件)。这样就可以将所有需要的构件填充到本地仓库中。
  • 然后将这个本地仓库导入到安全环境中,并将所有插件添加到Nexus(只需复制文件即可-结构相同)。

每周执行此操作一次(可以自动化),您就可以拥有一个相当稳定和可用的本地仓库。


严格离线,是指断开与互联网的连接还是完全没有网络? - Pascal Thivent
谢谢您的评论 - 环境有一个小型网络:一个带有nexus的服务器,一些带有eclipse IDE的客户端。但是该网络未连接到互联网(或任何其他网络)。 - Andreas Dolk
2
Andreas- 已经过去一年了。你有什么教训要报告吗?我基本上面临着与你完全相同的问题。 - Christopher Painter
@Christopher Painter - 我会在问题中添加自己的“最佳实践”,也许你可以设置类似的过程... - Andreas Dolk
@Andreas_D - 你能告诉我需要复制哪些文件到安全服务器吗?如果我将$HOME/sonatype-work/nexus文件夹复制到安全服务器上的相应文件夹,是否就足够了?谢谢。 - ziggy
有人知道如何在Nexus 3上使其工作吗? 当他们转移到Blob存储时,他们真的让这些类型的过程变得很糟糕。 - robross0606
4个回答

6
“能行吗?有没有文档介绍如何在私有服务器上设置类似'central'的东西,是否有机制可以同步选定的构件?”
嗯,您可以成为“中央仓库”的一个镜像,但是抓取大约10 GB的构件有什么意义呢?您不需要它们,通常的建议是使用存储库管理器。
实际上,我的最初想法是:
  1. 使用连接到SEE之外的互联网的Nexus
  2. rsync此Nexus的内容到DVD上。
  3. 通过DVD将内容复制到SEE的Nexus中。
  4. 定期重复。
我发现这个解决方案很丑陋,但是现在我们对您的情况有了更多细节,这可能是可以接受的。

感谢您的回答。特别是 Maven 链接,我认为这对我很有帮助。第二个 Nexus 是一个好主意,但我必须找到一种方法将构件放入 Nexus 中 - Nexus 通常只在需要时缓存构件,例如由 Maven 构建驱动,并且外部没有“需求”。我想我会调整“公共仓库”解决方案 - 镜像所需的构件并在内部网络上创建该服务器的克隆。 - Andreas Dolk
我没有涉及到那部分,但这确实需要在具有所有必需依赖项的pom上运行maven(例如使用mvn dependency:go-offline,无需编译任何内容)。我猜想不能使用SEE中的pom(s)作为选项... - Pascal Thivent
1
由于 Nexus 3 转向 Blob 存储,这似乎不再容易实现。 - robross0606

4
我曾经在一个网络环境中工作,其中部分网络无法访问互联网或其他网络。每当我们需要在这个网络中更新软件时,我们会执行以下步骤:
  1. 将更新的软件上传到“安全”主机(跳板)
  2. 断开跳板与网络的连接
  3. 将跳板连接到安全网络
  4. 将更新的软件推送到存储库
  5. 断开跳板与安全网络的连接
我们通过自动配置交换机以适当地连接和断开网络(因此始终存在物理连接但没有可用的IP连接)完全自动化了此过程。也许你可以做类似的事情-这取决于“断开连接”的定义的灵活性;)

你很幸运被允许将“跳板”连接到两个网络 - 至少一个接一个地。不幸的是,我的环境更为严格...但这听起来是一个不错的方案! - Andreas Dolk
嗯,这并不是特别好处理的 - 实际上,它相当棘手,需要穿越数十个防火墙和各种安全策略。更不用提所有必须的安全组和认证,以将其投入生产使用 :) - sfussenegger
1
我们在类似的环境中采用的另一种方法是基于SSH隧道技术,实际上,SSH隧道是我们的瑞士军刀:) 我们使用了几个隧道来通过不同的安全层进行连接,但基本上归结为 ssh -R 8080:repo1.maven.org:80 secure.example.org update-repo.sh,然后update-repo.org会从localhost:8080(即repo1.maven.org)下载一些文件。这可能需要严格配置SSH守护程序才能获得安全审批。 - sfussenegger

3

我在自己的环境中遇到了类似的问题。

通常情况下,我们托管Nexus的服务器无法访问互联网。然而,我与运维团队会面并向他们解释,允许Nexus自动从互联网下载构件对我们来说是一个巨大的生产力提升。

一旦他们理解了我们的需求,运维就允许服务器访问非常严格的互联网IP白名单,例如中央Maven仓库。因此,当外部仓库IP地址发生变化时,我们仍然需要通过运维添加新的仓库或执行白名单修复。但总体上,我们认为这是安全和生产力之间最好的折衷方案,并且它适用于我们。

如果你再向利益相关者重申连接网络只限于高度受限制的白名单方式将使你更具生产力并最终节省所有人的时间,看看他们是否会同意。


我喜欢那个想法 - 也许我可以说服我的安全团队采用白名单和临时连接相结合的解决方案...尽管我仍然有疑虑... - Andreas Dolk
当然 - 将临时连接与严格的IP白名单结合起来听起来非常强大。如果您按照sfussenegger的答案进行脚本编写,您应该会得到既安全又有用的东西。 - Brian Laframboise

3

我不确定 - 这难道不只是将问题转移到另一台服务器上吗?在我的情况下,我必须将相同的安全限制应用于“采购存储库”服务器,即:无法连接到互联网。那么我该如何填充和更新采购存储库呢? - Andreas Dolk
它的作用是在Nexus可以联系远程仓库,但代理的事物受到严格控制的情况下工作。通过添加这种额外的“防火墙”层,以前必须完全断开连接的组织现在被允许只通过Nexus进行访问。 - Brian Fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接