Skip to content

Commit

Permalink
Merge pull request #1361 from dappnode/pablo/fix-webpack-build
Browse files Browse the repository at this point in the history
Do not compile dappmanager with `webpack`
  • Loading branch information
pablomendezroyo authored Jan 20, 2023
2 parents 5aa0161 + 8c5a3db commit a217554
Show file tree
Hide file tree
Showing 479 changed files with 1,895 additions and 2,059 deletions.
123 changes: 75 additions & 48 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,33 +1,56 @@
ARG NODE_VERSION=19.2.0

############
# GIT-DATA #
############
FROM --platform=${BUILDPLATFORM:-amd64} node:${NODE_VERSION}-alpine as git-data

WORKDIR /usr/src/app
RUN apk add --no-cache git

COPY .git .git
COPY dappnode_package.json .
COPY docker/getGitData.js .

RUN node getGitData /usr/src/app/.git-data.json

##################
# BUILD-BINARIES #
##################
FROM --platform=${BUILDPLATFORM:-amd64} node:${NODE_VERSION}-alpine as build-binaries

RUN apk add --no-cache bind-tools docker curl
RUN curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-$(uname -m) > /usr/local/bin/docker-compose \
&& chmod +x /usr/local/bin/docker-compose

# Common base so it's cached
# --platform=$BUILDPLATFORM is used build javascript source with host arch
# Otherwise webpack builds on emulated archs can be extremely slow (+1h)
#####################################
FROM --platform=${BUILDPLATFORM:-amd64} node:${NODE_VERSION}-alpine as build-monorepo

WORKDIR /app
#############
# BUILD-SRC #
#############
FROM --platform=${BUILDPLATFORM:-amd64} node:${NODE_VERSION}-alpine as build-src

RUN apk add --no-cache python3 build-base bash
WORKDIR /app
RUN apk add --no-cache python3 build-base

# Copy and install deps first to cache
COPY package.json yarn.lock lerna.json ./
COPY patches patches/
# Install lerna first
RUN yarn --frozen-lockfile --non-interactive --ignore-scripts --ignore-optional
COPY packages/admin-ui/package.json \
packages/admin-ui/
COPY packages/dappmanager/package.json \
packages/dappmanager/
COPY packages/common/package.json \
packages/common/
RUN yarn install --production
RUN yarn --frozen-lockfile --non-interactive --ignore-optional

# Build common
WORKDIR /app/packages/common/
COPY packages/common/ .
RUN yarn generate
RUN yarn build
RUN yarn build
# Results in dist/*

# Build admin-ui
Expand All @@ -37,62 +60,66 @@ ENV REACT_APP_API_URL /
RUN yarn build
# Results in build/*

# Build DAPPMANAGER
# Build dappmanager
WORKDIR /app/packages/dappmanager/
COPY packages/dappmanager/ .
RUN yarn build
# Results in build/index.js
# Results in dist/*

# Compute git data
#####################################
FROM --platform=${BUILDPLATFORM:-amd64} node:${NODE_VERSION}-alpine as git-data
##############
# BUILD-DEPS #
##############

WORKDIR /usr/src/app
FROM --platform=${BUILDPLATFORM:-amd64} node:${NODE_VERSION}-alpine as build-deps

RUN apk add --no-cache git
COPY .git .git
COPY dappnode_package.json .
COPY docker/getGitData.js .
RUN node getGitData /usr/src/app/.git-data.json

# Build binaries
#####################################
FROM node:${NODE_VERSION}-alpine as build-binaries

RUN apk add --no-cache bind-tools docker
WORKDIR /usr/src/app
RUN apk add --no-cache python3
COPY --from=build-src /app .
RUN yarn install --non-interactive --frozen-lockfile --production --force --ignore-optional

# Final layer
#####################################
##############
# PRODUCTION #
##############
FROM node:${NODE_VERSION}-alpine

ENV DOCKER_COMPOSE_VERSION v2.5.0

RUN apk add --no-cache curl bind-dev xz libltdl miniupnpc zip unzip dbus bind \
# See https://github.com/dappnode/DNP_DAPPMANAGER/issues/669
avahi-tools

