feat: add Dockerfile

This commit is contained in:
Kentai Radiquum 2025-05-30 13:35:46 +05:00
parent 767121c77b
commit ed20227b1a
Signed by: Radiquum
GPG key ID: 858E8EE696525EED
9 changed files with 144 additions and 7 deletions

68
.dockerignore Normal file
View file

@ -0,0 +1,68 @@
# Python
__pycache__
venv
.mypy_cache
# VSCode
.VSCode
*.code-workspace
# DetaSpace
.space
# NextJS
## dependencies
standalone
node_modules
.pnp
.pnp.js
.yarn/install-state.gz
## testing
coverage
## next.js
.next
out
## production
build
## misc
.DS_Store
*.pem
## debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
## local env files
.env*.local
## vercel
.vercel
## typescript
*.tsbuildinfo
next-env.d.ts
# traefik
traefik/traefik
old/
#Trigger Vercel Prod Build
# next-video
videos/*
!videos/*.json
!videos/*.js
!videos/*.ts
public/_next-video
API-Trace/*
.env
player-parsers
docs
.git

32
Dockerfile Normal file
View file

@ -0,0 +1,32 @@
FROM node:23-alpine AS base
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
FROM base AS runner
LABEL org.opencontainers.image.source=https://github.com/radiquum/anix
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
CMD ["node", "server.js"]

View file

@ -4,7 +4,13 @@ import { usePreferencesStore } from "./store/preferences";
import { Navbar } from "./components/Navbar/NavbarUpdate";
import { Inter } from "next/font/google";
import { useEffect, useState } from "react";
import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react";
import {
Button,
Modal,
ModalBody,
ModalFooter,
ModalHeader,
} from "flowbite-react";
import { Spinner } from "./components/Spinner/Spinner";
import { ChangelogModal } from "#/components/ChangelogModal/ChangelogModal";
import { Bounce, ToastContainer } from "react-toastify";

View file

@ -1,4 +1,5 @@
import { tryCatchPlayer, tryCatchAPI } from "#/api/utils";
import { env } from 'next-runtime-env';
export async function _fetchAPI(
url: string,
@ -75,7 +76,8 @@ export const _fetchKodikManifest = async (
setPlayerError: (state) => void
) => {
// Fetch episode links via edge function
if (!process.env.NEXT_PUBLIC_KODIK_PARSER_URL) {
const NEXT_PUBLIC_KODIK_PARSER_URL = env("NEXT_PUBLIC_KODIK_PARSER_URL")
if (!NEXT_PUBLIC_KODIK_PARSER_URL) {
setPlayerError({
message: "Источник не настроен",
detail: "переменная 'NEXT_PUBLIC_KODIK_PARSER_URL' не обнаружена",
@ -84,7 +86,7 @@ export const _fetchKodikManifest = async (
}
const data = await _fetchPlayer(
`${process.env.NEXT_PUBLIC_KODIK_PARSER_URL}/?url=${url}&player=kodik`,
`${NEXT_PUBLIC_KODIK_PARSER_URL}/?url=${url}&player=kodik`,
setPlayerError
);
if (data) {
@ -213,9 +215,10 @@ export const _fetchAnilibriaManifest = async (
const epid = url.split("?id=")[1].split("&ep=")[1];
const _url = `https://api.anilibria.tv/v3/title?id=${id}`;
let data = null;
if (process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL) {
const NEXT_PUBLIC_ANILIBRIA_PARSER_URL = env("NEXT_PUBLIC_ANILIBRIA_PARSER_URL")
if (NEXT_PUBLIC_ANILIBRIA_PARSER_URL) {
data = await _fetchPlayer(
`${process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL}/?url=${_url}&player=libria`,
`${NEXT_PUBLIC_ANILIBRIA_PARSER_URL}/?url=${_url}&player=libria`,
setPlayerError
);
} else {
@ -243,7 +246,8 @@ export const _fetchSibnetManifest = async (
setPlayerError: (state) => void
) => {
// Fetch data via cloud endpoint
if (!process.env.NEXT_PUBLIC_SIBNET_PARSER_URL) {
const NEXT_PUBLIC_SIBNET_PARSER_URL = env("NEXT_PUBLIC_SIBNET_PARSER_URL")
if (!NEXT_PUBLIC_SIBNET_PARSER_URL) {
setPlayerError({
message: "Источник не настроен",
detail: "переменная 'NEXT_PUBLIC_SIBNET_PARSER_URL' не обнаружена",
@ -251,7 +255,7 @@ export const _fetchSibnetManifest = async (
return { manifest: null, poster: null };
}
const data = await _fetchPlayer(
`${process.env.NEXT_PUBLIC_SIBNET_PARSER_URL}/?url=${url}&player=sibnet`,
`${NEXT_PUBLIC_SIBNET_PARSER_URL}/?url=${url}&player=sibnet`,
setPlayerError
);
if (data) {

View file

@ -1,6 +1,7 @@
import "./globals.css";
import { App } from "./App";
import { ThemeModeScript } from "flowbite-react";
import { PublicEnvScript } from 'next-runtime-env';
export const metadata = {
metadataBase: new URL("https://anix.wah.su"),
@ -33,6 +34,7 @@ export default function RootLayout({ children }) {
return (
<html lang="en" suppressHydrationWarning>
<head>
<PublicEnvScript />
<ThemeModeScript />
</head>
<App>{children}</App>

View file

@ -1,10 +1,16 @@
const withFlowbiteReact = require("flowbite-react/plugin/nextjs");
/** @type {import('next').NextConfig} */
const NextConfig = {
output: "standalone",
reactStrictMode: false,
images: {
unoptimized: true,
},
env: {
NEXT_PUBLIC_KODIK_PARSER_URL: process.env.NEXT_PUBLIC_KODIK_PARSER_URL,
NEXT_PUBLIC_ANILIBRIA_PARSER_URL: process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL,
NEXT_PUBLIC_SIBNET_PARSER_URL: process.env.NEXT_PUBLIC_SIBNET_PARSER_URL,
},
async headers() {
return [
{

15
package-lock.json generated
View file

@ -17,6 +17,7 @@
"markdown-to-jsx": "^7.4.7",
"media-chrome": "^4.9.0",
"next": "^14.2.26",
"next-runtime-env": "^3.3.0",
"prettier": "^3.5.3",
"react": "^18",
"react-cropper": "^2.3.3",
@ -4955,6 +4956,20 @@
}
}
},
"node_modules/next-runtime-env": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-3.3.0.tgz",
"integrity": "sha512-JgKVnog9mNbjbjH9csVpMnz2tB2cT5sLF+7O47i6Ze/s/GoiKdV7dHhJHk1gwXpo6h5qPj5PTzryldtSjvrHuQ==",
"license": "MIT",
"dependencies": {
"next": "^14",
"react": "^18"
},
"peerDependencies": {
"next": "^14",
"react": "^18"
}
},
"node_modules/next/node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",

View file

@ -18,6 +18,7 @@
"markdown-to-jsx": "^7.4.7",
"media-chrome": "^4.9.0",
"next": "^14.2.26",
"next-runtime-env": "^3.3.0",
"prettier": "^3.5.3",
"react": "^18",
"react-cropper": "^2.3.3",

View file

@ -9,4 +9,7 @@ RUN npm ci
COPY *.ts ./
EXPOSE 7000
ENV PORT=7000
ENV HOSTNAME="0.0.0.0"
CMD ["npm", "run", "serve"]