Add caddy file and update docker compose. Added IMS_TOKEN validation.

This commit is contained in:
Patrick Fic
2022-05-11 16:28:47 -07:00
parent 2928b614aa
commit 789fe501db
10 changed files with 1806 additions and 1740 deletions

View File

@@ -1,2 +1,3 @@
MEDIA_PATH=~/Desktop/IMS
PORT=8000
PORT=8000
IMS_TOKEN=ImEXMS

4
Caddyfile Normal file
View File

@@ -0,0 +1,4 @@
domain.com {
reverse_proxy ims:8000
}

36
docker-compose.yml Normal file
View File

@@ -0,0 +1,36 @@
version: '2'
services:
ims:
ports:
- 8000:8000
volumes:
- ~:/root
#- "C:\\IMS:/media"
- "/Users/pfic/Desktop/ISM:/media"
environment:
- MEDIA_PATH=/media
- DUPLICATE_BILL_TO_VENDOR=false
- IMS_TOKEN=ThisIsAnImEXSecretTokenToBeSent
image: imexonline/media-server:latest
#image: imexonline/media-server:beta
restart: unless-stopped
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
command: --interval 3600
caddy:
image: caddy/caddy:latest
container_name: caddy-service
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- $PWD/Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:

View File

@@ -1 +1,2 @@
docker build . -t imexonline/media-server:latest -t imexonline/media-server:1.0
docker build . -t imexonline/media-server:beta

View File

@@ -1,12 +0,0 @@
version: '2'
services:
web:
ports:
- 8000:8000
volumes:
- ~:/root
- "/Users/pfic/Desktop/ISM:/media"
environment:
- MEDIA_PATH=/media
- DUPLICATE_BILL_TO_VENDOR=false
image: imexonline/media-server:latest

View File

@@ -20,6 +20,7 @@
"file-type": "^16.5.3",
"fs-extra": "^10.1.0",
"gm": "^1.23.1",
"helmet": "^5.0.2",
"image-thumbnail": "^1.0.14",
"morgan": "^1.10.0",
"multer": "^1.4.4",
@@ -27,13 +28,13 @@
"winston-daily-rotate-file": "^4.6.1"
},
"devDependencies": {
"@types/multer": "^1.4.7",
"@types/cors": "^2.8.12",
"@types/express": "^4.17.13",
"@types/fs-extra": "^9.0.13",
"@types/gm": "^1.18.11",
"@types/image-thumbnail": "^1.0.1",
"@types/morgan": "^1.9.3",
"@types/multer": "^1.4.7",
"@types/node": "^16.11.32",
"nodemon": "^2.0.15",
"ts-node": "^10.7.0",

View File

@@ -6,6 +6,8 @@ MEDIA_PATH => Must match the mount directory of the volume. e.g.
volumes: - ~:/root - "/Users/pfic/Desktop/ISM:/media"
environment: - MEDIA_PATH=/media
IMS_TOKEN => This will be validated on every request. If it is not sent, the request will be rejected.
# Operations
## Bills
@@ -13,19 +15,51 @@ environment: - MEDIA_PATH=/media
By default, it will query from the job files. Anything duplicated to the vendor files is purely for reference.
If an invoice number is included, it will be default fetch that file only.
Sample Docker Compose file.
Caddy is used as a reverse HTTPS proxy so that CORS does not block requests. This must sit in the same dir as the docker-compose.yml file.
```markdown
domain.com {
reverse_proxy ims:8000
}
```
## Sample Docker Compose file.
```docker
version: '2'
services:
web:
ims:
ports:
- 8000:8000
volumes:
- ~:/root
- "D:\Images:/media"
- "C:\\IMS:/media"
#- "/Users/pfic/Desktop/ISM:/media"
environment:
- MEDIA_PATH=/media
- DUPLICATE_BILL_TO_VENDOR=false
- IMS_TOKEN=ThisIsAnImEXSecretTokenToBeSent
image: imexonline/media-server:latest
#image: imexonline/media-server:beta
restart: unless-stopped
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
command: --interval 3600
caddy:
image: caddy/caddy:latest
container_name: caddy-service
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- $PWD/Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
```

View File

@@ -13,10 +13,12 @@ import morgan from "morgan";
import { BillsListMedia } from "./bills/billsListMedia";
import BillRequestValidator from "./bills/billRequestValidator";
import cors from "cors";
import helmet from "helmet";
import {
BillsMediaUploadMulter,
BillsUploadMedia,
} from "./bills/billsUploadMedia";
import ValidateImsToken from "./util/validateToken";
dotenv.config({
path: resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`),
@@ -115,26 +117,36 @@ const morganMiddleware = morgan(
);
app.use(morganMiddleware);
app.post("/jobs/list", JobRequestValidator, JobsListMedia);
app.use(helmet());
app.post("/jobs/list", ValidateImsToken, JobRequestValidator, JobsListMedia);
app.post(
"/jobs/upload",
ValidateImsToken,
JobMediaUploadMulter.array("file"),
JobRequestValidator,
jobsUploadMedia
);
app.post(
"/jobs/move", //JobRequestValidator,
ValidateImsToken,
JobsMoveMedia
);
app.post("/bills/list", BillRequestValidator, BillsListMedia);
app.post(
"/bills/upload",
ValidateImsToken,
BillsMediaUploadMulter.array("file"),
BillRequestValidator,
BillsUploadMedia
);
app.get(
"/",
ValidateImsToken,
(req: express.Request, res: express.Response) => {
res.send("IMS running.");
}
);
InitServer();
app.use(FolderPaths.StaticPath, express.static(FolderPaths.Root, {}));

28
util/validateToken.ts Normal file
View File

@@ -0,0 +1,28 @@
import { Request, Response, NextFunction } from "express";
import dotenv from "dotenv";
import { resolve } from "path";
import { logger } from "../server";
dotenv.config({
path: resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`),
});
export default function ValidateImsToken(
req: Request,
res: Response,
next: NextFunction
) {
const jobid: string = (req.body.jobid || "").trim();
const IMS_TOKEN: string = (process.env.IMS_TOKEN || "").trim();
if (IMS_TOKEN === "") {
next();
} else {
if (req.headers.ims_token !== IMS_TOKEN) {
res.sendStatus(401);
} else {
next();
}
}
}

3403
yarn.lock

File diff suppressed because it is too large Load Diff