RUN curl -L https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-linux-$(uname -m) > /usr/local/bin/docker-compose \
&& chmod +x /usr/local/bin/docker-compose

WORKDIR /usr/src/app

ENV COMPOSE_HTTP_TIMEOUT=300 \
DOCKER_CLIENT_TIMEOUT=300 \
DOCKER_HOST=unix:///var/run/docker.sock \
UI_FILES_PATH=dist \
GIT_DATA_PATH=.git-data.json
UI_FILES_PATH=/usr/src/app/packages/admin-ui/build \
GIT_DATA_PATH=.git-data.json
WORKDIR /usr/src/app

# TODO: consider moving all these binaries to the build-binaries stage
RUN apk add --no-cache bind-dev xz libltdl miniupnpc zip unzip dbus bind avahi-tools

# Copy docker
COPY docker/rndc.conf /etc/bind/
COPY docker/update_local_dyndns.sh /usr/local/bin/update_local_dyndns

# Copy git data
COPY --from=git-data /usr/src/app/.git-data.json $GIT_DATA_PATH

# Copy binaries
COPY --from=build-binaries /usr/bin/nsupdate /usr/bin/nsupdate
COPY --from=build-binaries /usr/bin/docker /usr/bin/docker
COPY --from=build-binaries /usr/local/bin/docker-compose /usr/local/bin/docker-compose

# Copy the src last as it's the layer most likely to change
# Copy scripts and services
COPY packages/dappmanager/hostScripts /usr/src/app/hostScripts
COPY packages/dappmanager/hostServices /usr/src/app/hostServices
COPY --from=build-monorepo /app/packages/admin-ui/build $UI_FILES_PATH
COPY --from=build-monorepo /app/packages/dappmanager/build /usr/src/app/
COPY --from=git-data /usr/src/app/.git-data.json $GIT_DATA_PATH

COPY docker/rndc.conf /etc/bind/
COPY docker/update_local_dyndns.sh /usr/local/bin/update_local_dyndns

CMD [ "node", "index" ]
# Copy root app
COPY --from=build-deps /usr/src/app/node_modules ./node_modules
COPY --from=build-deps /usr/src/app/package.json ./package.json
# Copy common
COPY --from=build-deps /usr/src/app/packages/common/dist ./packages/common/dist
COPY --from=build-deps /usr/src/app/packages/common/node_modules ./packages/common/node_modules
COPY --from=build-deps /usr/src/app/packages/common/package.json ./packages/common/package.json
# Copy admin-ui
COPY --from=build-deps /usr/src/app/packages/admin-ui/build ./packages/admin-ui/build
# Copy dappmanager
COPY --from=build-deps /usr/src/app/packages/dappmanager/dist /usr/src/app/packages/dappmanager/dist
COPY --from=build-deps /usr/src/app/packages/dappmanager/node_modules /usr/src/app/packages/dappmanager/node_modules
COPY --from=build-deps /usr/src/app/packages/dappmanager/package.json /usr/src/app/packages/dappmanager/package.json

