diff --git a/.dockerignore b/.dockerignore index cd967fc..efcb815 100644 --- a/.dockerignore +++ b/.dockerignore @@ -22,4 +22,6 @@ **/secrets.dev.yaml **/values.dev.yaml LICENSE -README.md \ No newline at end of file +README.md +Manga +settings diff --git a/.github/workflows/docker-base.yml b/.github/workflows/docker-base.yml deleted file mode 100644 index cedd6d2..0000000 --- a/.github/workflows/docker-base.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Docker Image CI - -on: - workflow_dispatch: - -jobs: - - build: - - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - # https://github.com/docker/setup-qemu-action#usage - - name: Set up QEMU - uses: docker/setup-qemu-action@v3.2.0 - - # https://github.com/marketplace/actions/docker-setup-buildx - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3.6.1 - - # https://github.com/docker/login-action#docker-hub - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - # https://github.com/docker/build-push-action#multi-platform-image - - name: Build and push base - uses: docker/build-push-action@v6.7.0 - with: - context: ./ - file: ./Dockerfile-base - #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 - platforms: linux/amd64 - pull: true - push: true - tags: | - glax/tranga-base:latest \ No newline at end of file diff --git a/.github/workflows/docker-image-cuttingedge.yml b/.github/workflows/docker-image-cuttingedge.yml index b5b6c3a..35c35b6 100644 --- a/.github/workflows/docker-image-cuttingedge.yml +++ b/.github/workflows/docker-image-cuttingedge.yml @@ -38,7 +38,7 @@ jobs: context: ./ file: ./Dockerfile #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 pull: true push: true tags: | diff --git a/.github/workflows/docker-image-dev.yml b/.github/workflows/docker-image-dev.yml index 8750d13..3387bcf 100644 --- a/.github/workflows/docker-image-dev.yml +++ b/.github/workflows/docker-image-dev.yml @@ -38,7 +38,7 @@ jobs: context: ./ file: ./Dockerfile #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 pull: true push: true tags: | diff --git a/.github/workflows/docker-image-master.yml b/.github/workflows/docker-image-master.yml index db2403c..dd98c5e 100644 --- a/.github/workflows/docker-image-master.yml +++ b/.github/workflows/docker-image-master.yml @@ -38,7 +38,7 @@ jobs: context: ./ file: ./Dockerfile #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 pull: true push: true tags: | diff --git a/.github/workflows/docker-image-serverv2.yml b/.github/workflows/docker-image-serverv2.yml index f160d58..23d2c2f 100644 --- a/.github/workflows/docker-image-serverv2.yml +++ b/.github/workflows/docker-image-serverv2.yml @@ -38,7 +38,7 @@ jobs: context: ./ file: ./Dockerfile #platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6 - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 pull: true push: true tags: | diff --git a/.gitignore b/.gitignore index 456b786..d439ba7 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,7 @@ riderModule.iml /.idea cover.jpg cover.png -/.vscode \ No newline at end of file +/.vscode +/Manga +/settings +*.DotSettings.user \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 25d4758..e3938b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,29 +1,42 @@ # syntax=docker/dockerfile:1 +ARG DOTNET=7.0 -FROM mcr.microsoft.com/dotnet/sdk:7.0 as build-env +FROM mcr.microsoft.com/dotnet/runtime:$DOTNET AS base +WORKDIR /publish +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true +ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium +RUN apt-get update \ + && apt-get install -y libx11-6 libx11-xcb1 libatk1.0-0 libgtk-3-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 libxshmfence1 libnss3 chromium \ + && apt-get autopurge -y \ + && apt-get autoclean -y + +FROM mcr.microsoft.com/dotnet/sdk:$DOTNET AS build-env WORKDIR /src -COPY CLI /src/CLI -COPY Tranga /src/Tranga -COPY Logging /src/Logging -COPY Tranga.sln /src -RUN dotnet restore /src/Tranga/Tranga.csproj -RUN dotnet publish -c Release -o /publish -FROM glax/tranga-base:latest as runtime +COPY Tranga.sln /src +COPY CLI/CLI.csproj /src/CLI/CLI.csproj +COPY Logging/Logging.csproj /src/Logging/Logging.csproj +COPY Tranga/Tranga.csproj /src/Tranga/Tranga.csproj +RUN dotnet restore /src/Tranga.sln + +COPY . /src/ +RUN dotnet publish -c Release -o /publish -maxcpucount:1 + +FROM base AS runtime EXPOSE 6531 ARG UNAME=tranga ARG UID=1000 ARG GID=1000 -RUN groupadd -g $GID -o $UNAME -RUN useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME -RUN mkdir /usr/share/tranga-api -RUN mkdir /Manga -RUN chown 1000:1000 /usr/share/tranga-api -RUN chown 1000:1000 /Manga +RUN groupadd -g $GID -o $UNAME \ + && useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME \ + && mkdir /usr/share/tranga-api \ + && mkdir /Manga \ + && chown 1000:1000 /usr/share/tranga-api \ + && chown 1000:1000 /Manga USER $UNAME WORKDIR /publish -COPY --from=build-env /publish . +COPY --chown=1000:1000 --from=build-env /publish . USER 0 -RUN chown 1000:1000 /publish -ENTRYPOINT ["dotnet", "/publish/Tranga.dll", "-f", "-c", "-l", "/usr/share/tranga-api/logs"] +ENTRYPOINT ["dotnet", "/publish/Tranga.dll"] +CMD ["-f", "-c", "-l", "/usr/share/tranga-api/logs"] \ No newline at end of file diff --git a/Dockerfile-base b/Dockerfile-base deleted file mode 100644 index 6c9c7f1..0000000 --- a/Dockerfile-base +++ /dev/null @@ -1,8 +0,0 @@ -# syntax=docker/dockerfile:1 -#FROM mcr.microsoft.com/dotnet/aspnet:7.0 as runtime -FROM mcr.microsoft.com/dotnet/runtime:7.0 as runtime -WORKDIR /publish -RUN apt-get update -RUN apt-get install -y libx11-6 libx11-xcb1 libatk1.0-0 libgtk-3-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2 libxshmfence1 libnss3 -RUN apt-get autopurge -y -RUN apt-get autoclean -y \ No newline at end of file diff --git a/Tranga/Manga.cs b/Tranga/Manga.cs index 5ebad19..357f940 100644 --- a/Tranga/Manga.cs +++ b/Tranga/Manga.cs @@ -128,10 +128,19 @@ public struct Manga public void MovePublicationFolder(string downloadDirectory, string newFolderName) { string oldPath = Path.Join(downloadDirectory, this.folderName); - this.folderName = newFolderName; + this.folderName = newFolderName;//Create new Path with the new folderName string newPath = CreatePublicationFolder(downloadDirectory); - if(Directory.Exists(oldPath)) - Directory.Move(oldPath, newPath); + if (Directory.Exists(oldPath)) + { + if (Directory.Exists(newPath)) //Move/Overwrite old Files, Delete old Directory + { + IEnumerable newPathFileNames = new DirectoryInfo(newPath).GetFiles().Select(fi => fi.Name); + foreach(FileInfo fileInfo in new DirectoryInfo(oldPath).GetFiles().Where(fi => newPathFileNames.Contains(fi.Name) == false)) + File.Move(fileInfo.FullName, Path.Join(newPath, fileInfo.Name), true); + Directory.Delete(oldPath); + }else + Directory.Move(oldPath, newPath); + } } public void UpdateLatestDownloadedChapter(Chapter chapter)//TODO check files if chapters are all downloaded diff --git a/Tranga/MangaConnectors/ChromiumDownloadClient.cs b/Tranga/MangaConnectors/ChromiumDownloadClient.cs index d7e6523..9042812 100644 --- a/Tranga/MangaConnectors/ChromiumDownloadClient.cs +++ b/Tranga/MangaConnectors/ChromiumDownloadClient.cs @@ -13,40 +13,12 @@ internal class ChromiumDownloadClient : DownloadClient private const int StartTimeoutMs = 30000; private readonly HttpDownloadClient _httpDownloadClient; - private async Task DownloadBrowser() + private async Task StartBrowser() { - BrowserFetcher browserFetcher = new (); - foreach(string rev in browserFetcher.LocalRevisions().Where(rev => rev != ChromiumVersion)) - browserFetcher.Remove(rev); - if (!browserFetcher.LocalRevisions().Contains(ChromiumVersion)) - { - Log("Downloading headless browser"); - DateTime last = DateTime.Now.Subtract(TimeSpan.FromSeconds(5)); - browserFetcher.DownloadProgressChanged += (_, args) => - { - double currentBytes = Convert.ToDouble(args.BytesReceived) / Convert.ToDouble(args.TotalBytesToReceive); - if (args.TotalBytesToReceive == args.BytesReceived) - Log("Browser downloaded."); - else if (DateTime.Now > last.AddSeconds(1)) - { - Log($"Browser download progress: {currentBytes:P2}"); - last = DateTime.Now; - } - - }; - if (!browserFetcher.CanDownloadAsync(ChromiumVersion).Result) - { - Log($"Can't download browser version {ChromiumVersion}"); - throw new Exception(); - } - await browserFetcher.DownloadAsync(ChromiumVersion); - } - Log($"Starting Browser. ({StartTimeoutMs}ms timeout)"); return await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true, - ExecutablePath = browserFetcher.GetExecutablePath(ChromiumVersion), Args = new [] { "--disable-gpu", "--disable-dev-shm-usage", @@ -58,7 +30,7 @@ internal class ChromiumDownloadClient : DownloadClient public ChromiumDownloadClient(GlobalBase clone) : base(clone) { - this.browser = DownloadBrowser().Result; + this.browser = StartBrowser().Result; _httpDownloadClient = new(this); } diff --git a/docker-compose.local.yaml b/docker-compose.local.yaml new file mode 100644 index 0000000..9c7ac8d --- /dev/null +++ b/docker-compose.local.yaml @@ -0,0 +1,21 @@ +version: '3' +services: + tranga-api: + build: + dockerfile: Dockerfile + context: . + container_name: tranga-api + volumes: + - ./Manga:/Manga + - ./settings:/usr/share/tranga-api + ports: + - "6531:6531" + restart: unless-stopped + tranga-website: + image: glax/tranga-website:latest + container_name: tranga-website + ports: + - "9555:80" + depends_on: + - tranga-api + restart: unless-stopped \ No newline at end of file