├── diagrams ├── 10 │ └── .gitkeep ├── 11 │ ├── .gitkeep │ └── diagrams.xml ├── 12 │ └── .gitkeep ├── 13 │ ├── .gitkeep │ └── diagrams.xml ├── 14 │ └── .gitkeep ├── 15 │ └── .gitkeep ├── 16 │ ├── .gitkeep │ └── diagrams.xml ├── 17 │ ├── .gitkeep │ └── diagrams.xml ├── 18 │ ├── .gitkeep │ └── diagrams.xml ├── 19 │ ├── .gitkeep │ └── diagrams.xml ├── 01 │ └── .gitkeep ├── 02 │ └── .gitkeep ├── 03 │ ├── .gitkeep │ └── diagrams.xml ├── 04 │ ├── .gitkeep │ └── diagrams.xml ├── 05 │ ├── .gitkeep │ └── diagrams.xml ├── 06 │ └── .gitkeep ├── 07 │ ├── .gitkeep │ └── diagrams.xml ├── 09 │ └── .gitkeep └── 08 │ └── diagrams.xml ├── complex ├── .gitignore ├── client │ ├── src │ │ ├── index.css │ │ ├── App.test.js │ │ ├── OtherPage.js │ │ ├── index.js │ │ ├── App.css │ │ ├── App.js │ │ ├── Fib.js │ │ ├── logo.svg │ │ └── registerServiceWorker.js │ ├── public │ │ ├── favicon.ico │ │ ├── manifest.json │ │ └── index.html │ ├── Dockerfile.dev │ ├── nginx │ │ └── default.conf │ ├── docker-compose.yml │ ├── Dockerfile │ ├── .gitignore │ └── package.json ├── service-account.json.enc ├── worker │ ├── keys.js │ ├── Dockerfile │ ├── Dockerfile.dev │ ├── package.json │ └── index.js ├── server │ ├── Dockerfile │ ├── Dockerfile.dev │ ├── keys.js │ ├── package.json │ └── index.js ├── k8s │ ├── client-cluster-ip-service.yaml │ ├── redis-cluster-ip-service.yaml │ ├── server-cluster-ip-service.yaml │ ├── database-persistent-volume-claim.yaml │ ├── postgres-cluster-ip-service.yaml │ ├── issuer.yaml │ ├── redis-deployment.yaml │ ├── client-deployment.yaml │ ├── certificate.yaml │ ├── worker-deployment.yaml │ ├── postgres-deployment.yaml │ ├── server-deployment.yaml │ └── ingress-service.yaml ├── skaffold.yaml ├── deploy.sh └── .travis.yml ├── .gitignore ├── README.md ├── complex-elastic-beanstalk ├── nginx │ ├── Dockerfile │ ├── Dockerfile.dev │ └── default.conf ├── client │ ├── src │ │ ├── index.css │ │ ├── App.test.js │ │ ├── OtherPage.js │ │ ├── index.js │ │ ├── App.css │ │ ├── App.js │ │ ├── Fib.js │ │ ├── logo.svg │ │ └── registerServiceWorker.js │ ├── public │ │ ├── favicon.ico │ │ ├── manifest.json │ │ └── index.html │ ├── Dockerfile.dev │ ├── nginx │ │ └── default.conf │ ├── Dockerfile │ ├── .gitignore │ └── package.json ├── worker │ ├── keys.js │ ├── Dockerfile │ ├── Dockerfile.dev │ ├── package.json │ └── index.js ├── server │ ├── Dockerfile │ ├── Dockerfile.dev │ ├── keys.js │ ├── package.json │ └── index.js ├── Dockerrun.aws.json ├── docker-compose.yml └── .travis.yml ├── frontend ├── src │ ├── index.css │ ├── index.js │ ├── App.test.js │ ├── App.css │ ├── App.js │ ├── logo.svg │ └── registerServiceWorker.js ├── public │ ├── favicon.ico │ ├── manifest.json │ └── index.html ├── Dockerfile.dev ├── Dockerfile ├── .gitignore ├── package.json ├── docker-compose.yml └── .travis.yml ├── simpleweb ├── package.json ├── Dockerfile └── index.js ├── simplek8s ├── client-node-port.yaml ├── client-pod.yaml └── client-deployment.yaml └── redis-image └── Dockerfile /diagrams/01/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/02/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/03/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/04/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/05/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/06/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /diagrams/07/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/09/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/10/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/11/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/12/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/13/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/14/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/15/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/16/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/17/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/18/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /diagrams/19/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /complex/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DockerCasts 2 | Companion repo to a course on Udemy.com 3 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx 2 | COPY ./default.conf /etc/nginx/conf.d/default.conf -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: sans-serif; 5 | } 6 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/nginx/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM nginx 2 | COPY ./default.conf /etc/nginx/conf.d/default.conf -------------------------------------------------------------------------------- /complex/client/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: sans-serif; 5 | } 6 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StephenGrider/DockerCasts/master/frontend/public/favicon.ico -------------------------------------------------------------------------------- /complex/service-account.json.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StephenGrider/DockerCasts/master/complex/service-account.json.enc -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: sans-serif; 5 | } 6 | -------------------------------------------------------------------------------- /complex/client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StephenGrider/DockerCasts/master/complex/client/public/favicon.ico -------------------------------------------------------------------------------- /complex/worker/keys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | redisHost: process.env.REDIS_HOST, 3 | redisPort: process.env.REDIS_PORT 4 | }; 5 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/worker/keys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | redisHost: process.env.REDIS_HOST, 3 | redisPort: process.env.REDIS_PORT 4 | }; 5 | -------------------------------------------------------------------------------- /complex/server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "start"] -------------------------------------------------------------------------------- /complex/worker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "start"] -------------------------------------------------------------------------------- /simpleweb/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "express": "*" 4 | }, 5 | "scripts": { 6 | "start": "node index.js" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /complex/client/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR '/app' 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "start"] -------------------------------------------------------------------------------- /complex/server/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "dev"] -------------------------------------------------------------------------------- /complex/worker/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "dev"] -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StephenGrider/DockerCasts/master/complex-elastic-beanstalk/client/public/favicon.ico -------------------------------------------------------------------------------- /complex-elastic-beanstalk/server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "start"] -------------------------------------------------------------------------------- /complex-elastic-beanstalk/server/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "dev"] -------------------------------------------------------------------------------- /complex-elastic-beanstalk/worker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "start"] -------------------------------------------------------------------------------- /complex-elastic-beanstalk/worker/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR "/app" 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "dev"] -------------------------------------------------------------------------------- /complex/client/nginx/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 3000; 3 | 4 | location / { 5 | root /usr/share/nginx/html; 6 | index index.html index.htm; 7 | } 8 | } -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | WORKDIR '/app' 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | CMD ["npm", "run", "start"] -------------------------------------------------------------------------------- /frontend/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | 3 | WORKDIR '/app' 4 | 5 | COPY package.json . 6 | RUN npm install 7 | 8 | COPY . . 9 | 10 | CMD ["npm", "run", "start"] -------------------------------------------------------------------------------- /complex/client/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => {}); 6 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/nginx/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 3000; 3 | 4 | location / { 5 | root /usr/share/nginx/html; 6 | index index.html index.htm; 7 | } 8 | } -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => {}); 6 | -------------------------------------------------------------------------------- /complex/worker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "nodemon": "1.18.3", 4 | "redis": "2.8.0" 5 | }, 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "nodemon" 9 | } 10 | } -------------------------------------------------------------------------------- /complex-elastic-beanstalk/worker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "nodemon": "1.18.3", 4 | "redis": "2.8.0" 5 | }, 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "nodemon" 9 | } 10 | } -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine as builder 2 | WORKDIR '/app' 3 | COPY package*.json ./ 4 | RUN npm install 5 | COPY . . 6 | RUN npm run build 7 | 8 | FROM nginx 9 | EXPOSE 80 10 | COPY --from=builder /app/build /usr/share/nginx/html -------------------------------------------------------------------------------- /simpleweb/Dockerfile: -------------------------------------------------------------------------------- 1 | # Specify a base image 2 | FROM node:alpine 3 | 4 | WORKDIR /usr/app 5 | 6 | # Install some depenendencies 7 | COPY ./package.json ./ 8 | RUN npm install 9 | COPY ./ ./ 10 | 11 | # Default command 12 | CMD ["npm", "start"] -------------------------------------------------------------------------------- /simpleweb/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | 3 | const app = express(); 4 | 5 | app.get('/', (req, res) => { 6 | res.send('How are you doing'); 7 | }); 8 | 9 | app.listen(8080, () => { 10 | console.log('Listening on port 8080'); 11 | }); 12 | -------------------------------------------------------------------------------- /complex/k8s/client-cluster-ip-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: client-cluster-ip-service 5 | spec: 6 | type: ClusterIP 7 | selector: 8 | component: web 9 | ports: 10 | - port: 3000 11 | targetPort: 3000 12 | -------------------------------------------------------------------------------- /complex/k8s/redis-cluster-ip-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: redis-cluster-ip-service 5 | spec: 6 | type: ClusterIP 7 | selector: 8 | component: redis 9 | ports: 10 | - port: 6379 11 | targetPort: 6379 12 | -------------------------------------------------------------------------------- /complex/k8s/server-cluster-ip-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: server-cluster-ip-service 5 | spec: 6 | type: ClusterIP 7 | selector: 8 | component: server 9 | ports: 10 | - port: 5000 11 | targetPort: 5000 12 | -------------------------------------------------------------------------------- /complex/k8s/database-persistent-volume-claim.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: database-persistent-volume-claim 5 | spec: 6 | accessModes: 7 | - ReadWriteOnce 8 | resources: 9 | requests: 10 | storage: 2Gi 11 | -------------------------------------------------------------------------------- /simplek8s/client-node-port.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: client-node-port 5 | spec: 6 | type: NodePort 7 | ports: 8 | - port: 3050 9 | targetPort: 3000 10 | nodePort: 31515 11 | selector: 12 | component: web 13 | -------------------------------------------------------------------------------- /complex/client/src/OtherPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | export default () => { 5 | return ( 6 |
7 | Im some other page! 8 | Go back home 9 |
10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /complex/k8s/postgres-cluster-ip-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: postgres-cluster-ip-service 5 | spec: 6 | type: ClusterIP 7 | selector: 8 | component: postgres 9 | ports: 10 | - port: 5432 11 | targetPort: 5432 12 | -------------------------------------------------------------------------------- /redis-image/Dockerfile: -------------------------------------------------------------------------------- 1 | # Use an existing docker image as a base 2 | FROM alpine 3 | 4 | # Download and install a dependency 5 | RUN apk add --update gcc 6 | RUN apk add --update redis 7 | 8 | # Tell the image what to do when it starts 9 | # as a container 10 | CMD ["redis-server"] -------------------------------------------------------------------------------- /simplek8s/client-pod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: client-pod 5 | labels: 6 | component: web 7 | spec: 8 | containers: 9 | - name: client 10 | image: stephengrider/multi-worker 11 | ports: 12 | - containerPort: 9999 13 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/OtherPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | export default () => { 5 | return ( 6 |
7 | Im some other page! 8 | Go back home 9 |
10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /complex/client/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | client_tests: 4 | command: ['nodemon', '--exec', 'npm', 'test'] 5 | build: 6 | dockerfile: ./client/Dockerfile.dev 7 | context: ./client 8 | volumes: 9 | - /app/node_modules 10 | - .:/app 11 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import registerServiceWorker from './registerServiceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | registerServiceWorker(); 9 | -------------------------------------------------------------------------------- /complex/client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import registerServiceWorker from './registerServiceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | registerServiceWorker(); 9 | -------------------------------------------------------------------------------- /complex/client/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine as builder 2 | WORKDIR '/app' 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | RUN npm run build 7 | 8 | FROM nginx 9 | EXPOSE 3000 10 | COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf 11 | COPY --from=builder /app/build /usr/share/nginx/html -------------------------------------------------------------------------------- /frontend/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import registerServiceWorker from './registerServiceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | registerServiceWorker(); 9 | -------------------------------------------------------------------------------- /complex/server/keys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | redisHost: process.env.REDIS_HOST, 3 | redisPort: process.env.REDIS_PORT, 4 | pgUser: process.env.PGUSER, 5 | pgHost: process.env.PGHOST, 6 | pgDatabase: process.env.PGDATABASE, 7 | pgPassword: process.env.PGPASSWORD, 8 | pgPort: process.env.PGPORT 9 | }; 10 | -------------------------------------------------------------------------------- /complex/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "express": "4.16.3", 4 | "pg": "7.4.3", 5 | "redis": "2.8.0", 6 | "cors": "2.8.4", 7 | "nodemon": "1.18.3", 8 | "body-parser": "*" 9 | }, 10 | "scripts": { 11 | "dev": "nodemon", 12 | "start": "node index.js" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine as builder 2 | WORKDIR '/app' 3 | COPY ./package.json ./ 4 | RUN npm install 5 | COPY . . 6 | RUN npm run build 7 | 8 | FROM nginx 9 | EXPOSE 3000 10 | COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf 11 | COPY --from=builder /app/build /usr/share/nginx/html -------------------------------------------------------------------------------- /complex-elastic-beanstalk/server/keys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | redisHost: process.env.REDIS_HOST, 3 | redisPort: process.env.REDIS_PORT, 4 | pgUser: process.env.PGUSER, 5 | pgHost: process.env.PGHOST, 6 | pgDatabase: process.env.PGDATABASE, 7 | pgPassword: process.env.PGPASSWORD, 8 | pgPort: process.env.PGPORT 9 | }; 10 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "express": "4.16.3", 4 | "pg": "7.4.3", 5 | "redis": "2.8.0", 6 | "cors": "2.8.4", 7 | "nodemon": "1.18.3", 8 | "body-parser": "*" 9 | }, 10 | "scripts": { 11 | "dev": "nodemon", 12 | "start": "node index.js" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /complex/k8s/issuer.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: certmanager.k8s.io/v1alpha1 2 | kind: ClusterIssuer 3 | metadata: 4 | name: letsencrypt-prod 5 | spec: 6 | acme: 7 | server: https://acme-v02.api.letsencrypt.org/directory 8 | email: 'ste.grider@gmail.com' 9 | privateKeySecretRef: 10 | name: letsencrypt-prod 11 | http01: {} 12 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | -------------------------------------------------------------------------------- /complex/client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | -------------------------------------------------------------------------------- /frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /complex/client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "react": "^16.4.1", 7 | "react-dom": "^16.4.1", 8 | "react-scripts": "1.1.4" 9 | }, 10 | "scripts": { 11 | "start": "react-scripts start", 12 | "build": "react-scripts build", 13 | "test": "react-scripts test --env=jsdom", 14 | "eject": "react-scripts eject" 15 | } 16 | } -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /complex/k8s/redis-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: redis-deployment 5 | spec: 6 | replicas: 1 7 | selector: 8 | matchLabels: 9 | component: redis 10 | template: 11 | metadata: 12 | labels: 13 | component: redis 14 | spec: 15 | containers: 16 | - name: redis 17 | image: redis 18 | ports: 19 | - containerPort: 6379 20 | -------------------------------------------------------------------------------- /frontend/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | web: 4 | build: 5 | context: . 6 | dockerfile: Dockerfile.dev 7 | ports: 8 | - "3000:3000" 9 | volumes: 10 | - /app/node_modules 11 | - .:/app 12 | tests: 13 | build: 14 | context: . 15 | dockerfile: Dockerfile.dev 16 | volumes: 17 | - /app/node_modules 18 | - .:/app 19 | command: ["npm", "run", "test"] 20 | -------------------------------------------------------------------------------- /complex/k8s/client-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: client-deployment 5 | spec: 6 | replicas: 3 7 | selector: 8 | matchLabels: 9 | component: web 10 | template: 11 | metadata: 12 | labels: 13 | component: web 14 | spec: 15 | containers: 16 | - name: client 17 | image: stephengrider/multi-client 18 | ports: 19 | - containerPort: 3000 20 | -------------------------------------------------------------------------------- /simplek8s/client-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: client-deployment 5 | spec: 6 | replicas: 1 7 | selector: 8 | matchLabels: 9 | component: web 10 | template: 11 | metadata: 12 | labels: 13 | component: web 14 | spec: 15 | containers: 16 | - name: client 17 | image: stephengrider/multi-client 18 | ports: 19 | - containerPort: 3000 20 | -------------------------------------------------------------------------------- /complex/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "react": "^16.4.2", 7 | "react-dom": "^16.4.2", 8 | "react-scripts": "1.1.4", 9 | "react-router-dom": "4.3.1", 10 | "axios": "0.18.0" 11 | }, 12 | "scripts": { 13 | "start": "react-scripts start", 14 | "build": "react-scripts build", 15 | "test": "react-scripts test --env=jsdom", 16 | "eject": "react-scripts eject" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "react": "^16.4.2", 7 | "react-dom": "^16.4.2", 8 | "react-scripts": "1.1.4", 9 | "react-router-dom": "4.3.1", 10 | "axios": "0.18.0" 11 | }, 12 | "scripts": { 13 | "start": "react-scripts start", 14 | "build": "react-scripts build", 15 | "test": "react-scripts test --env=jsdom", 16 | "eject": "react-scripts eject" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | animation: App-logo-spin infinite 20s linear; 7 | height: 80px; 8 | } 9 | 10 | .App-header { 11 | background-color: #222; 12 | height: 150px; 13 | padding: 20px; 14 | color: white; 15 | } 16 | 17 | .App-title { 18 | font-size: 1.5em; 19 | } 20 | 21 | .App-intro { 22 | font-size: large; 23 | } 24 | 25 | @keyframes App-logo-spin { 26 | from { transform: rotate(0deg); } 27 | to { transform: rotate(360deg); } 28 | } 29 | -------------------------------------------------------------------------------- /complex/client/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | animation: App-logo-spin infinite 20s linear; 7 | height: 80px; 8 | } 9 | 10 | .App-header { 11 | background-color: #222; 12 | height: 150px; 13 | padding: 20px; 14 | color: white; 15 | } 16 | 17 | .App-title { 18 | font-size: 1.5em; 19 | } 20 | 21 | .App-intro { 22 | font-size: large; 23 | } 24 | 25 | @keyframes App-logo-spin { 26 | from { transform: rotate(0deg); } 27 | to { transform: rotate(360deg); } 28 | } 29 | -------------------------------------------------------------------------------- /complex/k8s/certificate.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: certmanager.k8s.io/v1alpha1 2 | kind: Certificate 3 | metadata: 4 | name: k8s-multi-com-tls 5 | spec: 6 | secretName: k8s-multi-com 7 | issuerRef: 8 | name: letsencrypt-prod 9 | kind: ClusterIssuer 10 | commonName: k8s-multi.com 11 | dnsNames: 12 | - k8s-multi.com 13 | - www.k8s-multi.com 14 | acme: 15 | config: 16 | - http01: 17 | ingressClass: nginx 18 | domains: 19 | - k8s-multi.com 20 | - www.k8s-multi.com 21 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | animation: App-logo-spin infinite 20s linear; 7 | height: 80px; 8 | } 9 | 10 | .App-header { 11 | background-color: #222; 12 | height: 150px; 13 | padding: 20px; 14 | color: white; 15 | } 16 | 17 | .App-title { 18 | font-size: 1.5em; 19 | } 20 | 21 | .App-intro { 22 | font-size: large; 23 | } 24 | 25 | @keyframes App-logo-spin { 26 | from { transform: rotate(0deg); } 27 | to { transform: rotate(360deg); } 28 | } 29 | -------------------------------------------------------------------------------- /diagrams/05/diagrams.xml: -------------------------------------------------------------------------------- 1 | dZHBEoIgEIafhjuxjePdrC6dPHQmQWVC10EcradPAzPG4sLut/+/yywEkno8Gd5WFxRSE0bFSOBAGNuxKJ6umTwciSByoDRKeNEKMvWUHlJPeyVkFwgtoraqDWGOTSNzGzBuDA6hrEAdTm15KTcgy7ne0qsStnIUgNK1cJaqrPzofRR7y43n99Jg3/iBhEHxPq5c86WZ79RVXODwhSAlkBhE66J6TKSel7vszfmOf6qfhxvZ2B+GKVh7T0nwg5C+AA== -------------------------------------------------------------------------------- /complex/worker/index.js: -------------------------------------------------------------------------------- 1 | const keys = require('./keys'); 2 | const redis = require('redis'); 3 | 4 | const redisClient = redis.createClient({ 5 | host: keys.redisHost, 6 | port: keys.redisPort, 7 | retry_strategy: () => 1000 8 | }); 9 | const sub = redisClient.duplicate(); 10 | 11 | function fib(index) { 12 | if (index < 2) return 1; 13 | return fib(index - 1) + fib(index - 2); 14 | } 15 | 16 | sub.on('message', (channel, message) => { 17 | redisClient.hset('values', message, fib(parseInt(message))); 18 | }); 19 | sub.subscribe('insert'); 20 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/nginx/default.conf: -------------------------------------------------------------------------------- 1 | upstream client { 2 | server client:3000; 3 | } 4 | 5 | upstream api { 6 | server api:5000; 7 | } 8 | 9 | server { 10 | listen 80; 11 | 12 | location / { 13 | proxy_pass http://client; 14 | } 15 | 16 | location /sockjs-node { 17 | proxy_pass http://client; 18 | proxy_http_version 1.1; 19 | proxy_set_header Upgrade $http_upgrade; 20 | proxy_set_header Connection "Upgrade"; 21 | } 22 | 23 | location /api { 24 | rewrite /api/(.*) /$1 break; 25 | proxy_pass http://api; 26 | } 27 | } -------------------------------------------------------------------------------- /complex-elastic-beanstalk/worker/index.js: -------------------------------------------------------------------------------- 1 | const keys = require('./keys'); 2 | const redis = require('redis'); 3 | 4 | const redisClient = redis.createClient({ 5 | host: keys.redisHost, 6 | port: keys.redisPort, 7 | retry_strategy: () => 1000 8 | }); 9 | const sub = redisClient.duplicate(); 10 | 11 | function fib(index) { 12 | if (index < 2) return 1; 13 | return fib(index - 1) + fib(index - 2); 14 | } 15 | 16 | sub.on('message', (channel, message) => { 17 | redisClient.hset('values', message, fib(parseInt(message))); 18 | }); 19 | sub.subscribe('insert'); 20 | -------------------------------------------------------------------------------- /complex/k8s/worker-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: worker-deployment 5 | spec: 6 | replicas: 1 7 | selector: 8 | matchLabels: 9 | component: worker 10 | template: 11 | metadata: 12 | labels: 13 | component: worker 14 | spec: 15 | containers: 16 | - name: worker 17 | image: stephengrider/multi-worker 18 | env: 19 | - name: REDIS_HOST 20 | value: redis-cluster-ip-service 21 | - name: REDIS_PORT 22 | value: '6379' 23 | -------------------------------------------------------------------------------- /frontend/.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | services: 3 | - docker 4 | 5 | before_install: 6 | - docker build -t stephengrider/docker-react -f Dockerfile.dev . 7 | 8 | script: 9 | - docker run stephengrider/docker-react npm run test -- --coverage 10 | 11 | deploy: 12 | provider: elasticbeanstalk 13 | region: "us-west-2" 14 | app: "docker" 15 | env: "Docker-env" 16 | bucket_name: "elasticbeanstalk-us-west-2-306476627547" 17 | bucket_path: "docker" 18 | on: 19 | branch: master 20 | access_key_id: $AWS_ACCESS_KEY 21 | secret_access_key: 22 | secure: "$AWS_SECRET_KEY" 23 | 24 | -------------------------------------------------------------------------------- /frontend/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import logo from './logo.svg'; 3 | import './App.css'; 4 | 5 | class App extends Component { 6 | render() { 7 | return ( 8 |
9 |
10 | logo 11 |

