💭

RaspberryPiにローカルNugetサーバを建てた

2023/09/26に公開

概要

Dockerで軽量NugetサーバBaGetを起動する。
https://github.com/loic-sharma/BaGet

Dockerfile

Arm64向けのDockerfileはないのでイメージ作成から

FROM mcr.microsoft.com/dotnet/aspnet:3.1

# ワーキングディレクトリの設定
WORKDIR /app

# BaGetのビルド済みバイナリをダウンロード・配置・解凍
ADD https://github.com/loic-sharma/BaGet/releases/download/v0.4.0-preview2/BaGet.zip /app/
RUN apt-get update && apt-get install -y unzip && unzip BaGet.zip && rm BaGet.zip

# 環境変数の設定
ENV ASPNETCORE_URLS=http://+:80 \
    DOTNET_RUNNING_IN_CONTAINER=true

# BaGet用のコンテナイメージの作成
ENTRYPOINT ["dotnet", "BaGet.dll"]

特にこだわりはないのでプロジェクトが動く最低限のバージョン(3.1)を利用。
公式Githubを見ても数年動いてないのでバージョン決め打ちでダウンロード

docker build -t baget .

イメージをビルド

Bagetの設定

docker run -d baget:latest
docker ps -a |grep baget:latest
53645734ca6b   baget:latest               "dotnet BaGet.dll"       3 minutes ago       Exited (0) 2 minutes ago                                                     wizardly_diffie
mkdir data
docker cp wizardly_diffie:/app/appsettings.json .
docker cp wizardly_diffie:/app/baget.db data

一旦起動して必要そうな設定ファイルとDBファイルを外にだす。

appsettings.json
{
  "ApiKey": "****************",
  "PackageDeletionBehavior": "Unlist",
  "AllowPackageOverwrites": false,

  "Database": {
    "Type": "Sqlite",
    "ConnectionString": "Data Source=/data/baget.db"
  },

  "Storage": {
    "Type": "FileSystem",
    "Path": "/data/storage"
  },
...

ApiKeyとDatabase.ConnectString(Data Sourceの位置)、Storageの場所だけ設定

composeに追加

docker-compose.yaml
  baget:
    image: baget
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - ./baget/appsettings.json:/app/appsettings.json
      - ./baget/data:/data

既存のWeb用のcomposeに追加

nginxの設定

    server {
        listen 80;
        server_name baget.my-domain.lan;

        location / {
            proxy_pass http://baget:80;
            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;
        }
    }

※予め*.my-domain.lanをこのサーバで処理するようにDNSを設定している。
BaGetは(たぶん)location単位でのサービス起動に対応していなかったため、このような設定になった。

nugetへのソース登録

dotnet nuget Add source http://baget.mydomain.lan/v3/index.json -n "baget.mydomain"
dotnet pack -c Release
dotnet nuget push -s "baget.mydomain" -k "****************"  bin\Release\test.1.0.0.nupkg

Discussion