Initializing a Custom Node Environment in a Subdomain#

First, create our node “application”:

vim app.js

const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

Next create Reward’s .env file in the same directory and modify it as you wish.

reward env-init webapp --environment-type=local

With the first 3 variables you can configure the target container, the shell and the user of reward shell.

With the next 3 variables you can configure the target of the synchronization (to which container, to which folder) and you can disable sync if you want.

vim .env

REWARD_SHELL_CONTAINER=custom-container
REWARD_SHELL_COMMAND=sh
REWARD_SHELL_USER=node

REWARD_SYNC_ENABLED=true
REWARD_SYNC_CONTAINER=custom-container
REWARD_SYNC_PATH=/app

REWARD_ENV_NAME=webapp
REWARD_ENV_TYPE=local
REWARD_WEB_ROOT=/

TRAEFIK_DOMAIN=webapp.test
TRAEFIK_SUBDOMAIN=custom
TRAEFIK_EXTRA_HOSTS=

REWARD_DB=false
REWARD_ELASTICSEARCH=false
REWARD_OPENSEARCH=false
REWARD_VARNISH=false
REWARD_RABBITMQ=false
REWARD_REDIS=false
REWARD_MERCURE=false

Now we define the new environment using a custom go template.

Note: if you modify the container name in the service you should modify it in the labels as well!

vim .reward/reward-env.yml

version: "3.5"
services:
  custom-container:
    hostname: "{{ .reward_env_name }}-node"
    build:
      context: .
      dockerfile: .reward/Dockerfile
    volumes:
      - appdata:/app
    extra_hosts:
      - {{ .traefik_domain }}:{{ default "0.0.0.0" .traefik_address }}
      - {{ default "app" .traefik_subdomain }}.{{ .traefik_domain }}:{{ default "0.0.0.0" .traefik_address}}
    labels:
      - traefik.enable=true
      - traefik.http.routers.custom.tls=true
      - traefik.http.routers.custom.rule=Host(`{{ default "app" .traefik_subdomain }}.{{ default "custom.test" .traefik_domain }}`)
      - traefik.http.services.custom.loadbalancer.server.port=3000
      - traefik.docker.network={{ .reward_env_name }}_default
      - dev.reward.container.name=custom-container
      - dev.reward.environment.name={{ .reward_env_name }}

volumes:
  appdata: {}

And finally create a custom Dockerfile

vim .reward/Dockerfile

FROM node:lts
WORKDIR /app
COPY . /app

ARG DOCKER_START_COMMAND="node app.js"
ENV DOCKER_START_COMMAND=$DOCKER_START_COMMAND

CMD ["sh", "-c", "while true; do ${DOCKER_START_COMMAND}; sleep 10; done"]