Welcome to React

12 |
13 |

14 | I was changed on the Feature branch 15 |

16 |
17 | ); 18 | } 19 | } 20 | 21 | export default App; 22 | -------------------------------------------------------------------------------- /complex/skaffold.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: skaffold/v1beta2 2 | kind: Config 3 | build: 4 | local: 5 | push: false 6 | artifacts: 7 | - image: stephengrider/multi-client 8 | context: client 9 | docker: 10 | dockerfile: Dockerfile.dev 11 | sync: 12 | '**/*.js': . 13 | '**/*.css': . 14 | '**/*.html': . 15 | - image: stephengrider/multi-server 16 | context: server 17 | docker: 18 | dockerfile: Dockerfile.dev 19 | sync: 20 | '**/*.js': . 21 | - image: stephengrider/multi-worker 22 | context: worker 23 | docker: 24 | dockerfile: Dockerfile.dev 25 | sync: 26 | '**/*.js': . 27 | deploy: 28 | kubectl: 29 | manifests: 30 | - k8s/client-deployment.yaml 31 | - k8s/server-deployment.yaml 32 | - k8s/worker-deployment.yaml 33 | - k8s/server-cluster-ip-service.yaml 34 | - k8s/client-cluster-ip-service.yaml 35 | -------------------------------------------------------------------------------- /complex/client/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import logo from './logo.svg'; 3 | import './App.css'; 4 | import { BrowserRouter as Router, Route, Link } from 'react-router-dom'; 5 | import OtherPage from './OtherPage'; 6 | import Fib from './Fib'; 7 | 8 | class App extends Component { 9 | render() { 10 | return ( 11 | 12 |
13 |
14 | logo 15 |

Fib Calculator UPDATED!

16 | Home 17 | Other Page 18 |
19 |
20 | 21 | 22 |
23 |
24 |
25 | ); 26 | } 27 | } 28 | 29 | export default App; 30 | -------------------------------------------------------------------------------- /complex/deploy.sh: -------------------------------------------------------------------------------- 1 | docker build -t stephengrider/multi-client:latest -t stephengrider/multi-client:$SHA -f ./client/Dockerfile ./client 2 | docker build -t stephengrider/multi-server:latest -t stephengrider/multi-server:$SHA -f ./server/Dockerfile ./server 3 | docker build -t stephengrider/multi-worker:latest -t stephengrider/multi-worker:$SHA -f ./worker/Dockerfile ./worker 4 | 5 | docker push stephengrider/multi-client:latest 6 | docker push stephengrider/multi-server:latest 7 | docker push stephengrider/multi-worker:latest 8 | 9 | docker push stephengrider/multi-client:$SHA 10 | docker push stephengrider/multi-server:$SHA 11 | docker push stephengrider/multi-worker:$SHA 12 | 13 | kubectl apply -f k8s 14 | kubectl set image deployments/server-deployment server=stephengrider/multi-server:$SHA 15 | kubectl set image deployments/client-deployment client=stephengrider/multi-client:$SHA 16 | kubectl set image deployments/worker-deployment worker=stephengrider/multi-worker:$SHA -------------------------------------------------------------------------------- /complex/k8s/postgres-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: postgres-deployment 5 | spec: 6 | replicas: 1 7 | selector: 8 | matchLabels: 9 | component: postgres 10 | template: 11 | metadata: 12 | labels: 13 | component: postgres 14 | spec: 15 | volumes: 16 | - name: postgres-storage 17 | persistentVolumeClaim: 18 | claimName: database-persistent-volume-claim 19 | containers: 20 | - name: postgres 21 | image: postgres 22 | ports: 23 | - containerPort: 5432 24 | volumeMounts: 25 | - name: postgres-storage 26 | mountPath: /var/lib/postgresql/data 27 | subPath: postgres 28 | env: 29 | - name: PGPASSWORD 30 | valueFrom: 31 | secretKeyRef: 32 | name: pgpassword 33 | key: PGPASSWORD 34 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import logo from './logo.svg'; 3 | import './App.css'; 4 | import { BrowserRouter as Router, Route, Link } from 'react-router-dom'; 5 | import OtherPage from './OtherPage'; 6 | import Fib from './Fib'; 7 | 8 | class App extends Component { 9 | render() { 10 | return ( 11 | 12 |
13 |
14 | logo 15 |

Fib Calculator version 2

16 | Home 17 | Other Page 18 |
19 |
20 | 21 | 22 |
23 |
24 |
25 | ); 26 | } 27 | } 28 | 29 | export default App; 30 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/Dockerrun.aws.json: -------------------------------------------------------------------------------- 1 | { 2 | "AWSEBDockerrunVersion": 2, 3 | "containerDefinitions": [ 4 | { 5 | "name": "client", 6 | "image": "stephengrider/multi-client", 7 | "hostname": "client", 8 | "essential": false, 9 | "memory": 128 10 | }, 11 | { 12 | "name": "server", 13 | "image": "stephengrider/multi-server", 14 | "hostname": "api", 15 | "essential": false, 16 | "memory": 128 17 | }, 18 | { 19 | "name": "worker", 20 | "image": "stephengrider/multi-worker", 21 | "hostname": "worker", 22 | "essential": false, 23 | "memory": 128 24 | }, 25 | { 26 | "name": "nginx", 27 | "image": "stephengrider/multi-nginx", 28 | "hostname": "nginx", 29 | "essential": true, 30 | "portMappings": [ 31 | { 32 | "hostPort": 80, 33 | "containerPort": 80 34 | } 35 | ], 36 | "links": ["client", "server"], 37 | "memory": 128 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /complex/.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | services: 3 | - docker 4 | env: 5 | global: 6 | - SHA=$(git rev-parse HEAD) 7 | - CLOUDSDK_CORE_DISABLE_PROMPTS=1 8 | before_install: 9 | - openssl aes-256-cbc -K $encrypted_0c35eebf403c_key -iv $encrypted_0c35eebf403c_iv -in service-account.json.enc -out service-account.json -d 10 | - curl https://sdk.cloud.google.com | bash > /dev/null; 11 | - source $HOME/google-cloud-sdk/path.bash.inc 12 | - gcloud components update kubectl 13 | - gcloud auth activate-service-account --key-file service-account.json 14 | - gcloud config set project skilful-berm-214822 15 | - gcloud config set compute/zone us-central1-a 16 | - gcloud container clusters get-credentials multi-cluster 17 | - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin 18 | - docker build -t stephengrider/react-test -f ./client/Dockerfile.dev ./client 19 | 20 | script: 21 | - docker run stephengrider/react-test npm test -- --coverage 22 | 23 | deploy: 24 | provider: script 25 | script: bash ./deploy.sh 26 | on: 27 | branch: master 28 | -------------------------------------------------------------------------------- /complex/k8s/server-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: server-deployment 5 | spec: 6 | replicas: 3 7 | selector: 8 | matchLabels: 9 | component: server 10 | template: 11 | metadata: 12 | labels: 13 | component: server 14 | spec: 15 | containers: 16 | - name: server 17 | image: stephengrider/multi-server 18 | ports: 19 | - containerPort: 5000 20 | env: 21 | - name: REDIS_HOST 22 | value: redis-cluster-ip-service 23 | - name: REDIS_PORT 24 | value: '6379' 25 | - name: PGUSER 26 | value: postgres 27 | - name: PGHOST 28 | value: postgres-cluster-ip-service 29 | - name: PGPORT 30 | value: '5432' 31 | - name: PGDATABASE 32 | value: postgres 33 | - name: PGPASSWORD 34 | valueFrom: 35 | secretKeyRef: 36 | name: pgpassword 37 | key: PGPASSWORD 38 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | postgres: 4 | image: 'postgres:latest' 5 | redis: 6 | image: 'redis:latest' 7 | nginx: 8 | restart: always 9 | build: 10 | dockerfile: Dockerfile.dev 11 | context: ./nginx 12 | ports: 13 | - '3050:80' 14 | api: 15 | build: 16 | dockerfile: Dockerfile.dev 17 | context: ./server 18 | volumes: 19 | - /app/node_modules 20 | - ./server:/app 21 | environment: 22 | - REDIS_HOST=redis 23 | - REDIS_PORT=6379 24 | - PGUSER=postgres 25 | - PGHOST=postgres 26 | - PGDATABASE=postgres 27 | - PGPASSWORD=postgres_password 28 | - PGPORT=5432 29 | client: 30 | build: 31 | dockerfile: Dockerfile.dev 32 | context: ./client 33 | volumes: 34 | - /app/node_modules 35 | - ./client:/app 36 | worker: 37 | environment: 38 | - REDIS_HOST=redis 39 | - REDIS_PORT=6379 40 | build: 41 | dockerfile: Dockerfile.dev 42 | context: ./worker 43 | volumes: 44 | - /app/node_modules 45 | - ./worker:/app 46 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | services: 3 | - docker 4 | 5 | before_install: 6 | - docker build -t stephengrider/react-test -f ./client/Dockerfile.dev ./client 7 | 8 | script: 9 | - docker run stephengrider/react-test npm test -- --coverage 10 | 11 | after_success: 12 | - docker build -t stephengrider/multi-client ./client 13 | - docker build -t stephengrider/multi-nginx ./nginx 14 | - docker build -t stephengrider/multi-server ./server 15 | - docker build -t stephengrider/multi-worker ./worker 16 | # Log in to the docker CLI 17 | - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_ID" --password-stdin 18 | # Take those images and push them to docker hub 19 | - docker push stephengrider/multi-client 20 | - docker push stephengrider/multi-nginx 21 | - docker push stephengrider/multi-server 22 | - docker push stephengrider/multi-worker 23 | 24 | deploy: 25 | provider: elasticbeanstalk 26 | region: us-west-1 27 | app: multi-docker 28 | env: MultiDocker-env 29 | bucket_name: elasticbeanstalk-us-west-1-306476627547 30 | bucket_path: docker-multi 31 | on: 32 | branch: master 33 | access_key_id: $AWS_ACCESS_KEY 34 | secret_access_key: 35 | secure: $AWS_SECRET_KEY 36 | -------------------------------------------------------------------------------- /complex/k8s/ingress-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: extensions/v1beta1 2 | kind: Ingress 3 | metadata: 4 | name: ingress-service 5 | annotations: 6 | kubernetes.io/ingress.class: nginx 7 | nginx.ingress.kubernetes.io/rewrite-target: /$1 8 | certmanager.k8s.io/cluster-issuer: 'letsencrypt-prod' 9 | nginx.ingress.kubernetes.io/ssl-redirect: 'false' 10 | spec: 11 | tls: 12 | - hosts: 13 | - k8s-multi.com 14 | - www.k8s-multi.com 15 | secretName: k8s-multi-com 16 | rules: 17 | - host: k8s-multi.com 18 | http: 19 | paths: 20 | - path: /?(.*) 21 | backend: 22 | serviceName: client-cluster-ip-service 23 | servicePort: 3000 24 | - path: /api/?(.*) 25 | backend: 26 | serviceName: server-cluster-ip-service 27 | servicePort: 5000 28 | - host: www.k8s-multi.com 29 | http: 30 | paths: 31 | - path: /?(.*) 32 | backend: 33 | serviceName: client-cluster-ip-service 34 | servicePort: 3000 35 | - path: /api/?(.*) 36 | backend: 37 | serviceName: server-cluster-ip-service 38 | servicePort: 5000 39 | -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 22 | React App 23 | 24 | 25 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /complex/client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 22 | React App 23 | 24 | 25 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 22 | React App 23 | 24 | 25 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /complex/client/src/Fib.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import axios from 'axios'; 3 | 4 | class Fib extends Component { 5 | state = { 6 | seenIndexes: [], 7 | values: {}, 8 | index: '' 9 | }; 10 | 11 | componentDidMount() { 12 | this.fetchValues(); 13 | this.fetchIndexes(); 14 | } 15 | 16 | async fetchValues() { 17 | const values = await axios.get('/api/values/current'); 18 | this.setState({ values: values.data }); 19 | } 20 | 21 | async fetchIndexes() { 22 | const seenIndexes = await axios.get('/api/values/all'); 23 | this.setState({ 24 | seenIndexes: seenIndexes.data 25 | }); 26 | } 27 | 28 | handleSubmit = async event => { 29 | event.preventDefault(); 30 | 31 | await axios.post('/api/values', { 32 | index: this.state.index 33 | }); 34 | this.setState({ index: '' }); 35 | }; 36 | 37 | renderSeenIndexes() { 38 | return this.state.seenIndexes.map(({ number }) => number).join(', '); 39 | } 40 | 41 | renderValues() { 42 | const entries = []; 43 | 44 | for (let key in this.state.values) { 45 | entries.push( 46 |
47 | For index {key} I calculated {this.state.values[key]} 48 |
49 | ); 50 | } 51 | 52 | return entries; 53 | } 54 | 55 | render() { 56 | return ( 57 |
58 |
59 | 60 | this.setState({ index: event.target.value })} 63 | /> 64 | 65 |
66 | 67 |

Indexes I have seen:

68 | {this.renderSeenIndexes()} 69 | 70 |

Calculated Values:

71 | {this.renderValues()} 72 |
73 | ); 74 | } 75 | } 76 | 77 | export default Fib; 78 | -------------------------------------------------------------------------------- /complex/server/index.js: -------------------------------------------------------------------------------- 1 | const keys = require('./keys'); 2 | 3 | // Express App Setup 4 | const express = require('express'); 5 | const bodyParser = require('body-parser'); 6 | const cors = require('cors'); 7 | 8 | const app = express(); 9 | app.use(cors()); 10 | app.use(bodyParser.json()); 11 | 12 | // Postgres Client Setup 13 | const { Pool } = require('pg'); 14 | const pgClient = new Pool({ 15 | user: keys.pgUser, 16 | host: keys.pgHost, 17 | database: keys.pgDatabase, 18 | password: keys.pgPassword, 19 | port: keys.pgPort 20 | }); 21 | pgClient.on('error', () => console.log('Lost PG connection')); 22 | 23 | pgClient 24 | .query('CREATE TABLE IF NOT EXISTS values (number INT)') 25 | .catch(err => console.log(err)); 26 | 27 | // Redis Client Setup 28 | const redis = require('redis'); 29 | const redisClient = redis.createClient({ 30 | host: keys.redisHost, 31 | port: keys.redisPort, 32 | retry_strategy: () => 1000 33 | }); 34 | const redisPublisher = redisClient.duplicate(); 35 | 36 | // Express route handlers 37 | 38 | app.get('/', (req, res) => { 39 | res.send('Hi'); 40 | }); 41 | 42 | app.get('/values/all', async (req, res) => { 43 | // const values = await pgClient.query('SELECT * from values'); 44 | 45 | res.send([1, 2, 3]); 46 | }); 47 | 48 | app.get('/values/current', async (req, res) => { 49 | redisClient.hgetall('values', (err, values) => { 50 | res.send(values); 51 | }); 52 | }); 53 | 54 | app.post('/values', async (req, res) => { 55 | const index = req.body.index; 56 | 57 | if (parseInt(index) > 40) { 58 | return res.status(422).send('Index too high'); 59 | } 60 | 61 | redisClient.hset('values', index, 'Nothing yet!'); 62 | redisPublisher.publish('insert', index); 63 | pgClient.query('INSERT INTO values(number) VALUES($1)', [index]); 64 | 65 | res.send({ working: true }); 66 | }); 67 | 68 | app.listen(5000, err => { 69 | console.log('Listening'); 70 | }); 71 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/server/index.js: -------------------------------------------------------------------------------- 1 | const keys = require('./keys'); 2 | 3 | // Express App Setup 4 | const express = require('express'); 5 | const bodyParser = require('body-parser'); 6 | const cors = require('cors'); 7 | 8 | const app = express(); 9 | app.use(cors()); 10 | app.use(bodyParser.json()); 11 | 12 | // Postgres Client Setup 13 | const { Pool } = require('pg'); 14 | const pgClient = new Pool({ 15 | user: keys.pgUser, 16 | host: keys.pgHost, 17 | database: keys.pgDatabase, 18 | password: keys.pgPassword, 19 | port: keys.pgPort 20 | }); 21 | pgClient.on('error', () => console.log('Lost PG connection')); 22 | 23 | pgClient 24 | .query('CREATE TABLE IF NOT EXISTS values (number INT)') 25 | .catch(err => console.log(err)); 26 | 27 | // Redis Client Setup 28 | const redis = require('redis'); 29 | const redisClient = redis.createClient({ 30 | host: keys.redisHost, 31 | port: keys.redisPort, 32 | retry_strategy: () => 1000 33 | }); 34 | const redisPublisher = redisClient.duplicate(); 35 | 36 | // Express route handlers 37 | 38 | app.get('/', (req, res) => { 39 | res.send('Hi'); 40 | }); 41 | 42 | app.get('/values/all', async (req, res) => { 43 | const values = await pgClient.query('SELECT * from values'); 44 | 45 | res.send(values.rows); 46 | }); 47 | 48 | app.get('/values/current', async (req, res) => { 49 | redisClient.hgetall('values', (err, values) => { 50 | res.send(values); 51 | }); 52 | }); 53 | 54 | app.post('/values', async (req, res) => { 55 | const index = req.body.index; 56 | 57 | if (parseInt(index) > 40) { 58 | return res.status(422).send('Index too high'); 59 | } 60 | 61 | redisClient.hset('values', index, 'Nothing yet!'); 62 | redisPublisher.publish('insert', index); 63 | pgClient.query('INSERT INTO values(number) VALUES($1)', [index]); 64 | 65 | res.send({ working: true }); 66 | }); 67 | 68 | app.listen(5000, err => { 69 | console.log('Listening'); 70 | }); 71 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/Fib.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import axios from 'axios'; 3 | 4 | class Fib extends Component { 5 | state = { 6 | seenIndexes: [], 7 | values: {}, 8 | index: '' 9 | }; 10 | 11 | componentDidMount() { 12 | this.fetchValues(); 13 | this.fetchIndexes(); 14 | } 15 | 16 | async fetchValues() { 17 | const values = await axios.get('/api/values/current'); 18 | this.setState({ values: values.data }); 19 | } 20 | 21 | async fetchIndexes() { 22 | const seenIndexes = await axios.get('/api/values/all'); 23 | this.setState({ 24 | seenIndexes: seenIndexes.data 25 | }); 26 | } 27 | 28 | handleSubmit = async event => { 29 | event.preventDefault(); 30 | 31 | await axios.post('/api/values', { 32 | index: this.state.index 33 | }); 34 | this.setState({ index: '' }); 35 | }; 36 | 37 | renderSeenIndexes() { 38 | return this.state.seenIndexes.map(({ number }) => number).join(', '); 39 | } 40 | 41 | renderValues() { 42 | const entries = []; 43 | 44 | for (let key in this.state.values) { 45 | entries.push( 46 |
47 | For index {key} I calculated {this.state.values[key]} 48 |
49 | ); 50 | } 51 | 52 | return entries; 53 | } 54 | 55 | render() { 56 | return ( 57 |
58 |
59 | 60 | this.setState({ index: event.target.value })} 63 | /> 64 | 65 |
66 | 67 |

Indexes I have seen:

68 | {this.renderSeenIndexes()} 69 | 70 |

Calculated Values:

71 | {this.renderValues()} 72 |
73 | ); 74 | } 75 | } 76 | 77 | export default Fib; 78 | -------------------------------------------------------------------------------- /frontend/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /complex/client/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /diagrams/19/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /frontend/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | const isLocalhost = Boolean( 12 | window.location.hostname === 'localhost' || 13 | // [::1] is the IPv6 localhost address. 14 | window.location.hostname === '[::1]' || 15 | // 127.0.0.1/8 is considered localhost for IPv4. 16 | window.location.hostname.match( 17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 18 | ) 19 | ); 20 | 21 | export default function register() { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Lets check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ' 45 | ); 46 | }); 47 | } else { 48 | // Is not local host. Just register service worker 49 | registerValidSW(swUrl); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then(registration => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | installingWorker.onstatechange = () => { 62 | if (installingWorker.state === 'installed') { 63 | if (navigator.serviceWorker.controller) { 64 | // At this point, the old content will have been purged and 65 | // the fresh content will have been added to the cache. 66 | // It's the perfect time to display a "New content is 67 | // available; please refresh." message in your web app. 68 | console.log('New content is available; please refresh.'); 69 | } else { 70 | // At this point, everything has been precached. 71 | // It's the perfect time to display a 72 | // "Content is cached for offline use." message. 73 | console.log('Content is cached for offline use.'); 74 | } 75 | } 76 | }; 77 | }; 78 | }) 79 | .catch(error => { 80 | console.error('Error during service worker registration:', error); 81 | }); 82 | } 83 | 84 | function checkValidServiceWorker(swUrl) { 85 | // Check if the service worker can be found. If it can't reload the page. 86 | fetch(swUrl) 87 | .then(response => { 88 | // Ensure service worker exists, and that we really are getting a JS file. 89 | if ( 90 | response.status === 404 || 91 | response.headers.get('content-type').indexOf('javascript') === -1 92 | ) { 93 | // No service worker found. Probably a different app. Reload the page. 94 | navigator.serviceWorker.ready.then(registration => { 95 | registration.unregister().then(() => { 96 | window.location.reload(); 97 | }); 98 | }); 99 | } else { 100 | // Service worker found. Proceed as normal. 101 | registerValidSW(swUrl); 102 | } 103 | }) 104 | .catch(() => { 105 | console.log( 106 | 'No internet connection found. App is running in offline mode.' 107 | ); 108 | }); 109 | } 110 | 111 | export function unregister() { 112 | if ('serviceWorker' in navigator) { 113 | navigator.serviceWorker.ready.then(registration => { 114 | registration.unregister(); 115 | }); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /complex/client/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | const isLocalhost = Boolean( 12 | window.location.hostname === 'localhost' || 13 | // [::1] is the IPv6 localhost address. 14 | window.location.hostname === '[::1]' || 15 | // 127.0.0.1/8 is considered localhost for IPv4. 16 | window.location.hostname.match( 17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 18 | ) 19 | ); 20 | 21 | export default function register() { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Lets check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ' 45 | ); 46 | }); 47 | } else { 48 | // Is not local host. Just register service worker 49 | registerValidSW(swUrl); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then(registration => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | installingWorker.onstatechange = () => { 62 | if (installingWorker.state === 'installed') { 63 | if (navigator.serviceWorker.controller) { 64 | // At this point, the old content will have been purged and 65 | // the fresh content will have been added to the cache. 66 | // It's the perfect time to display a "New content is 67 | // available; please refresh." message in your web app. 68 | console.log('New content is available; please refresh.'); 69 | } else { 70 | // At this point, everything has been precached. 71 | // It's the perfect time to display a 72 | // "Content is cached for offline use." message. 73 | console.log('Content is cached for offline use.'); 74 | } 75 | } 76 | }; 77 | }; 78 | }) 79 | .catch(error => { 80 | console.error('Error during service worker registration:', error); 81 | }); 82 | } 83 | 84 | function checkValidServiceWorker(swUrl) { 85 | // Check if the service worker can be found. If it can't reload the page. 86 | fetch(swUrl) 87 | .then(response => { 88 | // Ensure service worker exists, and that we really are getting a JS file. 89 | if ( 90 | response.status === 404 || 91 | response.headers.get('content-type').indexOf('javascript') === -1 92 | ) { 93 | // No service worker found. Probably a different app. Reload the page. 94 | navigator.serviceWorker.ready.then(registration => { 95 | registration.unregister().then(() => { 96 | window.location.reload(); 97 | }); 98 | }); 99 | } else { 100 | // Service worker found. Proceed as normal. 101 | registerValidSW(swUrl); 102 | } 103 | }) 104 | .catch(() => { 105 | console.log( 106 | 'No internet connection found. App is running in offline mode.' 107 | ); 108 | }); 109 | } 110 | 111 | export function unregister() { 112 | if ('serviceWorker' in navigator) { 113 | navigator.serviceWorker.ready.then(registration => { 114 | registration.unregister(); 115 | }); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /complex-elastic-beanstalk/client/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | const isLocalhost = Boolean( 12 | window.location.hostname === 'localhost' || 13 | // [::1] is the IPv6 localhost address. 14 | window.location.hostname === '[::1]' || 15 | // 127.0.0.1/8 is considered localhost for IPv4. 16 | window.location.hostname.match( 17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 18 | ) 19 | ); 20 | 21 | export default function register() { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Lets check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ' 45 | ); 46 | }); 47 | } else { 48 | // Is not local host. Just register service worker 49 | registerValidSW(swUrl); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then(registration => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | installingWorker.onstatechange = () => { 62 | if (installingWorker.state === 'installed') { 63 | if (navigator.serviceWorker.controller) { 64 | // At this point, the old content will have been purged and 65 | // the fresh content will have been added to the cache. 66 | // It's the perfect time to display a "New content is 67 | // available; please refresh." message in your web app. 68 | console.log('New content is available; please refresh.'); 69 | } else { 70 | // At this point, everything has been precached. 71 | // It's the perfect time to display a 72 | // "Content is cached for offline use." message. 73 | console.log('Content is cached for offline use.'); 74 | } 75 | } 76 | }; 77 | }; 78 | }) 79 | .catch(error => { 80 | console.error('Error during service worker registration:', error); 81 | }); 82 | } 83 | 84 | function checkValidServiceWorker(swUrl) { 85 | // Check if the service worker can be found. If it can't reload the page. 86 | fetch(swUrl) 87 | .then(response => { 88 | // Ensure service worker exists, and that we really are getting a JS file. 89 | if ( 90 | response.status === 404 || 91 | response.headers.get('content-type').indexOf('javascript') === -1 92 | ) { 93 | // No service worker found. Probably a different app. Reload the page. 94 | navigator.serviceWorker.ready.then(registration => { 95 | registration.unregister().then(() => { 96 | window.location.reload(); 97 | }); 98 | }); 99 | } else { 100 | // Service worker found. Proceed as normal. 101 | registerValidSW(swUrl); 102 | } 103 | }) 104 | .catch(() => { 105 | console.log( 106 | 'No internet connection found. App is running in offline mode.' 107 | ); 108 | }); 109 | } 110 | 111 | export function unregister() { 112 | if ('serviceWorker' in navigator) { 113 | navigator.serviceWorker.ready.then(registration => { 114 | registration.unregister(); 115 | }); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /diagrams/13/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/18/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/11/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/04/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/07/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/17/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/16/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/03/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /diagrams/08/diagrams.xml: -------------------------------------------------------------------------------- 1 | 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 --------------------------------------------------------------------------------