diff --git a/.env.example b/.env.example index 66f0759..6b8c763 100644 --- a/.env.example +++ b/.env.example @@ -1,41 +1,10 @@ -# -# Application Settings -# - -# Set this to the url moonlight is accessible through the internet -MOONLIGHT_URL=http://localhost:9069 - -# This defines the port moonlight should run on -MOONLIGHT_PORT=9069 - -# Here you can adjust where the moonlight instance will save -# the application and database data -MOONLIGHT_DATA=./data - -# With the following settings you can adjust the database configuration -MOONLIGHT_DATABASE_USER=moonlight -MOONLIGHT_DATABASE_PASSWORD=s3cret -MOONLIGHT_DATABASE_NAME=moonlight - -# -# Build Settings -# - -# This defines the way to get the moonlight docker image -# By default moonlight will build the image locally. To pull -# it from the registry, set the value to 'always' -MOONLIGHT_PULL_POLICY=build - -# This defines the image name to use when building/pulling -# the moonlight docker image -MOONLIGHT_IMAGE=moonlightpanel/panel:2.1 - -# Moonlight uses githubs nuget registry for development packages -# Due to githubs restrictions you need an access token (classic) with the -# read.packages permission -MOONLIGHT_GITHUB_TOKEN=your-github-access-token-goes-here -MOONLIGHT_NUGET_SOURCE=https://nuget.pkg.github.com/Moonlight-Panel/index.json - -# Specify where the fetch the moonlight source code when building -MOONLIGHT_REPOSITORY=https://github.com/Moonlight-Panel/Moonlight -MOONLIGHT_BRANCH=v2_ChangeArchitecture \ No newline at end of file +DATABASE_HOST=database +DATABASE_PORT=5432 +DATABASE_USERNAME=moonlight +DATABASE_PASSWORD=super-secret-password +DATABASE_DATABASE=moonlight +OIDC_AUTHORITY=http://localhost:8092 +OIDC_AUTHORITY=http://localhost:8092 +OIDC_CLIENT_ID=client_id +OIDC_CLIENT_SECRET=client_secret +OIDC_REQUIRE_HTTPS_METADATA=false \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 68e38f0..92b1362 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,71 +1,73 @@ -# Prepare runtime docker image -FROM cgr.dev/chainguard/aspnet-runtime:latest AS base +# +# Prepare build image for building moonlight +# +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build -# Prepare build image -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-moonlight +# Install required packages +RUN apt-get update; apt-get install nodejs npm -y; apt-get clean -# === Heavy download/install tasks === -# should be put here for caching reasons +# +# Build & publish projects +# +FROM build AS publish -# Install nodejs and npm so we can build tailwind -RUN apt-get update && apt-get install nodejs npm git -y && apt-get clean - -# === Configuration options === - -# Usefull for custom forks ARG BUILD_CONFIGURATION=Release -ARG MOONLIGHT_REPO=https://github.com/Moonlight-Panel/Moonlight -ARG MOONLIGHT_BRANCH=v2_ChangeArchitecture -ARG MOONLIGHT_NUGET_SOURCE=https://nuget.pkg.github.com/Moonlight-Panel/index.json -ARG MOONLIGHT_GITHUB_TOKEN=unset - -# === Small preparations === - -# Prepare directories -RUN mkdir -p /src +ARG GIT_REPOSITORY=https://git.battlestati.one/Moonlight-Panel/Moonlight +ARG GIT_BRANCH=v2.1 # Setup nuget package source -RUN dotnet nuget add source --username Build --password $MOONLIGHT_GITHUB_TOKEN --store-password-in-clear-text --name nuget-moonlight $MOONLIGHT_NUGET_SOURCE - +COPY ["nuget.config", "/context/nuget.config"] + +# Clone source code WORKDIR /src +RUN git clone -b $GIT_BRANCH --single-branch $GIT_REPOSITORY . -# === Building === +# Save hash of commit +WORKDIR /src +RUN mkdir -p "/output" && git log -1 --pretty=format:"%H" > /output/version -# Clone the main moonlight repo -RUN git clone --branch $MOONLIGHT_BRANCH $MOONLIGHT_REPO /src/. +# TODO: Implement plugin loading here # Install npm packages -WORKDIR /src/Moonlight.Client.Runtime/Styles -RUN npm i +WORKDIR /src/Hosts/Moonlight.Frontend.Host/Styles +RUN npm install +# Install nuget packages WORKDIR /src +RUN dotnet restore --configfile /context/nuget.config "Hosts/Moonlight.Api.Host/Moonlight.Api.Host.csproj" +RUN dotnet restore --configfile /context/nuget.config "Hosts/Moonlight.Frontend.Host/Moonlight.Frontend.Host.csproj" -# Copying plugin references to src -COPY Plugins.ApiServer.props /src/Moonlight.ApiServer.Runtime/Plugins.props -COPY Plugins.Frontend.props /src/Moonlight.Client.Runtime/Plugins.props +# Build styles +# - We need to build the frontend before the tailwind build, so the class lists get generated +WORKDIR "/src/Hosts/Moonlight.Frontend.Host" +RUN dotnet build --no-restore "./Moonlight.Frontend.Host.csproj" -c $BUILD_CONFIGURATION -o /output/build-frontend -# Build solution so every build task ran. Especially for tailwind class names etc -RUN dotnet build -c $BUILD_CONFIGURATION +WORKDIR "/src/Hosts/Moonlight.Frontend.Host/Styles" +RUN npm run build -# Build tailwind -WORKDIR /src/Moonlight.Client.Runtime/Styles -RUN npm run tailwind-build +# Build projects +WORKDIR "/src/Hosts/Moonlight.Api.Host" +RUN dotnet build --no-restore "./Moonlight.Api.Host.csproj" -c $BUILD_CONFIGURATION -o /output/build-api -# Build moonlight with the built tailwind assets -WORKDIR "/src/Moonlight.ApiServer.Runtime" -RUN dotnet build "Moonlight.ApiServer.Runtime.csproj" -c $BUILD_CONFIGURATION -o /app/build/ +WORKDIR "/src/Hosts/Moonlight.Frontend.Host" +RUN dotnet build --no-restore "./Moonlight.Frontend.Host.csproj" -c $BUILD_CONFIGURATION -o /output/build-frontend -# Publish application -FROM build-moonlight AS publish +# Publish projects +WORKDIR "/src/Hosts/Moonlight.Api.Host" +RUN dotnet publish --no-restore "./Moonlight.Api.Host.csproj" -c $BUILD_CONFIGURATION -o /output/publish-api /p:UseAppHost=false -ARG BUILD_CONFIGURATION=Release +WORKDIR "/src/Hosts/Moonlight.Frontend.Host" +RUN dotnet publish --no-restore "./Moonlight.Frontend.Host.csproj" -c $BUILD_CONFIGURATION -o /output/publish-frontend /p:UseAppHost=false -RUN dotnet publish "Moonlight.ApiServer.Runtime.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false - -# Create final minimal image -FROM base AS final +# +# Construct final docker image +# +FROM cgr.dev/chainguard/aspnet-runtime:latest AS final WORKDIR /app -COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "Moonlight.ApiServer.Runtime.dll"] \ No newline at end of file +COPY --from=publish /output/publish-api . +COPY --from=publish /output/publish-frontend/wwwroot ./wwwroot +COPY --from=publish /output/version . + +ENTRYPOINT ["dotnet", "Moonlight.Api.Host.dll"] \ No newline at end of file diff --git a/Plugins.ApiServer.props b/Plugins.ApiServer.props deleted file mode 100644 index 64d3507..0000000 --- a/Plugins.ApiServer.props +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Plugins.Frontend.props b/Plugins.Frontend.props deleted file mode 100644 index 384e727..0000000 --- a/Plugins.Frontend.props +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/compose.yml b/compose.yml index 0447038..531f104 100644 --- a/compose.yml +++ b/compose.yml @@ -1,49 +1,70 @@ -services: - api-server: - user: 0:0 - restart: always - image: ${MOONLIGHT_IMAGE} +services: + app: + # Meta + image: moonlight-deploy + + # Build + pull_policy: build build: context: . - dockerfile: ./Dockerfile + dockerfile: Dockerfile args: - - MOONLIGHT_REPO=${MOONLIGHT_REPOSITORY} - - MOONLIGHT_BRANCH=${MOONLIGHT_BRANCH} - - MOONLIGHT_GITHUB_TOKEN=${MOONLIGHT_GITHUB_TOKEN} - - MOONLIGHT_NUGET_SOURCE=${MOONLIGHT_NUGET_SOURCE} - ports: - - "${MOONLIGHT_PORT}:8080" + HTTP_PROXY: ${HTTP_PROXY} + HTTPS_PROXY: ${HTTPS_PROXY} + + # Requirements depends_on: - db: + database: condition: service_healthy + + # Networks + networks: + - moonlight + ports: + - "8080:8080" + + # Env Settings environment: - - MOONLIGHT_DATABASE_HOST=db - - MOONLIGHT_DATABASE_PORT=5432 - - MOONLIGHT_DATABASE_USERNAME=${MOONLIGHT_DATABASE_USER} - - MOONLIGHT_DATABASE_PASSWORD=${MOONLIGHT_DATABASE_PASSWORD} - - MOONLIGHT_DATABASE_DATABASE=${MOONLIGHT_DATABASE_NAME} - - MOONLIGHT_PUBLICURL=${MOONLIGHT_URL} - - MOONLIGHT_AUTHENTICATION_OAUTH2_ACCESSENDPOINT=http://localhost:8080/oauth2/handle # Use this when moonlight is using local oauth2 and a different port as the public url - env_file: - - path: "additional.env" - required: false - volumes: - - ${MOONLIGHT_DATA}/moonlight:/app/storage - links: - - db - pull_policy: ${MOONLIGHT_PULL_POLICY} + # Database settings + - "Moonlight__Database__Host=${DATABASE_HOST}" + - "Moonlight__Database__Port=${DATABASE_PORT}" + - "Moonlight__Database__Username=${DATABASE_USERNAME}" + - "Moonlight__Database__Password=${DATABASE_PASSWORD}" + - "Moonlight__Database__Database=${DATABASE_DATABASE}" + + # OIDC + - "Moonlight__OIDC__Authority=${OIDC_AUTHORITY}" + - "Moonlight__OIDC__ClientId=${OIDC_CLIENT_ID}" + - "Moonlight__OIDC__ClientSecret=${OIDC_CLIENT_SECRET}" + - "Moonlight__OIDC__RequireHttpsMetadata=${OIDC_REQUIRE_HTTPS_METADATA:-true}" + - "Moonlight__OIDC__Scopes__0=openid" + - "Moonlight__OIDC__Scopes__1=identify" + - "Moonlight__OIDC__Scopes__2=email" + + # Logging + - "Logging__LogLevel__Default=Information" + - "Logging__LogLevel__Microsoft.AspNetCore=Warning" - db: - image: postgres:latest - restart: always + database: + image: postgres:18.1 + + networks: + - moonlight + environment: - - POSTGRES_USER=${MOONLIGHT_DATABASE_USER} - - POSTGRES_DB=${MOONLIGHT_DATABASE_NAME} - - POSTGRES_PASSWORD=${MOONLIGHT_DATABASE_PASSWORD} + - "POSTGRES_USER=${DATABASE_USERNAME}" + - "POSTGRES_PASSWORD=${DATABASE_PASSWORD}" + - "POSTGRES_DB=${DATABASE_DATABASE}" + - "PGDATA=/pgdata" + volumes: - - ${MOONLIGHT_DATA}/database:/var/lib/postgresql/data + - ./data/database:/var/lib/postgresql/data + healthcheck: - test: ["CMD-SHELL", "pg_isready"] + test: [ "CMD", "pg_isready", "-q", "-d", $DATABASE_DATABASE, "-U", $DATABASE_USERNAME] interval: 10s timeout: 5s retries: 5 + +networks: + moonlight: \ No newline at end of file diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..05f6b5e --- /dev/null +++ b/nuget.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/update.sh b/update.sh deleted file mode 100755 index 017d54b..0000000 --- a/update.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -set -e - -source .env - -echo "[i] Updating your moonlight instance" - -echo "[i] Checking for updates on deploy repo" - -# Fetch remote updates -git fetch - -# Get current branch name -branch=$(git rev-parse --abbrev-ref HEAD) - -# Compare local and remote branch -local_commit=$(git rev-parse "$branch") -remote_commit=$(git rev-parse "origin/$branch") - -if [ "$local_commit" != "$remote_commit" ]; then - echo "[i] The deploy repository has updates. Fetching changes" - git pull - echo "[i] Updated deploy tools. Please rerun the update.sh" - exit 0 -else - echo "[i] No update of the deploy repository available" -fi - -if [ "$MOONLIGHT_PULL_POLICY" == "build" ]; then - echo "[i] Rebuilding the docker image" - docker compose build - echo "[i] Rebuild done" -fi - -if [ "$MOONLIGHT_PULL_POLICY" == "always" ]; then - echo "[i] Pulling the latest docker image" - docker compose pull - echo "[i] Pulling completed" -fi - -echo "[i] Stopping containers" -docker compose down - -echo "[i] Starting containers" -docker compose up -d - -echo "[i] Update done :>" \ No newline at end of file