diff --git a/Makefile b/Makefile
index 5dec3b20d..d8d775214 100644
--- a/Makefile
+++ b/Makefile
@@ -132,6 +132,11 @@ ecosystem-images:
cd `pwd`/linux/ecosystem/torrserver && pwd && make
+ cd `pwd`/linux/ecosystem/nodejs/node12 && pwd && make
+ cd `pwd`/linux/ecosystem/nodejs/node14 && pwd && make
+ cd `pwd`/linux/ecosystem/nodejs/node15 && pwd && make
+ cd `pwd`/linux/ecosystem/nodejs/node16 && pwd && make
+
cd `pwd`/linux/ecosystem/postgres/latest && pwd && make
cd `pwd`/linux/ecosystem/postgres/8.2 && pwd && make
cd `pwd`/linux/ecosystem/postgres/8.3 && pwd && make
diff --git a/linux/ecosystem/atlassian/jira/8/8.22.1/.env b/linux/ecosystem/atlassian/jira/8/8.22.1/.env
new file mode 100644
index 000000000..c50f3e3ff
--- /dev/null
+++ b/linux/ecosystem/atlassian/jira/8/8.22.1/.env
@@ -0,0 +1,3 @@
+
+RELEASE=8.22.1
+DOWNLOAD_URL=https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-8.22.1.tar.gz
diff --git a/linux/ecosystem/atlassian/jira/8/8.22.1/Dockerfile b/linux/ecosystem/atlassian/jira/8/8.22.1/Dockerfile
new file mode 100644
index 000000000..eeec7c1d8
--- /dev/null
+++ b/linux/ecosystem/atlassian/jira/8/8.22.1/Dockerfile
@@ -0,0 +1,49 @@
+FROM epicmorg/prod:jdk8
+LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
+ARG DEBIAN_FRONTEND=noninteractive
+
+##################################################################
+# ARGuments
+##################################################################
+
+#configured by dockerfile / .ENV
+ARG RELEASE
+ARG DOWNLOAD_URL
+
+
+##################################################################
+# Setup
+##################################################################
+ENV RUN_USER daemon
+ENV RUN_GROUP daemon
+
+# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
+ENV JIRA_HOME /var/atlassian/application-data/jira
+ENV JIRA_INSTALL_DIR /opt/atlassian/jira
+
+VOLUME ["${JIRA_HOME}"]
+WORKDIR $JIRA_HOME
+
+# Expose HTTP port
+EXPOSE 8080
+
+##################################################################
+# Installing
+##################################################################
+RUN mkdir -p ${JIRA_INSTALL_DIR} \
+ && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
+ && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
+ && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
+ && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
+ && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
+ && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
+ update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
+ apt clean -y && \
+ apt autoclean -y && \
+ rm -rfv /var/lib/apt/lists/* && \
+ rm -rfv /var/cache/apt/archives/*.deb
+
+CMD ["/entrypoint.sh", "-fg"]
+ENTRYPOINT ["/usr/bin/tini", "--"]
+COPY entrypoint.sh /entrypoint.sh
+COPY . /tmp
diff --git a/linux/ecosystem/atlassian/jira/8/8.22.1/Dockerfile.jdk11 b/linux/ecosystem/atlassian/jira/8/8.22.1/Dockerfile.jdk11
new file mode 100644
index 000000000..a98a20e49
--- /dev/null
+++ b/linux/ecosystem/atlassian/jira/8/8.22.1/Dockerfile.jdk11
@@ -0,0 +1,49 @@
+FROM epicmorg/prod:jdk11
+LABEL maintainer="Atlassian Jira Server Team; EpicMorg DevTeam, developer@epicm.org"
+ARG DEBIAN_FRONTEND=noninteractive
+
+##################################################################
+# ARGuments
+##################################################################
+
+#configured by dockerfile / .ENV
+ARG RELEASE
+ARG DOWNLOAD_URL
+
+
+##################################################################
+# Setup
+##################################################################
+ENV RUN_USER daemon
+ENV RUN_GROUP daemon
+
+# https://confluence.atlassian.com/display/JSERVERM/Important+directories+and+files
+ENV JIRA_HOME /var/atlassian/application-data/jira
+ENV JIRA_INSTALL_DIR /opt/atlassian/jira
+
+VOLUME ["${JIRA_HOME}"]
+WORKDIR $JIRA_HOME
+
+# Expose HTTP port
+EXPOSE 8080
+
+##################################################################
+# Installing
+##################################################################
+RUN mkdir -p ${JIRA_INSTALL_DIR} \
+ && curl -L ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C "$JIRA_INSTALL_DIR" \
+ && chown -R ${RUN_USER}:${RUN_GROUP} ${JIRA_INSTALL_DIR}/ \
+ && sed -i -e 's/^JVM_SUPPORT_RECOMMENDED_ARGS=""$/: \${JVM_SUPPORT_RECOMMENDED_ARGS:=""}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
+ && sed -i -e 's/^JVM_\(.*\)_MEMORY="\(.*\)"$/: \${JVM_\1_MEMORY:=\2}/g' ${JIRA_INSTALL_DIR}/bin/setenv.sh \
+ && sed -i -e 's/grep "java version"/grep -E "(openjdk|java) version"/g' ${JIRA_INSTALL_DIR}/bin/check-java.sh \
+ && sed -i -e 's/port="8080"/port="8080" secure="${catalinaConnectorSecure}" scheme="${catalinaConnectorScheme}" proxyName="${catalinaConnectorProxyName}" proxyPort="${catalinaConnectorProxyPort}"/' ${JIRA_INSTALL_DIR}/conf/server.xml && \
+ update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \
+ apt clean -y && \
+ apt autoclean -y && \
+ rm -rfv /var/lib/apt/lists/* && \
+ rm -rfv /var/cache/apt/archives/*.deb
+
+CMD ["/entrypoint.sh", "-fg"]
+ENTRYPOINT ["/usr/bin/tini", "--"]
+COPY entrypoint.sh /entrypoint.sh
+COPY . /tmp
diff --git a/linux/ecosystem/atlassian/jira/8/8.22.1/Makefile b/linux/ecosystem/atlassian/jira/8/8.22.1/Makefile
new file mode 100644
index 000000000..bad6d73b5
--- /dev/null
+++ b/linux/ecosystem/atlassian/jira/8/8.22.1/Makefile
@@ -0,0 +1,19 @@
+all: app
+
+app:
+ make build
+ make deploy
+ make clean
+
+build:
+ docker-compose build --compress --parallel
+
+deploy:
+ docker-compose push
+
+clean:
+ docker container prune -f
+ docker image prune -f
+ docker network prune -f
+ docker volume prune -f
+ docker system prune -af
diff --git a/linux/ecosystem/atlassian/jira/8/8.22.1/docker-compose.yml b/linux/ecosystem/atlassian/jira/8/8.22.1/docker-compose.yml
new file mode 100644
index 000000000..81592d775
--- /dev/null
+++ b/linux/ecosystem/atlassian/jira/8/8.22.1/docker-compose.yml
@@ -0,0 +1,17 @@
+version: '3.9'
+services:
+ app:
+ image: "epicmorg/jira:${RELEASE}"
+ build:
+ context: .
+ args:
+ RELEASE: ${RELEASE}
+ DOWNLOAD_URL: ${DOWNLOAD_URL}
+ app-jdk11:
+ image: "epicmorg/jira:${RELEASE}-jdk11"
+ build:
+ context: .
+ dockerfile: Dockerfile.jdk11
+ args:
+ RELEASE: ${RELEASE}
+ DOWNLOAD_URL: ${DOWNLOAD_URL}
diff --git a/linux/ecosystem/atlassian/jira/8/8.22.1/entrypoint.sh b/linux/ecosystem/atlassian/jira/8/8.22.1/entrypoint.sh
new file mode 100755
index 000000000..50ee4ecd1
--- /dev/null
+++ b/linux/ecosystem/atlassian/jira/8/8.22.1/entrypoint.sh
@@ -0,0 +1,89 @@
+#!/bin/bash
+set -euo pipefail
+
+export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
+export JRE_HOME="$JAVA_HOME/jre"
+export JAVA_BINARY="$JRE_HOME/bin/java"
+export JAVA_VERSION=$("$JAVA_BINARY" -version 2>&1 | awk -F '"' '/version/ {print $2}')
+
+# Setup Catalina Opts
+: ${CATALINA_CONNECTOR_PROXYNAME:=}
+: ${CATALINA_CONNECTOR_PROXYPORT:=}
+: ${CATALINA_CONNECTOR_SCHEME:=http}
+: ${CATALINA_CONNECTOR_SECURE:=false}
+
+: ${CATALINA_OPTS:=}
+
+: ${JAVA_OPTS:=}
+
+CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyName=${CATALINA_CONNECTOR_PROXYNAME}"
+CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorProxyPort=${CATALINA_CONNECTOR_PROXYPORT}"
+CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorScheme=${CATALINA_CONNECTOR_SCHEME}"
+CATALINA_OPTS="${CATALINA_OPTS} -DcatalinaConnectorSecure=${CATALINA_CONNECTOR_SECURE}"
+
+export JAVA_OPTS="${JAVA_OPTS} ${CATALINA_OPTS}"
+
+# Setup Data Center configuration
+if [ ! -f "/etc/container_id" ]; then
+ uuidgen > /etc/container_id
+fi
+CONTAINER_ID=$(cat /etc/container_id)
+CONTAINER_SHORT_ID=${CONTAINER_ID::8}
+
+: ${CLUSTERED:=false}
+: ${JIRA_NODE_ID:=jira_node_${CONTAINER_SHORT_ID}}
+: ${JIRA_SHARED_HOME:=${JIRA_HOME}/shared}
+: ${EHCACHE_PEER_DISCOVERY:=}
+: ${EHCACHE_LISTENER_HOSTNAME:=}
+: ${EHCACHE_LISTENER_PORT:=}
+: ${EHCACHE_LISTENER_SOCKETTIMEOUTMILLIS:=}
+: ${EHCACHE_MULTICAST_ADDRESS:=}
+: ${EHCACHE_MULTICAST_PORT:=}
+: ${EHCACHE_MULTICAST_TIMETOLIVE:=}
+: ${EHCACHE_MULTICAST_HOSTNAME:=}
+
+# Cleanly set/unset values in cluster.properties
+function set_cluster_property {
+ if [ -z $2 ]; then
+ if [ -f "${JIRA_HOME}/cluster.properties" ]; then
+ sed -i -e "/^${1}/d" "${JIRA_HOME}/cluster.properties"
+ fi
+ return
+ fi
+ if [ ! -f "${JIRA_HOME}/cluster.properties" ]; then
+ echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
+ elif grep "^${1}" "${JIRA_HOME}/cluster.properties"; then
+ sed -i -e "s#^${1}=.*#${1}=${2}#g" "${JIRA_HOME}/cluster.properties"
+ else
+ echo "${1}=${2}" >> "${JIRA_HOME}/cluster.properties"
+ fi
+}
+
+if [ "${CLUSTERED}" == "true" ]; then
+ set_cluster_property "jira.node.id" "${JIRA_NODE_ID}"
+ set_cluster_property "jira.shared.home" "${JIRA_SHARED_HOME}"
+ set_cluster_property "ehcache.peer.discovery" "${EHCACHE_PEER_DISCOVERY}"
+ set_cluster_property "ehcache.listener.hostName" "${EHCACHE_LISTENER_HOSTNAME}"
+ set_cluster_property "ehcache.listener.port" "${EHCACHE_LISTENER_PORT}"
+ set_cluster_property "ehcache.listener.socketTimeoutMillis" "${EHCACHE_LISTENER_PORT}"
+ set_cluster_property "ehcache.multicast.address" "${EHCACHE_MULTICAST_ADDRESS}"
+ set_cluster_property "ehcache.multicast.port" "${EHCACHE_MULTICAST_PORT}"
+ set_cluster_property "ehcache.multicast.timeToLive" "${EHCACHE_MULTICAST_TIMETOLIVE}"
+ set_cluster_property "ehcache.multicast.hostName" "${EHCACHE_MULTICAST_HOSTNAME}"
+fi
+
+
+# Start Jira as the correct user
+if [ "${UID}" -eq 0 ]; then
+ echo "User is currently root. Will change directory ownership to ${RUN_USER}:${RUN_GROUP}, then downgrade permission to ${RUN_USER}"
+ PERMISSIONS_SIGNATURE=$(stat -c "%u:%U:%a" "${JIRA_HOME}")
+ EXPECTED_PERMISSIONS=$(id -u ${RUN_USER}):${RUN_USER}:700
+ if [ "${PERMISSIONS_SIGNATURE}" != "${EXPECTED_PERMISSIONS}" ]; then
+ chmod -R 700 "${JIRA_HOME}" &&
+ chown -R "${RUN_USER}:${RUN_GROUP}" "${JIRA_HOME}"
+ fi
+ # Now drop privileges
+ exec su -s /bin/bash "${RUN_USER}" -c "$JIRA_INSTALL_DIR/bin/start-jira.sh $@"
+else
+ exec "$JIRA_INSTALL_DIR/bin/start-jira.sh" "$@"
+fi
diff --git a/linux/ecosystem/nodejs/node12/Dockerfile b/linux/ecosystem/nodejs/node12/Dockerfile
new file mode 100644
index 000000000..74c1388ea
--- /dev/null
+++ b/linux/ecosystem/nodejs/node12/Dockerfile
@@ -0,0 +1,35 @@
+FROM epicmorg/edge:latest
+LABEL maintainer="EpicMorg DevTeam, developer@epicm.org"
+ARG DEBIAN_FRONTEND=noninteractive
+
+##################################################################
+# Node.js 12.x
+##################################################################
+RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \
+ echo "deb https://nightly.yarnpkg.com/debian/ nightly main" > /etc/apt/sources.list.d/yarn.list && \
+ apt-get update && \
+ apt-get install -y nodejs yarn
+
+# curl -L https://www.npmjs.com/install.sh | sh
+# npm install -g npm
+
+RUN echo "=============================================" && \
+ echo node $(node --version) && \
+ echo npm $(npm --version) && \
+ echo yarn $(yarn --version) && \
+ echo "============================================="
+
+##################################################################
+# cleaninig up
+##################################################################
+RUN apt clean -y && \
+ apt-get clean all && \
+ apt autoclean -y && \
+ rm -rfv /var/lib/apt/lists/* && \
+ rm -rfv /var/cache/apt/archives/*.deb && \
+ rm -rfv /tmp/deb/* && \
+ rm -rfv /tmp/composer-setup.php && \
+ rm -rfv /tmp/amxx_base_latest.tar.gz && \
+ rm -rfv /tmp/atlassian-plugin-sdk.deb && \
+ rm -rfv /tmp/addons
diff --git a/linux/ecosystem/nodejs/node12/Makefile b/linux/ecosystem/nodejs/node12/Makefile
new file mode 100644
index 000000000..bad6d73b5
--- /dev/null
+++ b/linux/ecosystem/nodejs/node12/Makefile
@@ -0,0 +1,19 @@
+all: app
+
+app:
+ make build
+ make deploy
+ make clean
+
+build:
+ docker-compose build --compress --parallel
+
+deploy:
+ docker-compose push
+
+clean:
+ docker container prune -f
+ docker image prune -f
+ docker network prune -f
+ docker volume prune -f
+ docker system prune -af
diff --git a/linux/ecosystem/nodejs/node12/README.md b/linux/ecosystem/nodejs/node12/README.md
new file mode 100644
index 000000000..b53fe01e8
--- /dev/null
+++ b/linux/ecosystem/nodejs/node12/README.md
@@ -0,0 +1,93 @@
+## TeamCity Minimal Build Agent
+
+[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
+
+This is an official [JetBrains TeamCity](https://www.jetbrains.com/teamcity/) minimal build agent image.
+
+ More details about tags and components are [here](https://github.com/JetBrains/teamcity-docker-images/blob/master/generated/teamcity-minimal-agent.md).
+
+The [TeamCity build agent](https://www.jetbrains.com/help/teamcity/build-agent.html) connects to the TeamCity server and spawns the actual build processes.
+You can use the ```jetbrains/teamcity-server``` image to run a TeamCity server.
+
+This minimal image adds just a TeamCity agent without any tools like VCS clients, etc. It is suitable for simple builds and can serve as a base for your custom images. For Java or .NET development we recommend using the default build agent image [jetbrains/teamcity-agent](https://hub.docker.com/r/jetbrains/teamcity-agent/).
+
+## How to Use This Image
+
+Pull the TeamCity minimal image from the Docker Hub Repository:
+
+```
+jetbrains/teamcity-minimal-agent
+```
+
+and use the following command to start a container with TeamCity agent running inside
+a Linux container:
+
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ jetbrains/teamcity-minimal-agent
+```
+
+or a Windows container:
+```
+docker run -it -e SERVER_URL=""
+ -v :C:/BuildAgent/conf
+ jetbrains/teamcity-minimal-agent
+```
+where `` is the full URL for TeamCity server, accessible by the agent. Note that `localhost` will not generally not work as it will refer to the `localhost` inside the container.
+`` is the host machine directory to serve as the TeamCity agent config directory. We recommend providing this binding in order to persist the agent configuration, e.g. authorization on the server. Note that you should map a different folder for every new agent you create.
+
+Since version 2020.1, TeamCity agent Docker images __run under a non-root user__. Refer to our [upgrade notes](https://www.jetbrains.com/help/teamcity/upgrade-notes.html#UpgradeNotes-AgentDockerimagesrunundernon-rootuser) for information on possible affected use cases.
+
+When you run the agent for the first time, you should authorize it via the TeamCity server UI: go to the **Unauthorized Agents** page in your browser. See [more details](https://www.jetbrains.com/help/teamcity/build-agent.html).
+
+All information about agent authorization is stored in agent's configuration folder. If you stop the container with the agent and then start a new one with the same config folder, the agent's name and authorization state will be preserved.
+
+TeamCity agent does not need manual upgrade: it will upgrade itself automatically on connecting to an upgraded server.
+
+### Agent Image Environment Variables
+
+- **SERVER_URL** - URL of the TeamCity server agent will connect to
+- **AGENT_NAME** - (optional) Name of the agent in TeamCity UI, autogenerated if omitted
+- **AGENT_TOKEN** - (optional) Agent authorization token, if unset, the agent should be [authorized](https://www.jetbrains.com/help/teamcity/build-agent.html#BuildAgent-BuildAgentStatus) via TeamCity UI.
+- **OWN_ADDRESS** - (optional, linux only) IP address build agent binds to, autodetected
+- **OWN_PORT** - (optional, linux only) Port build agent binds to, 9090 by default
+
+### Windows Containers Limitations
+
+The details on the known problems in Windows containers are available in the [TeamCity documentation](https://www.jetbrains.com/help/teamcity/known-issues.html#KnownIssues-WindowsDockerContainers).
+
+## Customization
+
+You can customize the image via the usual Docker procedure:
+
+1. Run the image
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ --name="my-customized-agent" \
+ jetbrains/teamcity-minimal-agent \
+```
+2. Enter the container
+```
+docker exec -it my-customized-agent bash
+```
+
+3. Change whatever you need
+4. Exit and [create a new image](https://docs.docker.com/engine/reference/commandline/commit/) from the container
+```
+docker commit my-customized-agent
+```
+
+## License
+
+The image is available under the [TeamCity license](https://www.jetbrains.com/teamcity/buy/license.html).
+TeamCity is free for perpetual use with the limitation of 100 build configurations (jobs) and 3 agents. [Licensing details](https://www.jetbrains.com/help/teamcity/licensing-policy.html).
+
+## Feedback
+
+Report issues of suggestions to the official TeamCity [issue tracker](https://youtrack.jetbrains.com/issues/TW).
+
+## Other TeamCity Images
+* [TeamCity Server](https://hub.docker.com/r/jetbrains/teamcity-server/)
+* [Build Agent](https://hub.docker.com/r/jetbrains/teamcity-agent/)
diff --git a/linux/ecosystem/nodejs/node12/docker-compose.yml b/linux/ecosystem/nodejs/node12/docker-compose.yml
new file mode 100644
index 000000000..95e6a70a8
--- /dev/null
+++ b/linux/ecosystem/nodejs/node12/docker-compose.yml
@@ -0,0 +1,6 @@
+version: '3.9'
+services:
+ app:
+ image: "epicmorg/nodejs:node12"
+ build:
+ context: .
diff --git a/linux/ecosystem/nodejs/node14/Dockerfile b/linux/ecosystem/nodejs/node14/Dockerfile
new file mode 100644
index 000000000..bb6016a3a
--- /dev/null
+++ b/linux/ecosystem/nodejs/node14/Dockerfile
@@ -0,0 +1,35 @@
+FROM epicmorg/edge:latest
+LABEL maintainer="EpicMorg DevTeam, developer@epicm.org"
+ARG DEBIAN_FRONTEND=noninteractive
+
+##################################################################
+# Node.js 14.x
+##################################################################
+RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \
+ echo "deb https://nightly.yarnpkg.com/debian/ nightly main" > /etc/apt/sources.list.d/yarn.list && \
+ apt-get update && \
+ apt-get install -y nodejs yarn
+
+# curl -L https://www.npmjs.com/install.sh | sh
+# npm install -g npm
+
+RUN echo "=============================================" && \
+ echo node $(node --version) && \
+ echo npm $(npm --version) && \
+ echo yarn $(yarn --version) && \
+ echo "============================================="
+
+##################################################################
+# cleaninig up
+##################################################################
+RUN apt clean -y && \
+ apt-get clean all && \
+ apt autoclean -y && \
+ rm -rfv /var/lib/apt/lists/* && \
+ rm -rfv /var/cache/apt/archives/*.deb && \
+ rm -rfv /tmp/deb/* && \
+ rm -rfv /tmp/composer-setup.php && \
+ rm -rfv /tmp/amxx_base_latest.tar.gz && \
+ rm -rfv /tmp/atlassian-plugin-sdk.deb && \
+ rm -rfv /tmp/addons
diff --git a/linux/ecosystem/nodejs/node14/Makefile b/linux/ecosystem/nodejs/node14/Makefile
new file mode 100644
index 000000000..bad6d73b5
--- /dev/null
+++ b/linux/ecosystem/nodejs/node14/Makefile
@@ -0,0 +1,19 @@
+all: app
+
+app:
+ make build
+ make deploy
+ make clean
+
+build:
+ docker-compose build --compress --parallel
+
+deploy:
+ docker-compose push
+
+clean:
+ docker container prune -f
+ docker image prune -f
+ docker network prune -f
+ docker volume prune -f
+ docker system prune -af
diff --git a/linux/ecosystem/nodejs/node14/README.md b/linux/ecosystem/nodejs/node14/README.md
new file mode 100644
index 000000000..b53fe01e8
--- /dev/null
+++ b/linux/ecosystem/nodejs/node14/README.md
@@ -0,0 +1,93 @@
+## TeamCity Minimal Build Agent
+
+[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
+
+This is an official [JetBrains TeamCity](https://www.jetbrains.com/teamcity/) minimal build agent image.
+
+ More details about tags and components are [here](https://github.com/JetBrains/teamcity-docker-images/blob/master/generated/teamcity-minimal-agent.md).
+
+The [TeamCity build agent](https://www.jetbrains.com/help/teamcity/build-agent.html) connects to the TeamCity server and spawns the actual build processes.
+You can use the ```jetbrains/teamcity-server``` image to run a TeamCity server.
+
+This minimal image adds just a TeamCity agent without any tools like VCS clients, etc. It is suitable for simple builds and can serve as a base for your custom images. For Java or .NET development we recommend using the default build agent image [jetbrains/teamcity-agent](https://hub.docker.com/r/jetbrains/teamcity-agent/).
+
+## How to Use This Image
+
+Pull the TeamCity minimal image from the Docker Hub Repository:
+
+```
+jetbrains/teamcity-minimal-agent
+```
+
+and use the following command to start a container with TeamCity agent running inside
+a Linux container:
+
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ jetbrains/teamcity-minimal-agent
+```
+
+or a Windows container:
+```
+docker run -it -e SERVER_URL=""
+ -v :C:/BuildAgent/conf
+ jetbrains/teamcity-minimal-agent
+```
+where `` is the full URL for TeamCity server, accessible by the agent. Note that `localhost` will not generally not work as it will refer to the `localhost` inside the container.
+`` is the host machine directory to serve as the TeamCity agent config directory. We recommend providing this binding in order to persist the agent configuration, e.g. authorization on the server. Note that you should map a different folder for every new agent you create.
+
+Since version 2020.1, TeamCity agent Docker images __run under a non-root user__. Refer to our [upgrade notes](https://www.jetbrains.com/help/teamcity/upgrade-notes.html#UpgradeNotes-AgentDockerimagesrunundernon-rootuser) for information on possible affected use cases.
+
+When you run the agent for the first time, you should authorize it via the TeamCity server UI: go to the **Unauthorized Agents** page in your browser. See [more details](https://www.jetbrains.com/help/teamcity/build-agent.html).
+
+All information about agent authorization is stored in agent's configuration folder. If you stop the container with the agent and then start a new one with the same config folder, the agent's name and authorization state will be preserved.
+
+TeamCity agent does not need manual upgrade: it will upgrade itself automatically on connecting to an upgraded server.
+
+### Agent Image Environment Variables
+
+- **SERVER_URL** - URL of the TeamCity server agent will connect to
+- **AGENT_NAME** - (optional) Name of the agent in TeamCity UI, autogenerated if omitted
+- **AGENT_TOKEN** - (optional) Agent authorization token, if unset, the agent should be [authorized](https://www.jetbrains.com/help/teamcity/build-agent.html#BuildAgent-BuildAgentStatus) via TeamCity UI.
+- **OWN_ADDRESS** - (optional, linux only) IP address build agent binds to, autodetected
+- **OWN_PORT** - (optional, linux only) Port build agent binds to, 9090 by default
+
+### Windows Containers Limitations
+
+The details on the known problems in Windows containers are available in the [TeamCity documentation](https://www.jetbrains.com/help/teamcity/known-issues.html#KnownIssues-WindowsDockerContainers).
+
+## Customization
+
+You can customize the image via the usual Docker procedure:
+
+1. Run the image
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ --name="my-customized-agent" \
+ jetbrains/teamcity-minimal-agent \
+```
+2. Enter the container
+```
+docker exec -it my-customized-agent bash
+```
+
+3. Change whatever you need
+4. Exit and [create a new image](https://docs.docker.com/engine/reference/commandline/commit/) from the container
+```
+docker commit my-customized-agent
+```
+
+## License
+
+The image is available under the [TeamCity license](https://www.jetbrains.com/teamcity/buy/license.html).
+TeamCity is free for perpetual use with the limitation of 100 build configurations (jobs) and 3 agents. [Licensing details](https://www.jetbrains.com/help/teamcity/licensing-policy.html).
+
+## Feedback
+
+Report issues of suggestions to the official TeamCity [issue tracker](https://youtrack.jetbrains.com/issues/TW).
+
+## Other TeamCity Images
+* [TeamCity Server](https://hub.docker.com/r/jetbrains/teamcity-server/)
+* [Build Agent](https://hub.docker.com/r/jetbrains/teamcity-agent/)
diff --git a/linux/ecosystem/nodejs/node14/docker-compose.yml b/linux/ecosystem/nodejs/node14/docker-compose.yml
new file mode 100644
index 000000000..4635592a1
--- /dev/null
+++ b/linux/ecosystem/nodejs/node14/docker-compose.yml
@@ -0,0 +1,6 @@
+version: '3.9'
+services:
+ app:
+ image: "epicmorg/nodejs:node14"
+ build:
+ context: .
diff --git a/linux/ecosystem/nodejs/node15/Dockerfile b/linux/ecosystem/nodejs/node15/Dockerfile
new file mode 100644
index 000000000..1f8aff791
--- /dev/null
+++ b/linux/ecosystem/nodejs/node15/Dockerfile
@@ -0,0 +1,35 @@
+FROM epicmorg/edge:latest
+LABEL maintainer="EpicMorg DevTeam, developer@epicm.org"
+ARG DEBIAN_FRONTEND=noninteractive
+
+##################################################################
+# Node.js 15.x
+##################################################################
+RUN curl -sL https://deb.nodesource.com/setup_15.x | bash - && \
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \
+ echo "deb https://nightly.yarnpkg.com/debian/ nightly main" > /etc/apt/sources.list.d/yarn.list && \
+ apt-get update && \
+ apt-get install -y nodejs yarn
+
+# curl -L https://www.npmjs.com/install.sh | sh
+# npm install -g npm
+
+RUN echo "=============================================" && \
+ echo node $(node --version) && \
+ echo npm $(npm --version) && \
+ echo yarn $(yarn --version) && \
+ echo "============================================="
+
+##################################################################
+# cleaninig up
+##################################################################
+RUN apt clean -y && \
+ apt-get clean all && \
+ apt autoclean -y && \
+ rm -rfv /var/lib/apt/lists/* && \
+ rm -rfv /var/cache/apt/archives/*.deb && \
+ rm -rfv /tmp/deb/* && \
+ rm -rfv /tmp/composer-setup.php && \
+ rm -rfv /tmp/amxx_base_latest.tar.gz && \
+ rm -rfv /tmp/atlassian-plugin-sdk.deb && \
+ rm -rfv /tmp/addons
diff --git a/linux/ecosystem/nodejs/node15/Makefile b/linux/ecosystem/nodejs/node15/Makefile
new file mode 100644
index 000000000..bad6d73b5
--- /dev/null
+++ b/linux/ecosystem/nodejs/node15/Makefile
@@ -0,0 +1,19 @@
+all: app
+
+app:
+ make build
+ make deploy
+ make clean
+
+build:
+ docker-compose build --compress --parallel
+
+deploy:
+ docker-compose push
+
+clean:
+ docker container prune -f
+ docker image prune -f
+ docker network prune -f
+ docker volume prune -f
+ docker system prune -af
diff --git a/linux/ecosystem/nodejs/node15/README.md b/linux/ecosystem/nodejs/node15/README.md
new file mode 100644
index 000000000..b53fe01e8
--- /dev/null
+++ b/linux/ecosystem/nodejs/node15/README.md
@@ -0,0 +1,93 @@
+## TeamCity Minimal Build Agent
+
+[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
+
+This is an official [JetBrains TeamCity](https://www.jetbrains.com/teamcity/) minimal build agent image.
+
+ More details about tags and components are [here](https://github.com/JetBrains/teamcity-docker-images/blob/master/generated/teamcity-minimal-agent.md).
+
+The [TeamCity build agent](https://www.jetbrains.com/help/teamcity/build-agent.html) connects to the TeamCity server and spawns the actual build processes.
+You can use the ```jetbrains/teamcity-server``` image to run a TeamCity server.
+
+This minimal image adds just a TeamCity agent without any tools like VCS clients, etc. It is suitable for simple builds and can serve as a base for your custom images. For Java or .NET development we recommend using the default build agent image [jetbrains/teamcity-agent](https://hub.docker.com/r/jetbrains/teamcity-agent/).
+
+## How to Use This Image
+
+Pull the TeamCity minimal image from the Docker Hub Repository:
+
+```
+jetbrains/teamcity-minimal-agent
+```
+
+and use the following command to start a container with TeamCity agent running inside
+a Linux container:
+
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ jetbrains/teamcity-minimal-agent
+```
+
+or a Windows container:
+```
+docker run -it -e SERVER_URL=""
+ -v :C:/BuildAgent/conf
+ jetbrains/teamcity-minimal-agent
+```
+where `` is the full URL for TeamCity server, accessible by the agent. Note that `localhost` will not generally not work as it will refer to the `localhost` inside the container.
+`` is the host machine directory to serve as the TeamCity agent config directory. We recommend providing this binding in order to persist the agent configuration, e.g. authorization on the server. Note that you should map a different folder for every new agent you create.
+
+Since version 2020.1, TeamCity agent Docker images __run under a non-root user__. Refer to our [upgrade notes](https://www.jetbrains.com/help/teamcity/upgrade-notes.html#UpgradeNotes-AgentDockerimagesrunundernon-rootuser) for information on possible affected use cases.
+
+When you run the agent for the first time, you should authorize it via the TeamCity server UI: go to the **Unauthorized Agents** page in your browser. See [more details](https://www.jetbrains.com/help/teamcity/build-agent.html).
+
+All information about agent authorization is stored in agent's configuration folder. If you stop the container with the agent and then start a new one with the same config folder, the agent's name and authorization state will be preserved.
+
+TeamCity agent does not need manual upgrade: it will upgrade itself automatically on connecting to an upgraded server.
+
+### Agent Image Environment Variables
+
+- **SERVER_URL** - URL of the TeamCity server agent will connect to
+- **AGENT_NAME** - (optional) Name of the agent in TeamCity UI, autogenerated if omitted
+- **AGENT_TOKEN** - (optional) Agent authorization token, if unset, the agent should be [authorized](https://www.jetbrains.com/help/teamcity/build-agent.html#BuildAgent-BuildAgentStatus) via TeamCity UI.
+- **OWN_ADDRESS** - (optional, linux only) IP address build agent binds to, autodetected
+- **OWN_PORT** - (optional, linux only) Port build agent binds to, 9090 by default
+
+### Windows Containers Limitations
+
+The details on the known problems in Windows containers are available in the [TeamCity documentation](https://www.jetbrains.com/help/teamcity/known-issues.html#KnownIssues-WindowsDockerContainers).
+
+## Customization
+
+You can customize the image via the usual Docker procedure:
+
+1. Run the image
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ --name="my-customized-agent" \
+ jetbrains/teamcity-minimal-agent \
+```
+2. Enter the container
+```
+docker exec -it my-customized-agent bash
+```
+
+3. Change whatever you need
+4. Exit and [create a new image](https://docs.docker.com/engine/reference/commandline/commit/) from the container
+```
+docker commit my-customized-agent
+```
+
+## License
+
+The image is available under the [TeamCity license](https://www.jetbrains.com/teamcity/buy/license.html).
+TeamCity is free for perpetual use with the limitation of 100 build configurations (jobs) and 3 agents. [Licensing details](https://www.jetbrains.com/help/teamcity/licensing-policy.html).
+
+## Feedback
+
+Report issues of suggestions to the official TeamCity [issue tracker](https://youtrack.jetbrains.com/issues/TW).
+
+## Other TeamCity Images
+* [TeamCity Server](https://hub.docker.com/r/jetbrains/teamcity-server/)
+* [Build Agent](https://hub.docker.com/r/jetbrains/teamcity-agent/)
diff --git a/linux/ecosystem/nodejs/node15/docker-compose.yml b/linux/ecosystem/nodejs/node15/docker-compose.yml
new file mode 100644
index 000000000..fbb9dbdea
--- /dev/null
+++ b/linux/ecosystem/nodejs/node15/docker-compose.yml
@@ -0,0 +1,6 @@
+version: '3.9'
+services:
+ app:
+ image: "epicmorg/nodejs:node15"
+ build:
+ context: .
diff --git a/linux/ecosystem/nodejs/node16/Dockerfile b/linux/ecosystem/nodejs/node16/Dockerfile
new file mode 100644
index 000000000..09621fdd6
--- /dev/null
+++ b/linux/ecosystem/nodejs/node16/Dockerfile
@@ -0,0 +1,35 @@
+FROM epicmorg/edge:latest
+LABEL maintainer="EpicMorg DevTeam, developer@epicm.org"
+ARG DEBIAN_FRONTEND=noninteractive
+
+##################################################################
+# Node.js 16.x
+##################################################################
+RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - && \
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \
+ echo "deb https://nightly.yarnpkg.com/debian/ nightly main" > /etc/apt/sources.list.d/yarn.list && \
+ apt-get update && \
+ apt-get install -y nodejs yarn
+
+# curl -L https://www.npmjs.com/install.sh | sh
+# npm install -g npm
+
+RUN echo "=============================================" && \
+ echo node $(node --version) && \
+ echo npm $(npm --version) && \
+ echo yarn $(yarn --version) && \
+ echo "============================================="
+
+##################################################################
+# cleaninig up
+##################################################################
+RUN apt clean -y && \
+ apt-get clean all && \
+ apt autoclean -y && \
+ rm -rfv /var/lib/apt/lists/* && \
+ rm -rfv /var/cache/apt/archives/*.deb && \
+ rm -rfv /tmp/deb/* && \
+ rm -rfv /tmp/composer-setup.php && \
+ rm -rfv /tmp/amxx_base_latest.tar.gz && \
+ rm -rfv /tmp/atlassian-plugin-sdk.deb && \
+ rm -rfv /tmp/addons
diff --git a/linux/ecosystem/nodejs/node16/Makefile b/linux/ecosystem/nodejs/node16/Makefile
new file mode 100644
index 000000000..bad6d73b5
--- /dev/null
+++ b/linux/ecosystem/nodejs/node16/Makefile
@@ -0,0 +1,19 @@
+all: app
+
+app:
+ make build
+ make deploy
+ make clean
+
+build:
+ docker-compose build --compress --parallel
+
+deploy:
+ docker-compose push
+
+clean:
+ docker container prune -f
+ docker image prune -f
+ docker network prune -f
+ docker volume prune -f
+ docker system prune -af
diff --git a/linux/ecosystem/nodejs/node16/README.md b/linux/ecosystem/nodejs/node16/README.md
new file mode 100644
index 000000000..b53fe01e8
--- /dev/null
+++ b/linux/ecosystem/nodejs/node16/README.md
@@ -0,0 +1,93 @@
+## TeamCity Minimal Build Agent
+
+[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
+
+This is an official [JetBrains TeamCity](https://www.jetbrains.com/teamcity/) minimal build agent image.
+
+ More details about tags and components are [here](https://github.com/JetBrains/teamcity-docker-images/blob/master/generated/teamcity-minimal-agent.md).
+
+The [TeamCity build agent](https://www.jetbrains.com/help/teamcity/build-agent.html) connects to the TeamCity server and spawns the actual build processes.
+You can use the ```jetbrains/teamcity-server``` image to run a TeamCity server.
+
+This minimal image adds just a TeamCity agent without any tools like VCS clients, etc. It is suitable for simple builds and can serve as a base for your custom images. For Java or .NET development we recommend using the default build agent image [jetbrains/teamcity-agent](https://hub.docker.com/r/jetbrains/teamcity-agent/).
+
+## How to Use This Image
+
+Pull the TeamCity minimal image from the Docker Hub Repository:
+
+```
+jetbrains/teamcity-minimal-agent
+```
+
+and use the following command to start a container with TeamCity agent running inside
+a Linux container:
+
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ jetbrains/teamcity-minimal-agent
+```
+
+or a Windows container:
+```
+docker run -it -e SERVER_URL=""
+ -v :C:/BuildAgent/conf
+ jetbrains/teamcity-minimal-agent
+```
+where `` is the full URL for TeamCity server, accessible by the agent. Note that `localhost` will not generally not work as it will refer to the `localhost` inside the container.
+`` is the host machine directory to serve as the TeamCity agent config directory. We recommend providing this binding in order to persist the agent configuration, e.g. authorization on the server. Note that you should map a different folder for every new agent you create.
+
+Since version 2020.1, TeamCity agent Docker images __run under a non-root user__. Refer to our [upgrade notes](https://www.jetbrains.com/help/teamcity/upgrade-notes.html#UpgradeNotes-AgentDockerimagesrunundernon-rootuser) for information on possible affected use cases.
+
+When you run the agent for the first time, you should authorize it via the TeamCity server UI: go to the **Unauthorized Agents** page in your browser. See [more details](https://www.jetbrains.com/help/teamcity/build-agent.html).
+
+All information about agent authorization is stored in agent's configuration folder. If you stop the container with the agent and then start a new one with the same config folder, the agent's name and authorization state will be preserved.
+
+TeamCity agent does not need manual upgrade: it will upgrade itself automatically on connecting to an upgraded server.
+
+### Agent Image Environment Variables
+
+- **SERVER_URL** - URL of the TeamCity server agent will connect to
+- **AGENT_NAME** - (optional) Name of the agent in TeamCity UI, autogenerated if omitted
+- **AGENT_TOKEN** - (optional) Agent authorization token, if unset, the agent should be [authorized](https://www.jetbrains.com/help/teamcity/build-agent.html#BuildAgent-BuildAgentStatus) via TeamCity UI.
+- **OWN_ADDRESS** - (optional, linux only) IP address build agent binds to, autodetected
+- **OWN_PORT** - (optional, linux only) Port build agent binds to, 9090 by default
+
+### Windows Containers Limitations
+
+The details on the known problems in Windows containers are available in the [TeamCity documentation](https://www.jetbrains.com/help/teamcity/known-issues.html#KnownIssues-WindowsDockerContainers).
+
+## Customization
+
+You can customize the image via the usual Docker procedure:
+
+1. Run the image
+```
+docker run -it -e SERVER_URL="" \
+ -v :/data/teamcity_agent/conf \
+ --name="my-customized-agent" \
+ jetbrains/teamcity-minimal-agent \
+```
+2. Enter the container
+```
+docker exec -it my-customized-agent bash
+```
+
+3. Change whatever you need
+4. Exit and [create a new image](https://docs.docker.com/engine/reference/commandline/commit/) from the container
+```
+docker commit my-customized-agent
+```
+
+## License
+
+The image is available under the [TeamCity license](https://www.jetbrains.com/teamcity/buy/license.html).
+TeamCity is free for perpetual use with the limitation of 100 build configurations (jobs) and 3 agents. [Licensing details](https://www.jetbrains.com/help/teamcity/licensing-policy.html).
+
+## Feedback
+
+Report issues of suggestions to the official TeamCity [issue tracker](https://youtrack.jetbrains.com/issues/TW).
+
+## Other TeamCity Images
+* [TeamCity Server](https://hub.docker.com/r/jetbrains/teamcity-server/)
+* [Build Agent](https://hub.docker.com/r/jetbrains/teamcity-agent/)
diff --git a/linux/ecosystem/nodejs/node16/docker-compose.yml b/linux/ecosystem/nodejs/node16/docker-compose.yml
new file mode 100644
index 000000000..7a126d0b9
--- /dev/null
+++ b/linux/ecosystem/nodejs/node16/docker-compose.yml
@@ -0,0 +1,6 @@
+version: '3.9'
+services:
+ app:
+ image: "epicmorg/nodejs:node16"
+ build:
+ context: .