Setup Node.js using latest features for development and production

i am building a node.js api. I want to use some latest ecmascript features. But during production i need a built/dist version that will run on the lts node version.

Problems:

  1. I have setup webpack and babel for this but im not sure if im duplicating stuff by having webpack & babel in seperate configuration files.

  2. My goal is to have a setup that builds on changes and the node server restarts on changes. This does not need to be the case for production i just need a built version. Do i need seperate webconfigs for this? Right now i have a webpack plugin that after build it runs nodemon this works well for dev but dont need for production.

  3. Trying to debug errors using my setup is difficult i believe the sourcemaps are not setup properly. So the errors always point to dist/index.js which is a long file of compiled code.

package.json

{     "name": "backend-blue",     "version": "1.0.0",     "description": "",     "main": "index.js",     "scripts": {         "serve": "webpack --watch",         "build": "webpack",         "quality": "./node_modules/.bin/eslint src/",         "test": "nyc mocha --timeout 5000 test/**/*.test.js --exit"     },     "nyc": {         "require": [             "@babel/register"         ],         "reporter": [             "lcov",             "text"         ],         "sourceMap": false,         "instrument": false     },     "repository": {         "type": "git",         "url": ""     },     "author": "",     "license": "ISC",     "dependencies": {         "cors": "^2.8.5",         "dotenv": "^6.2.0",         "express": "^4.16.4",         "express-validator": "^5.3.1",         "mongoose": "^5.4.15",         "morgan": "^1.9.1",         "passport": "^0.4.0",         "passport-jwt": "^4.0.0",         "response-time": "^2.3.2",         "uuid": "^3.3.2",         "winston": "^3.2.1"     },     "devDependencies": {         "@babel/cli": "^7.2.3",         "@babel/core": "^7.3.3",         "@babel/plugin-proposal-class-properties": "^7.3.3",         "@babel/plugin-transform-runtime": "^7.2.0",         "@babel/preset-env": "^7.3.1",         "@babel/register": "^7.0.0",         "@babel/runtime": "^7.3.1",         "babel-eslint": "^10.0.1",         "babel-loader": "^8.0.5",         "babel-plugin-istanbul": "^5.1.1",         "babel-plugin-transform-regenerator": "^6.26.0",         "babel-polyfill": "^6.26.0",         "chai": "^4.2.0",         "clean-webpack-plugin": "^1.0.1",         "cross-env": "^5.2.0",         "eslint": "^5.14.1",         "eslint-config-google": "^0.12.0",         "eslint-loader": "^2.1.2",         "eslint-plugin-react": "^7.12.4",         "mocha": "^6.0.1",         "nyc": "^13.3.0",         "supertest": "^3.4.2",         "webpack": "^4.29.5",         "webpack-cli": "^3.2.3",         "webpack-node-externals": "^1.7.2",         "webpack-shell-plugin": "^0.5.0"     } } 

webpack.config.js

