0
0

Added Hckrnws

This commit is contained in:
Opnxng 2024-10-09 19:44:34 +08:00
parent cfe3a01c1e
commit 363b4c2212
3 changed files with 953 additions and 0 deletions

View File

@ -0,0 +1,68 @@
name: hckrnws
run-name: hckrnws
env:
REPO_NAME: hckrnws
REMOTE_REPO: https://github.com/rajatkulkarni95/hckrnws.git
BUILD_PLATFORM: linux/arm64
on:
schedule:
- cron: "0 0 1 */3 *" # every 3 months
push:
paths:
- ".gitea/workflows/hckrnws.yaml"
- "dockerfiles/hckrnws.Dockerfile"
jobs:
build:
runs-on: runner
container:
image: git.opnxng.com/opnxng/docker-buildx:latest
steps:
- name: Check latest upstream commit
run: |
STORED_COMMIT=$(curl -H "Authorization: Bearer ${{ secrets.NT }}" -s "https://nt.opnxng.com/${REPO_NAME}/raw?poll=1" | tail -n 1)
LATEST_COMMIT=$(git ls-remote ${REMOTE_REPO} | awk '{print $1}' | head -1)
echo "STORED_COMMIT=${STORED_COMMIT}" >> "$GITHUB_ENV"
echo "LATEST_COMMIT=${LATEST_COMMIT}" >> "$GITHUB_ENV"
echo "Stored Commit: ${STORED_COMMIT}"
echo "Latest Commit: ${LATEST_COMMIT}"
- name: Build and push Docker image
run: |
if [ "$STORED_COMMIT" != "$LATEST_COMMIT" ]; then
echo "Found a new commit, building new image"
# Create and use Docker Buildx builder
docker buildx create --use --name buildx
# Login to Package Registry
echo "${{ secrets.TOKEN }}" | docker login git.opnxng.com -u ${{ gitea.repository_owner }} --password-stdin
# Build and push Docker image
mkdir temp
cd temp
git clone ${REMOTE_REPO} .
curl -JL https://git.opnxng.com/opnxng/docker-images/raw/branch/main/copy/globals.css -o ./src/styles/globals.css
curl -JL https://git.opnxng.com/opnxng/docker-images/raw/branch/main/dockerfiles/hckrnws.Dockerfile -o Dockerfile
docker buildx build \
--platform ${BUILD_PLATFORM} \
-t git.opnxng.com/${{ gitea.repository_owner }}/${REPO_NAME}:latest \
-f ./Dockerfile \
--push . && \
curl -H prio:low -d "Built and pushed ${REPO_NAME}" https://ntfy.opnxng.com/build || \
{ curl -H tags:warning -H prio:high -d "Built and pushed ${REPO_NAME} failed!" https://ntfy.opnxng.com/build ; exit 1; }
# Remove Docker Buildx builder
docker buildx rm buildx
else
echo "No new commit, skipped build"
fi
- name: Update stored commit
run: |
if [ "$STORED_COMMIT" != "$LATEST_COMMIT" ]; then
curl -H "Authorization: Bearer ${{ secrets.NT }}" -d $(git ls-remote ${REMOTE_REPO} | awk '{print $1}' | head -1) "https://nt.opnxng.com/${REPO_NAME}"
STORED_COMMIT=$(curl -H "Authorization: Bearer ${{ secrets.NT }}" -s "https://nt.opnxng.com/${REPO_NAME}/raw?poll=1" | tail -n 1)
echo "STORED_COMMIT=${STORED_COMMIT}" >> "$GITHUB_ENV"
else
curl -H "Authorization: Bearer ${{ secrets.NT }}" -d $(git ls-remote ${REMOTE_REPO} | awk '{print $1}' | head -1) "https://nt.opnxng.com/${REPO_NAME}"
STORED_COMMIT=$(curl -H "Authorization: Bearer ${{ secrets.NT }}" -s "https://nt.opnxng.com/${REPO_NAME}/raw?poll=1" | tail -n 1)
echo "STORED_COMMIT=${STORED_COMMIT}" >> "$GITHUB_ENV"
exit 1
fi

862
copy/globals.css Normal file
View File

@ -0,0 +1,862 @@
/*
! tailwindcss v3.2.7 | MIT License | https://tailwindcss.com
*/*,
:after,
:before {
box-sizing:border-box;
border:0 solid #e5e7eb
}
:after,
:before {
--tw-content:""
}
html {
line-height:1.5;
-webkit-text-size-adjust:100%;
-moz-tab-size:4;
-o-tab-size:4;
tab-size:4;
font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;
font-feature-settings:normal
}
body {
margin:0;
line-height:inherit
}
hr {
height:0;
color:inherit;
border-top-width:1px
}
abbr:where([title]) {
-webkit-text-decoration:underline dotted;
text-decoration:underline dotted
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-size:inherit;
font-weight:inherit
}
a {
color:inherit;
text-decoration:inherit
}
b,
strong {
font-weight:bolder
}
code,
kbd,
pre,
samp {
font-family:Space Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;
font-size:1em
}
small {
font-size:80%
}
sub,
sup {
font-size:75%;
line-height:0;
position:relative;
vertical-align:baseline
}
sub {
bottom:-.25em
}
sup {
top:-.5em
}
table {
text-indent:0;
border-color:inherit;
border-collapse:collapse
}
button,
input,
optgroup,
select,
textarea {
font-family:inherit;
font-size:100%;
font-weight:inherit;
line-height:inherit;
color:inherit;
margin:0;
padding:0
}
button,
select {
text-transform:none
}
[type=button],
[type=reset],
[type=submit],
button {
-webkit-appearance:button;
background-color:transparent;
background-image:none
}
:-moz-focusring {
outline:auto
}
:-moz-ui-invalid {
box-shadow:none
}
progress {
vertical-align:baseline
}
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height:auto
}
[type=search] {
-webkit-appearance:textfield;
outline-offset:-2px
}
::-webkit-search-decoration {
-webkit-appearance:none
}
::-webkit-file-upload-button {
-webkit-appearance:button;
font:inherit
}
summary {
display:list-item
}
blockquote,
dd,
dl,
figure,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
p,
pre {
margin:0
}
fieldset {
margin:0
}
fieldset,
legend {
padding:0
}
menu,
ol,
ul {
list-style:none;
margin:0;
padding:0
}
textarea {
resize:vertical
}
input::-moz-placeholder,
textarea::-moz-placeholder {
opacity:1;
color:#9ca3af
}
input::placeholder,
textarea::placeholder {
opacity:1;
color:#9ca3af
}
[role=button],
button {
cursor:pointer
}
:disabled {
cursor:default
}
audio,
canvas,
embed,
iframe,
img,
object,
svg,
video {
display:block;
vertical-align:middle
}
img,
video {
max-width:100%;
height:auto
}
[hidden] {
display:none
}
*,
:after,
:before {
--tw-border-spacing-x:0;
--tw-border-spacing-y:0;
--tw-translate-x:0;
--tw-translate-y:0;
--tw-rotate:0;
--tw-skew-x:0;
--tw-skew-y:0;
--tw-scale-x:1;
--tw-scale-y:1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness:proximity;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width:0px;
--tw-ring-offset-color:#fff;
--tw-ring-color:rgba(59,130,246,.5);
--tw-ring-offset-shadow:0 0 #0000;
--tw-ring-shadow:0 0 #0000;
--tw-shadow:0 0 #0000;
--tw-shadow-colored:0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia:
}
::backdrop {
--tw-border-spacing-x:0;
--tw-border-spacing-y:0;
--tw-translate-x:0;
--tw-translate-y:0;
--tw-rotate:0;
--tw-skew-x:0;
--tw-skew-y:0;
--tw-scale-x:1;
--tw-scale-y:1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness:proximity;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width:0px;
--tw-ring-offset-color:#fff;
--tw-ring-color:rgba(59,130,246,.5);
--tw-ring-offset-shadow:0 0 #0000;
--tw-ring-shadow:0 0 #0000;
--tw-shadow:0 0 #0000;
--tw-shadow-colored:0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia:
}
.relative {
position:relative
}
.m-0 {
margin:0
}
.mx-auto {
margin-left:auto;
margin-right:auto
}
.my-2 {
margin-top:.5rem;
margin-bottom:.5rem
}
.mb-0 {
margin-bottom:0
}
.mb-0\.5 {
margin-bottom:.125rem
}
.mb-1 {
margin-bottom:.25rem
}
.mb-2 {
margin-bottom:.5rem
}
.mb-3 {
margin-bottom:.75rem
}
.mb-8 {
margin-bottom:2rem
}
.ml-0 {
margin-left:0
}
.ml-0\.5 {
margin-left:.125rem
}
.ml-1 {
margin-left:.25rem
}
.ml-2 {
margin-left:.5rem
}
.ml-auto {
margin-left:auto
}
.mr-1 {
margin-right:.25rem
}
.mr-2 {
margin-right:.5rem
}
.mr-3 {
margin-right:.75rem
}
.mt-0 {
margin-top:0
}
.mt-0\.5 {
margin-top:.125rem
}
.mt-1 {
margin-top:.25rem
}
.mt-3 {
margin-top:.75rem
}
.mt-4 {
margin-top:1rem
}
.mt-8 {
margin-top:2rem
}
.mt-auto {
margin-top:auto
}
.flex {
display:flex
}
.hidden {
display:none
}
.h-3 {
height:.75rem
}
.h-4 {
height:1rem
}
.min-h-screen {
min-height:100vh
}
.w-20 {
width:5rem
}
.w-3 {
width:.75rem
}
.w-32 {
width:8rem
}
.w-4 {
width:1rem
}
.w-fit {
width:-moz-fit-content;
width:fit-content
}
.w-full {
width:100%
}
.max-w-\[128px\] {
max-width:128px
}
.max-w-\[156px\] {
max-width:156px
}
.flex-1 {
flex:1 1 0%
}
.flex-none {
flex:none
}
.cursor-default {
cursor:default
}
.flex-col {
flex-direction:column
}
.items-center {
align-items:center
}
.justify-start {
justify-content:flex-start
}
.justify-end {
justify-content:flex-end
}
.justify-center {
justify-content:center
}
.justify-between {
justify-content:space-between
}
.overflow-x-hidden {
overflow-x:hidden
}
.truncate {
overflow:hidden;
text-overflow:ellipsis
}
.truncate,
.whitespace-nowrap {
white-space:nowrap
}
.whitespace-pre-line {
white-space:pre-line
}
.rounded {
border-radius:.25rem
}
.rounded-full {
border-radius:9999px
}
.rounded-md {
border-radius:.375rem
}
.rounded-l-full {
border-top-left-radius:9999px;
border-bottom-left-radius:9999px
}
.rounded-r-full {
border-top-right-radius:9999px;
border-bottom-right-radius:9999px
}
.border {
border-width:1px
}
.border-b {
border-bottom-width:1px
}
.border-l-2 {
border-left-width:2px
}
.border-r {
border-right-width:1px
}
.border-none {
border-style:none
}
.border-primary {
border-color:var(--color-border-primary)
}
.bg-op {
background-color:var(--color-bg-op)
}
.bg-primary {
background-color:var(--color-bg-primary)
}
.bg-secondary {
background-color:var(--color-bg-secondary)
}
.bg-tertiary {
background-color:var(--color-bg-tertiary)
}
.bg-transparent {
background-color:transparent
}
.p-0 {
padding:0;
}
.p-0\.5 {
padding:.125rem;
}
.p-1 {
padding:.25rem;
}
.p-1\.5 {
padding:.375rem;
}
.p-4 {
padding:1rem;
}
@media (min-width:1280px) {
.p-4 {
padding:1rem 2rem;
}
}
.px-1 {
padding-left:.25rem;
padding-right:.25rem
}
.px-1\.5 {
padding-left:.375rem;
padding-right:.375rem
}
.px-2 {
padding-left:.5rem;
padding-right:.5rem
}
.px-3 {
padding-left:.75rem;
padding-right:.75rem
}
.px-4 {
padding-left:1rem;
padding-right:1rem
}
.py-0 {
padding-top:0;
padding-bottom:0
}
.py-0\.5 {
padding-top:.125rem;
padding-bottom:.125rem
}
.py-1 {
padding-top:.25rem;
padding-bottom:.25rem
}
.py-1\.5 {
padding-top:.375rem;
padding-bottom:.375rem
}
.py-2 {
padding-top:.5rem;
padding-bottom:.5rem
}
.py-3 {
padding-top:.75rem;
padding-bottom:.75rem
}
.pb-1 {
padding-bottom:.25rem
}
.pl-0 {
padding-left:0
}
.pl-3 {
padding-left:.75rem
}
.pr-2 {
padding-right:.5rem
}
.pt-0 {
padding-top:0
}
.text-center {
text-align:center
}
.font-mono {
font-family:Space Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace
}
.font-sans {
font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji
}
.text-\[10px\] {
font-size:10px
}
.text-base {
font-size:1rem;
line-height:1.5rem
}
.text-lg {
font-size:1.125rem;
line-height:1.75rem
}
.text-sm {
font-size:.875rem;
line-height:1.25rem
}
.text-xl {
font-size:1.25rem;
line-height:1.75rem
}
.text-xs {
font-size:.75rem;
line-height:1rem
}
.font-medium {
font-weight:500
}
.font-normal {
font-weight:400
}
.font-semibold {
font-weight:600
}
.text-amber-400 {
--tw-text-opacity:1;
color:rgb(251 191 36/var(--tw-text-opacity))
}
.text-icon {
color:var(--color-text-icon)
}
.text-primary {
color:var(--color-text-secondary)
}
.text-secondary {
color:var(--color-text-secondary)
}
.text-tertiary {
color:var(--color-text-tertiary)
}
.antialiased {
-webkit-font-smoothing:antialiased;
-moz-osx-font-smoothing:grayscale
}
.shadow-sm {
--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);
--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);
box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)
}
.outline-none {
outline:2px solid transparent;
outline-offset:2px
}
.ring-0 {
--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)
}
.filter {
filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)
}
.duration-100 {
transition-duration:.1s
}
.duration-150 {
transition-duration:.15s
}
* {
box-sizing:border-box
}
a,
button {
outline:none
}
.quotes {
margin-top:1rem!important;
margin-bottom:1rem!important;
border-left-width:2px;
border-color:var(--color-border-secondary);
padding-left:1rem;
padding-right:1rem;
color:var(--color-text-tertiary)
}
/* App Themes */
[data-theme="light"] {
--color-text-primary: #1C1B1A; /* 950 (dark gray) */
--color-text-secondary: #1C1B1A; /* 950 (dark gray) */
--color-text-tertiary: #CECDC3; /* 200 (light gray) */
--color-text-code: #100F0F; /* black */
--color-text-icon: #403E3C; /* 800 (dark gray) */
--color-text-btn: #F0F0F0; /* modified to a pure light gray */
--color-text-link: #4385BE; /* blue */
--color-bg-primary: #F0F0F0; /* modified to a pure light gray (formerly paper) */
--color-bg-secondary: #E0E0E0; /* modified to a more neutral light gray */
--color-bg-tertiary: #D0D0D0; /* modified to a very light gray */
--color-bg-hover: #E0E0E0; /* modified (similar to secondary) */
--color-bg-tooltip: #F2F2F2; /* adjusted for a neutral light gray */
--color-bg-code: #CECDC3; /* 200 (light gray) */
--color-bg-op: #D0A215; /* still yellow but usually used in context */
--color-bg-btn: #100F0F; /* black */
--color-border-primary: #B7B5AC; /* 300 (light gray) */
--color-border-secondary: #878580; /* 500 (medium gray) */
}
[data-theme="dark"] {
--color-text-primary: #E0E0E0; /* modified to a light gray (formerly paper) */
--color-text-secondary: #B7B5AC; /* 300 (medium gray) */
--color-text-tertiary: #CECDC3; /* 200 (light gray) */
--color-text-code: #E0E0E0; /* modified to a light gray (formerly paper) */
--color-text-icon: #6F6E69; /* 600 (dark gray) */
--color-text-btn: #100F0F; /* black */
--color-text-link: #4385BE; /* blue */
--color-bg-primary: #100F0F; /* black */
--color-bg-secondary: #1C1B1A; /* 950 (dark gray) */
--color-bg-tertiary: #282726; /* 900 (dark gray) */
--color-bg-hover: #181818; /* darkened color for hover */
--color-bg-tooltip: #1A1A1A; /* dark gray */
--color-bg-code: #403E3C; /* 800 (dark gray) */
--color-bg-op: #5E409D; /* purple */
--color-bg-btn: #E0E0E0; /* modified to a light gray (formerly paper) */
--color-border-primary: #1C1B1A; /* 950 (dark gray) */
--color-border-secondary: #343331; /* 850 (dark gray) */
}
[data-theme="andromeda"] {
--color-text-primary: #100F0F; /* black */
--color-text-secondary: #A5ABA8; /* still using adapted gray */
--color-text-tertiary: #AEABB1; /* still using adapted gray */
--color-text-code: #E0E0E0; /* light gray */
--color-text-icon: #403E3C; /* 800 (dark gray) */
--color-bg-primary: #100F0F; /* black */
--color-bg-secondary: #282726; /* 900 (dark gray) */
--color-bg-tertiary: #343331; /* 850 (dark gray) */
--color-bg-hover: #262930; /* darkened for hover */
--color-bg-code: #1E2025; /* blackish tone for the code */
--color-bg-tooltip: #1A1A1A; /* dark gray */
--color-border-primary: #2B2E37; /* adapted */
--color-border-secondary: #24262D; /* adapted */
}
.hover\:border-secondary:hover {
border-color:var(--color-border-secondary)
}
.hover\:bg-hover:hover {
background-color:var(--color-bg-hover)
}
.hover\:bg-secondary:hover {
background-color:var(--color-bg-secondary)
}
.hover\:bg-tertiary:hover {
background-color:var(--color-bg-tertiary)
}
.hover\:text-primary:hover {
color:var(--color-text-primary)
}
.focus-visible\:ring-1:focus-visible {
--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)
}
.focus-visible\:ring-blue-500:focus-visible {
--tw-ring-opacity:1;
--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))
}
.enabled\:hover\:bg-btn:hover:enabled {
background-color:var(--color-bg-btn)
}
.disabled\:cursor-not-allowed:disabled {
cursor:not-allowed
}
.disabled\:opacity-40:disabled {
opacity:.4
}
.group:hover .group-hover\:text-btn {
color:var(--color-text-btn)
}
.group:hover .group-hover\:text-primary {
color:var(--color-text-primary)
}
@media (min-width:768px) {
.md\:w-5\/6 {
width:83.333333%
}
.md\:max-w-full {
max-width:100%
}
.md\:overflow-visible {
overflow:visible
}
.md\:whitespace-normal {
white-space:normal
}
.md\:text-2xl {
font-size:1.5rem;
line-height:2rem
}
.md\:text-xl {
font-size:1.25rem;
line-height:1.75rem
}
}
@media (min-width:1280px) {
.xl\:w-\[900px\] {
width:900px
}
}
.\[\&\>p\>a\]\:whitespace-pre-line>p>a {
white-space:pre-line
}
.\[\&\>p\>a\]\:text-link>p>a {
color:var(--color-text-link)
}
.\[\&\>p\>a\]\:underline>p>a {
text-decoration-line:underline
}
.\[\&\>p\]\:mb-1>p {
margin-bottom:.25rem
}
.\[\&\>p\]\:whitespace-pre-line>p {
white-space:pre-line
}
.\[\&\>pre\>code\]\:font-mono>pre>code {
font-family:Space Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace
}
.\[\&\>pre\>code\]\:text-xs>pre>code {
font-size:.75rem;
line-height:1rem
}
@media (min-width:768px) {
.md\:\[\&\>pre\>code\]\:text-sm>pre>code {
font-size:.875rem;
line-height:1.25rem
}
}
.\[\&\>pre\]\:my-2>pre {
margin-top:.5rem;
margin-bottom:.5rem
}
.\[\&\>pre\]\:overflow-x-auto>pre {
overflow-x:auto
}
.\[\&\>pre\]\:whitespace-pre-line>pre {
white-space:pre-line
}
.\[\&\>pre\]\:rounded>pre {
border-radius:.25rem
}
.\[\&\>pre\]\:border>pre {
border-width:1px
}
.\[\&\>pre\]\:border-primary>pre {
border-color:var(--color-border-primary)
}
.\[\&\>pre\]\:bg-code>pre {
background-color:var(--color-bg-code)
}
.\[\&\>pre\]\:p-2>pre {
padding:.5rem
}

23
dockerfiles/hckrnws.Dockerfile Executable file
View File

@ -0,0 +1,23 @@
# Use the official Node.js image
FROM node:lts-slim
# Set the working directory in the container
WORKDIR /app
# Copy package.json and pnpm-lock.yaml for installing dependencies
COPY package.json pnpm-lock.yaml ./
# Install pnpm
RUN npm install -g pnpm
# Install project dependencies
RUN pnpm install
# Copy the rest of the application code
COPY . .
# Expose the port
EXPOSE 3000
# Command to run the application
CMD ["pnpm", "run", "dev"]