Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bruke common server i oms-arb #2270

Merged
merged 15 commits into from
Sep 30, 2024
20 changes: 12 additions & 8 deletions apps/omsorgspengerutbetaling-arbeidstaker-soknad/.env.example
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
API_URL=http://localhost:8089
APPSTATUS_DATASET=staging
APPSTATUS_PROJECT_ID=ryujtq87
DEKORATOR_URL=https://dekoratoren.ekstern.dev.nav.no/?simple=true&chatbot=false&urlLookupTable=false&logoutUrl=https://omsorgspengerutbetaling-arbeidstaker-soknad.intern.dev.nav.no/oauth2/logout&redirectToApp=true,
FRONTEND_API_PATH=http://localhost:8089
FRONTEND_VEDLEGG_URL=http://localhost:8080/api
LOGIN_URL=http://localhost:8089
MINSIDE_URL=https://www.intern.dev.nav.no/minside
APP_VERSION=dev
NODE_ENV=development
PUBLIC_PATH=/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker
GITHUB_REF_NAME=branch-name

SIF_PUBLIC_APPSTATUS_DATASET=staging
SIF_PUBLIC_APPSTATUS_PROJECT_ID=ryujtq87
SIF_PUBLIC_DEKORATOR_URL=https://www.nav.no/dekoratoren/?simple=true&chatbot=false&logoutUrl=https://www.nav.no/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling/oauth2/logout
SIF_PUBLIC_LOGIN_URL=http://localhost:8081/auth-mock/cookie?subject=mockSubject&redirect_location=http://localhost:8080
SIF_PUBLIC_MINSIDE_URL=https://www.intern.dev.nav.no/minside

K9_BRUKERDIALOG_PROSESSERING_FRONTEND_PATH=/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker/api
K9_BRUKERDIALOG_PROSESSERING_API_SCOPE=dev-gcp:dusseldorf:k9-brukerdialog-prosessering
K9_BRUKERDIALOG_PROSESSERING_API_URL=http://k9-brukerdialog-prosessering
13 changes: 13 additions & 0 deletions apps/omsorgspengerutbetaling-arbeidstaker-soknad/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# @navikt/omsorgspengerutbetaling-arbeidstaker-soknad

## 1.7.0

### Minor Changes

- 70809d1: Bruke common bibliotek for api kall

### Patch Changes

- Updated dependencies [70809d1]
- @navikt/[email protected]
- @navikt/[email protected]
- @navikt/[email protected]

## 1.6.12

### Patch Changes
Expand Down
95 changes: 69 additions & 26 deletions apps/omsorgspengerutbetaling-arbeidstaker-soknad/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,35 +1,78 @@
FROM node:20.12-alpine AS base

FROM node:18-alpine AS base
RUN apk update && apk add git
RUN apk add --no-cache libc6-compat
ENV APP="omsorgspengerutbetaling-arbeidstaker-soknad"
ENV SERVER="server"
ENV SCOPE=@navikt/omsorgspengerutbetaling-arbeidstaker-soknad