CMD [ "node", "packages/dappmanager/dist/index" ]
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"name": "@dappnode/dappnode",
"type": "module",
"version": "1.0.0",
"private": true,
"repository": "git@github.com:dappnode/DNP_DAPPMANAGER.git",
Expand Down
10 changes: 5 additions & 5 deletions packages/admin-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
"clipboard": "^2.0.1",
"deepmerge": "^2.1.1",
"ethereum-blockies-base64": "^1.0.2",
"is-ipfs": "^0.6.0",
"is-ipfs": "^8.0.1",
"lodash-es": "^4.17.21",
"mitt": "^2.1.0",
"pretty-bytes": "^5.3.0",
Expand All @@ -58,18 +58,18 @@
"redux": "^4.0.0",
"redux-thunk": "^2.3.0",
"sass": "^1.49.7",
"semver": "^5.5.0",
"semver": "^7.3.8",
"socket.io-client": "^4.5.1",
"styled-components": "^4.2.0",
"swr": "^0.2.0",
"tweetnacl": "^1.0.1",
"tweetnacl-util": "^0.15.0",
"typescript": "^4.7.3"
"tweetnacl-util": "^0.15.0"
},
"devDependencies": {
"@types/jest": "^24.9.1",
"nodemon": "^2.0.4",
"prettier": "^1.16.4"
"prettier": "^1.16.4",
"typescript": "^4.7.3"
},
"browserslist": {
"production": [
Expand Down
32 changes: 16 additions & 16 deletions packages/admin-ui/src/utils/computeSemverUpdateType.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import semver from "semver";
import { valid, patch, minor, coerce, major, lt } from "semver";

/**
* Compute the release type: major, minor, patch
Expand All @@ -12,27 +12,27 @@ function computeSemverUpdateType(
to: string | null,
dontUpSmallVersions?: boolean
): "major" | "minor" | "patch" | "downgrade" | null {
if (!from || !to || !semver.valid(from) || !semver.valid(to)) return null;
if (!from || !to || !valid(from) || !valid(to)) return null;

// Make sure there are no downgrades
if (semver.lt(to, from)) return "downgrade";
if (lt(to, from)) return "downgrade";

// Remove wierd stuff: 10000000000000000.4.7.4 becomes 4.7.4
// If not valid, abort
from = semver.valid(semver.coerce(from));
to = semver.valid(semver.coerce(to));
from = valid(coerce(from));
to = valid(coerce(to));
// For safety, check again
if (!from || !to || !semver.valid(from) || !semver.valid(to)) return null;
if (!from || !to || !valid(from) || !valid(to)) return null;

if (!dontUpSmallVersions) {
// Semver considers 0.1.21 -> 0.2.0 a minor update
// Turn it into 1.21.0 -> 2.0.0, to consider it a major
const fromMajor = semver.major(from);
const fromMinor = semver.minor(from);
const fromPatch = semver.patch(from);
const toMajor = semver.major(to);
const toMinor = semver.minor(to);
const toPatch = semver.patch(to);
const fromMajor = major(from);
const fromMinor = minor(from);
const fromPatch = patch(from);
const toMajor = major(to);
const toMinor = minor(to);
const toPatch = patch(to);
if (fromMajor === 0 && toMajor === 0) {
if (fromMinor === 0 && toMinor === 0) {
from = [fromPatch, 0, 0].join(".");
Expand All @@ -45,11 +45,11 @@ function computeSemverUpdateType(
}

// For safety, check again
if (!from || !to || !semver.valid(from) || !semver.valid(to)) return null;
if (!from || !to || !valid(from) || !valid(to)) return null;

if (semver.major(from) !== semver.major(to)) return "major";
if (semver.minor(from) !== semver.minor(to)) return "minor";
if (semver.patch(from) !== semver.patch(to)) return "patch";
if (major(from) !== major(to)) return "major";
if (minor(from) !== minor(to)) return "minor";
if (patch(from) !== patch(to)) return "patch";
return null;
}

Expand Down
4 changes: 1 addition & 3 deletions packages/admin-ui/src/utils/isIpfsHash.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
// Pending: No type definitions for "is-ipfs"
// @ts-ignore
import isIPFS from "is-ipfs";
import * as isIPFS from "is-ipfs";

function isMultihash(hash: string) {
return isIPFS.cid(hash);
Expand Down
8 changes: 5 additions & 3 deletions packages/common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,20 @@
"./package.json": "./package.json"
},
"scripts": {
"build": "yarn run generate && tsc",
"build": "yarn run generate && tsc -p tsconfig.json",
"generate": "ts-node ./src/validation/generateSchemas.ts tsconfig.json ./src/validation/schemas",
"dev": "tsc -w"
},
"dependencies": {
"@dappnode/dappnodesdk": "^0.2.69",
"@types/node": "^18.11.18"
"@types/node": "^18.11.18",
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@types/lodash-es": "^4.17.6",
"@types/node": "^18.11.18",
"ajv": "6.10.2",
"lodash-es": "^4.17.21",
"ts-node": "^10.9.1",
"typescript": "^4.9.4",
"typescript-json-schema": "^0.55.0"
}
Expand Down
24 changes: 9 additions & 15 deletions packages/dappmanager/package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
{
"name": "@dappnode/dappmanager",
"type": "module",
"main": "dist/index.js",
"version": "0.1.0",
"scripts": {
"start": "node dist/index.js",
"dev": "nodemon -w src -e js,ts,json --require dotenv/config -x ts-node src/index.ts",
"build": "webpack",
"build": "tsc -p tsconfig.json",
"watch-ts": "tsc -w",
"file": "node",
"test": "npm run test:file \"./{,!(node_modules)/**}/*.test.ts\" ",
Expand Down Expand Up @@ -44,13 +45,12 @@
"@types/node-fetch": "^2.5.1",
"@types/node-os-utils": "^1.2.0",
"@types/node-telegram-bot-api": "^0.50.4",
"@types/semver": "^6.0.1",
"@types/semver": "^7.3.13",
"@types/sinon": "^7.0.13",
"@types/socket.io": "^3.0.2",
"@types/stack-trace": "^0.0.29",
"@types/strip-ansi": "^5.2.1",
"@types/tar-stream": "^2.1.0",
"abort-controller": "^3.0.0",
"ajv": "^6.10.2",
"async": "^3.2.4",
"async-retry": "^1.3.1",
Expand All @@ -72,34 +72,27 @@
"ipfs-car": "^0.9.1",
"ipfs-http-client": "^59.0.0",
"is-ip": "^3.0.0",
"is-ipfs": "^6.0.2",
"is-ipfs": "^8.0.1",
"js-yaml": "^3.11.0",
"lodash-es": "^4.17.21",
"memoizee": "^0.4.14",
"monero-rpc": "^0.5.0",
"multicodec": "^3.2.1",
"multiformats": "^11.0.0",
"multiformats": "^11.0.1",
"multihashes": "^4.0.3",
"node-fetch": "^2.6.0",
"node-loader": "^2.0.0",
"node-os-utils": "^1.2.2",
"node-telegram-bot-api": "^0.50.0",
"prom-client": "^14.1.0",
"semver": "^5.5.0",
"semver": "^7.3.8",
"socket.io": "^4.5.1",
"source-map-support": "^0.5.19",
"stack-trace": "^0.0.10",
"strip-ansi": "^6.0.0",
"tar-stream": "^2.1.4",
"timestring": "^6.0.0",
"ts-loader": "^9.3.0",
"tweetnacl": "^1.0.1",
"tweetnacl-util": "^0.15.0",
"typescript": "^4.7.3",
"typescript-json-schema": "^0.55.0",
"webpack": "^5.52.0",
"webpack-cli": "^5.0.1",
"webpack-node-externals": "^3.0.0"
"tweetnacl-util": "^0.15.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.30.0",
Expand All @@ -113,6 +106,7 @@
"rewiremock": "^3.13.7",
"sinon": "^5.0.10",
"socket.io-client": "^4.5.1",
"ts-node": "^10.8.1"
"ts-node": "^10.8.1",
"typescript": "^4.7.3"
}
}
4 changes: 2 additions & 2 deletions packages/dappmanager/src/api/auth/adminPasswordDb.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import bcrypt from "bcryptjs";
import { JsonFileDb } from "../../utils/fileDb";
import { getRandomAlphanumericToken } from "../../utils/token";
import { JsonFileDb } from "../../utils/fileDb.js";
import { getRandomAlphanumericToken } from "../../utils/token.js";

export enum AdminPasswordDbError {
PASSWORD_CHANGED = "ADMIN_PASSWORD_DB_ERROR_PASSWORD_CHANGED"
Expand Down
2 changes: 1 addition & 1 deletion packages/dappmanager/src/api/auth/errors.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { HttpError } from "../utils";
import { HttpError } from "../utils.js";

const ERROR_NOT_ADMIN_IP = "NOT_ADMIN_IP";
const ERROR_NOT_REGISTERED = "NOT_REGISTERED";
Expand Down
2 changes: 1 addition & 1 deletion packages/dappmanager/src/api/auth/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from "./sessionAuth";
export * from "./sessionAuth.js";
Loading

0 comments on commit a217554

Please sign in to comment.