{"id":16770365,"url":"https://github.com/ivanproskuryakov/loopplate","last_synced_at":"2026-05-10T15:35:05.632Z","repository":{"id":74609907,"uuid":"113480723","full_name":"ivanproskuryakov/loopplate","owner":"ivanproskuryakov","description":"Loopplate - Production ready Node.js boilerplate. Loopback, Typescript, Angular.js","archived":false,"fork":false,"pushed_at":"2018-12-02T10:17:06.000Z","size":2688,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-16T15:19:56.034Z","etag":null,"topics":["express","javascript-framework","loopback","node","nodejs","nodejs-framework","typescript","typescript-framework"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ivanproskuryakov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-07T17:39:03.000Z","updated_at":"2019-01-30T09:13:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"f2cde19e-b543-4463-a9fa-64eec83ab41c","html_url":"https://github.com/ivanproskuryakov/loopplate","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ivanproskuryakov/loopplate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanproskuryakov%2Floopplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanproskuryakov%2Floopplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanproskuryakov%2Floopplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanproskuryakov%2Floopplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ivanproskuryakov","download_url":"https://codeload.github.com/ivanproskuryakov/loopplate/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ivanproskuryakov%2Floopplate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32861655,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-10T13:40:02.631Z","status":"ssl_error","status_checked_at":"2026-05-10T13:40:02.145Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","javascript-framework","loopback","node","nodejs","nodejs-framework","typescript","typescript-framework"],"created_at":"2024-10-13T06:23:55.647Z","updated_at":"2026-05-10T15:35:05.585Z","avatar_url":"https://github.com/ivanproskuryakov.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"Quick start\n------------\nBuild, launch server and watch for changes\n```\ngulp app:watch\n```\n \nRunning tests\n```\nnpm test\n```\n\n![Image of Loopback](https://raw.githubusercontent.com/ivanproskuryakov/loopplate/master/docs/screen-one.png)\n\n\nDependencies\n-------------\nhttps://github.com/ivanproskuryakov/loopplate/wiki/Packages-\u0026-dependencies\n\n\nDetailed Description\n-------------\nNOTE: Boilerplate in active developing process. https://12factor.net/\n\n### I. Codebase\nApps codebase contains both backend and frontend parts.\n- Backend with its settings is located inside /app directory,\n- /build directory is transpiled version of typescript running with node.js\n- /data directory for backend assets, like the list of available countries used by the app.\n- /public is where AnguarJS SPA located with needed assets and stylesheets.\n\n### II. Dependencies\nBackend dependencies controlled by NPM, bower used for the frontend, `package.json` and `bower.json` \nare the corresponding files with all needed dependencies, \n```npm install``` and ```bower install``` - common commands to install them.\n\n### III. Config\nRunning environments: production, development and test.\nA setting file for each environment located in app/server directory.\nAn official documentation technical aspects with needed details, see http://loopback.io/doc/en/lb3/Environment-specific-configuration.html\n\n\n### IV. Backing services\nMongoDb is a storage of choice, app can be converted to SQL based database since it's based on Looback's DAO.\nFor more info, see https://loopback.io/doc/en/lb3/Defining-data-sources.html.\nOutbound emails are sent using mailgun that connected as a datasource and listed in datasources.json file.\nLogs and errors are sent to sentry.io saas storage.\n\n\n### V. Build, release, run\nBuilds done with https://github.com/shipitjs/shipit - it is simple, does the jobs and written on js.\nCommands ```shipit production deploy``` and ```shipit staging deploy``` deploy production and staging accordingly.\n\nOn deployment git repo, and runs the commands in the following steps:\n1. `npm install` - installs backend node dependencies on remote server.\n2. `npm rebuild node-sass` - rebuilding `node-sass` vendor otherwise node-sass is broken and can't be used.\n3. `bower install --allow-root` - frontend dependencies using bower.\n4. `gulp app:build`- the actual build of the app, once the required vendors are in place.\n5. `pm2 delete all` - kills/removes the actual node app and workers from the list, no mater if there any or not.\n6. `pm2 start pm2.json` - start the app and workers based on settings from pm2.json file.\n7. `node build/command/sitemap.js` - generates sitemap.xml file.\n8. Update slack on successful deployment. \n\n\n### VI. Processes\nCommands needed both for dev and deployment made with gulp, see `gulpfile.js`.\n\n- `gulp app:build` - build the app.\n- `gulp app:watch` - watch for changes both in frontend and backend codebase, compile, run \"server:watch\".\n- `gulp server:watch` - launch server.js in background and restarts if changes were done in \"/build\" directory.\n\nFrontend:\n- `gulp frontend:sass` - compile sass.\n- `gulp frontend:sass` - compile sass + watch for changes.\n- `gulp frontend:loopback` - generate Angular $resource services based on backend code, see https://github.com/strongloop/loopback-sdk-angular.\n- `gulp frontend:rjs` - compiles javascript into a single file using RequireJS.\n- `gulp frontend:templatecache` - concatenate and register AngularJS templates in the $templateCache.\n- `gulp frontend:clean` - concatenate and register AngularJS templates in the $templateCache.\n\nBackend:\n- `gulp backend:symlink` - symlink /node_modules/app with /node_modules, needed for absolute paths.\n- `gulp backend:build` - clean and rebuild.\n- `gulp backend:watch` - watch for changes and recompile.\n\nDB:\n- `mongodump_mongorestore.sh` - shell script to restore db from remote production to local development environment.\n\n\n### VII. Port binding\n - Development: 8080\n - Production: 80\n  \n### VIII. Concurrency\nDue the nature of Node event-loop repeatedly takes a one single event at the time, no JavaScript code is executed in parallel.\nParallelism can be achieved by starting several workers(server/server.js), see http://pm2.keymetrics.io/docs/usage/cluster-mode/\n\n### IX. Disposability\n`shipit production pm2-start` \u0026 `shipit production pm2-stop` \nhttp://pm2.keymetrics.io/docs/usage/signals-clean-restart/\n\n### X. Dev/prod parity\nManifest recommends have identical production, development and environments.\nBackup production database to your local frequently manually or with `mongodump_mongorestore.sh`, \n\n### XI. Logs\nOn production logs go to sentry.io, development sends logs to console, test environment do not output any logs(mock).\n`winston` npm library is used for logs transportation, https://github.com/winstonjs/winston       \n\n### XII. Admin processes\n - `node build/command/sitemap.js` - generate sitemap.xml file.\n - `node build/command/sendSummary.js` - send summary email with a list of new users.\n - `node build/db/updateDataSources.js` - migration command to detect difference between DB and schema, alter DB schema to match schema.\n - `node build/db/cleanup.js` - truncate database and populate demo data.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanproskuryakov%2Floopplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fivanproskuryakov%2Floopplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fivanproskuryakov%2Floopplate/lists"}