2
0

Compare commits

..

No commits in common. "8316ed08a78d87099ac3d5cf30fece8cf0e68925" and "398b6fff059fdd7f92c858c4132146a9337786eb" have entirely different histories.

12 changed files with 106 additions and 75 deletions

View File

@ -23,5 +23,3 @@
**/values.dev.yaml **/values.dev.yaml
LICENSE LICENSE
README.md README.md
Manga
settings

43
.github/workflows/docker-base.yml vendored Normal file
View File

@ -0,0 +1,43 @@
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

View File

@ -38,7 +38,7 @@ jobs:
context: ./ context: ./
file: ./Dockerfile 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,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64 platforms: linux/amd64
pull: true pull: true
push: true push: true
tags: | tags: |

View File

@ -38,7 +38,7 @@ jobs:
context: ./ context: ./
file: ./Dockerfile 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,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64 platforms: linux/amd64
pull: true pull: true
push: true push: true
tags: | tags: |

View File

@ -38,7 +38,7 @@ jobs:
context: ./ context: ./
file: ./Dockerfile 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,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64 platforms: linux/amd64
pull: true pull: true
push: true push: true
tags: | tags: |

View File

@ -38,7 +38,7 @@ jobs:
context: ./ context: ./
file: ./Dockerfile 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,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64 platforms: linux/amd64
pull: true pull: true
push: true push: true
tags: | tags: |

3
.gitignore vendored
View File

@ -20,6 +20,3 @@ riderModule.iml
cover.jpg cover.jpg
cover.png cover.png
/.vscode /.vscode
/Manga
/settings
*.DotSettings.user

View File

@ -1,42 +1,29 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
ARG DOTNET=7.0
FROM mcr.microsoft.com/dotnet/runtime:$DOTNET AS base FROM mcr.microsoft.com/dotnet/sdk:7.0 as build-env
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 WORKDIR /src
COPY CLI /src/CLI
COPY Tranga /src/Tranga
COPY Logging /src/Logging
COPY Tranga.sln /src COPY Tranga.sln /src
COPY CLI/CLI.csproj /src/CLI/CLI.csproj RUN dotnet restore /src/Tranga/Tranga.csproj
COPY Logging/Logging.csproj /src/Logging/Logging.csproj RUN dotnet publish -c Release -o /publish
COPY Tranga/Tranga.csproj /src/Tranga/Tranga.csproj
RUN dotnet restore /src/Tranga.sln
COPY . /src/ FROM glax/tranga-base:latest as runtime
RUN dotnet publish -c Release -o /publish -maxcpucount:1
FROM base AS runtime
EXPOSE 6531 EXPOSE 6531
ARG UNAME=tranga ARG UNAME=tranga
ARG UID=1000 ARG UID=1000
ARG GID=1000 ARG GID=1000
RUN groupadd -g $GID -o $UNAME \ RUN groupadd -g $GID -o $UNAME
&& useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME \ RUN useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
&& mkdir /usr/share/tranga-api \ RUN mkdir /usr/share/tranga-api
&& mkdir /Manga \ RUN mkdir /Manga
&& chown 1000:1000 /usr/share/tranga-api \ RUN chown 1000:1000 /usr/share/tranga-api
&& chown 1000:1000 /Manga RUN chown 1000:1000 /Manga
USER $UNAME USER $UNAME
WORKDIR /publish WORKDIR /publish
COPY --chown=1000:1000 --from=build-env /publish . COPY --from=build-env /publish .
USER 0 USER 0
ENTRYPOINT ["dotnet", "/publish/Tranga.dll"] RUN chown 1000:1000 /publish
CMD ["-f", "-c", "-l", "/usr/share/tranga-api/logs"] ENTRYPOINT ["dotnet", "/publish/Tranga.dll", "-f", "-c", "-l", "/usr/share/tranga-api/logs"]

8
Dockerfile-base Normal file
View File

@ -0,0 +1,8 @@
# 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

View File

@ -128,19 +128,10 @@ public struct Manga
public void MovePublicationFolder(string downloadDirectory, string newFolderName) public void MovePublicationFolder(string downloadDirectory, string newFolderName)
{ {
string oldPath = Path.Join(downloadDirectory, this.folderName); string oldPath = Path.Join(downloadDirectory, this.folderName);
this.folderName = newFolderName;//Create new Path with the new folderName this.folderName = newFolderName;
string newPath = CreatePublicationFolder(downloadDirectory); string newPath = CreatePublicationFolder(downloadDirectory);
if (Directory.Exists(oldPath)) if(Directory.Exists(oldPath))
{ Directory.Move(oldPath, newPath);
if (Directory.Exists(newPath)) //Move/Overwrite old Files, Delete old Directory
{
IEnumerable<string> 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 public void UpdateLatestDownloadedChapter(Chapter chapter)//TODO check files if chapters are all downloaded

View File

@ -13,12 +13,40 @@ internal class ChromiumDownloadClient : DownloadClient
private const int StartTimeoutMs = 30000; private const int StartTimeoutMs = 30000;
private readonly HttpDownloadClient _httpDownloadClient; private readonly HttpDownloadClient _httpDownloadClient;
private async Task<IBrowser> StartBrowser() private async Task<IBrowser> DownloadBrowser()
{ {
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)"); Log($"Starting Browser. ({StartTimeoutMs}ms timeout)");
return await Puppeteer.LaunchAsync(new LaunchOptions return await Puppeteer.LaunchAsync(new LaunchOptions
{ {
Headless = true, Headless = true,
ExecutablePath = browserFetcher.GetExecutablePath(ChromiumVersion),
Args = new [] { Args = new [] {
"--disable-gpu", "--disable-gpu",
"--disable-dev-shm-usage", "--disable-dev-shm-usage",
@ -30,7 +58,7 @@ internal class ChromiumDownloadClient : DownloadClient
public ChromiumDownloadClient(GlobalBase clone) : base(clone) public ChromiumDownloadClient(GlobalBase clone) : base(clone)
{ {
this.browser = StartBrowser().Result; this.browser = DownloadBrowser().Result;
_httpDownloadClient = new(this); _httpDownloadClient = new(this);
} }

View File

@ -1,21 +0,0 @@
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