Nexus

概述

Nexus Repository Manager 是一个强大的开源仓库管理工具,主要用于存储和管理软件包、构件和依赖项。它支持多种格式,帮助开发团队更有效地管理其开发和发布流程。

核心功能

  • 多格式支持:支持 Maven、npm、Docker、NuGet、PyPI、RubyGems、Go 等 20+ 种仓库格式
  • 代理仓库:缓存远程仓库(如 Maven Central、npmjs),加速构建并减少网络依赖
  • 私有仓库:托管企业内部构件和制品,支持版本管理和访问控制
  • 仓库组:聚合多个仓库,提供统一访问地址
  • 安全审计:支持用户权限管理、LDAP 集成和内容审计

典型应用场景

  • Java(Maven)项目的依赖管理
  • Docker 镜像私有仓库
  • 前端项目(npm)的包管理
  • 企业内部制品统一管理

部署准备

1. 系统要求

项目 最低配置 推荐配置
CPU 2 核 4 核+
内存 2 GB 4 GB+
硬盘 20 GB 50 GB+
Docker 18.06+ 最新版

注意:Nexus 对资源消耗较大,生产环境建议 4 核 4GB 以上配置。

2. 创建 Docker Compose 编排文件

docker-compose.yaml

services:
  nexus:
    image: sonatype/nexus3:3.67.1-java11
    container_name: nexus
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - NEXUS_CONTEXT=/
      - INSTALL4J_ADD_VM_PARAMS=-Xms512m -Xmx2g -XX:MaxDirectMemorySize=2g
    ports:
      - "8081:8081"
    volumes:
      - nexus_data:/nexus-data
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: "4G"
volumes:
  nexus_data:

3. 环境变量说明

变量 说明
NEXUS_CONTEXT 上下文路径,默认 /
INSTALL4J_ADD_VM_PARAMS JVM 参数,-Xms 初始堆,-Xmx 最大堆,MaxDirectMemorySize 直接内存

数据持久化nexus_data Volume 存储所有仓库数据、配置和日志,删除 Volume 将丢失全部数据。


启动服务

docker compose up -d

查看启动日志(首次启动初始化耗时较长,约 2-5 分钟):

docker logs nexus -f --tail=50

验证访问

curl http://127.0.0.1:8081

在浏览器中打开 http://<服务器IP>:8081 即可访问 Nexus。


初始配置

1. 获取管理员密码

首次启动时,Nexus 会为 admin 用户生成随机密码,查看方式如下:

# 进入容器
docker exec -it nexus /bin/bash

# 查看初始密码
cat /nexus-data/admin.password

或直接执行:

docker exec nexus cat /nexus-data/admin.password

输出示例:abcd1234-efgh-5678-ijkl-9012mnop3456

2. 登录并重置密码

  1. 浏览器访问 http://<服务器IP>:8081
  2. 点击右上角 Sign In,用户名 admin,密码为上述初始密码
  3. 按提示设置新密码

3. 启用匿名访问(可选)

根据提示选择是否启用匿名访问:

  • 如需允许未登录用户拉取公开仓库,选择 Enable anonymous access
  • 如仅允许认证用户访问,选择 Disable anonymous access

常用管理命令

操作 命令
启动 Nexus docker compose up -d
停止 Nexus docker compose stop
重启 Nexus docker compose restart
查看状态 docker compose ps
查看日志 docker logs nexus -f --tail=100
进入容器 docker exec -it nexus /bin/bash

常见仓库类型

仓库类型 说明 适用场景
hosted 本地托管仓库 存储企业内部开发的制品
proxy 代理远程仓库 缓存中央仓库(Maven Central、npmjs 等)
group 仓库组 聚合多个仓库,提供统一访问地址

创建 Maven 代理仓库示例

  1. 登录 Nexus → RepositoryCreate repository
  2. 选择 maven2 (proxy)
  3. 填写:
    • Namemaven-central-proxy
    • Remote storagehttps://repo1.maven.org/maven2/
    • 其他默认即可
  4. 点击 Create repository

创建 Docker 私有仓库示例

  1. 登录 Nexus → RepositoryCreate repository
  2. 选择 docker (hosted)
  3. 填写:
    • Namedocker-private
    • HTTP:端口 8082
    • Enable Docker V1 API:勾选
  4. 点击 Create repository

配置 Nexus 使用外部数据库(可选)

默认使用 H2 嵌入式数据库,生产环境建议切换至 PostgreSQL:

services:
  nexus:
    image: sonatype/nexus3:3.67.1-java11
    container_name: nexus
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - NEXUS_CONTEXT=/
      - NEXUS_DB_TYPE=postgresql
      - NEXUS_DB_HOST=postgres
      - NEXUS_DB_PORT=5432
      - NEXUS_DB_NAME=nexus
      - NEXUS_DB_USER=nexus
      - NEXUS_DB_PASSWORD=nexus123
    ports:
      - "8081:8081"
    volumes:
      - nexus_data:/nexus-data
    depends_on:
      - postgres

  postgres:
    image: postgres:15
    container_name: nexus-postgres
    restart: always
    environment:
      - POSTGRES_USER=nexus
      - POSTGRES_PASSWORD=nexus123
      - POSTGRES_DB=nexus
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - 5432:5432
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: "1G"

volumes:
  nexus_data:
  postgres_data:

常见问题

Q:启动后浏览器访问 502 或响应缓慢?

  1. 确认容器是否正常运行:
docker ps | grep nexus
  1. 首次启动需要初始化数据库,耗时较长,可通过日志查看进度:
docker logs nexus -f --tail=50
  1. 检查资源是否充足,Nexus 最低需 2GB 内存:
docker stats nexus

Q:忘记 admin 密码怎么办?

进入容器重置密码:

docker exec -it nexus /bin/bash
cat /nexus-data/admin.password

或通过 API 重置:

curl -u admin:oldpassword -X PUT http://localhost:8081/service/rest/v1/security/users/admin/change-password -d '{"password":"newpassword"}' -H "Content-Type: application/json"

Q:磁盘空间不足如何清理?

进入 Nexus 管理界面:

  • Repository → Cleanup policies 配置清理策略
  • 手动删除旧版本制品(需谨慎)

清理临时文件:

# 进入容器清理缓存
docker exec -it nexus /bin/bash
rm -rf /nexus-data/cache/*
rm -rf /nexus-data/tmp/*
docker compose restart nexus

Q:如何备份 Nexus 数据?

# 停止 Nexus
docker compose down

# 备份数据卷
docker run --rm -v nexus_nexus_data:/data alpine tar czf /tmp/nexus_backup_$(date +%Y%m%d).tar.gz -C /data .

# 重启
docker compose up -d

Q:如何配置反向代理?

在 Nginx 配置中添加:

server {
    listen 80;
    server_name nexus.example.com;

    location / {
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

参考链接