dockerize everything, prepare for deployment

This commit is contained in:
JandereDev 2022-02-05 20:17:00 +01:00
parent 860b816136
commit 0aa6134d72
Signed by: Lea
GPG key ID: 5D5E18ACB990F57A
10 changed files with 152 additions and 5 deletions

39
.env.example Normal file
View 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
View file

@ -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
View 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"]

View file

@ -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"
} }
} }

View file

@ -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"

View file

@ -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

View 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
View 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"]

View file

@ -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 }

View file

@ -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' }}