Compare commits

...

28 Commits
v1.4 ... v1.5

Author SHA1 Message Date
Yifei Zhang
cc1a1d4f3c feat: #27 add docker image publish actions 2023-03-27 14:46:30 +00:00
Yifei Zhang
0463b350d8 feat: #24 docker publish actions 2023-03-27 22:44:09 +08:00
Yifei Zhang
8f87a68f72 Merge pull request #39 from AprilNEA/docker
feat: add docker deployment support
2023-03-27 22:41:20 +08:00
Yifei Zhang
60f27fdfbb Merge pull request #68 from AprilNEA/main
fix(#65): fix unknown git commit id
2023-03-27 22:01:19 +08:00
Yifei Zhang
d17706636b Merge pull request #66 from iFwu/main
fix: resolve hydration error
2023-03-27 21:59:19 +08:00
Yifei Zhang
9570691d5b Delete userRole.tsx 2023-03-27 21:52:50 +08:00
AprilNEA
efe4fcc188 Merge branch 'Yidadaa:main' into main 2023-03-27 18:31:47 +08:00
AprilNEA
efaf6590ef fix(#65): fix unknown git commit id 2023-03-27 18:31:04 +08:00
伏晓
fb06fb8c38 fix: resolve hydration error 2023-03-27 18:22:55 +08:00
Yifei Zhang
f188841188 Merge pull request #67 from iSource/pwa-support
feat: add PWA support
2023-03-27 18:19:49 +08:00
jianjian.ma
5593c067c4 feat: add PWA support 2023-03-27 18:02:35 +08:00
jianjian.ma
689b7bab26 feat: add PWA support 2023-03-27 17:53:32 +08:00
Yifei Zhang
a81e7394f0 Update README.md 2023-03-27 17:45:36 +08:00
Yifei Zhang
492fed6802 Merge pull request #64 from AprilNEA/fix-theme
Fix broswer tasklist and support safari webapp #54
2023-03-27 17:44:21 +08:00
jianjian.ma
bdf17fafff feat: add PWA support 2023-03-27 17:41:44 +08:00
AprilNEA
58baa23199 Merge branch 'fix-theme' of https://github.com/AprilNEA/ChatGPT-Next-Web into fix-theme 2023-03-27 17:05:15 +08:00
AprilNEA
dd80c4563d feat: adding iOS Webapp support
- fix media query about background-color
- Use colors from CSS files instead of fixed values
2023-03-27 17:04:11 +08:00
AprilNEA
785372ad73 fix: fix the different colors on mobile 2023-03-27 15:47:46 +08:00
AprilNEA
d8e4808316 Merge branch 'Yidadaa:main' into fix-theme 2023-03-27 15:10:10 +08:00
AprilNEA
6446692db0 feat: support safari appleWebApp 2023-03-27 15:02:12 +08:00
AprilNEA
cd73c3a7cb fix: taskbar color follow(#54) 2023-03-27 15:01:35 +08:00
AprilNEA
d0eee767fa fix: resolve conflict 2023-03-27 14:01:03 +08:00
AprilNEA
e880df6db9 docs: add instructions for docker deployment 2023-03-27 13:59:23 +08:00
AprilNEA
96c4f5bbd9 Merge branch 'Yidadaa:main' into docker 2023-03-27 13:53:46 +08:00
AprilNEA
2645540721 perf: build in stages to reduce container size 2023-03-27 13:49:26 +08:00
Yifei Zhang
b1f27aaf93 Merge pull request #61 from Yidadaa/bugfix-0327
fix: #7 disable light code theme
2023-03-27 11:07:07 +08:00
Yifei Zhang
fb2d281aac fix: #7 disable light code theme 2023-03-27 03:02:25 +00:00
AprilNEA
8d0d08725d feat: add Dockerfile for docker deployment support 2023-03-26 16:56:05 +08:00
15 changed files with 225 additions and 43 deletions

1
.eslintignore Normal file
View File

@@ -0,0 +1 @@
public/serviceWorker.js

33
.github/workflows/docker.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: yidadaa/chatgpt-next-web
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

44
Dockerfile Normal file
View File

@@ -0,0 +1,44 @@
FROM node:18-alpine AS base
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock* package-lock.json* ./
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
else echo "Lockfile not found." && exit 1; \
fi
FROM base AS builder
RUN apk update && apk add --no-cache git
ENV OPENAI_API_KEY=""
ENV CODE=""
ARG DOCKER=true
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN yarn build
FROM base AS runner
WORKDIR /app
ENV OPENAI_API_KEY=""
ENV CODE=""
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/.next/server ./.next/server
EXPOSE 3000
CMD ["node","server.js"]

View File

@@ -109,31 +109,32 @@ OPENAI_API_KEY=<your api key here>
```
### 本地开发 Local Development
> 如果你是中国大陆用户,不建议在本地进行开发,除非你能够独立解决 OpenAI API 本地代理问题。
1. 安装 nodejs 和 yarn具体细节请询问 ChatGPT
2. 执行 `yarn install && yarn dev` 即可。
### 本地部署 Local Deployment
请直接询问 ChatGPT使用下列 Prompt
```
如何使用 pm2 和 yarn 部署 nextjs 项目到 ubuntu 服务器上,项目编译命令为 yarn build启动命令为 yarn start启动时需要设置环境变量为 OPENAI_API_KEY端口为 3000使用 ngnix 做反向代理
```
Please ask ChatGPT with prompt:
```
how to deploy nextjs project with pm2 and yarn on my ubuntu server, the build command is `yarn build`, the start command is `yarn start`, the project must start with env var named `OPENAI_API_KEY`, the port is 3000, use ngnix
```
### Docker Deployment
请直接询问 ChatGPT使用下列 Prompt
```
如何使用 docker 部署 nextjs 项目到 ubuntu 服务器上,项目编译命令为 yarn build启动命令为 yarn start启动时需要设置环境变量为 OPENAI_API_KEY端口为 3000使用 ngnix 做反向代理
```
### 容器部署 Docker Deployment
Please ask ChatGPT with prompt:
```
how to deploy nextjs project with docker on my ubuntu server, the build command is `yarn build`, the start command is `yarn start`, the project must start with env var named `OPENAI_API_KEY`, the port is 3000, use ngnix
```shell
docker pull yidadaa/chatgpt-next-web
docker run -d -p 3000:3000 -e OPEN_API_KEY="" -e CODE="" aprilnea/chatgpt-next-web
```
## 截图 Screenshots
@@ -143,17 +144,25 @@ how to deploy nextjs project with docker on my ubuntu server, the build command
![更多展示 More](./static/more.png)
## 说明 Attention
本项目的演示地址所用的 OpenAI 账户的免费额度将于 2023-04-01 过期,届时将无法通过演示地址在线体验。
如果你想贡献出自己的 API Key可以通过作者主页的邮箱发送给作者并标注过期时间。
The free trial of the OpenAI account used by the demo will expire on April 1, 2023, and the demo will not be available at that time.
The free trial of the OpenAI account used by the demo will expire on April 1, 2023, and the demo will not be available at that time.
If you would like to contribute your API key, you can email it to the author and indicate the expiration date of the API key.
## 鸣谢 Special Thanks
### 捐赠者 Sponsor
[@mushan0x0](https://github.com/mushan0x0)
[@ClarenceDan](https://github.com/ClarenceDan)
### 贡献者 Contributor
[@AprilNEA](https://github.com/AprilNEA)
## LICENSE

View File

@@ -1,4 +1,3 @@
import type { ChatRequest } from "../chat/typing";
import { createParser } from "eventsource-parser";
import { NextRequest } from "next/server";

View File

@@ -399,11 +399,16 @@ function useSwitchTheme() {
useEffect(() => {
document.body.classList.remove("light");
document.body.classList.remove("dark");
if (config.theme === "dark") {
document.body.classList.add("dark");
} else if (config.theme === "light") {
document.body.classList.add("light");
}
const themeColor = getComputedStyle(document.body).getPropertyValue("--theme-color").trim();
const metaDescription = document.querySelector('meta[name="theme-color"]');
metaDescription?.setAttribute('content', themeColor);
}, [config.theme]);
}
@@ -465,6 +470,16 @@ function showMemoryPrompt(session: ChatSession) {
});
}
const useHasHydrated = () => {
const [hasHydrated, setHasHydrated] = useState<boolean>(false);
useEffect(() => {
setHasHydrated(true);
}, []);
return hasHydrated;
};
export function Home() {
const [createNewSession, currentIndex, removeSession] = useChatStore(
(state) => [
@@ -473,7 +488,7 @@ export function Home() {
state.removeSession,
]
);
const loading = !useChatStore?.persist?.hasHydrated();
const loading = !useHasHydrated();
const [showSideBar, setShowSideBar] = useState(true);
// setting

View File

@@ -354,7 +354,7 @@ export function Settings(props: { closeSettings: () => void }) {
<input
type="number"
min={100}
max={4000}
max={4096}
value={config.modelConfig.max_tokens}
onChange={(e) =>
updateConfig(

View File

@@ -5,19 +5,29 @@ import "./styles/prism.scss";
import process from "child_process";
import { ACCESS_CODES } from "./api/access";
const COMMIT_ID = process
.execSync("git rev-parse --short HEAD")
.toString()
.trim();
let COMMIT_ID: string | undefined;
try {
COMMIT_ID = process
.execSync("git rev-parse --short HEAD")
.toString()
.trim();
} catch (e) {
console.error("No git or not from git repo.")
}
export const metadata = {
title: "ChatGPT Next Web",
description: "Your personal ChatGPT Chat Bot.",
appleWebApp: {
title: "ChatGPT Next Web",
statusBarStyle: "black-translucent",
},
themeColor: "#fafafa"
};
function Meta() {
const metas = {
version: COMMIT_ID,
version: COMMIT_ID ?? "unknown",
access: ACCESS_CODES.size > 0 ? "enabled" : "disabled",
};
@@ -50,6 +60,7 @@ export default function RootLayout({
href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;700;900&display=swap"
rel="stylesheet"
></link>
<script src="/serviceWorkerRegister.js" defer></script>
</head>
<body>{children}</body>
</html>

View File

@@ -7,6 +7,7 @@
--second: rgb(231, 248, 255);
--hover-color: #f3f3f3;
--bar-color: rgba(0, 0, 0, 0.1);
--theme-color: var(--gray);
/* shadow */
--shadow: 50px 50px 100px 10px rgb(0, 0, 0, 0.1);
@@ -28,6 +29,8 @@
--bar-color: rgba(255, 255, 255, 0.1);
--border-in-light: 1px solid rgba(255, 255, 255, 0.192);
--theme-color: var(--gray);
}
.light {
@@ -84,7 +87,11 @@ body {
align-items: center;
user-select: none;
font-family: "Noto Sans SC", "SF Pro SC", "SF Pro Text", "SF Pro Icons",
"PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
"PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
@media only screen and (max-width: 600px) {
background-color: var(--second);
}
}
::-webkit-scrollbar {

View File

@@ -1,4 +1,9 @@
.markdown-body {
pre {
background: #282a36;
color: #f8f8f2;
}
code[class*="language-"],
pre[class*="language-"] {
color: #f8f8f2;
@@ -116,32 +121,32 @@
}
}
@mixin light {
.markdown-body pre[class*="language-"] {
filter: invert(1) hue-rotate(50deg) brightness(1.3);
}
}
// @mixin light {
// .markdown-body pre[class*="language-"] {
// filter: invert(1) hue-rotate(50deg) brightness(1.3);
// }
// }
@mixin dark {
.markdown-body pre[class*="language-"] {
filter: none;
}
}
// @mixin dark {
// .markdown-body pre[class*="language-"] {
// filter: none;
// }
// }
:root {
@include light();
}
// :root {
// @include light();
// }
.light {
@include light();
}
// .light {
// @include light();
// }
.dark {
@include dark();
}
// .dark {
// @include dark();
// }
@media (prefers-color-scheme: dark) {
:root {
@include dark();
}
}
// @media (prefers-color-scheme: dark) {
// :root {
// @include dark();
// }
// }

View File

@@ -14,4 +14,8 @@ const nextConfig = {
}
};
if (process.env.DOCKER) {
nextConfig.output = 'standalone'
}
module.exports = nextConfig;

View File

@@ -2,6 +2,7 @@
"name": "chatgpt-next-web",
"version": "1.1",
"private": false,
"license": "Anti 996",
"scripts": {
"dev": "next dev",
"build": "next build",

24
public/serviceWorker.js Normal file
View File

@@ -0,0 +1,24 @@
const CHATGPT_NEXT_WEB_CACHE = "chatgpt-next-web-cache";
self.addEventListener('activate', function (event) {
console.log('ServiceWorker activated.');
});
self.addEventListener('install', function (event) {
event.waitUntil(
caches.open(CHATGPT_NEXT_WEB_CACHE)
.then(function (cache) {
return cache.addAll([
]);
})
);
});
self.addEventListener('fetch', function (event) {
event.respondWith(
caches.match(event.request)
.then(function (response) {
return response || fetch(event.request);
})
);
});

View File

@@ -0,0 +1,9 @@
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('/serviceWorker.js').then(function (registration) {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}, function (err) {
console.error('ServiceWorker registration failed: ', err);
});
});
}

View File

@@ -1 +1,21 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
{
"name": "ChatGPT Next Web",
"short_name": "ChatGPT",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/",
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}