Browse Source
Merge pull request #56 from markoilijoski/feature/dockerization
Feature/dockerization
pull/61/head
Israel Abebe
12 months ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with
86 additions and
33 deletions
-
README.md
-
api/.dockerignore
-
api/.env.example
-
api/Dockerfile
-
docker-compose.yaml
-
mongo-init/init.js
-
web/.env.example
-
web/Dockerfile
|
|
@ -158,6 +158,24 @@ curl -X GET "https://api.textbee.dev/api/v1/gateway/devices/YOUR_DEVICE_ID/get-r |
|
|
``` |
|
|
``` |
|
|
4. Ensure your domain points to your VPS and Caddy is configured properly. |
|
|
4. Ensure your domain points to your VPS and Caddy is configured properly. |
|
|
|
|
|
|
|
|
|
|
|
### Dockerized env |
|
|
|
|
|
#### Requirements: |
|
|
|
|
|
- Docker installed |
|
|
|
|
|
1. After setting up Firebase, update your `.env` in `web` && `api` folder. |
|
|
|
|
|
```bash |
|
|
|
|
|
cd web && cp .env.example .env \ |
|
|
|
|
|
&& cd ../api && cp .env.example .env |
|
|
|
|
|
``` |
|
|
|
|
|
2. Navigate to root folder and execute docker-compose.yml file. |
|
|
|
|
|
This will spin up `web` container, `api` container alongside with `MongoDB` and `MongoExpress`. `TextBee` database will be automatically created. |
|
|
|
|
|
```bash |
|
|
|
|
|
docker compose up -d |
|
|
|
|
|
``` |
|
|
|
|
|
To stop the containers simply type |
|
|
|
|
|
```bash |
|
|
|
|
|
docker compose down |
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
## Contributing |
|
|
## Contributing |
|
|
|
|
|
|
|
|
Contributions are welcome! |
|
|
Contributions are welcome! |
|
|
|
|
|
@ -1,4 +1,3 @@ |
|
|
/dist |
|
|
/dist |
|
|
/node_modules |
|
|
/node_modules |
|
|
/coverage |
|
|
/coverage |
|
|
.env |
|
|
|
|
|
@ -1,10 +1,11 @@ |
|
|
PORT= |
|
|
|
|
|
MONGO_URI=mongodb://textbee-db:27017/textbee |
|
|
|
|
|
|
|
|
PORT=3005 |
|
|
|
|
|
MONGO_URI=mongodb://textbeeUser:textbeePassword@mongo:27017/TextBee |
|
|
JWT_SECRET=secret |
|
|
JWT_SECRET=secret |
|
|
JWT_EXPIRATION=60d |
|
|
JWT_EXPIRATION=60d |
|
|
|
|
|
|
|
|
FRONTEND_URL= |
|
|
|
|
|
|
|
|
FRONTEND_URL=http://localhost:3000 |
|
|
|
|
|
|
|
|
|
|
|
#Update from Firebase json file |
|
|
FIREBASE_PROJECT_ID= |
|
|
FIREBASE_PROJECT_ID= |
|
|
FIREBASE_PRIVATE_KEY_ID= |
|
|
FIREBASE_PRIVATE_KEY_ID= |
|
|
FIREBASE_PRIVATE_KEY= |
|
|
FIREBASE_PRIVATE_KEY= |
|
|
|
|
|
@ -1,4 +1,4 @@ |
|
|
FROM node:lts-alpine AS base |
|
|
|
|
|
|
|
|
FROM node:18-alpine AS base |
|
|
RUN npm i -g pnpm |
|
|
RUN npm i -g pnpm |
|
|
WORKDIR /app |
|
|
WORKDIR /app |
|
|
COPY package.json pnpm-lock.yaml ./ |
|
|
COPY package.json pnpm-lock.yaml ./ |
|
|
@ -13,10 +13,12 @@ FROM base AS build |
|
|
ENV NODE_ENV=production |
|
|
ENV NODE_ENV=production |
|
|
RUN pnpm build |
|
|
RUN pnpm build |
|
|
|
|
|
|
|
|
FROM node:lts-alpine AS prod |
|
|
|
|
|
|
|
|
FROM node:18-alpine AS prod |
|
|
ENV NODE_ENV=production |
|
|
ENV NODE_ENV=production |
|
|
|
|
|
EXPOSE 3005 |
|
|
WORKDIR /app |
|
|
WORKDIR /app |
|
|
RUN npm i -g pnpm |
|
|
RUN npm i -g pnpm |
|
|
|
|
|
COPY --from=build /app/.env ./.env |
|
|
COPY --from=build /app/dist ./dist |
|
|
COPY --from=build /app/dist ./dist |
|
|
COPY --from=build /app/package.json /app/pnpm-lock.yaml ./ |
|
|
COPY --from=build /app/package.json /app/pnpm-lock.yaml ./ |
|
|
RUN pnpm i --prod |
|
|
RUN pnpm i --prod |
|
|
@ -1,36 +1,56 @@ |
|
|
services: |
|
|
services: |
|
|
textbee-web: |
|
|
|
|
|
image: ghcr.io/vernu/textbee/web:latest |
|
|
|
|
|
container_name: textbee-web |
|
|
|
|
|
|
|
|
web: |
|
|
|
|
|
container_name: web |
|
|
build: |
|
|
build: |
|
|
context: ./web |
|
|
context: ./web |
|
|
dockerfile: Dockerfile |
|
|
dockerfile: Dockerfile |
|
|
ports: |
|
|
ports: |
|
|
- "3000:3000" |
|
|
- "3000:3000" |
|
|
env_file: |
|
|
|
|
|
- path: ./web/.env |
|
|
|
|
|
required: true |
|
|
|
|
|
command: pnpm start |
|
|
|
|
|
textbee-api: |
|
|
|
|
|
image: ghcr.io/vernu/textbee/api:latest |
|
|
|
|
|
container_name: textbee-api |
|
|
|
|
|
|
|
|
depends_on: |
|
|
|
|
|
- mongo |
|
|
|
|
|
environment: |
|
|
|
|
|
NODE_ENV: production |
|
|
|
|
|
|
|
|
|
|
|
api: |
|
|
|
|
|
container_name: api |
|
|
build: |
|
|
build: |
|
|
context: ./api |
|
|
context: ./api |
|
|
dockerfile: Dockerfile |
|
|
dockerfile: Dockerfile |
|
|
|
|
|
target: prod |
|
|
ports: |
|
|
ports: |
|
|
- "3005:3005" |
|
|
- "3005:3005" |
|
|
env_file: |
|
|
|
|
|
- path: ./api/.env |
|
|
|
|
|
required: true |
|
|
|
|
|
depends_on: |
|
|
depends_on: |
|
|
- textbee-db |
|
|
|
|
|
textbee-db: |
|
|
|
|
|
|
|
|
- mongo |
|
|
|
|
|
environment: |
|
|
|
|
|
NODE_ENV: production |
|
|
|
|
|
|
|
|
|
|
|
mongo: |
|
|
|
|
|
container_name: mongo |
|
|
image: mongo |
|
|
image: mongo |
|
|
container_name: textbee-db |
|
|
|
|
|
|
|
|
restart: always |
|
|
|
|
|
ports: |
|
|
|
|
|
- "27017:27017" |
|
|
|
|
|
environment: |
|
|
|
|
|
MONGO_INITDB_ROOT_USERNAME: adminUser |
|
|
|
|
|
MONGO_INITDB_ROOT_PASSWORD: adminPassword |
|
|
|
|
|
MONGO_INITDB_DATABASE: TextBee |
|
|
volumes: |
|
|
volumes: |
|
|
- textbee-db-data:/data/db |
|
|
- textbee-db-data:/data/db |
|
|
|
|
|
# THe following scripts creates TextBee DB automatically, also the user which web and api are connecting with. |
|
|
|
|
|
- ./mongo-init:/docker-entrypoint-initdb.d:ro |
|
|
|
|
|
mongo-express: |
|
|
|
|
|
container_name: mongo-ee |
|
|
|
|
|
image: mongo-express |
|
|
|
|
|
restart: always |
|
|
ports: |
|
|
ports: |
|
|
- "27017:27017" |
|
|
|
|
|
|
|
|
- "8081:8081" |
|
|
|
|
|
environment: |
|
|
|
|
|
ME_CONFIG_MONGODB_ADMINUSERNAME: adminUser |
|
|
|
|
|
ME_CONFIG_MONGODB_ADMINPASSWORD: adminPassword |
|
|
|
|
|
ME_CONFIG_MONGODB_URL: mongodb://adminUser:adminPassword@mongo:27017/ |
|
|
|
|
|
ME_CONFIG_BASICAUTH: "false" |
|
|
|
|
|
depends_on: |
|
|
|
|
|
- mongo |
|
|
|
|
|
|
|
|
volumes: |
|
|
volumes: |
|
|
textbee-db-data: |
|
|
textbee-db-data: |
|
|
@ -0,0 +1,11 @@ |
|
|
|
|
|
db = db.getSiblingDB("TextBee"); |
|
|
|
|
|
|
|
|
|
|
|
db.createUser({ |
|
|
|
|
|
user: "textbeeUser", |
|
|
|
|
|
pwd: "textbeePassword", |
|
|
|
|
|
roles: [{ role: "readWrite", db: "TextBee" }] |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
db.init.insertOne({ createdBy: "seed" }); |
|
|
|
|
|
|
|
|
|
|
|
print("✅ TextBee DB initialized and user created."); |
|
|
@ -1,11 +1,11 @@ |
|
|
NEXT_PUBLIC_API_BASE_URL=https://api.textbee.dev/api/v1 |
|
|
|
|
|
|
|
|
NEXT_PUBLIC_SITE_URL=http://localhost:3000 |
|
|
|
|
|
NEXT_PUBLIC_API_BASE_URL=http://localhost:3005/api/v1 |
|
|
NEXT_PUBLIC_GOOGLE_CLIENT_ID= |
|
|
NEXT_PUBLIC_GOOGLE_CLIENT_ID= |
|
|
NEXT_PUBLIC_TAWKTO_EMBED_URL= |
|
|
NEXT_PUBLIC_TAWKTO_EMBED_URL= |
|
|
|
|
|
|
|
|
NEXTAUTH_URL=http://localhost:3000 |
|
|
|
|
|
AUTH_SECRET= # https://generate-secret.vercel.app/32 |
|
|
AUTH_SECRET= # https://generate-secret.vercel.app/32 |
|
|
|
|
|
|
|
|
DATABASE_URL= |
|
|
|
|
|
|
|
|
DATABASE_URL=mongodb://textbeeUser:textbeePassword@mongo:27017/TextBee |
|
|
|
|
|
|
|
|
MAIL_HOST= |
|
|
MAIL_HOST= |
|
|
MAIL_PORT= |
|
|
MAIL_PORT= |
|
|
|
|
|
@ -1,8 +1,9 @@ |
|
|
FROM node:lts-alpine AS base |
|
|
|
|
|
|
|
|
FROM node:18-alpine AS base |
|
|
|
|
|
|
|
|
# Stage 1: Install web dependencies |
|
|
# Stage 1: Install web dependencies |
|
|
FROM base AS web-deps |
|
|
FROM base AS web-deps |
|
|
WORKDIR /app |
|
|
WORKDIR /app |
|
|
|
|
|
COPY .env ./.env |
|
|
COPY package.json pnpm-lock.yaml ./ |
|
|
COPY package.json pnpm-lock.yaml ./ |
|
|
RUN corepack enable pnpm && pnpm install --frozen-lockfile |
|
|
RUN corepack enable pnpm && pnpm install --frozen-lockfile |
|
|
|
|
|
|
|
|
@ -13,6 +14,7 @@ EXPOSE 3000 |
|
|
WORKDIR /app |
|
|
WORKDIR /app |
|
|
COPY . . |
|
|
COPY . . |
|
|
COPY --from=web-deps /app/node_modules ./node_modules |
|
|
COPY --from=web-deps /app/node_modules ./node_modules |
|
|
|
|
|
COPY --from=web-deps /app/.env .env |
|
|
RUN corepack enable pnpm && pnpm run vercel-build |
|
|
RUN corepack enable pnpm && pnpm run vercel-build |
|
|
|
|
|
|
|
|
CMD ["pnpm", "start"] |
|
|
CMD ["pnpm", "start"] |