diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..1f3b8da26 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# Set line formatting for scripts + +*.sh text eol=lf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..7f4e8ac71 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,44 @@ +#This Dockerfile pulls the latest git commit and builds Kavita from source +FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS builder + +MAINTAINER Chris P + +ENV DEBIAN_FRONTEND=noninteractive +ARG TARGETPLATFORM + +#Installs nodejs and npm +RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - \ + && apt-get install -y nodejs \ + && rm -rf /var/lib/apt/lists/* + +#Builds app based on platform +COPY build_target.sh /build_target.sh +RUN /build_target.sh + +#Production image +FROM ubuntu:focal + +MAINTAINER Chris P + +#Move the output files to where they need to be +COPY --from=builder /Projects/Kavita/_output/build/Kavita /kavita + +#Installs program dependencies +RUN apt-get update \ + && apt-get install -y libicu-dev libssl1.1 pwgen \ + && rm -rf /var/lib/apt/lists/* + +#Creates the manga storage directory +RUN mkdir /manga /kavita/data + +RUN cp /kavita/appsettings.Development.json /kavita/appsettings.json \ + && sed -i 's/Data source=kavita.db/Data source=data\/kavita.db/g' /kavita/appsettings.json + +COPY entrypoint.sh /entrypoint.sh + +EXPOSE 5000 + +WORKDIR /kavita + +ENTRYPOINT ["/bin/bash"] +CMD ["/entrypoint.sh"] diff --git a/Dockerfile.alpine b/Dockerfile.alpine new file mode 100644 index 000000000..faacfa823 --- /dev/null +++ b/Dockerfile.alpine @@ -0,0 +1,28 @@ +#This Dockerfile is for the musl alpine build of Kavita. +FROM alpine:latest + +MAINTAINER Chris P + +#Installs the needed dependencies +RUN apk update && apk add --no-cache wget curl pwgen icu-dev bash + +#Downloads Kavita, unzips and moves the folders to where they need to be +RUN wget https://github.com/Kareadita/Kavita/releases/download/v0.3.7/kavita-linux-musl-x64.tar.gz \ + && tar -xzf kavita*.tar.gz \ + && mv Kavita/ /kavita/ \ + && rm kavita*.gz \ + && chmod +x /kavita/Kavita + +#Creates the needed folders +RUN mkdir /manga /kavita/data /kavita/temp /kavita/cache + +RUN sed -i 's/Data source=kavita.db/Data source=data\/kavita.db/g' /kavita/appsettings.json + +COPY entrypoint.sh /entrypoint.sh + +EXPOSE 5000 + +WORKDIR /kavita + +ENTRYPOINT ["/bin/bash"] +CMD ["/entrypoint.sh"] diff --git a/Dockerfile.arm b/Dockerfile.arm new file mode 100644 index 000000000..e28430a38 --- /dev/null +++ b/Dockerfile.arm @@ -0,0 +1,27 @@ +#This Dockerfile pulls the latest git commit and builds Kavita from source + +#Production image +FROM ubuntu:focal + +#Move the output files to where they need to be +COPY Kavita /kavita + +#Installs program dependencies +RUN apt-get update \ + && apt-get install -y libicu-dev libssl1.1 pwgen \ + && rm -rf /var/lib/apt/lists/* + +#Creates the manga storage directory +RUN mkdir /kavita/data + +RUN cp /kavita/appsettings.Development.json /kavita/appsettings.json \ + && sed -i 's/Data source=kavita.db/Data source=data\/kavita.db/g' /kavita/appsettings.json + +COPY entrypoint.sh /entrypoint.sh + +EXPOSE 5000 + +WORKDIR /kavita + +ENTRYPOINT ["/bin/bash"] +CMD ["/entrypoint.sh"] diff --git a/build_target.sh b/build_target.sh new file mode 100644 index 000000000..56c54ba79 --- /dev/null +++ b/build_target.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +mkdir Projects + +cd Projects + +git clone https://github.com/Kareadita/Kavita.git +git clone https://github.com/Kareadita/Kavita-webui.git + +cd Kavita +chmod +x build.sh + +#Builds program based on the target platform + +if [ "$TARGETPLATFORM" == "linux/amd64" ] +then + ./build.sh linux-x64 + mv /Projects/Kavita/_output/linux-x64 /Projects/Kavita/_output/build +elif [ "$TARGETPLATFORM" == "linux/arm/v7" ] +then + ./build.sh linux-arm + mv /Projects/Kavita/_output/linux-arm /Projects/Kavita/_output/build +elif [ "$TARGETPLATFORM" == "linux/arm64" ] +then + ./build.sh linux-arm64 + mv /Projects/Kavita/_output/linux-arm64 /Projects/Kavita/_output/build +fi diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..fe479badd --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.9' +services: + kavita: + image: kizaing/kavita:latest + volumes: + - ./manga:/manga + - ./data/temp:/kavita/temp + - ./data/cache:/kavita/cache + - ./data:/kavita/data + - ./data/logs:/kavita/logs + ports: + - "5000:5000" + restart: unless-stopped diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 000000000..87d10d6ec --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +#Checks if a token has been set, and then generates a new token if not +if grep -q 'super secret unguessable key' /kavita/appsettings.json +then + export TOKEN_KEY="$(pwgen -s 16 1)" + sed -i "s/super secret unguessable key/${TOKEN_KEY}/g" /kavita/appsettings.json +fi + +#Checks if the appsettings.json already exists in bind mount +if test -f "/kavita/data/appsettings.json" +then + rm /kavita/appsettings.json + ln -s /kavita/data/appsettings.json /kavita/ +else + mv /kavita/appsettings.json /kavita/data/ + ln -s /kavita/data/appsettings.json /kavita/ +fi + +#Checks if the data folders exist +if [ -d /kavita/data/temp ] +then + if [ -d /kavita/temp ] + then + unlink /kavita/temp + ln -s /kavita/data/temp /kavita/temp + else + ln -s /kavita/data/temp /kavita/temp + fi +else + mkdir /kavita/data/temp + ln -s /kavita/data/temp /kavita/temp +fi + +if [ -d /kavita/data/cache ] +then + if [ -d /kavita/cache ] + then + unlink /kavita/cache + ln -s /kavita/data/cache /kavita/cache + else + ln -s /kavita/data/cache /kavita/cache + fi +else + mkdir /kavita/data/cache + ln -s /kavita/data/cache /kavita/cache +fi + +# Checks for the log file + +if test -f "/kavita/data/logs/kavita.log" +then + rm /kavita/kavita.log + ln -s /kavita/data/logs/kavita.log /kavita/ +else + if [ -d /kavita/data/logs ] + then + touch /kavita/data/logs/kavita.log + ln -s /kavita/data/logs/kavita.log /kavita/ + else + mkdir /kavita/data/logs + touch /kavita/data/logs/kavita.log + ln -s /kavita/data/logs/kavita.log /kavita/ + fi + +fi + +./Kavita