diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 04506aa..0000000 --- a/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -FROM jrottenberg/ffmpeg:4.1-alpine AS ffmpeg - -FROM ghcr.io/clansty/tgs-to-gif:latest AS tgs - -FROM node:17-alpine AS deps - -WORKDIR /app - -COPY package.json yarn.lock .yarnrc.yml ./ -COPY .yarn/ ./.yarn/ - -RUN apk add --no-cache alpine-sdk python3 &&\ - yarn install - -RUN rm -rf ./.yarn/cache - -FROM node:17-alpine AS build - -WORKDIR /app - -COPY --from=deps /app/ /app/ - -COPY tsconfig.json ./ -COPY src/ ./src/ - -RUN yarn build - -FROM node:17-alpine - -WORKDIR /app - -COPY --from=ffmpeg / / -COPY --from=tgs / / -COPY --from=deps /app/ /app/ -COPY prisma/ ./prisma/ -COPY assets/ ./assets/ -COPY --from=build /app/build/ /app/build/ - -RUN yarn add prisma@4.6.0 - -CMD [ "yarn", "start" ] diff --git a/docker.nix b/docker.nix new file mode 100644 index 0000000..b96fa0e --- /dev/null +++ b/docker.nix @@ -0,0 +1,52 @@ +{ pkgs, flakePkgs, nix2container, ... }: +nix2container.buildImage { + name = "q2tg"; + maxLayers = 8; + # optimizations + layers = with pkgs;[ + (nix2container.buildLayer { deps = [ bash ]; }) + (nix2container.buildLayer { deps = [ nodejs ]; }) + # deps of sharp + (nix2container.buildLayer { + deps = [ + (vips.override { + libjxl = libjxl.overrideAttrs (attrs: { + doCheck = false; + }); + }).dev + ]; + }) + # deps of node-canvas + (nix2container.buildLayer { deps = [ pixman cairo.dev pango.dev giflib libjpeg.dev libpng.dev librsvg.dev ]; }) + (nix2container.buildLayer { deps = [ ffmpeg ]; }) + (nix2container.buildLayer { deps = with flakePkgs;[ prisma-patched prisma-engines tgs-to-gif ]; }) + (nix2container.buildLayer { deps = with flakePkgs;[ fontsSf ]; }) + ]; + config = { + Cmd = [ + ( + pkgs.writeScript "start" '' + #!${pkgs.bash}/bin/bash + ${pkgs.coreutils}/bin/mkdir -p /tmp /root/.cache + ${flakePkgs.prisma-patched}/bin/prisma db push --accept-data-loss --skip-generate --schema ${flakePkgs.default}/libexec/q2tg/node_modules/.prisma/client/schema.prisma + ${flakePkgs.default}/bin/q2tg + '' + ) + ]; + Env = [ + "DATA_DIR=/app/data" + "PRISMA_MIGRATION_ENGINE_BINARY=${pkgs.prisma-engines}/bin/migration-engine" + "PRISMA_QUERY_ENGINE_BINARY=${pkgs.prisma-engines}/bin/query-engine" + "PRISMA_QUERY_ENGINE_LIBRARY=${pkgs.prisma-engines}/lib/libquery_engine.node" + "PRISMA_INTROSPECTION_ENGINE_BINARY=${pkgs.prisma-engines}/bin/introspection-engine" + "PRISMA_FMT_BINARY=${pkgs.prisma-engines}/bin/prisma-fmt" + "TGS_TO_GIF=${flakePkgs.tgs-to-gif}/bin/tgs-to-gif" + "FFMPEG_PATH=${pkgs.ffmpeg}/bin/ffmpeg" + "FFPROBE_PATH=${pkgs.ffmpeg}/bin/ffprobe" + "QUOTLY_FONTS=${flakePkgs.fontsSf}" + ]; + Volumes = { + "/app/data" = { }; + }; + }; +} diff --git a/flake.lock b/flake.lock index 3b327b9..631a7ab 100644 --- a/flake.lock +++ b/flake.lock @@ -15,7 +15,56 @@ "type": "github" } }, + "flake-utils_2": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nix2container": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1671269339, + "narHash": "sha256-KR2SXh4c2Y+bgbCfXjTGJ74O9/u4CAPFA0KYZHhKf5Q=", + "owner": "nlewo", + "repo": "nix2container", + "rev": "6800fff45afecc7e47c334d14cf2b2f4f25601a0", + "type": "github" + }, + "original": { + "owner": "nlewo", + "repo": "nix2container", + "type": "github" + } + }, "nixpkgs": { + "locked": { + "lastModified": 1654807842, + "narHash": "sha256-ADymZpr6LuTEBXcy6RtFHcUZdjKTBRTMYwu19WOx17E=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fc909087cc3386955f21b4665731dbdaceefb1d8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { "locked": { "lastModified": 1671752829, "narHash": "sha256-oFeJzAq0iRL6md9Si8Tx9bltjwjLmldvgUmAteMhYW4=", @@ -34,7 +83,8 @@ "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nix2container": "nix2container", + "nixpkgs": "nixpkgs_2" } } }, diff --git a/flake.nix b/flake.nix index 037cee8..af1868a 100644 --- a/flake.nix +++ b/flake.nix @@ -4,25 +4,27 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-22.11"; flake-utils.url = "github:numtide/flake-utils"; + nix2container.url = "github:nlewo/nix2container"; }; - outputs = { self, nixpkgs, flake-utils }: - { - packages = nixpkgs.lib.mapAttrs - (system: pkgs: { - default = import ./default.nix { inherit pkgs; }; - tgs-to-gif = pkgs.callPackage "${import ./nixos/clansty-flake.nix}/packages/tgs-to-gif" { }; - prisma-patched = pkgs.callPackage ./nixos/prismaPatched.nix { }; - fontsSf = pkgs.callPackage ./nixos/fontsSf.nix { }; - }) - nixpkgs.legacyPackages; - nixosModules.default = import ./nixos/module.nix { inherit self; }; - } // flake-utils.lib.eachDefaultSystem + outputs = { self, nixpkgs, flake-utils, nix2container }: + flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; flakePkgs = self.packages.${system}; + nix2containerPkgs = nix2container.packages.${system}; in { + packages = { + default = import ./default.nix { inherit pkgs; }; + tgs-to-gif = pkgs.callPackage "${import ./nixos/clansty-flake.nix}/packages/tgs-to-gif" { }; + prisma-patched = pkgs.callPackage ./nixos/prismaPatched.nix { }; + fontsSf = pkgs.callPackage ./nixos/fontsSf.nix { }; + docker = import ./docker.nix { + inherit pkgs flakePkgs; + nix2container = nix2containerPkgs.nix2container; + }; + }; devShells.default = import ./shell.nix { inherit pkgs flakePkgs; }; } );