|
| 1 | +# ASP.NET Core / Vue.js SPA Template App |
| 2 | + |
| 3 | +This app is a template application using ASP.NET Core for a REST/JSON API server and Vue.js for a web client. |
| 4 | + |
| 5 | +## Overview of Stack |
| 6 | +- Server |
| 7 | + - ASP.NET Core |
| 8 | + - PostgresSQL |
| 9 | + - Entity Framework Core w/ EF Migrations |
| 10 | + - JSON Web Token (JWT) authorization with OpenIddict |
| 11 | + - Docker used for development PostgresSQL database and MailCatcher server |
| 12 | +- Client |
| 13 | + - Vue.js |
| 14 | + - Webpack for asset bundling and HMR (Hot Module Replacement) |
| 15 | + - CSS Modules |
| 16 | +- Testing |
| 17 | + - xUnit for .NET Core |
| 18 | + - MailCatcher for development email delivery |
| 19 | +- DevOps |
| 20 | + - Ansible playbook for provisioning (Nginx reverse proxy, SSL via Let's Encrypt, PostgresSQL backups to S3) |
| 21 | + - Ansible playbook for deployment |
| 22 | + |
| 23 | +## Setup |
| 24 | + |
| 25 | +1. Install the following: |
| 26 | + - [.NET Core 1.1](https://www.microsoft.com/net/core) |
| 27 | + - [Node.js >= v7.8.0](https://nodejs.org/en/download/) |
| 28 | + - [Ansible >= 2.0](http://docs.ansible.com/ansible/intro_installation.html) |
| 29 | + - [Docker](https://docs.docker.com/engine/installation/) |
| 30 | +2. Run `npm install && npm start` |
| 31 | +3. Open browser and navigate to [http://localhost:5000](http://localhost:5000). |
| 32 | + |
| 33 | +## Scripts |
| 34 | + |
| 35 | +### `npm install` |
| 36 | + |
| 37 | +When first cloning the repo or adding new dependencies, run this command. This will: |
| 38 | + |
| 39 | +- Install Node dependencies from package.json |
| 40 | +- Install .NET Core dependencies from api/api.csproj and api.test/api.test.csproj (using dotnet restore) |
| 41 | + |
| 42 | +### `npm start` |
| 43 | + |
| 44 | +To start the app for development, run this command. This will: |
| 45 | + |
| 46 | +- Run `docker-compose up` to ensure the PostgreSQL and MailCatcher Docker images are up and running |
| 47 | +- Run dotnet watch run which will build the app (if changed), watch for changes and start the web server on http://localhost:5000 |
| 48 | +- Run Webpack dev middleware with HMR via [ASP.NET JavaScriptServices](https://github.com/aspnet/JavaScriptServices) |
| 49 | + |
| 50 | +### `npm run migrate` |
| 51 | + |
| 52 | +After making changes to Entity Framework models in `api/Models/`, run this command to generate and run a migration on the database. A timestamp will be used for the migration name. |
| 53 | + |
| 54 | +### `npm test` |
| 55 | + |
| 56 | +This will run the xUnit tests in api.test/ and the Vue.js tests in client-web.test/. |
| 57 | + |
| 58 | +### `npm run provision:prod` |
| 59 | + |
| 60 | + _Before running this script, you need to create an ops/hosts file first. See the [ops README](ops/) for instructions._ |
| 61 | + |
| 62 | + This will run the ops/provision.yml Ansible playbook and provision hosts in ops/hosts inventory file. This prepares the hosts to recieve deployments by doing the following: |
| 63 | + - Install Nginx |
| 64 | + - Generate a SSL certificate from [Let's Encrypt](https://letsencrypt.org/) and configure Nginx to use it |
| 65 | + - Install .Net Core |
| 66 | + - Install Supervisor (will run/manage the ASP.NET app) |
| 67 | + - Install PostgreSQL |
| 68 | + - Setup a cron job to automatically backup the PostgresSQL database, compress it, and upload it to S3. |
| 69 | + - Setup UFW (firewall) to lock everything down except inbound SSH and web traffic |
| 70 | + - Create a deploy user, directory for deployments and configure Nginx to serve from this directory |
| 71 | + |
| 72 | +### `npm run deploy:prod` |
| 73 | + |
| 74 | +_Before running this script, you need to create a ops/hosts file first. See the [ops README](ops/) for instructions._ |
| 75 | + |
| 76 | +This script will: |
| 77 | + - Build release Webpack bundles |
| 78 | + - Package the .NET Core application in Release mode (dotnet publish) |
| 79 | + - Run the ops/deploy.yml Ansible playbook to deploy this app to hosts in /ops/hosts inventory file. This does the following: |
| 80 | + - Copies the build assets to the remote host(s) |
| 81 | + - Updates the `appsettings.json` file with PostgresSQL credentials specified in ops/hosts file and the app URL (needed for JWT tokens) |
| 82 | + - Restarts the app so that changes will be picked up |
| 83 | + |
| 84 | +## Development Email Delivery |
| 85 | + |
| 86 | +This template includes a [MailCatcher](https://mailcatcher.me/) Docker image so that when email is sent during development (i.e. new user registration), it can be viewed |
| 87 | +in the MailCacher web interface at [http://localhost:1080/](http://localhost:1080/). |
| 88 | + |
| 89 | +## Visual Studio Code config |
| 90 | + |
| 91 | +This project has [Visual Studio Code](https://code.visualstudio.com/) tasks and debugger launch config located in .vscode/. |
| 92 | + |
| 93 | +### Tasks |
| 94 | + |
| 95 | +- **Command+Shift+B** - Runs the "build" task which builds the api/ project |
| 96 | +- **Command+Shift+T** - Runs the "test" task which runs the xUnit tests in api.test/ and Mocha/Enzyme tests in client-react.test/. |
| 97 | + |
| 98 | +### Debug Launcher |
| 99 | + |
| 100 | +With the following debugger launch configs, you can set breakpoints in api/ or the the Mocha tests in client-react.test/ and have full debugging support. |
| 101 | + |
| 102 | +- **Debug api/ (server)** - Runs the vscode debugger (breakpoints) on the api/ .NET Core app |
| 103 | +- **Debug client-web.test/ (Mocha tests)** - Runs the vscode debugger on the client-web.test/ Mocha tests |
| 104 | + |
| 105 | +## Credit |
| 106 | + |
| 107 | +The following resources were helpful in setting up this template: |
| 108 | + |
| 109 | +- [Sample for implementing Authentication with a React Flux app and JWTs](https://github.com/auth0-blog/react-flux-jwt-authentication-sample) |
| 110 | +- [Angular 2, React, and Knockout apps on ASP.NET Core](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/) |
| 111 | +- [Setting up ASP.NET v5 (vNext) to use JWT tokens (using OpenIddict)](http://capesean.co.za/blog/asp-net-5-jwt-tokens/) |
| 112 | +- [Cross-platform Single Page Applications with ASP.NET Core 1.0, Angular 2 & TypeScript](https://chsakell.com/2016/01/01/cross-platform-single-page-applications-with-asp-net-5-angular-2-typescript/) |
| 113 | +- [Stack Overflow - Token Based Authentication in ASP.NET Core](http://stackoverflow.com/questions/30546542/token-based-authentication-in-asp-net-core-refreshed) |
| 114 | +- [SPA example of a token based authentication implementation using the Aurelia front end framework and ASP.NET core]( https://github.com/alexandre-spieser/AureliaAspNetCoreAuth) |
| 115 | +- [A Real-World React.js Setup for ASP.NET Core and MVC5](https://www.simple-talk.com/dotnet/asp-net/a-real-world-react-js-setup-for-asp-net-core-and-mvc) |
| 116 | +- My own perseverance because this took a _lot_ of time to get right 😁 |
0 commit comments