• 在Linux上搭建基于开源技术的nuget私人保密仓库


    在Linux上搭建基于开源技术的nuget私人保密仓库

    前言

    在Linux上搭建nuget私人仓库一直是一个老大难的问题,主要涉及到以下难点:

    1. nuget.org官方使用的Nuget.Server基于.NET Framework的ASP.NET,而不是ASP.NET Core,因此是Windows Only(ASP.NET on Mono on Linux一直不是一个成熟的方案)。
    2. 其他的开源nuget服务应用皆不支持private feed(拉取验证)。
    3. 有proget等商业包服务,但是过于笨重且额外功能均为付费。

    目前大多数解决方案都是将nuget服务器放至公司内网,不在internet上暴露,远程连接需要VPN,极为不便。

    在各种尝试后,发现nuget客户端(包括dotnet cli内置的nuget功能)支持basic auth验证,因此得出了以反向代理添添加basic auth和ssl层的方案。

    • 注意!basic auth的用户名密码为明文传输,必须添加ssl层(也就是https)来确保基本安全性。

    本文的技术选型为:

    本文默认CentOS 8、Docker、Docker Compose、.NET 5.0 SDK已经安装,如未安装请参见安装指南/下载页面连接进行安装。


    通过Docker Compose安装运行BaGet镜像

    登入CentOS 8服务器,新建一个文件夹,作为BaGet服务的文件夹,下面用 BAGET 指代该文件夹的路径:

    mkdir -p BAGET && cd BAGET

    在BAGET文件夹下添加一个环境配置文件 baget.env ,内容如下:

    • 将NUGET-SERVER-API-KEY替换为你推送nuget包时所使用的api key,可以是一个较长的密码字符串。
    ApiKey=NUGET-SERVER-API-KEY
    
    Storage__Type=FileSystem
    Storage__Path=/var/baget/packages
    Database__Type=Sqlite
    Database__ConnectionString=Data Source=/var/baget/baget.db
    Search__Type=Database

    在BAGET文件夹下添加一个Docker Compose配置文件 docker-compose.yml ,内容如下:

    • 将12345替换成一个未被占用本地映射端口。
    version: "2"
    
    networks:
      baget:
        external: false
    
    services:
      server:
        image: loicsharma/baget:latest
        env_file: ./baget.env
        restart: always
        networks:
          - baget
        volumes:
          - ./baget:/var/baget
        ports:
          - "127.0.0.1:12345:80"

    启动docker镜像:

    docker-compose up -d

    通过curl确认baget正常启动:

    curl "http://localhost:12345/"

    配置nginx反向代理

    通过htpasswd配置密码文件

    安装htpasswd:

    dnf install -y httpd-tools

    创建密码文件:

    • 将admin, 123456替换为登录验证的第一个用户的用户名和密码,下同。
    htpasswd -bc BAGET/.htpasswd admin 123456
    chmod 644 BAGET/.htpasswd

    添加用户:

    htpasswd -b BAGET/.htpasswd admin 123456

    删除用户可以直接在 BAGET/.htpasswd 中删除用户的对应行。

    配置nginx

    在 /etc/nginx/conf.d 文件夹下添加一个配置文件 baget.conf 内容如下:

    • 将DOMAIN_NAME替换为访问nuget服务的域名,BAGET为之前创建的文件夹,12345为之前指定的端口号。
    • 这里使用80端口而不是443,以供certbot自动生成ssl配置。
    server {
        server_name DOMAIN_NAME;
    
        location / {
            proxy_pass http://127.0.0.1:12345;
            auth_basic "Login";
            auth_basic_user_file BAGET/.htpasswd;
            sub_filter_once off;
            sub_filter_types application/json;
            sub_filter 'http://127.0.0.1:12345/' 'https://DOMAIN_Name/';
        }
    
        listen 80;
    }

    配置certbot

    安装certbot:

    wget https://dl.eff.org/certbot-auto
    sudo mv certbot-auto /usr/local/bin/certbot-auto
    sudo chown root /usr/local/bin/certbot-auto
    sudo chmod 0755 /usr/local/bin/certbot-auto

    启动certbot:

    sudo /usr/local/bin/certbot-auto --nginx

    执行后会要求你键盘输入:

      你的邮箱(填写自己的邮箱)

      是否接受协议(必须接受)

      是否接收推送邮件(可以不接收)

      打开哪些网站的ssl(直接回车代表全部)

      是否将http连接重定向到https(一定要选是,否则会有密码泄露的风险)

    打开自动续订:

    echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew -q" | sudo tee -a /etc/crontab > /dev/null

    最后,在自己电脑上打开浏览器“https://DOMAIN_NAME/”打开站点,测试服务是否正常配置。

    配置客户端

    在自己的桌面电脑上配置nuget,添加私有源:

    • 将myRepo, admin, 123456, DOMAIN_NAME分别替换成你的私有源名称,以及之前设置的账号、密码、域名
    dotnet nuget add source -n myRepo -u admin -p 123456 https://DOMAIN_NAME/v3/index.json --valid-authentication-types basic

    做好一个nuget包,并推送至私有源进行推送测试:

    • 将myRepo, NUGET-SERVER-API-KEY, myPackage.nupkg分别替换成之前设置的私有源名称、api key、nuget包路径
    dotnet nuget push -s myRepo -k NUGET-SERVER-API-KEY myPackage.nupkg

    创建一个.NET Core项目,并添加包应用进行拉取测试:

    dotnet add package myPackage

    完成!

  • 相关阅读:
    .NET HttpWebRequest应用
    .NET 文件上传和文件接收
    小程序报错:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2
    发布微信小程序体验版
    .NET 通过entity framework报数据库连接错误:ORA-01017: invalid username/password; logon denied
    将Oracle 12c的某用户数据迁移至OracleXE的用户
    C# Oracle 时间字符串转时间类型
    在.NET中调用Java的类
    Oracle 取前几条记录
    oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
  • 原文地址:https://www.cnblogs.com/alsein/p/12937962.html
Copyright © 2020-2023  润新知