RUN apk fix \
&& apk add --no-cache --update libc6-compat tini \
&& rm -rf /var/cache/apk/*

RUN yarn global add turbo

#########################################
# PREPARE DEPS FOR BUILD
#########################################

FROM base AS prepare
WORKDIR /app
COPY ["package.json", ".yarnrc.yml", "yarn.lock", "turbo.json", "./"]
COPY [".yarn/releases/*", ".yarn/releases/"]
COPY packages packages
COPY apps apps
ARG SERVER
COPY ${SERVER} ${SERVER}
RUN find apps \! -name "package.json" -mindepth 2 -maxdepth 2 -print | xargs rm -rf
RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -print | xargs rm -rf
RUN find ${SERVER} \! -name "package.json" -mindepth 2 -maxdepth 2 -print | xargs rm -rf

ENV SCOPE=@navikt/omsorgspengerutbetaling-arbeidstaker-soknad
#########################################
# BUILDER IMAGE - INSTALL PACKAGES AND COPY SOURCE
#########################################

FROM base AS turbo-builder
FROM prepare AS installer
COPY --from=prepare /app ./
RUN --mount=type=secret,id=PACKAGES_AUTH_TOKEN \
PACKAGES_AUTH_TOKEN=$(cat /run/secrets/PACKAGES_AUTH_TOKEN) yarn
COPY . .
RUN yarn
RUN yarn turbo run build --filter=${SCOPE}

FROM base AS ws-installer
RUN apk update && apk add git
RUN apk add --no-cache libc6-compat
WORKDIR /app-ws
COPY . .
RUN yarn workspaces focus ${SCOPE} --production

FROM gcr.io/distroless/nodejs18-debian11:nonroot
WORKDIR /apps/omsorgspengerutbetaling-arbeidstaker-soknad
COPY --from=ws-installer /app-ws/node_modules ./node_modules/
COPY --from=turbo-builder /app/apps/omsorgspengerutbetaling-arbeidstaker-soknad/server.cjs .
COPY --from=turbo-builder /app/apps/omsorgspengerutbetaling-arbeidstaker-soknad/tokenx.cjs .
COPY --from=turbo-builder /app/apps/omsorgspengerutbetaling-arbeidstaker-soknad/package.json .
COPY --from=turbo-builder /app/apps/omsorgspengerutbetaling-arbeidstaker-soknad/src/build/decorator.cjs ./src/build/decorator.cjs
COPY --from=turbo-builder /app/apps/omsorgspengerutbetaling-arbeidstaker-soknad/src/build/AppSettings.cjs ./src/build/AppSettings.cjs
COPY --from=turbo-builder /app/apps/omsorgspengerutbetaling-arbeidstaker-soknad/dist ./dist

EXPOSE 8080
CMD ["server.cjs"]
#########################################
# BUILD SERVER
#########################################

FROM installer AS server-build
ARG SERVER
WORKDIR /app/${SERVER}
RUN --mount=type=secret,id=PACKAGES_AUTH_TOKEN \
PACKAGES_AUTH_TOKEN=$(cat /run/secrets/PACKAGES_AUTH_TOKEN) yarn build


#########################################
# Client
#########################################

FROM installer AS client-build
WORKDIR /app
RUN --mount=type=secret,id=PACKAGES_AUTH_TOKEN \
PACKAGES_AUTH_TOKEN=$(cat /run/secrets/PACKAGES_AUTH_TOKEN) yarn turbo run build --filter=${SCOPE}
RUN mv /app/apps/${APP}/dist /public


#########################################
# Server
#########################################
FROM base AS server
ARG SERVER
WORKDIR /app
COPY --from=server-build /app/${SERVER}/dist ./
ENTRYPOINT ["/sbin/tini", "--"]

#########################################
# App
#########################################
FROM server

COPY --from=client-build /public ./public

CMD ["node", "index.js"]

108 changes: 108 additions & 0 deletions apps/omsorgspengerutbetaling-arbeidstaker-soknad/dev-server.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
const { createProxyMiddleware, fixRequestBody } = require('http-proxy-middleware');
const getAppSettings = require('./mock/AppSettings.cjs');
const { injectDecoratorServerSide } = require('@navikt/nav-dekoratoren-moduler/ssr/index.js');
const express = require('express');
const server = express();
server.use(express.json());
const path = require('path');
const mustacheExpress = require('mustache-express');
const compression = require('compression');

server.disable('x-powered-by');

server.use(compression());

require('dotenv').config();
server.set('views', `${__dirname}`);
server.set('view engine', 'mustache');
server.engine('html', mustacheExpress());

server.use((req, res, next) => {
res.removeHeader('X-Powered-By');
res.set('X-Frame-Options', 'SAMEORIGIN');
res.set('X-XSS-Protection', '1; mode=block');
res.set('X-Content-Type-Options', 'nosniff');
res.set('Referrer-Policy', 'no-referrer');
res.set('Feature-Policy', "geolocation 'none'; microphone 'none'; camera 'none'");
next();
});

async function injectDecorator(filePath) {
return injectDecoratorServerSide({
env: 'dev',
filePath,
params: {
enforceLogin: false,
simple: true,
},
});
}

const startServer = async () => {
server.get('/health/isAlive', (req, res) => res.sendStatus(200));
server.get('/health/isReady', (req, res) => res.sendStatus(200));

const indexHtmlPath = path.resolve(__dirname, 'index.html');

const htmlWithDecoratorInjected = await injectDecorator(indexHtmlPath);

const renderedHtml = htmlWithDecoratorInjected.replaceAll(
'{{{APP_SETTINGS}}}',
JSON.stringify({
APP_VERSION: `${process.env.APP_VERSION}`,
PUBLIC_PATH: `${process.env.PUBLIC_PATH}`,
...getAppSettings(),
}),
);

server.use(
`${process.env.PUBLIC_PATH}/api`,
// limiter,
createProxyMiddleware({
target: 'http://localhost:8089/',
changeOrigin: true,
logger: console,
on: {
proxyReq: fixRequestBody,
},
}),
);

const fs = require('fs');
fs.writeFileSync(path.resolve(__dirname, 'index-decorated.html'), renderedHtml);

const vite = await require('vite').createServer({
root: __dirname,
server: {
middlewareMode: true,
port: 8080,
open: './index-decorated.html',
},
});

server.get(/^\/(?!.*dist).*$/, (req, res, next) => {
const ROOT_DIR = path.resolve(__dirname);
const fullPath = path.resolve(ROOT_DIR, decodeURIComponent(req.path.substring(1)));

if (!fullPath.startsWith(ROOT_DIR)) {
res.status(403).send('Forbidden');
return;
}

const fileExists = fs.existsSync(fullPath);

if ((!fileExists && !req.url.startsWith('/@')) || req.url === '/') {
req.url = '/index-decorated.html';
}
next();
});
Dismissed Show dismissed Hide dismissed

server.use(vite.middlewares);

const port = process.env.PORT || 8080;
server.listen(port, () => {
console.log(`App listening on port: ${port}`);
});
};

startServer();
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const decoratorParams = new URLSearchParams({

const getDecorator = (appSettings) =>
new Promise((resolve, reject) => {
fetch(`${process.env.DEKORATOR_URL}`, decoratorParams)
fetch(`${process.env.SIF_PUBLIC_DEKORATOR_URL}`, decoratorParams)
.then((response) => response.text())
.then((html) => {
if (html) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ const express = require('express');
const server = express();
const path = require('path');
const mustacheExpress = require('mustache-express');
const getAppSettings = require('./src/build/AppSettings.cjs');
const getDecorator = require('./src/build/decorator.cjs');
const getAppSettings = require('../../mock/AppSettings.cjs');
const getDecorator = require('./decorator.cjs');
const compression = require('compression');

require('dotenv').config();
Expand All @@ -13,7 +13,7 @@ server.use(express.json());
server.disable('x-powered-by');
server.use(compression());

server.set('views', path.resolve(`${__dirname}/dist`));
server.set('views', path.resolve(`${__dirname}/../../dist`));

server.set('view engine', 'mustache');
server.engine('html', mustacheExpress());
Expand Down Expand Up @@ -43,7 +43,7 @@ const startServer = async (html) => {
console.log(process.env.PUBLIC_PATH);
server.get(`${process.env.PUBLIC_PATH}/health/isAlive`, (_req, res) => res.sendStatus(200));
server.get(`${process.env.PUBLIC_PATH}/health/isReady`, (_req, res) => res.sendStatus(200));
server.use(`${process.env.PUBLIC_PATH}/assets`, express.static(path.resolve(__dirname, 'dist/assets')));
server.use(`${process.env.PUBLIC_PATH}/assets`, express.static(path.resolve(__dirname, '../../dist/assets')));

server.get(/^\/(?!.*api)(?!.*dist).*$/, (req, res) => {
res.send(html);
Expand Down
17 changes: 8 additions & 9 deletions apps/omsorgspengerutbetaling-arbeidstaker-soknad/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@
<html lang="no">

<head>
<meta charSet="utf-8" />
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/src/resources/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{{{NAV_SCRIPTS}}} {{{NAV_STYLES}}}
<script type="text/json" id="nav:appSettings">{{{APP_SETTINGS}}}</script>
<script type="text/json" id="nav:appSettings">
{{{APP_SETTINGS}}}
</script>

</head>

<body>
<div id="appContainer">
{{{NAV_HEADING}}}
<div id="app"></div>
{{{NAV_FOOTER}}}
</div>
<script type="module" src="/src/app/App.tsx"></script>
<div id="root"></div>
<script type="module" src="/src/app/main.tsx"></script>
</body>

</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
require('dotenv').config();

const process = require('process');

const getAppSettings = () => ({
APP_VERSION: `${process.env.APP_VERSION}`,
GITHUB_REF_NAME: `${process.env.GITHUB_REF_NAME}`,
IMAGE: `${process.env.IMAGE}`,
PUBLIC_PATH: `${process.env.PUBLIC_PATH}`,

K9_BRUKERDIALOG_PROSESSERING_API_URL: `${process.env.K9_BRUKERDIALOG_PROSESSERING_API_URL}`,
K9_BRUKERDIALOG_PROSESSERING_FRONTEND_PATH: `${process.env.K9_BRUKERDIALOG_PROSESSERING_FRONTEND_PATH}`,

SIF_PUBLIC_APPSTATUS_DATASET: `${process.env.SIF_PUBLIC_APPSTATUS_DATASET}`,
SIF_PUBLIC_APPSTATUS_PROJECT_ID: `${process.env.SIF_PUBLIC_APPSTATUS_PROJECT_ID}`,
SIF_PUBLIC_LOGIN_URL: `${process.env.SIF_PUBLIC_LOGIN_URL}`,
SIF_PUBLIC_MINSIDE_URL: `${process.env.SIF_PUBLIC_MINSIDE_URL}`,
SIF_PUBLIC_SKIP_ORGNUM_VALIDATION: `${process.env.SIF_PUBLIC_SKIP_ORGNUM_VALIDATION}`,
});

module.exports = getAppSettings;
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,26 @@
"team": "dusseldorf",
"ingresses": ["https://omsorgspengerutbetaling-arbeidstaker-soknad.intern.dev.nav.no"],
"externalHosts": ["www.nav.no", "dekoratoren.ekstern.dev.nav.no"],
"livenessPath": "/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker/health/isAlive",
"readinessPath": "/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker/health/isReady",
"livenessPath": "/internal/health/isAlive",
"readinessPath": "/internal/health/isReady",
"accessPolicyOutApps": ["k9-brukerdialog-prosessering"],
"minReplicas": 1,
"maxReplicas": 1,
"observabilityEnabled": "true",
"env": {
"API_TOKENX_AUDIENCE": "dev-gcp:dusseldorf:k9-brukerdialog-prosessering",
"API_URL": "http://k9-brukerdialog-prosessering",
"APP_VERSION": "dev",
"APPSTATUS_PROJECT_ID": "ryujtq87",
"APPSTATUS_DATASET": "staging",
"DEKORATOR_URL": "https://dekoratoren.ekstern.dev.nav.no/?simple=true&chatbot=false&urlLookupTable=false&logoutUrl=https://omsorgspengerutbetaling-arbeidstaker-soknad.intern.dev.nav.no/oauth2/logout&redirectToApp=true",
"FRONTEND_API_PATH": "/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker/api",
"FRONTEND_VEDLEGG_URL": "https://omsorgspengerutbetaling-arbeidstaker-soknad.intern.dev.nav.no/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker/api",
"LOGIN_URL": "https://omsorgspengerutbetaling-arbeidstaker-soknad.intern.dev.nav.no/oauth2/login?redirect=/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker/soknad",
"MINSIDE_URL": "https://www.intern.dev.nav.no/minside",
"NPM_CONFIG_CACHE": "/tmp",
"NODE_ENV": "development",
"PUBLIC_PATH": "/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker",
"VEDLEGG_API_URL": "https://k9-brukerdialog-prosessering"
"NPM_CONFIG_CACHE": "/tmp",

"K9_BRUKERDIALOG_PROSESSERING_API_SCOPE": "dev-gcp:dusseldorf:k9-brukerdialog-prosessering",
"K9_BRUKERDIALOG_PROSESSERING_API_URL": "http://k9-brukerdialog-prosessering",
"K9_BRUKERDIALOG_PROSESSERING_FRONTEND_PATH": "/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling-arbeidstaker/api",

"SIF_PUBLIC_APPSTATUS_DATASET": "staging",
"SIF_PUBLIC_APPSTATUS_PROJECT_ID": "ryujtq87",
"SIF_PUBLIC_DEKORATOR_URL": "https://dekoratoren.ekstern.dev.nav.no/?simple=true&chatbot=false&urlLookupTable=false&logoutUrl=https://omsorgspengerutbetaling-soknad.intern.dev.nav.no/oauth2/logout&redirectToApp=true",
"SIF_PUBLIC_LOGIN_URL": "https://omsorgspengerutbetaling-soknad.intern.dev.nav.no/oauth2/login?redirect=/familie/sykdom-i-familien/soknad/omsorgspengerutbetaling/soknad",
"SIF_PUBLIC_MINSIDE_URL": "https://www.intern.dev.nav.no/minside"
}
}
Loading