const path = require("path"); const WebpackShellPlugin = require("webpack-shell-plugin"); const nodeExternals = require("webpack-node-externals"); const CleanWebpackPlugin = require("clean-webpack-plugin");  module.exports = [     {         mode: "development",         entry: ["babel-polyfill", "./src/index.js"],         target: "node",         externals: [nodeExternals()], // in order to ignore all modules in node_modules folder         stats: {             colors: true         },         devtool: "source-map",          output: {             path: path.resolve(__dirname, "dist"),             filename: "index.js",             sourceMapFilename: "index.js.map"         },         module: {             rules: [                 {                     enforce: "pre",                     test: /\.js$  /,                     exclude: /node_modules/,                     loader: "eslint-loader",                 },                 {                     test: /\.m?js$  /,                     exclude: /(node_modules|bower_components)/,                     use: {                         loader: "babel-loader",                         options: {                             presets: ["@babel/preset-env", {                                 plugins: ["@babel/plugin-proposal-class-properties"]                             }]                         }                     }                 }             ],         },         node: {             __dirname: false,             __filename: false,         },          "plugins": [             new CleanWebpackPlugin(),             new WebpackShellPlugin({                 onBuildStart: [],                 onBuildEnd: ["nodemon dist/index.js"]             }),             // new CopyWebpackPlugin([{             //     from: 'src/public/',             //     to: 'public/'             // }]),         ]      }, ]; 

.babelrc

{     "presets": [       "@babel/preset-env"     ],     "env": {       "test": {         "plugins": [           "istanbul"         ]       }     },     "plugins": [         "@babel/transform-runtime", "@babel/plugin-proposal-class-properties"     ] } 

I am trying to achieve a node setup that allows me to use the latest ecmascript features, make code changes that automatically rebuild the project and restart server aswell as being able to debug errors. Finally being able to seperate development from production.

How do I get my Django + React Application running in production mode on apache2 with Pipenv?

I am doing a group project with Django and React and each of us has been given its own VM to run it on. At the moment we are only able to start a development server for Django with the “runserver” command and a server to compile our react code with “npm start”. The backend is then accessible on port 8000 and the frontend on port 3000. We are now trying to get this configuration running so that it is continually accessible and we can configure HTTPS. We have tried many different internet tutorials (and probably broke some things underway) but we can’t seem to get it running. Last one we tried was https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/modwsgi/ The server is still not accessible at its IP. Our VM is a Debian GNU/Linux 8.11 (jessie), we are using Pipenv version 2018.10.13 as out virtual environment with Python 3.4.2 and Django 2.0.10. Our apache is ver. 0.91-ubuntu1.

Here is my apache2.conf:

# This is the main Apache server configuration file.  It contains the # configuration directives that give the server its instructions. # See http://httpd.apache.org/docs/2.4/ for detailed information about # the directives and /usr/share/doc/apache2/README.Debian about Debian specific # hints. # # # Summary of how the Apache 2 configuration works in Debian: # The Apache 2 web server configuration in Debian is quite different to # upstream's suggested way to configure the web server. This is because Debian's # default Apache2 installation attempts to make adding and removing modules, # virtual hosts, and extra configuration directives as flexible as possible, in # order to make automating the changes and administering the server as easy as # possible.  # It is split into several files forming the configuration hierarchy outlined # below, all located in the /etc/apache2/ directory: # #       /etc/apache2/ #       |-- apache2.conf #       |       `--  ports.conf #       |-- mods-enabled #       |       |-- *.load #       |       `-- *.conf #       |-- conf-enabled #       |       `-- *.conf #       `-- sites-enabled #               `-- *.conf # # # * apache2.conf is the main configuration file (this file). It puts the pieces #   together by including all remaining configuration files when starting up the #   web server. # # * ports.conf is always included from the main configuration file. It is #   supposed to determine listening ports for incoming connections which can be #   customized anytime. # # * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ #   directories contain particular configuration snippets which manage modules, #   global configuration fragments, or virtual host configurations, #   respectively. # #   They are activated by symlinking available configuration files from their #   respective *-available/ counterparts. These should be managed by using our #   helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See #   their respective man pages for detailed information. # # * The binary is called apache2. Due to the use of environment variables, in #   the default configuration, apache2 needs to be started/stopped with #   /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not #   work with the default configuration.   # Global configuration #  # # ServerRoot: The top of the directory tree under which the server's # configuration, error, and log files are kept. # # NOTE!  If you intend to place this on an NFS (or otherwise network) # mounted filesystem then please read the Mutex documentation (available # at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>); # you will save yourself a lot of trouble. # # Do NOT add a slash at the end of the directory path. # #ServerRoot "/etc/apache2"  # # The accept serialization lock file MUST BE STORED ON A LOCAL DISK. # Mutex file:$  {APACHE_LOCK_DIR} default  # # PidFile: The file in which the server should record its process # identification number when it starts. # This needs to be set in /etc/apache2/envvars # PidFile $  {APACHE_PID_FILE}  # # Timeout: The number of seconds before receives and sends time out. # Timeout 300 # # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On  # # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 100  # # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 5   # These need to be set in /etc/apache2/envvars User $  {APACHE_RUN_USER} Group $  {APACHE_RUN_GROUP}  # # HostnameLookups: Log the names of clients or just their IP addresses # e.g., www.apache.org (on) or 204.62.129.132 (off). # The default is off because it'd be overall better for the net if people # had to knowingly turn this feature on, since enabling it means that # each client request will result in AT LEAST one lookup request to the # nameserver. # HostnameLookups Off  # ErrorLog: The location of the error log file. # If you do not specify an ErrorLog directive within a <VirtualHost> # container, error messages relating to that virtual host will be # logged here.  If you *do* define an error logfile for a <VirtualHost> # container, that host's errors will be logged there and not here. # ErrorLog $  {APACHE_LOG_DIR}/error.log  # # LogLevel: Control the severity of messages logged to the error_log. # Available values: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the log level for particular modules, e.g. # "LogLevel info ssl:warn" # LogLevel warn  # Include module configuration: IncludeOptional mods-enabled/*.load IncludeOptional mods-enabled/*.conf  # Include list of ports to listen on Include ports.conf # Sets the default security model of the Apache2 HTTPD server. It does # not allow access to the root filesystem outside of /usr/share and /var/www. # The former is used by web applications packaged in Debian, # the latter may be used for local directories served by the web server. If # your system is serving content from a sub-directory in /srv you must allow # access here, or in any related virtual host. <Directory />         Options FollowSymLinks         AllowOverride None         Require all denied </Directory>  <Directory /usr/share>         AllowOverride None         Require all granted </Directory>  <Directory /var/www/>         Options Indexes FollowSymLinks         AllowOverride All         Require all granted </Directory>  #<Directory /srv/> #       Options Indexes FollowSymLinks #       AllowOverride None #       Require all granted #</Directory>     # AccessFileName: The name of the file to look for in each directory # for additional configuration directives.  See also the AllowOverride # directive. # AccessFileName .htaccess  # # The following lines prevent .htaccess and .htpasswd files from being # viewed by Web clients. # <FilesMatch "^\.ht">         Require all denied </FilesMatch>   # # The following directives define some format nicknames for use with # a CustomLog directive. # # These deviate from the Common Log Format definitions in that they use %O # (the actual bytes sent including headers) instead of %b (the size of the # requested file), because the latter makes it impossible to detect partial # requests. # # Note that the use of %{X-Forwarded-For}i instead of %h is not recommended. # Use mod_remoteip instead. # LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent  # Include of directories ignores editors' and dpkg's backup files, # see README.Debian for details.  # Include generic snippets of statements IncludeOptional conf-enabled/*.conf  # Include the virtual host configurations: IncludeOptional sites-enabled/*.conf  # vim: syntax=apache ts=4 sw=4 sts=4 sr noet  # TODO LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so # This is just the root of your virtualenv directory, i.e. two levels above activate WSGIPythonHome /root/.local/share/virtualenvs/backend-nwAt4pcf/bin/ WSGIPythonPath /root/.local/share/virtualenvs/backend-nwAt4pcf/bin/python3.4   <Directory /var/www/>   Options Indexes FollowSymLinks   AllowOverride All   Require all granted </Directory>  

And my backend.conf:

Listen 8000 <VirtualHost *:8000>   ServerName webspec68.mi   ServerAdmin xxx@xxx-xxx.xx   DocumentRoot /var/www/html/puppy-webshop/backend    # Point this to the wsgi.py in the same directory as your settings.py file   WSGIScriptAlias / /var/www/html/puppy-webshop/backend/backend/wsgi.py    <Directory /var/www/html/puppy-webshop/backend>     <Files wsgi.py>       Require all granted       Allow from all     </Files>   </Directory> </VirtualHost>  

And finally the frontend.conf:

<VirtualHost *:80>   ServerName webspec68.mi   ServerAdmin xxx@xxx-xxx.xx   DocumentRoot /var/www/frontend    # Serve static files like the minified javascript from npm run-script build   Alias /static /var/www/todo/frontend/build/static   <Directory /var/www/todo/frontend/build/static>     Require all granted   </Directory> </VirtualHost>  

The error.log is constantly logging these errors:

"ImportError: No module named 'encodings' [Sun Jan 20 17:59:59.887686 2019] [core:notice] [pid 20413:tid 140450917902208] AH00052: child pid 20430 exit signal Aborted (6) [Sun Jan 20 18:00:00.889711 2019] [wsgi:warn] [pid 20431:tid 140450917902208] (13)Permission denied: mod_wsgi (pid=20431): Unable to stat Python home /root/.local/share/virtualenvs/backend-nwAt4pcf/bin/. Python interpreter may not be able to be initialized correctly. Verify the supplied path and access permissions for whole of the path. Fatal Python error: Py_Initialize: Unable to get the locale encoding 

The project is currently under /var/www/html/my-project/. Should our backend part be in /var/www/backend and our frontend in /var/www/frontend? Also the WSGIPythonHome and WSGIPythonPath are just a guess as I can’t find a tutorial for doing this with pipenv. These seem like the main problems for now. There is probably a lot wrong here but I am pretty new to all of this. Appreciate any help!

Magento 1.8 Emails not sending on production site

We have a dev site and a live site on the one server. Emails such as “Email a friend”, forgotten password, welcome emails etc – they are sent on the development site but not on the live production site.

We have AOE Scheduler installed on both. Cron appears to be working fine. All extensions etc are the same on both sites, and as far as we can see any code changes are the same also. The mail settings in System > Config > Advanced are all the same.

Don’t seem to be getting any relevant errors in the logs.

Is there anything we could try? The only thing that has just occurred to me in writing this is that the live site has SSL – is there any way this could be causing an issue?

Thanks for any pointers

How do you use production metrics to aid your day-to-day software development?

If you’ve ever used/heard of Application Performance Monitoring tools such as New Relic or ELK stack, you’ll know that they provide you with the following features:

  • Various production metrics on a deployed application, and hooks into most languages to collect said metrics
  • Per-function and sometimes per-line profiling data (also hooks into web frameworks like Flask to give you stats for each of your API endpoints)
  • Tracking of exceptions and error rates

However, these APM tools are largely targeted at operations/sysadmin people. There is arguably a huge amount of very useful data in there, which could aid you in your day-to-day development work. Imagine:

  1. Writing some code
  2. Deploying that code
  3. Knowing immediately on a line-by-line basis, where your performance bottlenecks are
  4. Seeing some exceptions unfold in your IDE, in real-time
  5. Playing back through particular events which occurred on live production servers in order to debug production issues locally, while having access to the exact inputs which were used
  6. Having your IDE infer the complexity of your functions based on live production data
  7. Having all of your production metrics be version-control-aware straight out-of-the-box, such that you could do all of the above with respect to any deployed revision
  8. ???

In his paper “Developer Targeted Analytics: Supporting Software Development Decisions with Runtime Information“, Jürgen Cito writes:

  • Runtime information delivered in the form of centralized and external dashboards are not actionable for software developers
  • When solving problems that have occurred at runtime, developers rather rely on beliefs and intuition than utilize metrics
  • Data combinatorics in production environments are so different to what profilers and tests can simulate either locally or in staging environments

All of which are very sensible observations – or are they? This is where I need your help.

I am using his work as a basis for developing my own solution to this problem, and I thought I would reach out to some real developers, in order to help me:

  1. Evaluate the importance/need/impact of a solution to this problem
  2. Draw some inspiration from software developers much more experienced than myself
  3. Gather real opinions on how to improve the development process as a whole, and lead to quicker turnaround times and higher quality code

I have a good set of initial ideas as to where I’d like to take this. A lot of the work will involve writing a very intuitive plugin for IntelliJ in order to make this kind of information actionable, and hopefully aid in the daily decision making process of developers.

So, with all of the above in mind, I’d like to ask the community here:

  1. What are your general thoughts on all of the above?
  2. What kinds of features do you wish your IDE had in order to make use of production metrics data?
  3. Do you know/use any other tools which tried to achieve the same thing? How did you find that experience?

Many thanks.

How to deploy pwa-studio on server in production mode?

I have successfully installed PWA-studio with Magento 2.3. But I am not able to run it on production mode on a Ubuntu 18.04 LTS server so that we can access the PWA remotely but I am always able to start the application in development mode which only accessible locally.

How I can configure my server as well as the PWA-studio so that we can access the application remotely?

CSS not updating in Production Mode

Issue

It doesn’t appear that my merged/minified files are being updated when changed whilst in Production Mode. For example, I made a change to this file:

app/design/frontend/Theme/theme_child/web/css/styles.css

But even after I run the following, the styling isn’t taking effect:

bin/magento setup:di:compile bin/magento setup:static-content:deploy en_GB en_US bin/magento cache:flush 

I even hit the Flush Javascript/CSS Cache button on the backend.

Question

Am I missing a step? Is this a known “gremlin”? Could some of the cached files not be clearing as expected? What folder can I rm -rf to manually purge them so they can be re-deployed?

Notes:

  • The changes do take affect on my Dev Server
  • It’s not my browsers cache
  • I’m not using a CDN

Production Mode app:config:import issue

after a new deployment I get the following error:

{"0":"The configuration file has changed. Run app:config:import or setup:upgrade command to synchronize configuration.","1":"#0 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/vendor\/magento\/framework\/Interception\/Interceptor.php(121): Magento\Deploy\Model\Plugin\ConfigChangeDetector->beforeDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Magento\Framework\App\Request\Http))\n#1 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/vendor\/magento\/module-page-cache\/Model\/App\/FrontController\/BuiltinPlugin.php(73): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))\n#2 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/vendor\/magento\/framework\/Interception\/Interceptor.php(135): Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))\n#3 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/vendor\/magento\/framework\/Interception\/Interceptor.php(153): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))\n#4 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/generated\/code\/Magento\/Framework\/App\/FrontController\/Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, Array)\n#5 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/vendor\/magento\/framework\/App\/Http.php(135): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))\n#6 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/vendor\/magento\/framework\/App\/Bootstrap.php(256): Magento\Framework\App\Http->launch()\n#7 \/var\/www\/dev.xxx.com\/httpdocs\/releases\/4\/pub\/index.php(37): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http\Interceptor))\n#8 {main}","url":"\/","script_name":"\/index.php"} 

But when I run bin/magento app:config:import (irrelevant how often) it says Nothing to import.

Anyone a suggestion how to solve this issue?

cheers bambamboole

Different web servers for Development and Production versions Swift

I am developing an app, which is using a web based database. I would like to separate the server addresses for the development builds and use this development server during the approval process when Apple is checking the App.

Once it is released, it should use the production server.

Could somebody help me where can I find how this can be made?