dockerize everything, prepare for deployment
This commit is contained in:
parent
860b816136
commit
0aa6134d72
10 changed files with 152 additions and 5 deletions
39
.env.example
Normal file
39
.env.example
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# Copy this file to `.env.example` before editing
|
||||||
|
|
||||||
|
### IMPORTANT: ###
|
||||||
|
# After changing `BOT_PREFIX` or `PUBLIC_API_URL`,
|
||||||
|
# you need to rebuild the web container:
|
||||||
|
# "docker-compose build web"
|
||||||
|
|
||||||
|
# Set a secure password for your database.
|
||||||
|
# Keep in mind that you can't easily change this
|
||||||
|
# after initializing the database.
|
||||||
|
DB_PASS=
|
||||||
|
|
||||||
|
# Your bot account's token.
|
||||||
|
BOT_TOKEN=
|
||||||
|
|
||||||
|
# The default prefix, can be overridden by server owners.
|
||||||
|
# Leave empty to keep default ("/")
|
||||||
|
BOT_PREFIX=
|
||||||
|
|
||||||
|
# Private token used by the bot to communicate
|
||||||
|
# with the API. Keep this private!
|
||||||
|
INTERNAL_API_TOKEN=
|
||||||
|
|
||||||
|
# Comma separated list of user IDs.
|
||||||
|
# Be careful with the people you add here -
|
||||||
|
# They will be able to use /eval and /shell,
|
||||||
|
# which gives them access to your server!
|
||||||
|
BOT_OWNERS=
|
||||||
|
|
||||||
|
# Optional: A Discord webhook URL which will be
|
||||||
|
# used to log certain events (bot started, etc).
|
||||||
|
LOG_WEBHOOK=
|
||||||
|
|
||||||
|
# The URL from which your API and Web app are
|
||||||
|
# publicly reachable. Do not add a trailing
|
||||||
|
# slash to the URLs.
|
||||||
|
|
||||||
|
PUBLIC_API_URL=http://localhost:9000
|
||||||
|
PUBLIC_WEB_URL=http://localhost:8080
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -2,3 +2,5 @@ node_modules
|
||||||
dist
|
dist
|
||||||
.env
|
.env
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
|
docker-compose.yml
|
||||||
|
/db
|
||||||
|
|
13
api/Dockerfile
Normal file
13
api/Dockerfile
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
FROM node:16 as build
|
||||||
|
WORKDIR /build/
|
||||||
|
COPY package.json yarn.lock ./
|
||||||
|
RUN yarn install --frozen-lockfile
|
||||||
|
COPY . .
|
||||||
|
RUN yarn build
|
||||||
|
|
||||||
|
FROM node:16 as prod
|
||||||
|
WORKDIR /app/
|
||||||
|
COPY --from=build /build/package.json /build/yarn.lock ./
|
||||||
|
COPY --from=build /build/dist ./dist
|
||||||
|
RUN yarn install --production --frozen-lockfile
|
||||||
|
CMD ["yarn", "start"]
|
|
@ -21,5 +21,8 @@
|
||||||
"log75": "^2.2.0",
|
"log75": "^2.2.0",
|
||||||
"monk": "^7.3.4",
|
"monk": "^7.3.4",
|
||||||
"ws": "^8.4.2"
|
"ws": "^8.4.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "^4.5.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -634,6 +634,11 @@ type-is@~1.6.18:
|
||||||
media-typer "0.3.0"
|
media-typer "0.3.0"
|
||||||
mime-types "~2.1.24"
|
mime-types "~2.1.24"
|
||||||
|
|
||||||
|
typescript@^4.5.5:
|
||||||
|
version "4.5.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
|
||||||
|
integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
|
||||||
|
|
||||||
unpipe@1.0.0, unpipe@~1.0.0:
|
unpipe@1.0.0, unpipe@~1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
|
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16 AS build
|
FROM node:16 as build
|
||||||
WORKDIR /build/
|
WORKDIR /build/
|
||||||
COPY package.json yarn.lock ./
|
COPY package.json yarn.lock ./
|
||||||
RUN yarn install --frozen-lockfile
|
RUN yarn install --frozen-lockfile
|
||||||
|
|
65
docker-compose.yml.example
Normal file
65
docker-compose.yml.example
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
# Copy this file to `docker-compose.yml` and modify it to your liking.
|
||||||
|
# Copy `.env.example` to `.env` to configure environment variables.
|
||||||
|
|
||||||
|
version: "3.1"
|
||||||
|
|
||||||
|
services:
|
||||||
|
bot:
|
||||||
|
build: ./bot
|
||||||
|
environment:
|
||||||
|
- DB_HOST=mongo:27017
|
||||||
|
- DB_USERNAME=mogus
|
||||||
|
- DB_PASS
|
||||||
|
- DB_NAME=admin
|
||||||
|
- BOT_TOKEN
|
||||||
|
- BOT_OWNERS
|
||||||
|
- LOG_WEBHOOK
|
||||||
|
- NODE_ENV=production
|
||||||
|
- API_WS_URL=ws://api:9000/internal/ws
|
||||||
|
- API_WS_TOKEN=${INTERNAL_API_TOKEN}
|
||||||
|
- WEB_UI_URL=${PUBLIC_WEB_URL}
|
||||||
|
- BOT_PREFIX
|
||||||
|
depends_on:
|
||||||
|
- mongo
|
||||||
|
- api
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
api:
|
||||||
|
build: ./api
|
||||||
|
environment:
|
||||||
|
- BOT_API_TOKEN=${INTERNAL_API_TOKEN}
|
||||||
|
- DB_HOST=mongo:27017
|
||||||
|
- DB_USERNAME=mogus
|
||||||
|
- DB_PASS
|
||||||
|
- DB_NAME=admin
|
||||||
|
expose:
|
||||||
|
- 9000
|
||||||
|
ports:
|
||||||
|
- 0.0.0.0:9000:9000
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# If you prefer to host the web app on a different
|
||||||
|
# platform like Vercel, you can remove this part.
|
||||||
|
web:
|
||||||
|
build:
|
||||||
|
context: ./web
|
||||||
|
args:
|
||||||
|
- VITE_API_URL=${PUBLIC_API_URL}
|
||||||
|
- VITE_BOT_PREFIX=${BOT_PREFIX}
|
||||||
|
ports:
|
||||||
|
- 0.0.0.0:8080:80
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
mongo:
|
||||||
|
image: mongo
|
||||||
|
environment:
|
||||||
|
- MONGO_INITDB_ROOT_USERNAME=mogus
|
||||||
|
- MONGO_INITDB_ROOT_PASSWORD=${DB_PASS}
|
||||||
|
expose:
|
||||||
|
- 27017
|
||||||
|
# If you want to access the database from outside
|
||||||
|
#ports:
|
||||||
|
# - "0.0.0.0:36602:27017"
|
||||||
|
volumes:
|
||||||
|
- ./db:/data/db:rw
|
||||||
|
restart: unless-stopped
|
16
web/Dockerfile
Normal file
16
web/Dockerfile
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
FROM node:16 as build
|
||||||
|
ARG VITE_API_URL
|
||||||
|
ARG VITE_BOT_PREFIX
|
||||||
|
WORKDIR /build/
|
||||||
|
COPY package.json yarn.lock ./
|
||||||
|
RUN yarn install --frozen-lockfile
|
||||||
|
COPY . .
|
||||||
|
RUN yarn build
|
||||||
|
|
||||||
|
FROM node:16 as prod
|
||||||
|
WORKDIR /app/
|
||||||
|
COPY --from=build /build/package.json /build/yarn.lock ./
|
||||||
|
COPY --from=build /build/dist ./dist
|
||||||
|
RUN yarn add --production --frozen-lockfile vite
|
||||||
|
# Running this with bash -c because it won't exit on ctrl+c otherwise
|
||||||
|
CMD ["bash", "-c", "yarn preview --port=80 --strictPort=true --clearScreen=false --host"]
|
|
@ -7,7 +7,11 @@ import RequireAuth from './components/RequireAuth';
|
||||||
import DashboardHome from './pages/DashboardHome';
|
import DashboardHome from './pages/DashboardHome';
|
||||||
import ServerDashboard from './pages/ServerDashboard';
|
import ServerDashboard from './pages/ServerDashboard';
|
||||||
|
|
||||||
const API_URL = 'http://localhost:9000';
|
const API_URL = import.meta.env.VITE_API_URL?.toString()
|
||||||
|
|| 'http://localhost:9000';
|
||||||
|
|
||||||
|
const BOT_PREFIX = import.meta.env.VITE_BOT_PREFIX?.toString()
|
||||||
|
|| '/';
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
|
@ -22,4 +26,4 @@ function App() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
export { API_URL }
|
export { API_URL, BOT_PREFIX }
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { Button } from '@revoltchat/ui/lib/components/atoms/inputs/Button';
|
||||||
import { InputBox } from '@revoltchat/ui/lib/components/atoms/inputs/InputBox';
|
import { InputBox } from '@revoltchat/ui/lib/components/atoms/inputs/InputBox';
|
||||||
import { H1 } from '@revoltchat/ui/lib/components/atoms/heading/H1';
|
import { H1 } from '@revoltchat/ui/lib/components/atoms/heading/H1';
|
||||||
import { H2 } from '@revoltchat/ui/lib/components/atoms/heading/H2';
|
import { H2 } from '@revoltchat/ui/lib/components/atoms/heading/H2';
|
||||||
import { API_URL } from "../App";
|
import { API_URL, BOT_PREFIX } from "../App";
|
||||||
|
|
||||||
const Login: FunctionComponent = () => {
|
const Login: FunctionComponent = () => {
|
||||||
const [username, setUsername] = useState('');
|
const [username, setUsername] = useState('');
|
||||||
|
@ -66,7 +66,7 @@ const Login: FunctionComponent = () => {
|
||||||
<H2>Your code: <a>{code}</a></H2>
|
<H2>Your code: <a>{code}</a></H2>
|
||||||
<p style={{ color: "var(--foreground)" }}>
|
<p style={{ color: "var(--foreground)" }}>
|
||||||
Run <code style={{ userSelect: 'all' }}>
|
Run <code style={{ userSelect: 'all' }}>
|
||||||
/login {code}
|
{BOT_PREFIX}login {code}
|
||||||
</code> in any server using AutoMod, then <a
|
</code> in any server using AutoMod, then <a
|
||||||
onClick={getSession}
|
onClick={getSession}
|
||||||
style={{ cursor: 'pointer' }}
|
style={{ cursor: 'pointer' }}
|
||||||
|
|
Loading…
Reference in a new issue