Compare commits
20 Commits
c6f10f9a32
...
master
Author | SHA1 | Date | |
---|---|---|---|
9d0a0a9cab | |||
f89b1721f9 | |||
b3206a9874 | |||
78b9522d03 | |||
a5f809eca5 | |||
26d16fe0a4 | |||
f38d22026f | |||
f79af61bb5 | |||
50b3b50e07 | |||
57698eca18 | |||
ca343a95a0 | |||
0ec98a0793 | |||
8bf3bd68da | |||
064cb62168 | |||
7d714cb406 | |||
969ccb88f8 | |||
be145d538a | |||
19b2c197ad | |||
96e1d23396 | |||
e7b80c56cf |
9
.dockerignore
Normal file
9
.dockerignore
Normal file
@ -0,0 +1,9 @@
|
||||
.github
|
||||
.idea
|
||||
vscode
|
||||
node_modules
|
||||
Dockerfile
|
||||
docker-compose.yml
|
||||
.env*
|
||||
.dockerignore
|
||||
.gitignore
|
57
.github/workflows/build.yml
vendored
Normal file
57
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,57 @@
|
||||
name: Build and publish
|
||||
run-name: Build and publish
|
||||
|
||||
on:
|
||||
push:
|
||||
|
||||
jobs:
|
||||
container:
|
||||
name: Build Container
|
||||
runs-on: ubuntu-latest
|
||||
container: docker
|
||||
steps:
|
||||
- name: Build Container
|
||||
run: |
|
||||
git clone -b "${{github.ref_name}}" "$(echo ${{github.server_url}}/${{github.repository}}.git | sed s%://%://${{github.token}}@% )" .
|
||||
DOCKER_HUB=$([ -n "${{secrets.DOCKER_HUB_USER}}" ] && [ -n "${{secrets.DOCKER_HUB_TOKEN}}" ] && [ -n "${{secrets.DOCKER_HUB_IMAGE}}" ] && echo "true" || echo "false")
|
||||
REGISTRY="$(echo "${{github.server_url}}" | sed -E 's|https?://||')"
|
||||
VERSION="$(cat package.json | grep 'version' | grep -Eo '([0-9]+\.?)+(-[0-9a-zA-Z\-\.]+)?')"
|
||||
|
||||
docker login -u "${{github.repository_owner}}" -p "${{secrets.DEPLOY_TOKEN}}" "$REGISTRY"
|
||||
if [ "$DOCKER_HUB" = "true" ]; then docker login -u "${{secrets.DOCKER_HUB_USER}}" -p "${{secrets.DOCKER_HUB_TOKEN}}" docker.io; fi
|
||||
|
||||
docker build -t "$REGISTRY/${{github.repository}}:${{github.ref_name}}" .
|
||||
docker push "$REGISTRY/${{github.repository}}:${{github.ref_name}}"
|
||||
if [ "$DOCKER_HUB" = "true" ]; then
|
||||
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:${{github.ref_name}}"
|
||||
docker push "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:${{github.ref_name}}"
|
||||
fi
|
||||
|
||||
if [ "${{github.ref_name}}" = "master" ]; then
|
||||
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "$REGISTRY/${{github.repository}}:$VERSION"
|
||||
docker push "$REGISTRY/${{github.repository}}:$VERSION"
|
||||
if [ "$DOCKER_HUB" = "true" ]; then
|
||||
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:$VERSION"
|
||||
docker push "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:$VERSION"
|
||||
fi
|
||||
|
||||
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "$REGISTRY/${{github.repository}}:latest"
|
||||
docker push "$REGISTRY/${{github.repository}}:latest"
|
||||
if [ "$DOCKER_HUB" = "true" ]; then
|
||||
docker tag "$REGISTRY/${{github.repository}}:${{github.ref_name}}" "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:latest"
|
||||
docker push "docker.io/${{secrets.DOCKER_HUB_IMAGE}}:latest"
|
||||
fi
|
||||
fi
|
||||
|
||||
tag:
|
||||
name: Git Tag
|
||||
runs-on: ubuntu-latest
|
||||
container: docker
|
||||
steps:
|
||||
- name: Git Tag
|
||||
run: |
|
||||
git clone -b "${{github.ref_name}}" "$(echo ${{github.server_url}}/${{github.repository}}.git | sed s%://%://${{github.token}}@% )" .
|
||||
VERSION="$(cat package.json | grep 'version' | grep -Eo '([0-9]+\.?)+(-[0-9a-zA-Z\-\.]+)?')"
|
||||
|
||||
git tag -f $VERSION ${{github.sha}}
|
||||
git push -f origin $VERSION
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
.idea
|
||||
vscode
|
||||
node_modules
|
||||
.env.local
|
||||
|
@ -1,10 +1,10 @@
|
||||
FROM node:alpine
|
||||
|
||||
ARG PORT
|
||||
ARG PORT="3000"
|
||||
ENV PORT=$PORT
|
||||
|
||||
COPY . .
|
||||
RUN npm install && npm run build
|
||||
RUN npm install && npm run build && rm -rf src
|
||||
|
||||
CMD ["node", "dist/main.js"]
|
||||
EXPOSE $PORT
|
||||
|
12
package-lock.json
generated
12
package-lock.json
generated
@ -12,6 +12,7 @@
|
||||
"@ztimson/utils": "^0.23.22",
|
||||
"compression": "^1.7.5",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.5.0",
|
||||
"express": "^4.21.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -468,6 +469,17 @@
|
||||
"node": ">=0.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "16.5.0",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
|
||||
"integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://dotenvx.com"
|
||||
}
|
||||
},
|
||||
"node_modules/dunder-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
|
||||
|
@ -13,6 +13,7 @@
|
||||
"@ztimson/utils": "^0.23.22",
|
||||
"compression": "^1.7.5",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.5.0",
|
||||
"express": "^4.21.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
@ -1,10 +1,15 @@
|
||||
import packageJson from '../package.json';
|
||||
import process from 'node:process';
|
||||
import * as dotenv from 'dotenv';
|
||||
|
||||
// Load `.env`
|
||||
dotenv.config();
|
||||
dotenv.config({path: '.env.local', override: true});
|
||||
|
||||
export const environment = {
|
||||
port: process.env['port'] ?? 3000,
|
||||
port: process.env['PORT'] ? +process.env['PORT'] : 3000,
|
||||
production: !process.env.NODE_ENV || ['prod', 'production'].includes(process.env.NODE_ENV.toLowerCase()),
|
||||
tickers: process.env['tickers']?.split(',') ?? [],
|
||||
token: process.env['token'],
|
||||
tickers: process.env['TICKERS']?.split(',') || [],
|
||||
token: process.env['TOKEN'],
|
||||
version: packageJson.version
|
||||
}
|
||||
|
15
src/main.ts
15
src/main.ts
@ -1,7 +1,8 @@
|
||||
import compression from 'compression';
|
||||
import cors from 'cors';
|
||||
import express from 'express';
|
||||
import http from 'node:http';
|
||||
import * as process from 'node:process';
|
||||
import process from 'node:process';
|
||||
import {environment} from './environment';
|
||||
import {errorHandler, errorMiddleware} from './error.middleware';
|
||||
import {loggerMiddleware} from './logger.middleware';
|
||||
@ -11,6 +12,7 @@ if(!environment.tickers.length) throw new Error('Please provide a CSV list of ti
|
||||
|
||||
const app = express();
|
||||
const httpServer: http.Server = http.createServer(app);
|
||||
app.use(cors({origin: '*'}))
|
||||
app.use(compression());
|
||||
app.use(loggerMiddleware);
|
||||
|
||||
@ -21,20 +23,17 @@ let shuttingDown = false;
|
||||
if(shuttingDown) return; // Already shutting down
|
||||
shuttingDown = true;
|
||||
console.warn(`${signal} Received, shutting down...`);
|
||||
httpServer.close(() => setTimeout(() => process.exit(128 + value), 1000));
|
||||
httpServer.close(() => process.exit(128 + value));
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/', errorHandler(async (req, res) => {
|
||||
app.get('*', errorHandler(async (req, res) => {
|
||||
const results = await Promise.all(environment.tickers.map(ticker =>
|
||||
fetch(`https://finnhub.io/api/v1/quote?symbol=${ticker}&token=${environment.token}`)
|
||||
.then(resp => resp.json())));
|
||||
|
||||
// const metrics = results.map(r => `# HELP stock_price_${result.symbol} Stock price for ${result.symbol}
|
||||
// # TYPE stock_price_${result.symbol} gauge
|
||||
// stock_price_${result.symbol} ${result.c}`).join('\n');
|
||||
const metrics = JSON.stringify(results);
|
||||
|
||||
let metrics = '# HELP stock_price Current stock price\n# TYPE stock_price gauge\n';
|
||||
metrics += results.map((r, i) => `stock_price{ticker="${environment.tickers[i]}"} ${r.c}`).join('\n');
|
||||
res.contentType('text/plain').send(metrics);
|
||||
}));
|
||||
|
||||
|
Reference in New Issue
Block a user