├── .gitignore ├── 01-Basic ├── Docker là gì.md ├── Docker volumes.md ├── README.md └── cheatsheet.md ├── README.md ├── ci └── github │ ├── .dockerignore │ ├── .github │ └── workflows │ │ └── build.yml │ ├── Dockerfile │ └── README.md ├── dockerize ├── README.md ├── django │ ├── Dockerfile │ └── README.md ├── nestjs │ ├── .dockerignore │ ├── Dockerfile │ └── README.md ├── nextjs │ ├── .dockerignore │ ├── Dockerfile │ └── README.md ├── node │ ├── Dockerfile │ ├── Hello │ │ └── app │ │ │ ├── Dockerfile │ │ │ └── app.js │ ├── Node │ │ ├── Dockerfile │ │ ├── a.js │ │ ├── docker-compose.yml │ │ ├── index.js │ │ ├── package-lock.json │ │ └── package.json │ ├── app.js │ └── nodemon-docker │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── docker-compose.yml │ │ ├── index.js │ │ ├── package-lock.json │ │ └── package.json └── python │ ├── Dockerfile │ └── README.md ├── docs ├── [Docker] Một số hướng dẫn và ví dụ hữu ích về cách sử dụng Volume trong Docker.md └── docker.md ├── kubernetes ├── README.md ├── templates │ └── mysql │ │ ├── Makefile │ │ ├── info.txt │ │ ├── mysql-deployment.yaml │ │ └── mysql-pv.yaml └── terraform │ ├── .gitignore │ ├── .terraform.lock.hcl │ ├── config.txt │ ├── kubernetes.tf │ ├── pv.yaml │ └── pvc.yaml ├── learn-k8s ├── docker-compose.yml ├── kompose.exe ├── web-deployment.yaml └── web-service.yaml └── services ├── README.md ├── adguard ├── .gitignore ├── README.md └── docker-compose.yml ├── airflow └── docker-compose.yml ├── alist ├── README.md ├── admin.sh └── docker-compose.yml ├── cassandra └── docker-compose.yml ├── cloudflared ├── README.md ├── docker-compose.yml └── nginx.conf ├── dgraph └── docker-compose.yml ├── glitchtip ├── .gitignore └── docker-compose.yml ├── hasura ├── README.md └── docker-compose.yml ├── minio └── README.md ├── mongodb ├── README.md ├── cluster │ └── docker-compose.yml └── docker-compose.yml ├── mqtt ├── .gitignore ├── README.md ├── docker-compose.yml ├── mosquitto.conf └── password.txt ├── mssql └── docker-compose.yml ├── mysql ├── README.md ├── docker-compose.yml ├── export.sh └── seed │ └── init.sql ├── n8n ├── docker-compose.yml └── postgresql │ ├── .env.example │ ├── .gitignore │ ├── docker-compose.yml │ ├── init-data.sh │ └── n8n │ └── config ├── neo4j ├── .gitignore └── docker-compose.yml ├── nginx ├── README.md ├── docker-compose.yml ├── nginx.conf └── openssl │ ├── Makefile │ ├── README.md │ ├── certificate.crt │ ├── openssl.conf │ └── private.key ├── nocodb ├── README.md └── docker-compose.yml ├── pihole ├── .gitignore └── docker-compose.yml ├── portainer └── README.md ├── postgres ├── README.md └── docker-compose.yml ├── prometheus ├── .gitignore ├── README.md ├── docker-compose.yml └── prometheus │ └── prometheus.yml ├── rabbitmq ├── README.md └── docker-compose.yml ├── redis ├── README.md └── docker-compose.yml ├── strapi ├── .gitignore ├── README.md └── docker-compose.yml ├── traefik ├── README.md └── docker-compose.yml ├── typesence └── docker-compose.yml ├── wordpress ├── README.md ├── docker-compose.yml └── upload.ini └── x-ui ├── README.md └── docker-compose.yml /.gitignore: -------------------------------------------------------------------------------- 1 | /temp -------------------------------------------------------------------------------- /01-Basic/Docker là gì.md: -------------------------------------------------------------------------------- 1 | # Docker là gì? 2 | 3 | Docker là một nền tảng ảo hóa cấp phép mã nguồn mở được thiết kế để giúp người dùng tạo ra, triển khai và chạy các ứng dụng trong một môi trường cô lập. Với Docker, bạn có thể đóng gói một ứng dụng và các thành phần của nó vào một "container" duy nhất, giúp các container này có thể chạy trên bất kỳ máy chủ nào có cài đặt Docker mà không cần phải lo lắng về các phụ thuộc và cấu hình khác nhau. 4 | 5 | Một số lợi ích của việc sử dụng Docker bao gồm: 6 | 7 | - Giảm thiểu sự khác biệt giữa các môi trường phát triển, sản xuất và thử nghiệm 8 | - Cho phép triển khai nhanh chóng và dễ dàng 9 | - Cải thiện khả năng di chuyển ứng dụng giữa các môi trường khác nhau 10 | - Tiết kiệm tài nguyên máy tính bằng cách chạy nhiều container trên cùng một máy chủ 11 | 12 | Với sự phát triển nhanh chóng của ứng dụng web và các ứng dụng phần mềm khác, Docker đã trở thành một công cụ quan trọng cho các nhà phát triển và quản trị viên hệ thống trong việc xây dựng, triển khai và quản lý các ứng dụng. -------------------------------------------------------------------------------- /01-Basic/Docker volumes.md: -------------------------------------------------------------------------------- 1 | # Docker volumes 2 | 3 | Docker volumes là một tính năng quan trọng của Docker cho phép các ứng dụng chạy trên Docker container có thể lưu trữ và truy cập dữ liệu mà không bị mất khi container bị xóa hoặc khởi động lại. Nó cho phép dữ liệu được lưu trữ và truy cập bên ngoài container và được chia sẻ giữa nhiều container. 4 | 5 | Khi sử dụng docker compose với mount volumes nó ưu tiên mount và ghi đề folder bằng dữ liệu trong volumes 6 | 7 | - https://docs.docker.com/storage/volumes/ 8 | -------------------------------------------------------------------------------- /01-Basic/README.md: -------------------------------------------------------------------------------- 1 | # Basic 2 | 3 | ## Cài đặt docker 4 | 5 | ### Gỡ docker cũ 6 | 7 | ```bash 8 | sudo apt-get remove docker docker-engine docker.io containerd runc 9 | ``` 10 | 11 | ### Cập nhật các gói hiện có trên hệ thống 12 | 13 | ```bash 14 | sudo apt-get update && sudo apt-get install ca-certificates curl gnupg lsb-release 15 | 16 | ``` 17 | 18 | ### Thêm docker pgp key 19 | 20 | ```bash 21 | sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 22 | ``` 23 | 24 | ### Cài đặt repository 25 | 26 | ```bash 27 | echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 28 | ``` 29 | 30 | ### Cài đặt docker 31 | 32 | ```bash 33 | sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin 34 | ``` 35 | 36 | ### Chạy docker hello world 37 | 38 | ```bash 39 | sudo docker run hello-world 40 | ``` 41 | -------------------------------------------------------------------------------- /01-Basic/cheatsheet.md: -------------------------------------------------------------------------------- 1 | ### Docker Markdown Cheat Sheet 2 | 3 | #### 1. **Docker Basics** 4 | ```bash 5 | # Show Docker version 6 | docker --version 7 | 8 | # Show system-wide Docker information 9 | docker info 10 | 11 | # List Docker CLI commands 12 | docker --help 13 | ``` 14 | 15 | #### 2. **Images Management** 16 | ```bash 17 | # Pull an image from Docker Hub 18 | docker pull 19 | 20 | # List all images 21 | docker images 22 | 23 | # Remove an image 24 | docker rmi 25 | 26 | # Build an image from a Dockerfile 27 | docker build -t . 28 | 29 | # Tag an image for pushing to a registry 30 | docker tag //: 31 | 32 | # Push an image to a registry 33 | docker push //: 34 | ``` 35 | 36 | #### 3. **Containers Management** 37 | ```bash 38 | # Run a container 39 | docker run 40 | 41 | # Run a container in detached mode 42 | docker run -d 43 | 44 | # Run a container with a specific name 45 | docker run --name 46 | 47 | # Start an existing container 48 | docker start 49 | 50 | # Stop a running container 51 | docker stop 52 | 53 | # Restart a stopped container 54 | docker restart 55 | 56 | # Remove a container 57 | docker rm 58 | 59 | # Remove all stopped containers 60 | docker container prune 61 | ``` 62 | 63 | ### Docker `run` Command Cheat Sheet 64 | 65 | #### Basic Syntax 66 | ```bash 67 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 68 | ``` 69 | 70 | #### Common Options 71 | 72 | | Option | Description | 73 | |--------------------------------|-------------| 74 | | `-d`, `--detach` | Run container in the background (detached mode). | 75 | | `--name ` | Assign a name to the container. | 76 | | `-it` | Open an interactive terminal (useful for shells). | 77 | | `--rm` | Automatically remove the container when it exits. | 78 | | `-p :` | Publish container’s port(s) to the host. | 79 | | `-e ` | Set environment variables. | 80 | | `--env-file ` | Load environment variables from a file. | 81 | | `-v :` | Mount a host volume to the container. | 82 | | `--network ` | Connect container to a specific network. | 83 | | `--link ` | Link to another container. | 84 | | `--hostname ` | Set the hostname of the container. | 85 | | `--restart ` | Set restart policy (`no`, `always`, `on-failure`, `unless-stopped`). | 86 | | `--cpus ` | Limit CPU usage (e.g., `--cpus="0.5"` for half a CPU). | 87 | | `--memory ` | Limit memory usage (e.g., `--memory="512m"`). | 88 | | `--entrypoint ` | Override the default entrypoint. | 89 | 90 | #### Examples 91 | 92 | ```bash 93 | # Run a container in detached mode with a specific name 94 | docker run -d --name my_container nginx 95 | 96 | # Run a container with an interactive terminal 97 | docker run -it ubuntu /bin/bash 98 | 99 | # Run a container and automatically remove it after it stops 100 | docker run --rm alpine 101 | 102 | # Run a container with environment variables 103 | docker run -e VAR_NAME=value my_image 104 | 105 | # Run a container with ports published to the host 106 | docker run -p 8080:80 my_image 107 | 108 | # Run a container with a volume mounted 109 | docker run -v /host/data:/container/data my_image 110 | 111 | # Run a container with limited CPU and memory 112 | docker run --cpus="1.5" --memory="1g" my_image 113 | ``` 114 | 115 | #### Restart Policies 116 | 117 | | Policy | Description | 118 | |---------------------|-------------| 119 | | `no` | Do not restart the container if it stops. | 120 | | `always` | Always restart the container regardless of exit status. | 121 | | `on-failure` | Restart only if the container exits with a non-zero status. | 122 | | `unless-stopped` | Restart always except if manually stopped. | 123 | 124 | Example: 125 | ```bash 126 | docker run --restart always my_image 127 | ``` 128 | 129 | #### 4. **Container Interaction** 130 | ```bash 131 | # List all running containers 132 | docker ps 133 | 134 | # List all containers (including stopped) 135 | docker ps -a 136 | 137 | # Show container logs 138 | docker logs 139 | 140 | # Attach to a running container 141 | docker attach 142 | 143 | # Execute a command in a running container 144 | docker exec -it 145 | 146 | # Open a shell in a running container 147 | docker exec -it /bin/bash 148 | ``` 149 | 150 | #### 5. **Volumes Management** 151 | ```bash 152 | # Create a volume 153 | docker volume create 154 | 155 | # List all volumes 156 | docker volume ls 157 | 158 | # Inspect a volume 159 | docker volume inspect 160 | 161 | # Remove a volume 162 | docker volume rm 163 | 164 | # Remove all unused volumes 165 | docker volume prune 166 | ``` 167 | 168 | #### 6. **Network Management** 169 | ```bash 170 | # List all networks 171 | docker network ls 172 | 173 | # Inspect a network 174 | docker network inspect 175 | 176 | # Create a network 177 | docker network create 178 | 179 | # Connect a container to a network 180 | docker network connect 181 | 182 | # Disconnect a container from a network 183 | docker network disconnect 184 | 185 | # Remove a network 186 | docker network rm 187 | 188 | # Remove all unused networks 189 | docker network prune 190 | ``` 191 | 192 | #### 7. **Docker Compose** 193 | ```yaml 194 | # Run Docker Compose (create and start containers) 195 | docker-compose up 196 | 197 | # Run Docker Compose in detached mode 198 | docker-compose up -d 199 | 200 | # Stop services started by Docker Compose 201 | docker-compose stop 202 | 203 | # Stop and remove containers, networks, images, and volumes 204 | docker-compose down 205 | 206 | # Build images before starting containers 207 | docker-compose up --build 208 | 209 | # Display Compose logs 210 | docker-compose logs 211 | ``` 212 | 213 | #### 8. **Docker System Cleanup** 214 | ```bash 215 | # Remove all stopped containers 216 | docker container prune 217 | 218 | # Remove all unused images 219 | docker image prune 220 | 221 | # Remove all unused networks 222 | docker network prune 223 | 224 | # Remove all dangling volumes 225 | docker volume prune 226 | 227 | # Clean up everything at once 228 | docker system prune 229 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Learn docker 2 | 3 | Repository này dùng để lưu trữ các tài liệu và code mẫu về docker 4 | -------------------------------------------------------------------------------- /ci/github/.dockerignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npv2k1/learn-docker/01d1c9976fe174ad936f922696d3a2174aef73a2/ci/github/.dockerignore -------------------------------------------------------------------------------- /ci/github/.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build docker image 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | docker: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - 13 | name: Checkout 14 | uses: actions/checkout@v3 15 | - 16 | name: Set up QEMU 17 | uses: docker/setup-qemu-action@v2 18 | - 19 | name: Set up Docker Buildx 20 | uses: docker/setup-buildx-action@v2 21 | - 22 | name: Login to Docker Hub 23 | uses: docker/login-action@v2 24 | with: 25 | username: ${{ secrets.DOCKERHUB_USERNAME }} 26 | password: ${{ secrets.DOCKERHUB_TOKEN }} 27 | - 28 | name: Build and push 29 | uses: docker/build-push-action@v4 30 | with: 31 | context: . 32 | push: true 33 | tags: npv2k1/hello:latest -------------------------------------------------------------------------------- /ci/github/Dockerfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npv2k1/learn-docker/01d1c9976fe174ad936f922696d3a2174aef73a2/ci/github/Dockerfile -------------------------------------------------------------------------------- /ci/github/README.md: -------------------------------------------------------------------------------- 1 | # GitHub Action for CI Docker Image 2 | 3 | Github action cho phép build docker image rồi push nên docker registry. Để bắt đầu cần tạo github action. 4 | 5 | `.github/workflows/build.yml` 6 | 7 | ```yml 8 | name: Build docker image 9 | 10 | on: 11 | push: 12 | branches: [master] 13 | workflow_dispatch: 14 | 15 | jobs: 16 | docker: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v3 21 | - name: Set up QEMU 22 | uses: docker/setup-qemu-action@v2 23 | - name: Set up Docker Buildx 24 | uses: docker/setup-buildx-action@v2 25 | - name: Login to Docker Hub 26 | uses: docker/login-action@v2 27 | with: 28 | username: ${{ secrets.DOCKERHUB_USERNAME }} 29 | password: ${{ secrets.DOCKERHUB_TOKEN }} 30 | - name: Build and push 31 | uses: docker/build-push-action@v4 32 | with: 33 | context: . 34 | push: true 35 | tags: npv2k1/hello:latest 36 | ``` 37 | 38 | Thêm `DOCKERHUB_USERNAME` và `DOCKERHUB_TOKEN` vào github action secret 39 | 40 | Sửa `tags` bằng repo trên docker hub của bạn 41 | -------------------------------------------------------------------------------- /dockerize/README.md: -------------------------------------------------------------------------------- 1 | # Dockerize là gì 2 | 3 | **Dockerize** là quá trình đóng gói ứng dụng và các thành phần liên quan của nó vào các **container Docker**. Việc sử dụng Dockerize giúp cho việc triển khai và vận hành ứng dụng trở nên dễ dàng hơn. Bằng cách đóng gói ứng dụng vào trong các container, người dùng có thể đảm bảo rằng ứng dụng có thể chạy trên bất kỳ hệ thống nào có sẵn Docker mà không cần phải lo lắng về các yêu cầu về môi trường, cài đặt và cấu hình. Dockerize cũng giúp cho việc quản lý các ứng dụng và các phiên bản của chúng trở nên dễ dàng hơn bằng cách sử dụng các công cụ quản lý container như Docker Compose. 4 | -------------------------------------------------------------------------------- /dockerize/django/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.9-slim-buster 2 | 3 | WORKDIR /app 4 | 5 | COPY requirements.txt . 6 | 7 | RUN pip install --no-cache-dir -r requirements.txt 8 | RUN pip install django-environ 9 | RUN pip install python-dotenv 10 | RUN pip install djongo 11 | 12 | COPY . . 13 | RUN rm -rf .env 14 | 15 | EXPOSE 5004 16 | 17 | CMD ["python", "manage.py", "runserver", "0.0.0.0:5004"] -------------------------------------------------------------------------------- /dockerize/django/README.md: -------------------------------------------------------------------------------- 1 | # Django dockerize 2 | 3 | ```Dockerfile 4 | FROM python:3.9-slim-buster 5 | 6 | WORKDIR /app 7 | 8 | COPY requirements.txt . 9 | 10 | RUN pip install --no-cache-dir -r requirements.txt 11 | RUN pip install django-environ 12 | RUN pip install python-dotenv 13 | RUN pip install djongo 14 | 15 | COPY . . 16 | RUN rm -rf .env 17 | 18 | EXPOSE 5004 19 | 20 | CMD ["python", "manage.py", "runserver", "0.0.0.0:5004"] 21 | ``` 22 | -------------------------------------------------------------------------------- /dockerize/nestjs/.dockerignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | node_modules/ 3 | npm-debug.log 4 | dist/ 5 | graphql/ 6 | test/ -------------------------------------------------------------------------------- /dockerize/nestjs/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16.14.2-alpine AS builder 2 | # Settup package 3 | RUN apk add --no-cache libc6-compat 4 | RUN npm i -g pnpm@8.2.0 5 | 6 | # Create app directory 7 | WORKDIR /app 8 | 9 | # A wildcard is used to ensure both package.json AND package-lock.json are copied 10 | COPY package*.json ./ 11 | COPY prisma ./prisma/ 12 | RUN pnpm install 13 | 14 | COPY . . 15 | RUN npm run build 16 | 17 | FROM node:16.14.2-alpine 18 | RUN apk add --no-cache libc6-compat 19 | RUN npm i -g pnpm@8.2.0 20 | WORKDIR /app 21 | COPY --from=builder /app/node_modules ./node_modules 22 | COPY --from=builder /app/package*.json ./ 23 | COPY --from=builder /app/dist ./dist 24 | COPY --from=builder /app/public ./public 25 | COPY --from=builder /app/templates ./templates 26 | 27 | 28 | EXPOSE 3000 29 | CMD [ "npm", "run", "start:prod" ] -------------------------------------------------------------------------------- /dockerize/nestjs/README.md: -------------------------------------------------------------------------------- 1 | # Nestjs Dockerize 2 | 3 | Để đóng gói nestjs ta có thể sử dụng `Dockerfile` như sau: 4 | 5 | `Dockerfile` 6 | 7 | ```Dockerfile 8 | FROM node:16.14.2-alpine AS builder 9 | RUN apk add --no-cache libc6-compat 10 | RUN npm i -g pnpm@8.2.0 11 | 12 | # Create app directory 13 | WORKDIR /app 14 | 15 | # A wildcard is used to ensure both package.json AND package-lock.json are copied 16 | COPY package*.json ./ 17 | COPY prisma ./prisma/ 18 | RUN pnpm install 19 | 20 | COPY . . 21 | RUN npm run build 22 | 23 | FROM node:16.14.2-alpine 24 | RUN apk add --no-cache libc6-compat 25 | RUN npm i -g pnpm@8.2.0 26 | WORKDIR /app 27 | COPY --from=builder /app/node_modules ./node_modules 28 | COPY --from=builder /app/package*.json ./ 29 | COPY --from=builder /app/dist ./dist 30 | COPY --from=builder /app/public ./public 31 | COPY --from=builder /app/templates ./templates 32 | 33 | 34 | EXPOSE 3000 35 | CMD [ "npm", "run", "start:prod" ] 36 | ``` 37 | 38 | File `Dockerfile` trên gồm 2 stage build. State ban đầu dùng để cài package. Statge thử 2 để build và chạy. 39 | -------------------------------------------------------------------------------- /dockerize/nextjs/.dockerignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | node_modules/ 3 | npm-debug.log 4 | dist/ 5 | graphql/ 6 | test/ 7 | .next/ -------------------------------------------------------------------------------- /dockerize/nextjs/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16.14.2-alpine AS dependencies 2 | RUN apk add --no-cache libc6-compat 3 | RUN npm i -g pnpm@8.2.0 4 | 5 | # Create app directory 6 | WORKDIR /app 7 | 8 | # A wildcard is used to ensure both package.json AND package-lock.json are copied 9 | COPY package*.json ./ 10 | RUN pnpm install 11 | 12 | FROM dependencies AS builder 13 | WORKDIR /app 14 | COPY --from=dependencies /app/node_modules ./node_modules 15 | COPY . . 16 | RUN npm run build 17 | 18 | FROM node:16.14.2-alpine 19 | RUN apk add --no-cache libc6-compat 20 | RUN npm i -g pnpm@8.2.0 21 | WORKDIR /app 22 | COPY --from=builder /app/node_modules ./node_modules 23 | COPY --from=builder /app/package*.json ./ 24 | COPY --from=builder /app/.next ./.next 25 | COPY --from=builder /app/public ./public 26 | COPY --from=builder /app/next.config.js ./next.config.js 27 | COPY --from=builder /app/next-i18next.config.js ./next-i18next.config.js 28 | 29 | 30 | EXPOSE 3000 31 | CMD [ "npm", "run", "start" ] -------------------------------------------------------------------------------- /dockerize/nextjs/README.md: -------------------------------------------------------------------------------- 1 | # Nextjs Dockerize 2 | 3 | ```Dockerfile 4 | FROM node:16.14.2-alpine AS dependencies 5 | RUN apk add --no-cache libc6-compat 6 | RUN npm i -g pnpm@8.2.0 7 | 8 | # Create app directory 9 | WORKDIR /app 10 | 11 | # A wildcard is used to ensure both package.json AND package-lock.json are copied 12 | COPY package*.json ./ 13 | RUN pnpm install 14 | 15 | FROM dependencies AS builder 16 | WORKDIR /app 17 | COPY --from=dependencies /app/node_modules ./node_modules 18 | COPY . . 19 | RUN npm run build 20 | 21 | FROM node:16.14.2-alpine 22 | RUN apk add --no-cache libc6-compat 23 | RUN npm i -g pnpm@8.2.0 24 | WORKDIR /app 25 | COPY --from=builder /app/node_modules ./node_modules 26 | COPY --from=builder /app/package*.json ./ 27 | COPY --from=builder /app/.next ./.next 28 | COPY --from=builder /app/public ./public 29 | COPY --from=builder /app/next.config.js ./next.config.js 30 | COPY --from=builder /app/next-i18next.config.js ./next-i18next.config.js 31 | 32 | 33 | EXPOSE 3000 34 | CMD [ "npm", "run", "start" ] 35 | ``` 36 | 37 | Notes: 38 | 39 | - Khi build nextjs docker image luôn phải có file `next.config.js` khi chạy production 40 | -------------------------------------------------------------------------------- /dockerize/node/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | COPY . /app 3 | WORKDIR /app 4 | CMD node app.js 5 | -------------------------------------------------------------------------------- /dockerize/node/Hello/app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | COPY . /app 3 | WORKDIR /app 4 | CMD node app.js 5 | -------------------------------------------------------------------------------- /dockerize/node/Hello/app/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npv2k1/learn-docker/01d1c9976fe174ad936f922696d3a2174aef73a2/dockerize/node/Hello/app/app.js -------------------------------------------------------------------------------- /dockerize/node/Node/Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for Node Express Backend api (development) 2 | 3 | FROM node:alpine 4 | 5 | ARG NODE_ENV=development 6 | 7 | # Create App Directory 8 | RUN mkdir -p /usr/src/app 9 | WORKDIR /usr/src/app 10 | 11 | # Install Dependencies 12 | COPY package*.json ./ 13 | RUN npm install 14 | 15 | # Copy app source code 16 | # COPY . . 17 | 18 | 19 | # Exports 20 | 21 | # CMD ["npm","start"] 22 | -------------------------------------------------------------------------------- /dockerize/node/Node/a.js: -------------------------------------------------------------------------------- 1 | console.log('object :>> ', "aaaaaa"); -------------------------------------------------------------------------------- /dockerize/node/Node/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | server: 5 | build: 6 | context: ./ 7 | dockerfile: Dockerfile 8 | image: hellos-docker 9 | container_name: hellos-docker 10 | command: npm run dev 11 | volumes: 12 | - ./:/usr/src/app 13 | environment: 14 | - NODE_ENV=development -------------------------------------------------------------------------------- /dockerize/node/Node/index.js: -------------------------------------------------------------------------------- 1 | let hello = "Hello Dockercdjhfvbhvvfdfv"; 2 | console.log("Hello :>> ", hello); 3 | -------------------------------------------------------------------------------- /dockerize/node/Node/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Node", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sindresorhus/is": { 8 | "version": "0.14.0", 9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 10 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", 11 | "dev": true 12 | }, 13 | "@szmarczak/http-timer": { 14 | "version": "1.1.2", 15 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", 16 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", 17 | "dev": true, 18 | "requires": { 19 | "defer-to-connect": "^1.0.1" 20 | } 21 | }, 22 | "abbrev": { 23 | "version": "1.1.1", 24 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 25 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 26 | "dev": true 27 | }, 28 | "ansi-align": { 29 | "version": "3.0.0", 30 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", 31 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", 32 | "dev": true, 33 | "requires": { 34 | "string-width": "^3.0.0" 35 | }, 36 | "dependencies": { 37 | "string-width": { 38 | "version": "3.1.0", 39 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 40 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 41 | "dev": true, 42 | "requires": { 43 | "emoji-regex": "^7.0.1", 44 | "is-fullwidth-code-point": "^2.0.0", 45 | "strip-ansi": "^5.1.0" 46 | } 47 | } 48 | } 49 | }, 50 | "ansi-regex": { 51 | "version": "4.1.0", 52 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 53 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 54 | "dev": true 55 | }, 56 | "ansi-styles": { 57 | "version": "4.3.0", 58 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 59 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 60 | "dev": true, 61 | "requires": { 62 | "color-convert": "^2.0.1" 63 | } 64 | }, 65 | "anymatch": { 66 | "version": "3.1.2", 67 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 68 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 69 | "dev": true, 70 | "requires": { 71 | "normalize-path": "^3.0.0", 72 | "picomatch": "^2.0.4" 73 | } 74 | }, 75 | "balanced-match": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 78 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 79 | "dev": true 80 | }, 81 | "binary-extensions": { 82 | "version": "2.2.0", 83 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 84 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 85 | "dev": true 86 | }, 87 | "boxen": { 88 | "version": "4.2.0", 89 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", 90 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", 91 | "dev": true, 92 | "requires": { 93 | "ansi-align": "^3.0.0", 94 | "camelcase": "^5.3.1", 95 | "chalk": "^3.0.0", 96 | "cli-boxes": "^2.2.0", 97 | "string-width": "^4.1.0", 98 | "term-size": "^2.1.0", 99 | "type-fest": "^0.8.1", 100 | "widest-line": "^3.1.0" 101 | } 102 | }, 103 | "brace-expansion": { 104 | "version": "1.1.11", 105 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 106 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 107 | "dev": true, 108 | "requires": { 109 | "balanced-match": "^1.0.0", 110 | "concat-map": "0.0.1" 111 | } 112 | }, 113 | "braces": { 114 | "version": "3.0.2", 115 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 116 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 117 | "dev": true, 118 | "requires": { 119 | "fill-range": "^7.0.1" 120 | } 121 | }, 122 | "cacheable-request": { 123 | "version": "6.1.0", 124 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 125 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", 126 | "dev": true, 127 | "requires": { 128 | "clone-response": "^1.0.2", 129 | "get-stream": "^5.1.0", 130 | "http-cache-semantics": "^4.0.0", 131 | "keyv": "^3.0.0", 132 | "lowercase-keys": "^2.0.0", 133 | "normalize-url": "^4.1.0", 134 | "responselike": "^1.0.2" 135 | }, 136 | "dependencies": { 137 | "get-stream": { 138 | "version": "5.2.0", 139 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 140 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 141 | "dev": true, 142 | "requires": { 143 | "pump": "^3.0.0" 144 | } 145 | }, 146 | "lowercase-keys": { 147 | "version": "2.0.0", 148 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 149 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 150 | "dev": true 151 | } 152 | } 153 | }, 154 | "camelcase": { 155 | "version": "5.3.1", 156 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 157 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 158 | "dev": true 159 | }, 160 | "chalk": { 161 | "version": "3.0.0", 162 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 163 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 164 | "dev": true, 165 | "requires": { 166 | "ansi-styles": "^4.1.0", 167 | "supports-color": "^7.1.0" 168 | }, 169 | "dependencies": { 170 | "has-flag": { 171 | "version": "4.0.0", 172 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 173 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 174 | "dev": true 175 | }, 176 | "supports-color": { 177 | "version": "7.2.0", 178 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 179 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 180 | "dev": true, 181 | "requires": { 182 | "has-flag": "^4.0.0" 183 | } 184 | } 185 | } 186 | }, 187 | "chokidar": { 188 | "version": "3.5.1", 189 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 190 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 191 | "dev": true, 192 | "requires": { 193 | "anymatch": "~3.1.1", 194 | "braces": "~3.0.2", 195 | "fsevents": "~2.3.1", 196 | "glob-parent": "~5.1.0", 197 | "is-binary-path": "~2.1.0", 198 | "is-glob": "~4.0.1", 199 | "normalize-path": "~3.0.0", 200 | "readdirp": "~3.5.0" 201 | } 202 | }, 203 | "ci-info": { 204 | "version": "2.0.0", 205 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", 206 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", 207 | "dev": true 208 | }, 209 | "cli-boxes": { 210 | "version": "2.2.1", 211 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", 212 | "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", 213 | "dev": true 214 | }, 215 | "clone-response": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 218 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 219 | "dev": true, 220 | "requires": { 221 | "mimic-response": "^1.0.0" 222 | } 223 | }, 224 | "color-convert": { 225 | "version": "2.0.1", 226 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 227 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 228 | "dev": true, 229 | "requires": { 230 | "color-name": "~1.1.4" 231 | } 232 | }, 233 | "color-name": { 234 | "version": "1.1.4", 235 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 236 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 237 | "dev": true 238 | }, 239 | "concat-map": { 240 | "version": "0.0.1", 241 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 242 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 243 | "dev": true 244 | }, 245 | "configstore": { 246 | "version": "5.0.1", 247 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", 248 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", 249 | "dev": true, 250 | "requires": { 251 | "dot-prop": "^5.2.0", 252 | "graceful-fs": "^4.1.2", 253 | "make-dir": "^3.0.0", 254 | "unique-string": "^2.0.0", 255 | "write-file-atomic": "^3.0.0", 256 | "xdg-basedir": "^4.0.0" 257 | } 258 | }, 259 | "crypto-random-string": { 260 | "version": "2.0.0", 261 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 262 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", 263 | "dev": true 264 | }, 265 | "debug": { 266 | "version": "3.2.7", 267 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 268 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 269 | "dev": true, 270 | "requires": { 271 | "ms": "^2.1.1" 272 | } 273 | }, 274 | "decompress-response": { 275 | "version": "3.3.0", 276 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 277 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 278 | "dev": true, 279 | "requires": { 280 | "mimic-response": "^1.0.0" 281 | } 282 | }, 283 | "deep-extend": { 284 | "version": "0.6.0", 285 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 286 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 287 | "dev": true 288 | }, 289 | "defer-to-connect": { 290 | "version": "1.1.3", 291 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 292 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", 293 | "dev": true 294 | }, 295 | "dot-prop": { 296 | "version": "5.3.0", 297 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", 298 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", 299 | "dev": true, 300 | "requires": { 301 | "is-obj": "^2.0.0" 302 | } 303 | }, 304 | "duplexer3": { 305 | "version": "0.1.4", 306 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 307 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 308 | "dev": true 309 | }, 310 | "emoji-regex": { 311 | "version": "7.0.3", 312 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 313 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 314 | "dev": true 315 | }, 316 | "end-of-stream": { 317 | "version": "1.4.4", 318 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 319 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 320 | "dev": true, 321 | "requires": { 322 | "once": "^1.4.0" 323 | } 324 | }, 325 | "escape-goat": { 326 | "version": "2.1.1", 327 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", 328 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", 329 | "dev": true 330 | }, 331 | "fill-range": { 332 | "version": "7.0.1", 333 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 334 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 335 | "dev": true, 336 | "requires": { 337 | "to-regex-range": "^5.0.1" 338 | } 339 | }, 340 | "fsevents": { 341 | "version": "2.3.2", 342 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 343 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 344 | "dev": true, 345 | "optional": true 346 | }, 347 | "get-stream": { 348 | "version": "4.1.0", 349 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 350 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 351 | "dev": true, 352 | "requires": { 353 | "pump": "^3.0.0" 354 | } 355 | }, 356 | "glob-parent": { 357 | "version": "5.1.2", 358 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 359 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 360 | "dev": true, 361 | "requires": { 362 | "is-glob": "^4.0.1" 363 | } 364 | }, 365 | "global-dirs": { 366 | "version": "2.1.0", 367 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", 368 | "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", 369 | "dev": true, 370 | "requires": { 371 | "ini": "1.3.7" 372 | } 373 | }, 374 | "got": { 375 | "version": "9.6.0", 376 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", 377 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", 378 | "dev": true, 379 | "requires": { 380 | "@sindresorhus/is": "^0.14.0", 381 | "@szmarczak/http-timer": "^1.1.2", 382 | "cacheable-request": "^6.0.0", 383 | "decompress-response": "^3.3.0", 384 | "duplexer3": "^0.1.4", 385 | "get-stream": "^4.1.0", 386 | "lowercase-keys": "^1.0.1", 387 | "mimic-response": "^1.0.1", 388 | "p-cancelable": "^1.0.0", 389 | "to-readable-stream": "^1.0.0", 390 | "url-parse-lax": "^3.0.0" 391 | } 392 | }, 393 | "graceful-fs": { 394 | "version": "4.2.6", 395 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 396 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 397 | "dev": true 398 | }, 399 | "has-flag": { 400 | "version": "3.0.0", 401 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 402 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 403 | "dev": true 404 | }, 405 | "has-yarn": { 406 | "version": "2.1.0", 407 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", 408 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", 409 | "dev": true 410 | }, 411 | "http-cache-semantics": { 412 | "version": "4.1.0", 413 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 414 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", 415 | "dev": true 416 | }, 417 | "ignore-by-default": { 418 | "version": "1.0.1", 419 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 420 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 421 | "dev": true 422 | }, 423 | "import-lazy": { 424 | "version": "2.1.0", 425 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 426 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 427 | "dev": true 428 | }, 429 | "imurmurhash": { 430 | "version": "0.1.4", 431 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 432 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 433 | "dev": true 434 | }, 435 | "ini": { 436 | "version": "1.3.7", 437 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", 438 | "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", 439 | "dev": true 440 | }, 441 | "is-binary-path": { 442 | "version": "2.1.0", 443 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 444 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 445 | "dev": true, 446 | "requires": { 447 | "binary-extensions": "^2.0.0" 448 | } 449 | }, 450 | "is-ci": { 451 | "version": "2.0.0", 452 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", 453 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", 454 | "dev": true, 455 | "requires": { 456 | "ci-info": "^2.0.0" 457 | } 458 | }, 459 | "is-extglob": { 460 | "version": "2.1.1", 461 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 462 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 463 | "dev": true 464 | }, 465 | "is-fullwidth-code-point": { 466 | "version": "2.0.0", 467 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 468 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 469 | "dev": true 470 | }, 471 | "is-glob": { 472 | "version": "4.0.1", 473 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 474 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 475 | "dev": true, 476 | "requires": { 477 | "is-extglob": "^2.1.1" 478 | } 479 | }, 480 | "is-installed-globally": { 481 | "version": "0.3.2", 482 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", 483 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", 484 | "dev": true, 485 | "requires": { 486 | "global-dirs": "^2.0.1", 487 | "is-path-inside": "^3.0.1" 488 | } 489 | }, 490 | "is-npm": { 491 | "version": "4.0.0", 492 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", 493 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", 494 | "dev": true 495 | }, 496 | "is-number": { 497 | "version": "7.0.0", 498 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 499 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 500 | "dev": true 501 | }, 502 | "is-obj": { 503 | "version": "2.0.0", 504 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 505 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", 506 | "dev": true 507 | }, 508 | "is-path-inside": { 509 | "version": "3.0.3", 510 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 511 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 512 | "dev": true 513 | }, 514 | "is-typedarray": { 515 | "version": "1.0.0", 516 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 517 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 518 | "dev": true 519 | }, 520 | "is-yarn-global": { 521 | "version": "0.3.0", 522 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", 523 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", 524 | "dev": true 525 | }, 526 | "json-buffer": { 527 | "version": "3.0.0", 528 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 529 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", 530 | "dev": true 531 | }, 532 | "keyv": { 533 | "version": "3.1.0", 534 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 535 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 536 | "dev": true, 537 | "requires": { 538 | "json-buffer": "3.0.0" 539 | } 540 | }, 541 | "latest-version": { 542 | "version": "5.1.0", 543 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", 544 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", 545 | "dev": true, 546 | "requires": { 547 | "package-json": "^6.3.0" 548 | } 549 | }, 550 | "lowercase-keys": { 551 | "version": "1.0.1", 552 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 553 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 554 | "dev": true 555 | }, 556 | "make-dir": { 557 | "version": "3.1.0", 558 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 559 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 560 | "dev": true, 561 | "requires": { 562 | "semver": "^6.0.0" 563 | }, 564 | "dependencies": { 565 | "semver": { 566 | "version": "6.3.0", 567 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 568 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 569 | "dev": true 570 | } 571 | } 572 | }, 573 | "mimic-response": { 574 | "version": "1.0.1", 575 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 576 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 577 | "dev": true 578 | }, 579 | "minimatch": { 580 | "version": "3.0.4", 581 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 582 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 583 | "dev": true, 584 | "requires": { 585 | "brace-expansion": "^1.1.7" 586 | } 587 | }, 588 | "minimist": { 589 | "version": "1.2.5", 590 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 591 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 592 | "dev": true 593 | }, 594 | "ms": { 595 | "version": "2.1.3", 596 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 597 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 598 | "dev": true 599 | }, 600 | "nodemon": { 601 | "version": "2.0.7", 602 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", 603 | "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", 604 | "dev": true, 605 | "requires": { 606 | "chokidar": "^3.2.2", 607 | "debug": "^3.2.6", 608 | "ignore-by-default": "^1.0.1", 609 | "minimatch": "^3.0.4", 610 | "pstree.remy": "^1.1.7", 611 | "semver": "^5.7.1", 612 | "supports-color": "^5.5.0", 613 | "touch": "^3.1.0", 614 | "undefsafe": "^2.0.3", 615 | "update-notifier": "^4.1.0" 616 | } 617 | }, 618 | "nopt": { 619 | "version": "1.0.10", 620 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 621 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 622 | "dev": true, 623 | "requires": { 624 | "abbrev": "1" 625 | } 626 | }, 627 | "normalize-path": { 628 | "version": "3.0.0", 629 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 630 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 631 | "dev": true 632 | }, 633 | "normalize-url": { 634 | "version": "4.5.1", 635 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", 636 | "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", 637 | "dev": true 638 | }, 639 | "once": { 640 | "version": "1.4.0", 641 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 642 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 643 | "dev": true, 644 | "requires": { 645 | "wrappy": "1" 646 | } 647 | }, 648 | "p-cancelable": { 649 | "version": "1.1.0", 650 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 651 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", 652 | "dev": true 653 | }, 654 | "package-json": { 655 | "version": "6.5.0", 656 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", 657 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", 658 | "dev": true, 659 | "requires": { 660 | "got": "^9.6.0", 661 | "registry-auth-token": "^4.0.0", 662 | "registry-url": "^5.0.0", 663 | "semver": "^6.2.0" 664 | }, 665 | "dependencies": { 666 | "semver": { 667 | "version": "6.3.0", 668 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 669 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 670 | "dev": true 671 | } 672 | } 673 | }, 674 | "picomatch": { 675 | "version": "2.3.0", 676 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 677 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 678 | "dev": true 679 | }, 680 | "prepend-http": { 681 | "version": "2.0.0", 682 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 683 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 684 | "dev": true 685 | }, 686 | "pstree.remy": { 687 | "version": "1.1.8", 688 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 689 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 690 | "dev": true 691 | }, 692 | "pump": { 693 | "version": "3.0.0", 694 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 695 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 696 | "dev": true, 697 | "requires": { 698 | "end-of-stream": "^1.1.0", 699 | "once": "^1.3.1" 700 | } 701 | }, 702 | "pupa": { 703 | "version": "2.1.1", 704 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", 705 | "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", 706 | "dev": true, 707 | "requires": { 708 | "escape-goat": "^2.0.0" 709 | } 710 | }, 711 | "rc": { 712 | "version": "1.2.8", 713 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 714 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 715 | "dev": true, 716 | "requires": { 717 | "deep-extend": "^0.6.0", 718 | "ini": "~1.3.0", 719 | "minimist": "^1.2.0", 720 | "strip-json-comments": "~2.0.1" 721 | } 722 | }, 723 | "readdirp": { 724 | "version": "3.5.0", 725 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 726 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 727 | "dev": true, 728 | "requires": { 729 | "picomatch": "^2.2.1" 730 | } 731 | }, 732 | "registry-auth-token": { 733 | "version": "4.2.1", 734 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", 735 | "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", 736 | "dev": true, 737 | "requires": { 738 | "rc": "^1.2.8" 739 | } 740 | }, 741 | "registry-url": { 742 | "version": "5.1.0", 743 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", 744 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", 745 | "dev": true, 746 | "requires": { 747 | "rc": "^1.2.8" 748 | } 749 | }, 750 | "responselike": { 751 | "version": "1.0.2", 752 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 753 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 754 | "dev": true, 755 | "requires": { 756 | "lowercase-keys": "^1.0.0" 757 | } 758 | }, 759 | "semver": { 760 | "version": "5.7.1", 761 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 762 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 763 | "dev": true 764 | }, 765 | "semver-diff": { 766 | "version": "3.1.1", 767 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", 768 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", 769 | "dev": true, 770 | "requires": { 771 | "semver": "^6.3.0" 772 | }, 773 | "dependencies": { 774 | "semver": { 775 | "version": "6.3.0", 776 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 777 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 778 | "dev": true 779 | } 780 | } 781 | }, 782 | "signal-exit": { 783 | "version": "3.0.3", 784 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 785 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 786 | "dev": true 787 | }, 788 | "string-width": { 789 | "version": "4.2.2", 790 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 791 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 792 | "dev": true, 793 | "requires": { 794 | "emoji-regex": "^8.0.0", 795 | "is-fullwidth-code-point": "^3.0.0", 796 | "strip-ansi": "^6.0.0" 797 | }, 798 | "dependencies": { 799 | "ansi-regex": { 800 | "version": "5.0.0", 801 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 802 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 803 | "dev": true 804 | }, 805 | "emoji-regex": { 806 | "version": "8.0.0", 807 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 808 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 809 | "dev": true 810 | }, 811 | "is-fullwidth-code-point": { 812 | "version": "3.0.0", 813 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 814 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 815 | "dev": true 816 | }, 817 | "strip-ansi": { 818 | "version": "6.0.0", 819 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 820 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 821 | "dev": true, 822 | "requires": { 823 | "ansi-regex": "^5.0.0" 824 | } 825 | } 826 | } 827 | }, 828 | "strip-ansi": { 829 | "version": "5.2.0", 830 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 831 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 832 | "dev": true, 833 | "requires": { 834 | "ansi-regex": "^4.1.0" 835 | } 836 | }, 837 | "strip-json-comments": { 838 | "version": "2.0.1", 839 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 840 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 841 | "dev": true 842 | }, 843 | "supports-color": { 844 | "version": "5.5.0", 845 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 846 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 847 | "dev": true, 848 | "requires": { 849 | "has-flag": "^3.0.0" 850 | } 851 | }, 852 | "term-size": { 853 | "version": "2.2.1", 854 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", 855 | "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", 856 | "dev": true 857 | }, 858 | "to-readable-stream": { 859 | "version": "1.0.0", 860 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 861 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", 862 | "dev": true 863 | }, 864 | "to-regex-range": { 865 | "version": "5.0.1", 866 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 867 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 868 | "dev": true, 869 | "requires": { 870 | "is-number": "^7.0.0" 871 | } 872 | }, 873 | "touch": { 874 | "version": "3.1.0", 875 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 876 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 877 | "dev": true, 878 | "requires": { 879 | "nopt": "~1.0.10" 880 | } 881 | }, 882 | "type-fest": { 883 | "version": "0.8.1", 884 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 885 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 886 | "dev": true 887 | }, 888 | "typedarray-to-buffer": { 889 | "version": "3.1.5", 890 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 891 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 892 | "dev": true, 893 | "requires": { 894 | "is-typedarray": "^1.0.0" 895 | } 896 | }, 897 | "undefsafe": { 898 | "version": "2.0.3", 899 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", 900 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", 901 | "dev": true, 902 | "requires": { 903 | "debug": "^2.2.0" 904 | }, 905 | "dependencies": { 906 | "debug": { 907 | "version": "2.6.9", 908 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 909 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 910 | "dev": true, 911 | "requires": { 912 | "ms": "2.0.0" 913 | } 914 | }, 915 | "ms": { 916 | "version": "2.0.0", 917 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 918 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 919 | "dev": true 920 | } 921 | } 922 | }, 923 | "unique-string": { 924 | "version": "2.0.0", 925 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 926 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 927 | "dev": true, 928 | "requires": { 929 | "crypto-random-string": "^2.0.0" 930 | } 931 | }, 932 | "update-notifier": { 933 | "version": "4.1.3", 934 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", 935 | "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", 936 | "dev": true, 937 | "requires": { 938 | "boxen": "^4.2.0", 939 | "chalk": "^3.0.0", 940 | "configstore": "^5.0.1", 941 | "has-yarn": "^2.1.0", 942 | "import-lazy": "^2.1.0", 943 | "is-ci": "^2.0.0", 944 | "is-installed-globally": "^0.3.1", 945 | "is-npm": "^4.0.0", 946 | "is-yarn-global": "^0.3.0", 947 | "latest-version": "^5.0.0", 948 | "pupa": "^2.0.1", 949 | "semver-diff": "^3.1.1", 950 | "xdg-basedir": "^4.0.0" 951 | } 952 | }, 953 | "url-parse-lax": { 954 | "version": "3.0.0", 955 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 956 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 957 | "dev": true, 958 | "requires": { 959 | "prepend-http": "^2.0.0" 960 | } 961 | }, 962 | "widest-line": { 963 | "version": "3.1.0", 964 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", 965 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", 966 | "dev": true, 967 | "requires": { 968 | "string-width": "^4.0.0" 969 | } 970 | }, 971 | "wrappy": { 972 | "version": "1.0.2", 973 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 974 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 975 | "dev": true 976 | }, 977 | "write-file-atomic": { 978 | "version": "3.0.3", 979 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 980 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 981 | "dev": true, 982 | "requires": { 983 | "imurmurhash": "^0.1.4", 984 | "is-typedarray": "^1.0.0", 985 | "signal-exit": "^3.0.2", 986 | "typedarray-to-buffer": "^3.1.5" 987 | } 988 | }, 989 | "xdg-basedir": { 990 | "version": "4.0.0", 991 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 992 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", 993 | "dev": true 994 | } 995 | } 996 | } 997 | -------------------------------------------------------------------------------- /dockerize/node/Node/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Node", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node index.js", 9 | "dev": "nodemon index.js" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "nodemon": "^2.0.7" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dockerize/node/app.js: -------------------------------------------------------------------------------- 1 | console.log("hello docker"); -------------------------------------------------------------------------------- /dockerize/node/nodemon-docker/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /dockerize/node/nodemon-docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:14.16.1-alpine3.13 2 | 3 | # Working directory be app 4 | WORKDIR /usr/app/frontend 5 | 6 | COPY package*.json ./ 7 | 8 | # Install dependencies 9 | RUN npm install 10 | 11 | # copy local files to app folder 12 | COPY . . 13 | 14 | EXPOSE 3000 15 | 16 | CMD ["npm","start"] -------------------------------------------------------------------------------- /dockerize/node/nodemon-docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | web: 4 | build: . 5 | image: node-dk 6 | ports: 7 | - 3000:3000 8 | working_dir: /usr/app/frontend 9 | 10 | volumes: 11 | - "./:/usr/app/frontend" 12 | command: ["yarn","dev"] 13 | -------------------------------------------------------------------------------- /dockerize/node/nodemon-docker/index.js: -------------------------------------------------------------------------------- 1 | console.log("dm lldockerh"); 2 | -------------------------------------------------------------------------------- /dockerize/node/nodemon-docker/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodejs-docker", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sindresorhus/is": { 8 | "version": "0.14.0", 9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 10 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", 11 | "dev": true 12 | }, 13 | "@szmarczak/http-timer": { 14 | "version": "1.1.2", 15 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", 16 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", 17 | "dev": true, 18 | "requires": { 19 | "defer-to-connect": "^1.0.1" 20 | } 21 | }, 22 | "abbrev": { 23 | "version": "1.1.1", 24 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 25 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 26 | "dev": true 27 | }, 28 | "ansi-align": { 29 | "version": "3.0.0", 30 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", 31 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", 32 | "dev": true, 33 | "requires": { 34 | "string-width": "^3.0.0" 35 | }, 36 | "dependencies": { 37 | "string-width": { 38 | "version": "3.1.0", 39 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 40 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 41 | "dev": true, 42 | "requires": { 43 | "emoji-regex": "^7.0.1", 44 | "is-fullwidth-code-point": "^2.0.0", 45 | "strip-ansi": "^5.1.0" 46 | } 47 | } 48 | } 49 | }, 50 | "ansi-regex": { 51 | "version": "4.1.0", 52 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 53 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 54 | "dev": true 55 | }, 56 | "ansi-styles": { 57 | "version": "4.3.0", 58 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 59 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 60 | "dev": true, 61 | "requires": { 62 | "color-convert": "^2.0.1" 63 | } 64 | }, 65 | "anymatch": { 66 | "version": "3.1.2", 67 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 68 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 69 | "dev": true, 70 | "requires": { 71 | "normalize-path": "^3.0.0", 72 | "picomatch": "^2.0.4" 73 | } 74 | }, 75 | "balanced-match": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 78 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 79 | "dev": true 80 | }, 81 | "binary-extensions": { 82 | "version": "2.2.0", 83 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 84 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 85 | "dev": true 86 | }, 87 | "boxen": { 88 | "version": "4.2.0", 89 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", 90 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", 91 | "dev": true, 92 | "requires": { 93 | "ansi-align": "^3.0.0", 94 | "camelcase": "^5.3.1", 95 | "chalk": "^3.0.0", 96 | "cli-boxes": "^2.2.0", 97 | "string-width": "^4.1.0", 98 | "term-size": "^2.1.0", 99 | "type-fest": "^0.8.1", 100 | "widest-line": "^3.1.0" 101 | } 102 | }, 103 | "brace-expansion": { 104 | "version": "1.1.11", 105 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 106 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 107 | "dev": true, 108 | "requires": { 109 | "balanced-match": "^1.0.0", 110 | "concat-map": "0.0.1" 111 | } 112 | }, 113 | "braces": { 114 | "version": "3.0.2", 115 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 116 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 117 | "dev": true, 118 | "requires": { 119 | "fill-range": "^7.0.1" 120 | } 121 | }, 122 | "cacheable-request": { 123 | "version": "6.1.0", 124 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 125 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", 126 | "dev": true, 127 | "requires": { 128 | "clone-response": "^1.0.2", 129 | "get-stream": "^5.1.0", 130 | "http-cache-semantics": "^4.0.0", 131 | "keyv": "^3.0.0", 132 | "lowercase-keys": "^2.0.0", 133 | "normalize-url": "^4.1.0", 134 | "responselike": "^1.0.2" 135 | }, 136 | "dependencies": { 137 | "get-stream": { 138 | "version": "5.2.0", 139 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 140 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 141 | "dev": true, 142 | "requires": { 143 | "pump": "^3.0.0" 144 | } 145 | }, 146 | "lowercase-keys": { 147 | "version": "2.0.0", 148 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 149 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 150 | "dev": true 151 | } 152 | } 153 | }, 154 | "camelcase": { 155 | "version": "5.3.1", 156 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 157 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 158 | "dev": true 159 | }, 160 | "chalk": { 161 | "version": "3.0.0", 162 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 163 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 164 | "dev": true, 165 | "requires": { 166 | "ansi-styles": "^4.1.0", 167 | "supports-color": "^7.1.0" 168 | }, 169 | "dependencies": { 170 | "has-flag": { 171 | "version": "4.0.0", 172 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 173 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 174 | "dev": true 175 | }, 176 | "supports-color": { 177 | "version": "7.2.0", 178 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 179 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 180 | "dev": true, 181 | "requires": { 182 | "has-flag": "^4.0.0" 183 | } 184 | } 185 | } 186 | }, 187 | "chokidar": { 188 | "version": "3.5.2", 189 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", 190 | "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", 191 | "dev": true, 192 | "requires": { 193 | "anymatch": "~3.1.2", 194 | "braces": "~3.0.2", 195 | "fsevents": "~2.3.2", 196 | "glob-parent": "~5.1.2", 197 | "is-binary-path": "~2.1.0", 198 | "is-glob": "~4.0.1", 199 | "normalize-path": "~3.0.0", 200 | "readdirp": "~3.6.0" 201 | } 202 | }, 203 | "ci-info": { 204 | "version": "2.0.0", 205 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", 206 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", 207 | "dev": true 208 | }, 209 | "cli-boxes": { 210 | "version": "2.2.1", 211 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", 212 | "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", 213 | "dev": true 214 | }, 215 | "clone-response": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 218 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 219 | "dev": true, 220 | "requires": { 221 | "mimic-response": "^1.0.0" 222 | } 223 | }, 224 | "color-convert": { 225 | "version": "2.0.1", 226 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 227 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 228 | "dev": true, 229 | "requires": { 230 | "color-name": "~1.1.4" 231 | } 232 | }, 233 | "color-name": { 234 | "version": "1.1.4", 235 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 236 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 237 | "dev": true 238 | }, 239 | "concat-map": { 240 | "version": "0.0.1", 241 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 242 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 243 | "dev": true 244 | }, 245 | "configstore": { 246 | "version": "5.0.1", 247 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", 248 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", 249 | "dev": true, 250 | "requires": { 251 | "dot-prop": "^5.2.0", 252 | "graceful-fs": "^4.1.2", 253 | "make-dir": "^3.0.0", 254 | "unique-string": "^2.0.0", 255 | "write-file-atomic": "^3.0.0", 256 | "xdg-basedir": "^4.0.0" 257 | } 258 | }, 259 | "crypto-random-string": { 260 | "version": "2.0.0", 261 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 262 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", 263 | "dev": true 264 | }, 265 | "debug": { 266 | "version": "3.2.7", 267 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 268 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 269 | "dev": true, 270 | "requires": { 271 | "ms": "^2.1.1" 272 | } 273 | }, 274 | "decompress-response": { 275 | "version": "3.3.0", 276 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 277 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 278 | "dev": true, 279 | "requires": { 280 | "mimic-response": "^1.0.0" 281 | } 282 | }, 283 | "deep-extend": { 284 | "version": "0.6.0", 285 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 286 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 287 | "dev": true 288 | }, 289 | "defer-to-connect": { 290 | "version": "1.1.3", 291 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 292 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", 293 | "dev": true 294 | }, 295 | "dot-prop": { 296 | "version": "5.3.0", 297 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", 298 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", 299 | "dev": true, 300 | "requires": { 301 | "is-obj": "^2.0.0" 302 | } 303 | }, 304 | "duplexer3": { 305 | "version": "0.1.4", 306 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 307 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 308 | "dev": true 309 | }, 310 | "emoji-regex": { 311 | "version": "7.0.3", 312 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 313 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 314 | "dev": true 315 | }, 316 | "end-of-stream": { 317 | "version": "1.4.4", 318 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 319 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 320 | "dev": true, 321 | "requires": { 322 | "once": "^1.4.0" 323 | } 324 | }, 325 | "escape-goat": { 326 | "version": "2.1.1", 327 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", 328 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", 329 | "dev": true 330 | }, 331 | "fill-range": { 332 | "version": "7.0.1", 333 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 334 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 335 | "dev": true, 336 | "requires": { 337 | "to-regex-range": "^5.0.1" 338 | } 339 | }, 340 | "fsevents": { 341 | "version": "2.3.2", 342 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 343 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 344 | "dev": true, 345 | "optional": true 346 | }, 347 | "get-stream": { 348 | "version": "4.1.0", 349 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 350 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 351 | "dev": true, 352 | "requires": { 353 | "pump": "^3.0.0" 354 | } 355 | }, 356 | "glob-parent": { 357 | "version": "5.1.2", 358 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 359 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 360 | "dev": true, 361 | "requires": { 362 | "is-glob": "^4.0.1" 363 | } 364 | }, 365 | "global-dirs": { 366 | "version": "2.1.0", 367 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", 368 | "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", 369 | "dev": true, 370 | "requires": { 371 | "ini": "1.3.7" 372 | } 373 | }, 374 | "got": { 375 | "version": "9.6.0", 376 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", 377 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", 378 | "dev": true, 379 | "requires": { 380 | "@sindresorhus/is": "^0.14.0", 381 | "@szmarczak/http-timer": "^1.1.2", 382 | "cacheable-request": "^6.0.0", 383 | "decompress-response": "^3.3.0", 384 | "duplexer3": "^0.1.4", 385 | "get-stream": "^4.1.0", 386 | "lowercase-keys": "^1.0.1", 387 | "mimic-response": "^1.0.1", 388 | "p-cancelable": "^1.0.0", 389 | "to-readable-stream": "^1.0.0", 390 | "url-parse-lax": "^3.0.0" 391 | } 392 | }, 393 | "graceful-fs": { 394 | "version": "4.2.6", 395 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 396 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 397 | "dev": true 398 | }, 399 | "has-flag": { 400 | "version": "3.0.0", 401 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 402 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 403 | "dev": true 404 | }, 405 | "has-yarn": { 406 | "version": "2.1.0", 407 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", 408 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", 409 | "dev": true 410 | }, 411 | "http-cache-semantics": { 412 | "version": "4.1.0", 413 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 414 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", 415 | "dev": true 416 | }, 417 | "ignore-by-default": { 418 | "version": "1.0.1", 419 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 420 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 421 | "dev": true 422 | }, 423 | "import-lazy": { 424 | "version": "2.1.0", 425 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 426 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 427 | "dev": true 428 | }, 429 | "imurmurhash": { 430 | "version": "0.1.4", 431 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 432 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 433 | "dev": true 434 | }, 435 | "ini": { 436 | "version": "1.3.7", 437 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", 438 | "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", 439 | "dev": true 440 | }, 441 | "is-binary-path": { 442 | "version": "2.1.0", 443 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 444 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 445 | "dev": true, 446 | "requires": { 447 | "binary-extensions": "^2.0.0" 448 | } 449 | }, 450 | "is-ci": { 451 | "version": "2.0.0", 452 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", 453 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", 454 | "dev": true, 455 | "requires": { 456 | "ci-info": "^2.0.0" 457 | } 458 | }, 459 | "is-extglob": { 460 | "version": "2.1.1", 461 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 462 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 463 | "dev": true 464 | }, 465 | "is-fullwidth-code-point": { 466 | "version": "2.0.0", 467 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 468 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 469 | "dev": true 470 | }, 471 | "is-glob": { 472 | "version": "4.0.1", 473 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 474 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 475 | "dev": true, 476 | "requires": { 477 | "is-extglob": "^2.1.1" 478 | } 479 | }, 480 | "is-installed-globally": { 481 | "version": "0.3.2", 482 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", 483 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", 484 | "dev": true, 485 | "requires": { 486 | "global-dirs": "^2.0.1", 487 | "is-path-inside": "^3.0.1" 488 | } 489 | }, 490 | "is-npm": { 491 | "version": "4.0.0", 492 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", 493 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", 494 | "dev": true 495 | }, 496 | "is-number": { 497 | "version": "7.0.0", 498 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 499 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 500 | "dev": true 501 | }, 502 | "is-obj": { 503 | "version": "2.0.0", 504 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 505 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", 506 | "dev": true 507 | }, 508 | "is-path-inside": { 509 | "version": "3.0.3", 510 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 511 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 512 | "dev": true 513 | }, 514 | "is-typedarray": { 515 | "version": "1.0.0", 516 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 517 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 518 | "dev": true 519 | }, 520 | "is-yarn-global": { 521 | "version": "0.3.0", 522 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", 523 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", 524 | "dev": true 525 | }, 526 | "json-buffer": { 527 | "version": "3.0.0", 528 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 529 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", 530 | "dev": true 531 | }, 532 | "keyv": { 533 | "version": "3.1.0", 534 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 535 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 536 | "dev": true, 537 | "requires": { 538 | "json-buffer": "3.0.0" 539 | } 540 | }, 541 | "latest-version": { 542 | "version": "5.1.0", 543 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", 544 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", 545 | "dev": true, 546 | "requires": { 547 | "package-json": "^6.3.0" 548 | } 549 | }, 550 | "lowercase-keys": { 551 | "version": "1.0.1", 552 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 553 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 554 | "dev": true 555 | }, 556 | "make-dir": { 557 | "version": "3.1.0", 558 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 559 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 560 | "dev": true, 561 | "requires": { 562 | "semver": "^6.0.0" 563 | }, 564 | "dependencies": { 565 | "semver": { 566 | "version": "6.3.0", 567 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 568 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 569 | "dev": true 570 | } 571 | } 572 | }, 573 | "mimic-response": { 574 | "version": "1.0.1", 575 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 576 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 577 | "dev": true 578 | }, 579 | "minimatch": { 580 | "version": "3.0.4", 581 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 582 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 583 | "dev": true, 584 | "requires": { 585 | "brace-expansion": "^1.1.7" 586 | } 587 | }, 588 | "minimist": { 589 | "version": "1.2.5", 590 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 591 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 592 | "dev": true 593 | }, 594 | "ms": { 595 | "version": "2.1.3", 596 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 597 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 598 | "dev": true 599 | }, 600 | "nodemon": { 601 | "version": "2.0.12", 602 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.12.tgz", 603 | "integrity": "sha512-egCTmNZdObdBxUBw6ZNwvZ/xzk24CKRs5K6d+5zbmrMr7rOpPmfPeF6OxM3DDpaRx331CQRFEktn+wrFFfBSOA==", 604 | "dev": true, 605 | "requires": { 606 | "chokidar": "^3.2.2", 607 | "debug": "^3.2.6", 608 | "ignore-by-default": "^1.0.1", 609 | "minimatch": "^3.0.4", 610 | "pstree.remy": "^1.1.7", 611 | "semver": "^5.7.1", 612 | "supports-color": "^5.5.0", 613 | "touch": "^3.1.0", 614 | "undefsafe": "^2.0.3", 615 | "update-notifier": "^4.1.0" 616 | } 617 | }, 618 | "nopt": { 619 | "version": "1.0.10", 620 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 621 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 622 | "dev": true, 623 | "requires": { 624 | "abbrev": "1" 625 | } 626 | }, 627 | "normalize-path": { 628 | "version": "3.0.0", 629 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 630 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 631 | "dev": true 632 | }, 633 | "normalize-url": { 634 | "version": "4.5.1", 635 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", 636 | "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", 637 | "dev": true 638 | }, 639 | "once": { 640 | "version": "1.4.0", 641 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 642 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 643 | "dev": true, 644 | "requires": { 645 | "wrappy": "1" 646 | } 647 | }, 648 | "p-cancelable": { 649 | "version": "1.1.0", 650 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 651 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", 652 | "dev": true 653 | }, 654 | "package-json": { 655 | "version": "6.5.0", 656 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", 657 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", 658 | "dev": true, 659 | "requires": { 660 | "got": "^9.6.0", 661 | "registry-auth-token": "^4.0.0", 662 | "registry-url": "^5.0.0", 663 | "semver": "^6.2.0" 664 | }, 665 | "dependencies": { 666 | "semver": { 667 | "version": "6.3.0", 668 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 669 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 670 | "dev": true 671 | } 672 | } 673 | }, 674 | "picomatch": { 675 | "version": "2.3.0", 676 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 677 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 678 | "dev": true 679 | }, 680 | "prepend-http": { 681 | "version": "2.0.0", 682 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 683 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 684 | "dev": true 685 | }, 686 | "pstree.remy": { 687 | "version": "1.1.8", 688 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 689 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 690 | "dev": true 691 | }, 692 | "pump": { 693 | "version": "3.0.0", 694 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 695 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 696 | "dev": true, 697 | "requires": { 698 | "end-of-stream": "^1.1.0", 699 | "once": "^1.3.1" 700 | } 701 | }, 702 | "pupa": { 703 | "version": "2.1.1", 704 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", 705 | "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", 706 | "dev": true, 707 | "requires": { 708 | "escape-goat": "^2.0.0" 709 | } 710 | }, 711 | "rc": { 712 | "version": "1.2.8", 713 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 714 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 715 | "dev": true, 716 | "requires": { 717 | "deep-extend": "^0.6.0", 718 | "ini": "~1.3.0", 719 | "minimist": "^1.2.0", 720 | "strip-json-comments": "~2.0.1" 721 | } 722 | }, 723 | "readdirp": { 724 | "version": "3.6.0", 725 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 726 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 727 | "dev": true, 728 | "requires": { 729 | "picomatch": "^2.2.1" 730 | } 731 | }, 732 | "registry-auth-token": { 733 | "version": "4.2.1", 734 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", 735 | "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", 736 | "dev": true, 737 | "requires": { 738 | "rc": "^1.2.8" 739 | } 740 | }, 741 | "registry-url": { 742 | "version": "5.1.0", 743 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", 744 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", 745 | "dev": true, 746 | "requires": { 747 | "rc": "^1.2.8" 748 | } 749 | }, 750 | "responselike": { 751 | "version": "1.0.2", 752 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 753 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 754 | "dev": true, 755 | "requires": { 756 | "lowercase-keys": "^1.0.0" 757 | } 758 | }, 759 | "semver": { 760 | "version": "5.7.1", 761 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 762 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 763 | "dev": true 764 | }, 765 | "semver-diff": { 766 | "version": "3.1.1", 767 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", 768 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", 769 | "dev": true, 770 | "requires": { 771 | "semver": "^6.3.0" 772 | }, 773 | "dependencies": { 774 | "semver": { 775 | "version": "6.3.0", 776 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 777 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 778 | "dev": true 779 | } 780 | } 781 | }, 782 | "signal-exit": { 783 | "version": "3.0.3", 784 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 785 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 786 | "dev": true 787 | }, 788 | "string-width": { 789 | "version": "4.2.2", 790 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 791 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 792 | "dev": true, 793 | "requires": { 794 | "emoji-regex": "^8.0.0", 795 | "is-fullwidth-code-point": "^3.0.0", 796 | "strip-ansi": "^6.0.0" 797 | }, 798 | "dependencies": { 799 | "ansi-regex": { 800 | "version": "5.0.0", 801 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 802 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 803 | "dev": true 804 | }, 805 | "emoji-regex": { 806 | "version": "8.0.0", 807 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 808 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 809 | "dev": true 810 | }, 811 | "is-fullwidth-code-point": { 812 | "version": "3.0.0", 813 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 814 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 815 | "dev": true 816 | }, 817 | "strip-ansi": { 818 | "version": "6.0.0", 819 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 820 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 821 | "dev": true, 822 | "requires": { 823 | "ansi-regex": "^5.0.0" 824 | } 825 | } 826 | } 827 | }, 828 | "strip-ansi": { 829 | "version": "5.2.0", 830 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 831 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 832 | "dev": true, 833 | "requires": { 834 | "ansi-regex": "^4.1.0" 835 | } 836 | }, 837 | "strip-json-comments": { 838 | "version": "2.0.1", 839 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 840 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 841 | "dev": true 842 | }, 843 | "supports-color": { 844 | "version": "5.5.0", 845 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 846 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 847 | "dev": true, 848 | "requires": { 849 | "has-flag": "^3.0.0" 850 | } 851 | }, 852 | "term-size": { 853 | "version": "2.2.1", 854 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", 855 | "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", 856 | "dev": true 857 | }, 858 | "to-readable-stream": { 859 | "version": "1.0.0", 860 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 861 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", 862 | "dev": true 863 | }, 864 | "to-regex-range": { 865 | "version": "5.0.1", 866 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 867 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 868 | "dev": true, 869 | "requires": { 870 | "is-number": "^7.0.0" 871 | } 872 | }, 873 | "touch": { 874 | "version": "3.1.0", 875 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 876 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 877 | "dev": true, 878 | "requires": { 879 | "nopt": "~1.0.10" 880 | } 881 | }, 882 | "type-fest": { 883 | "version": "0.8.1", 884 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 885 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 886 | "dev": true 887 | }, 888 | "typedarray-to-buffer": { 889 | "version": "3.1.5", 890 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 891 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 892 | "dev": true, 893 | "requires": { 894 | "is-typedarray": "^1.0.0" 895 | } 896 | }, 897 | "undefsafe": { 898 | "version": "2.0.3", 899 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", 900 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", 901 | "dev": true, 902 | "requires": { 903 | "debug": "^2.2.0" 904 | }, 905 | "dependencies": { 906 | "debug": { 907 | "version": "2.6.9", 908 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 909 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 910 | "dev": true, 911 | "requires": { 912 | "ms": "2.0.0" 913 | } 914 | }, 915 | "ms": { 916 | "version": "2.0.0", 917 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 918 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 919 | "dev": true 920 | } 921 | } 922 | }, 923 | "unique-string": { 924 | "version": "2.0.0", 925 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 926 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 927 | "dev": true, 928 | "requires": { 929 | "crypto-random-string": "^2.0.0" 930 | } 931 | }, 932 | "update-notifier": { 933 | "version": "4.1.3", 934 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", 935 | "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", 936 | "dev": true, 937 | "requires": { 938 | "boxen": "^4.2.0", 939 | "chalk": "^3.0.0", 940 | "configstore": "^5.0.1", 941 | "has-yarn": "^2.1.0", 942 | "import-lazy": "^2.1.0", 943 | "is-ci": "^2.0.0", 944 | "is-installed-globally": "^0.3.1", 945 | "is-npm": "^4.0.0", 946 | "is-yarn-global": "^0.3.0", 947 | "latest-version": "^5.0.0", 948 | "pupa": "^2.0.1", 949 | "semver-diff": "^3.1.1", 950 | "xdg-basedir": "^4.0.0" 951 | } 952 | }, 953 | "url-parse-lax": { 954 | "version": "3.0.0", 955 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 956 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 957 | "dev": true, 958 | "requires": { 959 | "prepend-http": "^2.0.0" 960 | } 961 | }, 962 | "widest-line": { 963 | "version": "3.1.0", 964 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", 965 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", 966 | "dev": true, 967 | "requires": { 968 | "string-width": "^4.0.0" 969 | } 970 | }, 971 | "wrappy": { 972 | "version": "1.0.2", 973 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 974 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 975 | "dev": true 976 | }, 977 | "write-file-atomic": { 978 | "version": "3.0.3", 979 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 980 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 981 | "dev": true, 982 | "requires": { 983 | "imurmurhash": "^0.1.4", 984 | "is-typedarray": "^1.0.0", 985 | "signal-exit": "^3.0.2", 986 | "typedarray-to-buffer": "^3.1.5" 987 | } 988 | }, 989 | "xdg-basedir": { 990 | "version": "4.0.0", 991 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 992 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", 993 | "dev": true 994 | } 995 | } 996 | } 997 | -------------------------------------------------------------------------------- /dockerize/node/nodemon-docker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodejs-docker", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "nodemon -L index.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "nodemon": "^2.0.12" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dockerize/python/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.9-slim-buster 2 | 3 | WORKDIR /app 4 | 5 | COPY requirements.txt . 6 | 7 | RUN pip install --no-cache-dir -r requirements.txt 8 | 9 | COPY . . 10 | 11 | CMD ["python", "main.py"] -------------------------------------------------------------------------------- /dockerize/python/README.md: -------------------------------------------------------------------------------- 1 | # Python dockerize 2 | -------------------------------------------------------------------------------- /docs/[Docker] Một số hướng dẫn và ví dụ hữu ích về cách sử dụng Volume trong Docker.md: -------------------------------------------------------------------------------- 1 | # [Docker] Một số hướng dẫn và ví dụ hữu ích về cách sử dụng Volume trong Docker 2 | 3 | [May Fest](https://viblo.asia/may-fest) 4 | 5 | `Volume` trong Docker là một cơ chế được Docker sử dụng để cung cấp khả năng lưu trữ liên tục (persistent data storage). Chúng mang lại những lợi ích đáng kể trong quá trình phát triển và triển khai ứng dụng của bạn với Docker. Nếu bạn mong muốn có thể làm chủ nền tảng docker thì cách sử dụng và quản lý `volume` là một trong những kiến thức cơ bản mà bạn cần phải nắm rõ. Vì vậy, thông qua bài viết này, mình hi vọng có thể giới thiệu đến các bạn một số hướng dẫn và ví dụ cụ thể rất hữu ích về cách sử dụng của `volume` và các lệnh `Docker Volume` trên Docker nhé. 6 | 7 | ## 1. Tạo volumes 8 | 9 | Rất dễ dàng để bạn có thể tạo một volume với docker bằng lệnh sau: 10 | 11 | ``` 12 | docker volume create [volume_name] 13 | ``` 14 | 15 | Lệnh này sẽ tạo ra một volume lưu trữ dữ liệu có thể được sử dụng bởi một container cụ thể hoặc một được chia sẻ giữa một nhóm các container. Bây giờ bạn có thể gắn volume này vào một vị trí bên trong container. Sau khi hoàn tất, bạn có thể dễ dàng lưu trữ hoặc truy cập dữ liệu container từ máy chủ. 16 | 17 | ## 2. Hiển thị volumes 18 | 19 | Trong thực tế làm việc, có thể bạn sẽ phải quản lý một số lượng lớn các volume dữ liệu, điều quan trọng là bạn có thể xác định được đúng các volume cụ thể mà bạn đang cần. Và bạn có thể dễ dàng liệt kê tất cả các volume hiện đang được khai báo bằng lệnh: 20 | 21 | ``` 22 | docker volume ls 23 | ``` 24 | 25 | Bạn sẽ nhận được danh sách tên tất cả các docker volume cùng với docker volume drivers tương ứng của chúng đang có trên máy chủ của bạn bằng cách chạy lệnh trên. Ngoài ra, đối với Linux thì các volume của bạn sẽ được lưu trữ tại /var/lib/docker/volumes trên máy chủ của bạn. 26 | 27 | ## 3. Kiểm tra volunes 28 | 29 | Lệnh kiểm tra docker volume sẽ cung cấp chúng ta thông tin chi tiết về một volume cụ thể. Nó hiển thị các thông tin về volume driver, mount point, scope hay labels (nhãn) của volume. 30 | 31 | ``` 32 | docker volume inspect [volume_name] 33 | ``` 34 | 35 | Các thông tin mà lệnh này cung cấp rất hữu ích khi bạn cần khắc phục các sự cố liên quan đến volume trên docker. 36 | 37 | ![img](https://images.viblo.asia/3e57a4ef-022c-40c8-b702-33b630f9e970.png) 38 | 39 | ## 4. Xoá volumes. 40 | 41 | Nếu như bạn đang có các volume chưa sử dụng đến thì lời khuyên là bạn nên xoá chúng đi. Xoá đi các volume không cần thiết có thể giúp bạn giải phóng không gian lưu trữ cho máy chủ của bạn. 42 | 43 | - Khi bạn muốn xoá 1 volume cụ thể: 44 | 45 | ``` 46 | docker volume rm [volume_name] 47 | ``` 48 | 49 | - Khi bạn muốn xoá nhiều volume cùng lúc: 50 | 51 | ``` 52 | docker volume rm [volume_name_1] [volume_name_2] [volume_name_3] [...] 53 | ``` 54 | 55 | - Ngoài ra, khi bạn có một số lượng volume rất lớn cần phải xoá đi thì docker daemon còn cung cấp cho bạn một lệnh rất hữu ích nữa đó là: 56 | 57 | ``` 58 | docker volume prune 59 | ``` 60 | 61 | Một điểm rất tốt ở lệnh này đó là nó sẽ không xoá đi bất cứ volume nào của bạn đang được sử dụng bởi một container hiện có. Nó sẽ chỉ xoá đi các volume đang không được sử dụng. Do đó, lệnh này là an toàn để bạn sử dụng và rất hiệu quả trong việc giải phóng không gian lưu trữ trên các môi trường phát triển của bạn. 62 | 63 | ## 5. Tạo một container với volumes 64 | 65 | Ở trên, mình đã giới thiệu đến các bạn các lệnh cơ bản nhất đối với docker volume. Trong thực tế, hầu như các bạn sẽ luôn cần gắn volume của mình vào các docker container. Lệnh sau đây sẽ chỉ cho các bạn cách tạo một docker container và mount volume vào container này. Nếu volume liên kết không tồn tại sẵn thì Docker Engine sẽ tạo một volume mới: 66 | 67 | - Cách 1: Sử dụng tuỳ chọn `--volume`: 68 | 69 | ``` 70 | docker run --name [container_name] --volume "[volume_name]":/tmp [docker_image] 71 | ``` 72 | 73 | Một ví dụ cụ thể hơn cho cú pháp lệnh trên như sau: 74 | 75 | ``` 76 | docker run -d -it --name test-container --volume "exampleVolume":/tmp ubuntu:xenial 77 | ``` 78 | 79 | Bạn cũng có thể sử dụng tuỳ chọn `-v` là viết tắt thay cho `--volume`. Lệnh này sẽ tạo một container có tên test-container bằng cách sử dụng image ubuntu:xenial và gắn volume exampleVolume của mình vào vị trị `/tmp` của container này. Bạn cũng có thể kiểm tra thêm thông tin bằng lệnh kiểm tra container là `docker inspect test-container` và kiểm tra phần "Mounts" trong kết quả đầu ra: 80 | 81 | ![img](https://images.viblo.asia/d82ad4fb-4953-40ff-ab0a-1b1d46973410.png) 82 | 83 | - Cách 2: sử dụng tuỳ chọn `--mount`: 84 | 85 | Sử dụng tuỳ chọn `--mount` sẽ đem lại kết qủa tương tự như trên. Nhưng cú pháp khi sử dụng `--mount` rõ ràng và dài dòng hơn so với sử dụng `--volume`. Trong khi `--volume` kết hợp tất cả chỉ trong một chuỗi thì `--mount` phân tách chúng. Đối với đa số các Linux developers thì có lẽ `--mount` sẽ đem lại cái nhìn trực quan hơn so với `--volume`. 86 | 87 | Cú pháp câu lệnh: 88 | 89 | ``` 90 | docker run --mount source=[volume_name],destination=[path_in_container] [docker_image] 91 | ``` 92 | 93 | Cụ thể với một câu lệnh tương tự như khi sử dụng `--volume` 94 | 95 | ``` 96 | docker run -d -it --name test-container --mount source=exampleVolume,target=/tmp ubuntu:xenial 97 | ``` 98 | 99 | - Lưu ý: Có một lưu ý nho nhỏ nữa cho các bạn là chỉ có `--mount` là khả dụng với `swarm mode`, còn `--volume` thì không. Vì vậy, `--mount` là cách duy nhất khả dụng khi sử dụng `docker service` 100 | 101 | ## 6. Pre-Populating volumes 102 | 103 | Nếu bạn tạo một container với một volume liên kết như trên khi volume đó chưa có sẵn và được Docker Engine tạo mới, vậy thì nội dung của vị trí đích trong container sẽ được sao chép vào volume, sau đó volume mới được liên kết với container. Ví dụ: 104 | 105 | ``` 106 | docker run -d --name=nginxContainer -v nginxVol:/usr/share/nginx/html nginx:latest 107 | ``` 108 | 109 | Trước tiên, lệnh trên sẽ tạo volume nginxVol và điền dữ liệu vào volume với nội dung là dữ liệu của vị trí đích /usr/share/nginx/html của hệ thống file bên trong container. Bây giờ, dữ liêụ này sẽ có thể truy cập được bởi tất cả các container khác cũng có liên kết với volume nginxVol. Tương tự, bạn cũng có thể sử dụng cú pháp với `--mount` để thực hiện lệnh tương tự như trên: 110 | 111 | ``` 112 | docker run -d --name=nginxContainer --mount source=nginxVol,destination=/usr/share/nginx/html nginx:latest 113 | ``` 114 | 115 | ## 7. Sử dụng Read Only Volumes 116 | 117 | Theo mặc định, tất cả các container đều có quyền đọc và ghi dữ liệu đối với volume được liên kết với chúng. Tuy nhiên, trong thực tế vận hành, không phải container nào cũng cần ghi dữ liệu vào volume mà chỉ cần quyền đọc dữ liệu. Trong những trường hợp như vậy, bạn hoàn toàn có thể chỉ định quyền chỉ đọc cho container của mình. Bạn có thể xem ví dụ dưới đây: 118 | 119 | ``` 120 | docker run -d --name=nginxContainer -v nginxVol:/usr/share/nginx/html:ro nginx:latest 121 | ``` 122 | 123 | hay 124 | 125 | ``` 126 | docker run -d --name=nginxContainer --mount source=nginxVol,destination=/usr/share/nginx/html,readonly nginx:latest 127 | ``` 128 | 129 | Như vậy bạn chỉ cần thêm trường `:ro` với tuỳ chọn `-v` hoặc `readonly` với tuỳ chọn `--mount`, bạn sẽ có thể cấp quyền chỉ đọc dữ liêụ từ volume cho container nginxContainer. 130 | 131 | ## 8. Tạo volumes sử dụng volume drivers cụ thể. 132 | 133 | Volume drivers là một cơ chế linh hoạt được Docker sử dụng để cung cấp quyền truy cập vào các remote mount, data encryption (mã hoá dữ liệu) và các tính năng khác. Lệnh dưới đây là ví dụ về cách tạo một volume bằng cách sử dụng một volume driver cụ thể: 134 | 135 | ``` 136 | docker volume create --driver vieux/sshfs -o sshcmd=test@node2:/home/session -o password=testPassword sshVolume 137 | ``` 138 | 139 | Lệnh này tạo một docker volume bằng cách sử dụng volume driver `vieux/sshfs`. Volume driver này cho phép bạn gắn các thư mục từ xa (remote directories) thông qua sử dụng SSHFS. 140 | 141 | ## 9. Khởi tạo container sử dụng một volume được tạo bởi một volumdriver cụ thể. 142 | 143 | Bạn cũng có thể sử dụng lệnh sau để khởi tạo một container và sử dụng một volume driver cụ thể để tạo volume liên kết với container của bạn. Mình có một lệnh ví dụ được xây dựng dựa trên ví dụ phía trên như sau: 144 | 145 | ``` 146 | docker run -d --name sshfsContainer --volume-driver vieux/sshfs --mount src=sshVolume,target=/tmp,volume-opt=sshcmd=test@node2:/home/session,volume-opt=password=testPassword nginx:latest 147 | ``` 148 | 149 | Trường `volume-opt` cho phép bạn thông qua qua các tuỳ chọn. Nó không bắt buộc trong mội trường hợp sử dụng. Tuy nhiênkhi sử dụng nó, bạn sẽ buộc phải dùng với `--mount`. 150 | 151 | ## 10. Tạo Services sử dụng một NFS Volume 152 | 153 | **NFS** hay **Network File System** là một hệ thống chia sẻ tệp phân tán. Nó cho phép bạn sử dụng hệ thống tệp từ xa (remote filesystems) như thể chúng là một phần của hệ thống tệp cục bộ. Lệnh sau đây là ví dụ cho bạn thấy cách tạo một service sử dụng NFS volume. 154 | 155 | ``` 156 | docker service create -d --name nfs-service --mount 'type=volume,source=nfsVolume,target=/tmp,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' nginx:latest 157 | ``` 158 | 159 | Lệnh trên giả định rằng máy chủ NFS đang chạy trên 10.0.0.10 và nó hiển thị thư mục /var/docker-nfs. Ở đây lệnh này chạy với NFSv3, đối với NFSv4, bạn cần điều chỉnh một chút như sau: 160 | 161 | ``` 162 | docker service create -d --name nfs-service --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt=o=addr=10.0.0.10,rw,nfsvers=4,async"' nginx:latest 163 | ``` 164 | 165 | ## 11. Backing Up Containers 166 | 167 | Volume cung cấp một cách linh hoạt để bạn có thể backup các dữ liệu container quan trọng. Để ví dụ, trước hết mình sẽ tạo một container mới là `test-container`: 168 | 169 | ``` 170 | docker run -v /data --name test-container ubuntu:xenial /bin/bash 171 | ``` 172 | 173 | Vậy là, container `test-continer` liên kết với một volume là `/data`. Bây giờ, mình sẽ khởi động một container khác và mount volume `data` từ `test-container`. Sau đó, mình sẽ mount một thư mục cục bộ (local directory) trện hệ thống tệp là thư mục `/backup`. Ở đây, mình thực thi một lệnh tar để lưu trữ nội dung của `/data` vào `/backup` dưới dạng `backup.tar`: 174 | 175 | ``` 176 | $ docker run --rm --volumes-from test-container -v $(pwd):/backup ubuntu:xenial tar cvf /backup/backup.tar /data 177 | ``` 178 | 179 | Cờ `--volumes-from` được dùng để khởi động một container và liên kết toàn bộ các volume đang liên kết với một container khác. Cơ chế này rất hữu dụng khi sao lưu và phục hồi volume. 180 | 181 | ## 12. Restoring Containers Backups 182 | 183 | Và cuối cùng, rất dễ dàng để bạn có thể khôi phục container của bạn từ các tệp backup như trên. Bạn có thể khôi phục sữ liệu vào cùng một container hoặc vào một container cụ thể khác. Tiếp nối ví dụ trên, mình sẽ hướng dẫn các bạn cách khôi phục dữ liệu từ tệp `backup.tar`. 184 | 185 | ``` 186 | docker run -v /data --name test-container2 ubuntu /bin/bash 187 | ``` 188 | 189 | Đầu tiên, tạo một container với `/data` volume. Sau đó, chúng ta sẽ trích xuất dữ liệu từ `backup.tar` trong volume mới này. 190 | 191 | ``` 192 | docker run --rm --volumes-from test-container2 -v $(pwd):/backup ubuntu bash -c "cd /data && tar xvf /backup/backup.tar --strip 1" 193 | ``` 194 | 195 | Như vậy, bạn hoàn toàn có thể tự động hoá việc backup và khôi phục dữ liệu container bằng cách sử dụng các lệnh `docker volume` đơn giản nhưng rất hữu ích này. 196 | 197 | Cảm ơn các bạn đã theo dõi bài viết của mình! 198 | 199 | # Nguồn tham khảo 200 | 201 | - https://docs.docker.com/storage/volumes/ -------------------------------------------------------------------------------- /docs/docker.md: -------------------------------------------------------------------------------- 1 | # liệt kê các network trong docker 2 | docker network ls 3 | # liệt kê thông số của network trong docker 4 | docker network inspect bridge 5 | # Ánh xạ cổng 8888 ở host vào container 6 | docker run -it --name B2 -p 8888:80 busybox 7 | # tạo mạng mới 8 | docker network create --driver bridge network1 9 | # xóa mạng 10 | docker network rm network1 11 | # tạo container với network 1 12 | docker run -it --name B3 --network network1 busybox 13 | # ket noi B3 voi bridge 14 | docker network connect bridge B3 -------------------------------------------------------------------------------- /kubernetes/README.md: -------------------------------------------------------------------------------- 1 | # Kubenetes 2 | 3 | ## Kubenetes là gi? 4 | 5 | Kubernetes (k8s) là một hệ thống mã nguồn mở được sử dụng để quản lý các ứng dụng đóng gói trong các container. Nó được phát triển bởi Google và hiện nay được quản lý bởi Cloud Native Computing Foundation. Kubernetes cung cấp một nền tảng quản lý ứng dụng độc lập với nền tảng, giúp cho việc triển khai, mở rộng và quản lý các ứng dụng trên các môi trường đám mây trở nên đơn giản hơn. 6 | 7 | ## Các thành phần của kubenetes 8 | 9 | Kubernetes gồm các thành phần sau: 10 | 11 | - **Master Node**: Quản lý và điều hành toàn bộ hệ thống Kubernetes. Master Node sẽ định nghĩa danh sách các Pod, quản lý các nút Worker Node, và phân phát các tác vụ đến các nút Worker Node. 12 | - **Worker Node**: Là các máy chủ nơi các ứng dụng được triển khai và chạy. Mỗi Worker Node sẽ chứa một hoặc nhiều Pod, nơi các container sẽ được triển khai và chạy. 13 | - **Pod**: Là đơn vị nhỏ nhất trong Kubernetes. Một Pod bao gồm một hoặc nhiều container, chạy trên cùng một nút Worker Node. Các container trong cùng một Pod sẽ chia sẻ tài nguyên máy chủ, bao gồm cả bộ nhớ và mạng. 14 | - **Deployment**: Quản lý việc triển khai các Pod và các phiên bản khác nhau của chúng. Deployment cho phép bạn cập nhật hoặc scale ứng dụng một cách dễ dàng. 15 | - **Service**: Là thành phần cung cấp một địa chỉ IP ổn định cho các Pod. Service giúp cho các ứng dụng có thể liên lạc với nhau dễ dàng hơn. 16 | - **Volume**: Là thành phần cung cấp khả năng lưu trữ dữ liệu cho các container trong các Pod. Volume giúp cho các dữ liệu của ứng dụng được lưu trữ bền vững hơn. 17 | -------------------------------------------------------------------------------- /kubernetes/templates/mysql/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npv2k1/learn-docker/01d1c9976fe174ad936f922696d3a2174aef73a2/kubernetes/templates/mysql/Makefile -------------------------------------------------------------------------------- /kubernetes/templates/mysql/info.txt: -------------------------------------------------------------------------------- 1 | Name: mysql 2 | Namespace: default 3 | CreationTimestamp: Wed, 12 Apr 2023 21:25:49 +0700 4 | Labels: 5 | Annotations: deployment.kubernetes.io/revision: 1 6 | Selector: app=mysql 7 | Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable 8 | StrategyType: Recreate 9 | MinReadySeconds: 0 10 | Pod Template: 11 | Labels: app=mysql 12 | Containers: 13 | mysql: 14 | Image: mysql:5.6 15 | Port: 3306/TCP 16 | Host Port: 0/TCP 17 | Environment: 18 | MYSQL_ROOT_PASSWORD: password 19 | Mounts: 20 | /var/lib/mysql from mysql-persistent-storage (rw) 21 | Volumes: 22 | mysql-persistent-storage: 23 | Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) 24 | ClaimName: mysql-pv-claim 25 | ReadOnly: false 26 | Conditions: 27 | Type Status Reason 28 | ---- ------ ------ 29 | Available False MinimumReplicasUnavailable 30 | Progressing True ReplicaSetUpdated 31 | OldReplicaSets: 32 | NewReplicaSet: mysql-79c846684f (1/1 replicas created) 33 | Events: 34 | Type Reason Age From Message 35 | ---- ------ ---- ---- ------- 36 | Normal ScalingReplicaSet 25s deployment-controller Scaled up replica set mysql-79c846684f to 1 37 | -------------------------------------------------------------------------------- /kubernetes/templates/mysql/mysql-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | 3 | kind: Service 4 | 5 | metadata: 6 | 7 | name: mysql 8 | 9 | spec: 10 | 11 | ports: 12 | 13 | - port: 3306 14 | 15 | selector: 16 | 17 | app: mysql 18 | 19 | clusterIP: None 20 | 21 | --- 22 | 23 | apiVersion: apps/v1 24 | 25 | kind: Deployment 26 | 27 | metadata: 28 | 29 | name: mysql 30 | 31 | spec: 32 | 33 | selector: 34 | 35 | matchLabels: 36 | 37 | app: mysql 38 | 39 | strategy: 40 | 41 | type: Recreate 42 | 43 | template: 44 | 45 | metadata: 46 | 47 | labels: 48 | 49 | app: mysql 50 | 51 | spec: 52 | 53 | containers: 54 | 55 | - image: mysql:5.6 56 | 57 | name: mysql 58 | 59 | env: 60 | 61 | # Use secret in real usage 62 | 63 | - name: MYSQL_ROOT_PASSWORD 64 | 65 | value: password 66 | 67 | ports: 68 | 69 | - containerPort: 3306 70 | 71 | name: mysql 72 | 73 | volumeMounts: 74 | 75 | - name: mysql-persistent-storage 76 | 77 | mountPath: /var/lib/mysql 78 | 79 | volumes: 80 | 81 | - name: mysql-persistent-storage 82 | 83 | persistentVolumeClaim: 84 | 85 | claimName: mysql-pv-claim 86 | -------------------------------------------------------------------------------- /kubernetes/templates/mysql/mysql-pv.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | 3 | kind: PersistentVolume 4 | 5 | metadata: 6 | name: mysql-pv-volume 7 | 8 | labels: 9 | type: local 10 | 11 | spec: 12 | storageClassName: manual 13 | 14 | capacity: 15 | storage: 20Gi 16 | 17 | accessModes: 18 | - ReadWriteOnce 19 | 20 | hostPath: 21 | path: "/mnt/data" 22 | 23 | --- 24 | apiVersion: v1 25 | 26 | kind: PersistentVolumeClaim 27 | 28 | metadata: 29 | name: mysql-pv-claim 30 | 31 | spec: 32 | storageClassName: manual 33 | 34 | accessModes: 35 | - ReadWriteOnce 36 | 37 | resources: 38 | requests: 39 | storage: 20Gi 40 | -------------------------------------------------------------------------------- /kubernetes/terraform/.gitignore: -------------------------------------------------------------------------------- 1 | # Local .terraform directories 2 | **/.terraform/* 3 | 4 | # .tfstate files 5 | *.tfstate 6 | *.tfstate.* 7 | 8 | # Crash log files 9 | crash.log 10 | crash.*.log 11 | 12 | # Exclude all .tfvars files, which are likely to contain sensitive data, such as 13 | # password, private keys, and other secrets. These should not be part of version 14 | # control as they are data points which are potentially sensitive and subject 15 | # to change depending on the environment. 16 | *.tfvars 17 | *.tfvars.json 18 | 19 | # Ignore override files as they are usually used to override resources locally and so 20 | # are not checked in 21 | override.tf 22 | override.tf.json 23 | *_override.tf 24 | *_override.tf.json 25 | 26 | # Include override files you do wish to add to version control using negated pattern 27 | # !example_override.tf 28 | 29 | # Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan 30 | # example: *tfplan* 31 | 32 | # Ignore CLI configuration files 33 | .terraformrc 34 | terraform.rc -------------------------------------------------------------------------------- /kubernetes/terraform/.terraform.lock.hcl: -------------------------------------------------------------------------------- 1 | # This file is maintained automatically by "terraform init". 2 | # Manual edits may be lost in future updates. 3 | 4 | provider "registry.terraform.io/hashicorp/kubernetes" { 5 | version = "2.19.0" 6 | hashes = [ 7 | "h1:DxyvGpc/SKydh3ntdHA7kvqmK7dB9ZpSHo53F+cUMa0=", 8 | "zh:028d346460de2d1d19b4c863dfc36be51c7bcd97d372b54a3a946bcb19f3f613", 9 | "zh:391d0b38c455437d0a2ab1beb6ce6e1230aa4160bbae11c58b2810b258b44280", 10 | "zh:40ea742f91b67f66e71d7091cfd40cc604528c4947651924bd6d8bd8d9793708", 11 | "zh:48a99d341c8ba3cadaafa7cb99c0f11999f5e23f5cfb0f8469b4e352d9116e74", 12 | "zh:4a5ade940eff267cbf7dcd52c1a7ac3999e7cc24996a409bd8b37bdb48a97f02", 13 | "zh:5063742016a8249a4be057b9cc0ef24a684ec76d0ae5463d4b07e9b2d21e047e", 14 | "zh:5d36b3a5662f840a6788f5e2a19d02139e87318feb3c5d82c7d076be1366fec4", 15 | "zh:75edd9960cb30e54ef7de1b7df2761a274f17d4d41f54e72f86b43f41af3eb6d", 16 | "zh:b85cadef3e6f25f1a10a617472bf5e8449decd61626733a1bc723de5edc08f64", 17 | "zh:dc565b17b4ea6dde6bd1b92bc37e5e850fcbf9400540eec00ad3d9552a76ac2e", 18 | "zh:deb665cc2123f2701aa3d653987b2ca35fb035a08a76a2382efb215c209f19a5", 19 | "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /kubernetes/terraform/config.txt: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | clusters: 3 | - cluster: 4 | certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCakNDQWU2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJek1ETXlPREV4TlRZek1Gb1hEVE16TURNeU5qRXhOVFl6TUZvd0ZURVRNQkVHQTFVRQpBeE1LYldsdWFXdDFZbVZEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTlJ5ClRBTmc0UDZUbnJaczV5aVoycnowb2pzcWlCZUg2dThzbS9xUU1OM3c1OFN0cFVYeE5xMmZOb2VSYUtUcHVKWGwKS2RUWEd3VE9iSW9mOFg0UjNISENSRzQ3cGRIQTZXRTUyU2haa2ZLblJMdjJFTnpzZDBXQkNFYTNLZU9tejNjVwpwS2RmbXVOd1E4a3k2YXFqRlhqUzdxNnJQQXBacWdOUEdJUEZ5UVZ1MmkyMys1QmxxdjF1L3RXcWk0N2dhNHN0CmpYUk52VWJ5SDdQVGhHWC9hWjlKWWpwWHkzRWIrdVlxK2JDWFNiWUxuTkNkMThuZkJySmgvNkJSNkk0VG9Ma28KcURjSVlPWVVRRFJwTjUrYW92RHlzK0JOZGQ3M1VZVWtJQVVRa2JuUzN2Ky8yZ0x3K0tQdDJQY1FXZ2JsNGJMSgovNWU1V3dzdHE5eDFVVE40ejU4Q0F3RUFBYU5oTUY4d0RnWURWUjBQQVFIL0JBUURBZ0trTUIwR0ExVWRKUVFXCk1CUUdDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVcKQkJSWjIrM3FPWCtycVJNZ2NxS0lxNHJBTnNaQTREQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFOVVJqVE1LMQpUY1dhRGxvRnROWVd3Q2pVMk9EMk9uR3pITDJLZ1U2YXl1SDJFUGFaTEZsc3FyZng0VjZlNUNSdXBDN2tvU2UzCmNKWjByd3pyTVhqd1ZneUc5cVovYzlEWnhMdEFYNFhVMnZ2L2xzekFQOUV2T2QrcnRJOXE4THRhMlNpckZHcU4Kc3oyS0M0RjViWS9EbjROOTlJemFlbWlNSDdPREw1bGhOQU1RaGpWOTMrbEpoWTdrWGlRbnUwemJVc2hWQURsaAozSWxCYnUydTNoWnVPRlVXaFV5TXlaamtZZXJ4TElqMWFhY3g4SlhRRXl5NUJDYkFXcW9aaXJ1SXJpUmtvRk9qCmd5UVYrWFJsWnZOd0xua1JpVXVhVDhNTGVGTlQ2bWRkUGhVZ3kzaVZIQ24zTUZadkZBa1FKTkZuUUJOUXFSQ1QKOWVoZmNsMWxHeDNuaWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== 5 | extensions: 6 | - extension: 7 | last-update: Wed, 12 Apr 2023 22:05:10 +07 8 | provider: minikube.sigs.k8s.io 9 | version: v1.29.0 10 | name: cluster_info 11 | server: https://127.0.0.1:55464 12 | name: minikube 13 | contexts: 14 | - context: 15 | cluster: minikube 16 | extensions: 17 | - extension: 18 | last-update: Wed, 12 Apr 2023 22:05:10 +07 19 | provider: minikube.sigs.k8s.io 20 | version: v1.29.0 21 | name: context_info 22 | namespace: default 23 | user: minikube 24 | name: minikube 25 | current-context: minikube 26 | kind: Config 27 | preferences: {} 28 | users: 29 | - name: minikube 30 | user: 31 | client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJek1ETXlPREV4TlRZek1Gb1hEVEkyTURNeU9ERXhOVFl6TUZvd01URVhNQlVHQTFVRQpDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGakFVQmdOVkJBTVREVzFwYm1scmRXSmxMWFZ6WlhJd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEbitsclZDVy9CeE9TYXBSVHFaekxWMVgrRHdnNHIKSHpaVnNkT3cyYzZ2ZjUxZVdYUWxGQWJGQWxEcjFyM2NJUmMvVmY0SU5TOUNlTnFmRU9NYzVNMHBSMC9rdHViWgpGQnJ0ZmMybnYvWTVsNklyZjNiY0w0K29oMDZKWXNNdmlIQThWRksrbkRoZUhNYXIwVFNwaUx5V05temRyNWNSCnNoaXlTQUU3bnRVbXhibGpVTmJhajdBZzhLTUZCR05ua200ek9aZXV0L05Rd3NRajVxdkhwL1NNcEZxNFo4a0wKcW5HZmx1NjQ5YnhjWkFVREp2ajBRZDZBcHEzMlVVdUhUZ09naGNDVHZYOXFCZUIrbW1IUmp2VXNvTjdDQkZ4QgpLZlB2OEVjZUVWZ0dOcFFXVjNTa1dTWncxamIwU2NrVWliWloyd0MyNnlKY1kvZURTTmpUeGFVUkFnTUJBQUdqCllEQmVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JSWjIrM3FPWCtycVJNZ2NxS0lxNHJBTnNaQQo0REFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBMGZ2c05mZFVMWlNRU1dBTCsvT0swTmRXVk5heVdSZUxUQXJ5CkpncXZXQ2g1aUFNbWlSV21scEFaa3FRSUgrd1ExNXV6eGhUcGxRWWYySTh1WlpmYSsxT3hRcFpqZldvKzAyRmIKRVRIWGVsL1YrdjUra2Qvc3FpdWgzcVU1TzMrV2RYNHlSbjZJVUtUeEgyVitNZTdvZjhBckF1VmNBT2FKZXAyVgpSYi96YzB6emJ6Q3JzSmc0SlVCLzY4VktEMWlXSUE0YVdiNWdXdFVPQVp4b2NwOGJXZ1ZrQzJiNHBsSG5mOXhZCnBZYXpRQlN5VG9tWDZHNi9ocTBMbGtBTGRvdEpvNXdtZ2lNL3UvR2xwMWhDMnh0R1QwemVYSVF3N01ydFRWUDcKNE5SME9DL25PQVU5S0pwdWNCT0JvYWhTd1FMd1JqZXpyNE5Ib0ZXVUZuV0NRdlpseGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== 32 | client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBNS9wYTFRbHZ3Y1RrbXFVVTZtY3kxZFYvZzhJT0t4ODJWYkhUc05uT3IzK2RYbGwwCkpSUUd4UUpRNjlhOTNDRVhQMVgrQ0RVdlFuamFueERqSE9UTktVZFA1TGJtMlJRYTdYM05wNy8yT1plaUszOTIKM0MrUHFJZE9pV0xETDRod1BGUlN2cHc0WGh6R3E5RTBxWWk4bGpaczNhK1hFYklZc2tnQk81N1ZKc1c1WTFEVwoybyt3SVBDakJRUmpaNUp1TXptWHJyZnpVTUxFSSthcng2ZjBqS1JhdUdmSkM2cHhuNWJ1dVBXOFhHUUZBeWI0CjlFSGVnS2F0OWxGTGgwNERvSVhBazcxL2FnWGdmcHBoMFk3MUxLRGV3Z1JjUVNuejcvQkhIaEZZQmphVUZsZDAKcEZrbWNOWTI5RW5KRkltMldkc0F0dXNpWEdQM2cwalkwOFdsRVFJREFRQUJBb0lCQVFEZmRGaDBwKzlnRHFKSwptTVFwK3hpTHhHbGRhTnN2REpUUlBVZDJMb2lhb3VuYXpYNUVqU0xzT1F2cjhXSFhub1IvUFAxRHVMOTZYMkh3CklWczBKTzIvV25NS0ZHa1FKLzY4VUJkL0JEbFJSdEF1NkV4OVVzOGwvcGhYWEt3NXFFcTh3bGttUk9ORFBLTGYKTk5sdWlVbG54S3RmYTltd2NRYTdEUU1yQkJlOGpKbjBneWgxZkVjaHRBcEV2YlBwajZ2cnhidzFRQnhaTTFXagpxdzJ3TVdmNGN5OGtkSTlEVWszWVlmczFPbndDU2FzU3EzUytNSGI4aktRR1lQQ0ExQVNHdkIyNDhoUzJ5UDdRCkp5Y2ozclN3YXZXM24xS1lEKytsaUhRbXVWNHpaR000dVU4QWJuSTdQaFZ1NzVRY2JoRHBlN284WWlmMTEzRXAKZXZXL1cxV0ZBb0dCQU9yQzdKVVZLdTI3SmlnaVNjZ1RRUlFXMHdxN2VldDVVZ0wrakRJUkI2UGdubDY5UWJDagp0TlhYN01GT3lIMFBtaXFuRjFna3liWksrK0dWOEQ4OVlXckJCZjJJcEtOS1ZGOGZaMTRZejcycGpjVkw3NHVLCnJJdytaUWlmaFpqZlMvYnE3Ym9sNlQwc1VwSzEyaUFQTTNJZVpiNFlxeWxBbUZ4ZnEzcDhidEdmQW9HQkFQejIKOXlQWVlJTFdNQnBvMktjdWZoK1ZyQ0kycnMra3ZGUGU2RzRQMCt6Q3hLOXNzd2pZeU56bVFQV0dlYUF6R2FVOApPczlvK0RZS3RVRWM5U29MODJGTEszb2NTOFFaOWVUSXdwRW9qN0FSZGpsVUlJYWFTOGwxU3FGSlBneXhOMTQ1CmVGNXNBU2M0VXJOcEEvNnFtT3loUFoyMnBmdm9HelNPS2cvM0d1dFBBb0dBUmVCZE1RYks3MVg4Um9mbU5ESmUKOVk3UnBHa25JZ3JMZVc2dzVob2hqd3JGdU9kV1RUQjlIQVdZUi9XZVFYTktiUld0SWlSWkVmU0J3cVN4alBGRgpOTlJkWnhpc0FKcVlRSFFGZllHZkhCSUN5ODROY0JpSHdYcTA4ZnNoZGQ1Skt5YkVPZHNjOElObjFKbGlZcGFECnRwMExwYWlNRWN4VFRYT0FoQVhUcW5zQ2dZQUdWMzZzcEdFUEJxV2dFOTdTbWlUSlQreEgwMDBnb1lXaktLUjEKRmVwL05nYk9TeEJWK1hGWHNHSVNoYk9JNDU4UitHZVZDWkduY1M5SUdaeS8yQnJhNXBLSmRpb2tHVzZEdE5ERAo2TnRwVTVhK0t6REJqeDYxUno1K3VxSldtUjdGT3ZXY2tHS2JCQnQycWZ4U3B4NDhXSEorQUxVNmtvQVVHamhOCnZDa3Rtd0tCZ0NpTnB4ekhqUGlKSVdYRzhoZkdrNFlXWVdVQjUxQ1FzeDdmcldKR1NaaHRueUhFajladlg5S3UKVEN4OWZqVlJja2Nhbktlano2Qk10SnI3QUMxb3VyeVBvYkpOMTZPY0tnMVJQWmJIREcwclNOWEV3aFpUMnRwMApmNGZmaCtiQ1RtSDBNTDBnVUo5K1R0QldYL3Axa05xSDFBcHFNZnRMR3QyaVFWdTk1YUtLCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== 33 | -------------------------------------------------------------------------------- /kubernetes/terraform/kubernetes.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | kubernetes = { 4 | source = "hashicorp/kubernetes" 5 | } 6 | } 7 | } 8 | 9 | variable "host" { 10 | type = string 11 | } 12 | 13 | variable "client_certificate" { 14 | type = string 15 | } 16 | 17 | variable "client_key" { 18 | type = string 19 | } 20 | 21 | variable "cluster_ca_certificate" { 22 | type = string 23 | } 24 | 25 | provider "kubernetes" { 26 | host = var.host 27 | 28 | client_certificate = base64decode(var.client_certificate) 29 | client_key = base64decode(var.client_key) 30 | cluster_ca_certificate = base64decode(var.cluster_ca_certificate) 31 | } 32 | 33 | // create storage volume 34 | resource "kubernetes_persistent_volume" "nginx_storage" { 35 | metadata { 36 | name = "nginx-storage" 37 | 38 | } 39 | 40 | spec { 41 | capacity = { 42 | storage = "10Gi" 43 | } 44 | 45 | access_modes = ["ReadWriteOnce"] 46 | # storage_class_name = "standard" 47 | persistent_volume_source { 48 | host_path { 49 | path = "/tmp/nginx-storage" 50 | } 51 | } 52 | } 53 | } 54 | 55 | resource "kubernetes_persistent_volume_claim" "nginx_volume_claim" { 56 | metadata { 57 | name = "exampleclaimname" 58 | } 59 | spec { 60 | access_modes = ["ReadWriteMany"] 61 | # storage_class_name = "standard" 62 | resources { 63 | requests = { 64 | storage = "5Gi" 65 | } 66 | } 67 | volume_name = "${kubernetes_persistent_volume.nginx_storage.metadata.0.name}" 68 | } 69 | } 70 | 71 | resource "kubernetes_deployment" "nginx" { 72 | metadata { 73 | name = "scalable-nginx-example" 74 | labels = { 75 | App = "ScalableNginxExample" 76 | } 77 | } 78 | 79 | spec { 80 | replicas = 1 81 | selector { 82 | match_labels = { 83 | App = "ScalableNginxExample" 84 | } 85 | } 86 | template { 87 | metadata { 88 | labels = { 89 | App = "ScalableNginxExample" 90 | } 91 | } 92 | spec { 93 | container { 94 | image = "nginx" 95 | name = "example" 96 | 97 | port { 98 | container_port = 80 99 | } 100 | 101 | resources { 102 | limits = { 103 | cpu = "0.5" 104 | memory = "512Mi" 105 | } 106 | requests = { 107 | cpu = "250m" 108 | memory = "50Mi" 109 | } 110 | } 111 | 112 | # volume_mount { 113 | # name = "exampleclaimname" 114 | # mount_path = "/usr/share/nginx/html" 115 | # } 116 | } 117 | } 118 | } 119 | } 120 | } 121 | 122 | 123 | 124 | 125 | // create a service to expose the deployment 126 | 127 | resource "kubernetes_service" "nginx" { 128 | metadata { 129 | name = "scalable-nginx-example" 130 | labels = { 131 | App = "ScalableNginxExample" 132 | } 133 | } 134 | 135 | spec { 136 | selector = { 137 | App = "ScalableNginxExample" 138 | } 139 | port { 140 | port = 80 141 | target_port = 80 142 | } 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /kubernetes/terraform/pv.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolume 3 | metadata: 4 | name: example-pv-volume 5 | labels: 6 | type: local 7 | spec: 8 | storageClassName: hostpath 9 | capacity: 10 | storage: 10Gi 11 | accessModes: 12 | - ReadWriteOnce 13 | hostPath: 14 | path: "/data" 15 | -------------------------------------------------------------------------------- /kubernetes/terraform/pvc.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: example-pv-claim 5 | spec: 6 | storageClassName: hostpath 7 | accessModes: 8 | - ReadWriteOnce 9 | resources: 10 | requests: 11 | storage: 4Gi 12 | -------------------------------------------------------------------------------- /learn-k8s/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | web: 4 | image: nginx:latest 5 | ports: 6 | - "8123:80" 7 | -------------------------------------------------------------------------------- /learn-k8s/kompose.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npv2k1/learn-docker/01d1c9976fe174ad936f922696d3a2174aef73a2/learn-k8s/kompose.exe -------------------------------------------------------------------------------- /learn-k8s/web-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | annotations: 5 | kompose.cmd: kompose convert 6 | kompose.version: 1.26.0 (40646f47) 7 | creationTimestamp: null 8 | labels: 9 | io.kompose.service: web 10 | name: web 11 | spec: 12 | replicas: 1 13 | selector: 14 | matchLabels: 15 | io.kompose.service: web 16 | strategy: {} 17 | template: 18 | metadata: 19 | annotations: 20 | kompose.cmd: kompose convert 21 | kompose.version: 1.26.0 (40646f47) 22 | creationTimestamp: null 23 | labels: 24 | io.kompose.service: web 25 | spec: 26 | containers: 27 | - image: nginx:latest 28 | name: web 29 | ports: 30 | - containerPort: 80 31 | resources: {} 32 | restartPolicy: Always 33 | status: {} 34 | -------------------------------------------------------------------------------- /learn-k8s/web-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | annotations: 5 | kompose.cmd: kompose convert 6 | kompose.version: 1.26.0 (40646f47) 7 | creationTimestamp: null 8 | labels: 9 | io.kompose.service: web 10 | name: web 11 | spec: 12 | ports: 13 | - name: "8123" 14 | port: 8123 15 | targetPort: 80 16 | selector: 17 | io.kompose.service: web 18 | status: 19 | loadBalancer: {} 20 | -------------------------------------------------------------------------------- /services/README.md: -------------------------------------------------------------------------------- 1 | # Docker template 2 | 3 | Tempate cấu hình chạy các app và service với docker hoặc docker-compose 4 | 5 | ## docker 6 | 7 | Để chạy ta dùng lệnh 8 | 9 | ```bash 10 | docker run -d --name -p : 11 | 12 | ``` 13 | 14 | `-d` Là tham số để docker chạy dưới nền 15 | 16 | `--name` Là tham số để đặt tên cho container 17 | 18 | `-p` Là tham số để map port từ host sang container 19 | 20 | `:` Là tham số để map port từ host sang container 21 | 22 | `` Là tham số để chạy image 23 | 24 | ```` 25 | 26 | 27 | 28 | ## docker-compose 29 | 30 | Để chạy ta dùng lệnh 31 | 32 | ```bash 33 | docker-compose up -d 34 | 35 | ```` 36 | 37 | `-d` Là tham số để docker chạy dưới nên 38 | 39 | Để xem log ta dùng lệnh 40 | 41 | ```bash 42 | docker-compose logs -f 43 | 44 | ``` 45 | 46 | `-f` Là tham số để xem log theo dõi 47 | 48 | Để dừng ta dùng lệnh 49 | 50 | ```bash 51 | docker-compose stop 52 | 53 | ``` 54 | 55 | Để xóa và hủy toàn bộ container ta dùng lệnh 56 | 57 | ```bash 58 | docker-compose down 59 | 60 | ``` 61 | -------------------------------------------------------------------------------- /services/adguard/.gitignore: -------------------------------------------------------------------------------- 1 | /workdir 2 | /confdir -------------------------------------------------------------------------------- /services/adguard/README.md: -------------------------------------------------------------------------------- 1 | admin 2 | pvn10092001 -------------------------------------------------------------------------------- /services/adguard/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | ad: 4 | image: adguard/adguardhome 5 | volumes: 6 | - ./workdir:/opt/adguardhome/work 7 | - ./confdir:/opt/adguardhome/conf 8 | ports: 9 | - "5555:53/tcp" 10 | - "5555:53/udp" 11 | - "6767:67/udp" 12 | - "6868:68/udp" 13 | - "8080:80/udp" 14 | - "4433:443/udp" 15 | - "3000:3000/tcp" 16 | - "8533:853/tcp" 17 | - "7844:784/udp" 18 | - "8533:853/udp" 19 | - "8853:8853/udp" 20 | - "5443:5443/tcp" 21 | - "5443:5443/udp" 22 | networks: 23 | ad: 24 | -------------------------------------------------------------------------------- /services/airflow/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, 12 | # software distributed under the License is distributed on an 13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 | # KIND, either express or implied. See the License for the 15 | # specific language governing permissions and limitations 16 | # under the License. 17 | # 18 | 19 | # Basic Airflow cluster configuration for CeleryExecutor with Redis and PostgreSQL. 20 | # 21 | # WARNING: This configuration is for local development. Do not use it in a production deployment. 22 | # 23 | # This configuration supports basic configuration using environment variables or an .env file 24 | # The following variables are supported: 25 | # 26 | # AIRFLOW_IMAGE_NAME - Docker image name used to run Airflow. 27 | # Default: apache/airflow:2.6.1 28 | # AIRFLOW_UID - User ID in Airflow containers 29 | # Default: 50000 30 | # AIRFLOW_PROJ_DIR - Base path to which all the files will be volumed. 31 | # Default: . 32 | # Those configurations are useful mostly in case of standalone testing/running Airflow in test/try-out mode 33 | # 34 | # _AIRFLOW_WWW_USER_USERNAME - Username for the administrator account (if requested). 35 | # Default: airflow 36 | # _AIRFLOW_WWW_USER_PASSWORD - Password for the administrator account (if requested). 37 | # Default: airflow 38 | # _PIP_ADDITIONAL_REQUIREMENTS - Additional PIP requirements to add when starting all containers. 39 | # Use this option ONLY for quick checks. Installing requirements at container 40 | # startup is done EVERY TIME the service is started. 41 | # A better way is to build a custom image or extend the official image 42 | # as described in https://airflow.apache.org/docs/docker-stack/build.html. 43 | # Default: '' 44 | # 45 | # Feel free to modify this file to suit your needs. 46 | --- 47 | version: '3.8' 48 | x-airflow-common: 49 | &airflow-common 50 | # In order to add custom dependencies or upgrade provider packages you can use your extended image. 51 | # Comment the image line, place your Dockerfile in the directory where you placed the docker-compose.yaml 52 | # and uncomment the "build" line below, Then run `docker-compose build` to build the images. 53 | image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.6.1} 54 | # build: . 55 | environment: 56 | &airflow-common-env 57 | AIRFLOW__CORE__EXECUTOR: CeleryExecutor 58 | AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow 59 | # For backward compatibility, with Airflow <2.3 60 | AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow 61 | AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow 62 | AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0 63 | AIRFLOW__CORE__FERNET_KEY: '' 64 | AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true' 65 | AIRFLOW__CORE__LOAD_EXAMPLES: 'true' 66 | AIRFLOW__API__AUTH_BACKENDS: 'airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session' 67 | # yamllint disable rule:line-length 68 | # Use simple http server on scheduler for health checks 69 | # See https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/logging-monitoring/check-health.html#scheduler-health-check-server 70 | # yamllint enable rule:line-length 71 | AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: 'true' 72 | # WARNING: Use _PIP_ADDITIONAL_REQUIREMENTS option ONLY for a quick checks 73 | # for other purpose (development, test and especially production usage) build/extend Airflow image. 74 | _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-} 75 | volumes: 76 | - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags 77 | - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs 78 | - ${AIRFLOW_PROJ_DIR:-.}/config:/opt/airflow/config 79 | - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins 80 | user: "${AIRFLOW_UID:-50000}:0" 81 | depends_on: 82 | &airflow-common-depends-on 83 | redis: 84 | condition: service_healthy 85 | postgres: 86 | condition: service_healthy 87 | 88 | services: 89 | postgres: 90 | image: postgres:13 91 | environment: 92 | POSTGRES_USER: airflow 93 | POSTGRES_PASSWORD: airflow 94 | POSTGRES_DB: airflow 95 | volumes: 96 | - postgres-db-volume:/var/lib/postgresql/data 97 | healthcheck: 98 | test: ["CMD", "pg_isready", "-U", "airflow"] 99 | interval: 10s 100 | retries: 5 101 | start_period: 5s 102 | restart: always 103 | 104 | redis: 105 | image: redis:latest 106 | expose: 107 | - 6379 108 | healthcheck: 109 | test: ["CMD", "redis-cli", "ping"] 110 | interval: 10s 111 | timeout: 30s 112 | retries: 50 113 | start_period: 30s 114 | restart: always 115 | 116 | airflow-webserver: 117 | <<: *airflow-common 118 | command: webserver 119 | ports: 120 | - "8080:8080" 121 | healthcheck: 122 | test: ["CMD", "curl", "--fail", "http://localhost:8080/health"] 123 | interval: 30s 124 | timeout: 10s 125 | retries: 5 126 | start_period: 30s 127 | restart: always 128 | depends_on: 129 | <<: *airflow-common-depends-on 130 | airflow-init: 131 | condition: service_completed_successfully 132 | 133 | airflow-scheduler: 134 | <<: *airflow-common 135 | command: scheduler 136 | healthcheck: 137 | test: ["CMD", "curl", "--fail", "http://localhost:8974/health"] 138 | interval: 30s 139 | timeout: 10s 140 | retries: 5 141 | start_period: 30s 142 | restart: always 143 | depends_on: 144 | <<: *airflow-common-depends-on 145 | airflow-init: 146 | condition: service_completed_successfully 147 | 148 | airflow-worker: 149 | <<: *airflow-common 150 | command: celery worker 151 | healthcheck: 152 | test: 153 | - "CMD-SHELL" 154 | - 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"' 155 | interval: 30s 156 | timeout: 10s 157 | retries: 5 158 | start_period: 30s 159 | environment: 160 | <<: *airflow-common-env 161 | # Required to handle warm shutdown of the celery workers properly 162 | # See https://airflow.apache.org/docs/docker-stack/entrypoint.html#signal-propagation 163 | DUMB_INIT_SETSID: "0" 164 | restart: always 165 | depends_on: 166 | <<: *airflow-common-depends-on 167 | airflow-init: 168 | condition: service_completed_successfully 169 | 170 | airflow-triggerer: 171 | <<: *airflow-common 172 | command: triggerer 173 | healthcheck: 174 | test: ["CMD-SHELL", 'airflow jobs check --job-type TriggererJob --hostname "$${HOSTNAME}"'] 175 | interval: 30s 176 | timeout: 10s 177 | retries: 5 178 | start_period: 30s 179 | restart: always 180 | depends_on: 181 | <<: *airflow-common-depends-on 182 | airflow-init: 183 | condition: service_completed_successfully 184 | 185 | airflow-init: 186 | <<: *airflow-common 187 | entrypoint: /bin/bash 188 | # yamllint disable rule:line-length 189 | command: 190 | - -c 191 | - | 192 | function ver() { 193 | printf "%04d%04d%04d%04d" $${1//./ } 194 | } 195 | airflow_version=$$(AIRFLOW__LOGGING__LOGGING_LEVEL=INFO && gosu airflow airflow version) 196 | airflow_version_comparable=$$(ver $${airflow_version}) 197 | min_airflow_version=2.2.0 198 | min_airflow_version_comparable=$$(ver $${min_airflow_version}) 199 | if (( airflow_version_comparable < min_airflow_version_comparable )); then 200 | echo 201 | echo -e "\033[1;31mERROR!!!: Too old Airflow version $${airflow_version}!\e[0m" 202 | echo "The minimum Airflow version supported: $${min_airflow_version}. Only use this or higher!" 203 | echo 204 | exit 1 205 | fi 206 | if [[ -z "${AIRFLOW_UID}" ]]; then 207 | echo 208 | echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m" 209 | echo "If you are on Linux, you SHOULD follow the instructions below to set " 210 | echo "AIRFLOW_UID environment variable, otherwise files will be owned by root." 211 | echo "For other operating systems you can get rid of the warning with manually created .env file:" 212 | echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user" 213 | echo 214 | fi 215 | one_meg=1048576 216 | mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg)) 217 | cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat) 218 | disk_available=$$(df / | tail -1 | awk '{print $$4}') 219 | warning_resources="false" 220 | if (( mem_available < 4000 )) ; then 221 | echo 222 | echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m" 223 | echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))" 224 | echo 225 | warning_resources="true" 226 | fi 227 | if (( cpus_available < 2 )); then 228 | echo 229 | echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m" 230 | echo "At least 2 CPUs recommended. You have $${cpus_available}" 231 | echo 232 | warning_resources="true" 233 | fi 234 | if (( disk_available < one_meg * 10 )); then 235 | echo 236 | echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m" 237 | echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))" 238 | echo 239 | warning_resources="true" 240 | fi 241 | if [[ $${warning_resources} == "true" ]]; then 242 | echo 243 | echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m" 244 | echo "Please follow the instructions to increase amount of resources available:" 245 | echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin" 246 | echo 247 | fi 248 | mkdir -p /sources/logs /sources/dags /sources/plugins 249 | chown -R "${AIRFLOW_UID}:0" /sources/{logs,dags,plugins} 250 | exec /entrypoint airflow version 251 | # yamllint enable rule:line-length 252 | environment: 253 | <<: *airflow-common-env 254 | _AIRFLOW_DB_UPGRADE: 'true' 255 | _AIRFLOW_WWW_USER_CREATE: 'true' 256 | _AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow} 257 | _AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow} 258 | _PIP_ADDITIONAL_REQUIREMENTS: '' 259 | user: "0:0" 260 | volumes: 261 | - ${AIRFLOW_PROJ_DIR:-.}:/sources 262 | 263 | airflow-cli: 264 | <<: *airflow-common 265 | profiles: 266 | - debug 267 | environment: 268 | <<: *airflow-common-env 269 | CONNECTION_CHECK_MAX_COUNT: "0" 270 | # Workaround for entrypoint issue. See: https://github.com/apache/airflow/issues/16252 271 | command: 272 | - bash 273 | - -c 274 | - airflow 275 | 276 | # You can enable flower by adding "--profile flower" option e.g. docker-compose --profile flower up 277 | # or by explicitly targeted on the command line e.g. docker-compose up flower. 278 | # See: https://docs.docker.com/compose/profiles/ 279 | flower: 280 | <<: *airflow-common 281 | command: celery flower 282 | profiles: 283 | - flower 284 | ports: 285 | - "5555:5555" 286 | healthcheck: 287 | test: ["CMD", "curl", "--fail", "http://localhost:5555/"] 288 | interval: 30s 289 | timeout: 10s 290 | retries: 5 291 | start_period: 30s 292 | restart: always 293 | depends_on: 294 | <<: *airflow-common-depends-on 295 | airflow-init: 296 | condition: service_completed_successfully 297 | 298 | volumes: 299 | postgres-db-volume: 300 | Copied -------------------------------------------------------------------------------- /services/alist/README.md: -------------------------------------------------------------------------------- 1 | # Alist 2 | 3 | Một công cụ quán lý các file trên cloud hỗ trợ nhiều dịch vụ cloud khác nhau 4 | 5 | # Hướng dẫn 6 | 7 | ## Khởi chạy Alist 8 | 9 | ```sh 10 | docker-compose up -d 11 | ``` 12 | 13 | ## Cấu hình tài khoản admin 14 | 15 | ```sh 16 | docker exec -it alist ./alist admin set NEW_PASSWORD 17 | ``` 18 | 19 | sau khi chạy thành công thì có thể vào http://localhost:5244 đăng nhập với password vừa tạo và sử dụng 20 | -------------------------------------------------------------------------------- /services/alist/admin.sh: -------------------------------------------------------------------------------- 1 | docker exec -it alist ./alist admin set NEW_PASSWORD 2 | -------------------------------------------------------------------------------- /services/alist/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.3" 2 | services: 3 | alist: 4 | image: "xhofe/alist:latest" 5 | restart: unless-stopped 6 | container_name: alist 7 | volumes: 8 | - alist-data:/opt/alist/data' 9 | ports: 10 | - "5244:5244" 11 | environment: 12 | - PUID=0 13 | - PGID=0 14 | - UMASK=022 15 | 16 | volumes: 17 | alist-data: 18 | -------------------------------------------------------------------------------- /services/cassandra/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | cassandra: 5 | image: cassandra:4.0 6 | ports: 7 | - 9042:9042 8 | volumes: 9 | - ./data:/var/lib/cassandra 10 | environment: 11 | - CASSANDRA_CLUSTER_NAME=cassandra 12 | -------------------------------------------------------------------------------- /services/cloudflared/README.md: -------------------------------------------------------------------------------- 1 | # Cloudflared 2 | 3 | Cloudflared là một dịch vụ có thể giúp tạo kết nối an toàn ra internet. 4 | 5 | # Hướng dẫn 6 | 7 | ## Tài khoản cloudflare 8 | 9 | Tạo tài khoản cloudflare và truy cập vào mục tunnel trong cloudflare tạo một tunnel mới. Sau khi tạo bạn sẽ nhận được token hãy tạo file `.env` 10 | 11 | ```plaintext 12 | CLOUDFLARE_TOKEN=your_token 13 | ``` 14 | 15 | Khởi chạy cloudflared 16 | 17 | ```sh 18 | docker-compose up -d 19 | ``` 20 | 21 | ## Trỏ tên miền vào các dịch vụ 22 | 23 | Vào mục Public hostnames và tiến hành trỏ một tiên miền mới. cloudflare được kết hợp với nginx giúp bạn có thể tạo và cấu hình một cách dễ ràng 24 | -------------------------------------------------------------------------------- /services/cloudflared/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | 3 | services: 4 | cloudflared: 5 | restart: always 6 | image: cloudflare/cloudflared:latest 7 | command: tunnel --no-autoupdate run --token $CLOUDFLARE_TOKEN 8 | extra_hosts: 9 | - "host.docker.internal:host-gateway" 10 | 11 | nginx: 12 | image: nginx:latest 13 | restart: always 14 | volumes: 15 | - ./nginx.conf:/etc/nginx/nginx.conf 16 | - ./openssl:/etc/nginx/certs # Mount the certificates directory 17 | ports: 18 | - 80:80 19 | extra_hosts: 20 | - "host.docker.internal:host-gateway" 21 | 22 | volumes: 23 | data: 24 | letsencrypt: 25 | -------------------------------------------------------------------------------- /services/cloudflared/nginx.conf: -------------------------------------------------------------------------------- 1 | events { 2 | worker_connections 768; 3 | } 4 | 5 | http { 6 | gzip on; 7 | server { 8 | listen 80 ; 9 | listen [::]:80 ; 10 | 11 | server_name codespace.vdaily.app; 12 | 13 | client_max_body_size 0; 14 | 15 | 16 | location / { 17 | root /usr/share/nginx/html; 18 | index index.html; 19 | # proxy_pass http://host.docker.internal:5678; 20 | proxy_http_version 1.1; 21 | proxy_set_header Upgrade $http_upgrade; 22 | proxy_set_header Connection "upgrade"; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /services/dgraph/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.2" 2 | services: 3 | zero: 4 | image: dgraph/dgraph:latest 5 | volumes: 6 | - /tmp/data:/dgraph 7 | ports: 8 | - 5080:5080 9 | - 6080:6080 10 | # restart: on-failure 11 | command: dgraph zero --my=zero:5080 12 | alpha: 13 | image: dgraph/dgraph:latest 14 | volumes: 15 | - /tmp/data:/dgraph 16 | ports: 17 | - 8080:8080 18 | - 9080:9080 19 | # restart: on-failure 20 | command: dgraph alpha --my=alpha:7080 --zero=zero:5080 --security whitelist=0.0.0.0/0 21 | ratel: 22 | image: dgraph/ratel 23 | ports: 24 | - 8000:8000 25 | command: dgraph-ratel 26 | -------------------------------------------------------------------------------- /services/glitchtip/.gitignore: -------------------------------------------------------------------------------- 1 | pg-data/ 2 | uploads/ -------------------------------------------------------------------------------- /services/glitchtip/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # Uncomment version if using an older version of docker compose 2 | # version: "3.8" 3 | x-environment: 4 | &default-environment 5 | DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres 6 | SECRET_KEY: change_me_to_something_random # best to run openssl rand -hex 32 7 | PORT: 8000 8 | EMAIL_URL: consolemail:// # Example smtp://email:password@smtp_url:port https://glitchtip.com/documentation/install#configuration 9 | GLITCHTIP_DOMAIN: https://glitchtip.local.com # Change this to your domain 10 | DEFAULT_FROM_EMAIL: email@glitchtip.com # Change this to your email 11 | CELERY_WORKER_AUTOSCALE: "1,3" # Scale between 1 and 3 to prevent excessive memory usage. Change it or remove to set it to the number of cpu cores. 12 | CELERY_WORKER_MAX_TASKS_PER_CHILD: "10000" 13 | 14 | x-depends_on: 15 | &default-depends_on 16 | - postgres 17 | - redis 18 | 19 | services: 20 | postgres: 21 | image: postgres:16 22 | environment: 23 | POSTGRES_HOST_AUTH_METHOD: "trust" # Consider removing this and setting a password 24 | restart: unless-stopped 25 | volumes: 26 | - ./pg-data:/var/lib/postgresql/data 27 | redis: 28 | image: redis 29 | restart: unless-stopped 30 | web: 31 | image: glitchtip/glitchtip 32 | depends_on: *default-depends_on 33 | ports: 34 | - "8100:8000" 35 | environment: *default-environment 36 | restart: unless-stopped 37 | volumes: 38 | - ./uploads:/code/uploads 39 | worker: 40 | image: glitchtip/glitchtip 41 | command: ./bin/run-celery-with-beat.sh 42 | depends_on: *default-depends_on 43 | environment: *default-environment 44 | restart: unless-stopped 45 | volumes: 46 | - ./uploads:/code/uploads 47 | migrate: 48 | image: glitchtip/glitchtip 49 | depends_on: *default-depends_on 50 | command: ./bin/run-migrate.sh 51 | environment: *default-environment 52 | 53 | volumes: 54 | pg-data: 55 | uploads: -------------------------------------------------------------------------------- /services/hasura/README.md: -------------------------------------------------------------------------------- 1 | # Hasura 2 | 3 | -------------------------------------------------------------------------------- /services/hasura/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | postgres: 4 | image: postgres:13 5 | restart: on-failure 6 | ports: 7 | - 5432:5432 8 | env_file: 9 | - .env 10 | volumes: 11 | - ./data/db:/var/lib/postgresql/data 12 | healthcheck: 13 | test: 14 | - CMD 15 | - pg_isready 16 | - -q 17 | - -d 18 | - ${POSTGRES_DB} 19 | - -U 20 | - ${POSTGRES_USER} 21 | timeout: 45s 22 | interval: 10s 23 | retries: 10 24 | metadata-db: 25 | image: postgres:13 26 | restart: on-failure 27 | volumes: 28 | - ./data/metadata-db:/var/lib/postgresql/data 29 | env_file: 30 | - .env 31 | environment: 32 | POSTGRES_PASSWORD: ${METADATA_POSTGRES_PASSWORD} 33 | command: -p 5433 34 | healthcheck: 35 | test: 36 | - CMD 37 | - pg_isready 38 | - -q 39 | - -d 40 | - ${POSTGRES_DB} 41 | - -U 42 | - ${POSTGRES_USER} 43 | timeout: 45s 44 | interval: 10s 45 | retries: 10 46 | hasura: 47 | image: hasura/graphql-engine:latest 48 | restart: on-failure 49 | ports: 50 | - "8080:8080" 51 | depends_on: 52 | - postgres 53 | - metadata-db 54 | 55 | env_file: 56 | - .env 57 | 58 | # volumes: 59 | # postgresttcs: 60 | # hasuradbttcs: 61 | -------------------------------------------------------------------------------- /services/minio/README.md: -------------------------------------------------------------------------------- 1 | # Minio 2 | 3 | ```bash 4 | docker run -p 9000:9000 -p 9090:9090 --name minio1 -v D:\minio\data:/data -e "MINIO_ROOT_USER=ADMIN" -e "MINIO_ROOT_PASSWORD=ADMIN@123" quay.io/minio/minio server /data --console-address ":9090" 5 | ``` 6 | -------------------------------------------------------------------------------- /services/mongodb/README.md: -------------------------------------------------------------------------------- 1 | # Mongodb 2 | -------------------------------------------------------------------------------- /services/mongodb/cluster/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | mongo-1: 5 | image: mongo:4.4.2 6 | container_name: mongo-1 7 | ports: 8 | - 27030:27017 9 | networks: 10 | - mongo 11 | command: /usr/bin/mongod --bind_ip_all --replSet rs0 --journal --dbpath /data/db --enableMajorityReadConcern false 12 | volumes: 13 | - ./mongo-1/db:/data/db 14 | 15 | mongo-2: 16 | image: mongo:4.4.2 17 | container_name: mongo-2 18 | ports: 19 | - 27031:27017 20 | networks: 21 | - mongo 22 | command: /usr/bin/mongod --bind_ip_all --replSet rs0 --journal --dbpath /data/db --enableMajorityReadConcern false 23 | volumes: 24 | - ./mongo-2/db:/data/db 25 | 26 | mongo-3: 27 | image: mongo:4.4.2 28 | container_name: mongo-3 29 | ports: 30 | - 27032:27017 31 | networks: 32 | - mongo 33 | 34 | command: /usr/bin/mongod --bind_ip_all --replSet rs0 --journal --dbpath /data/db --enableMajorityReadConcern false 35 | volumes: 36 | - ./mongo-3/db:/data/db 37 | 38 | volumes: 39 | mongo-1: 40 | mongo-2: 41 | mongo-3: 42 | 43 | 44 | networks: 45 | mongo: 46 | -------------------------------------------------------------------------------- /services/mongodb/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # Use root/example as user/password credentials 2 | version: '3.1' 3 | 4 | services: 5 | 6 | mongo: 7 | image: mongo 8 | restart: always 9 | ports: 10 | - 27017:27017 11 | environment: 12 | MONGO_INITDB_ROOT_USERNAME: root 13 | MONGO_INITDB_ROOT_PASSWORD: example 14 | 15 | 16 | mongo-express: 17 | image: mongo-express 18 | restart: always 19 | ports: 20 | - 8081:8081 21 | environment: 22 | ME_CONFIG_MONGODB_ADMINUSERNAME: root 23 | ME_CONFIG_MONGODB_ADMINPASSWORD: example 24 | ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/ -------------------------------------------------------------------------------- /services/mqtt/.gitignore: -------------------------------------------------------------------------------- 1 | /mosquitto_data 2 | /node-mqtt/* -------------------------------------------------------------------------------- /services/mqtt/README.md: -------------------------------------------------------------------------------- 1 | # MQTT Server 2 | 3 | MQTT (Message Queuing Telemetry Transport) là một giao thức truyền thông nhẹ được sử dụng để giao tiếp giữa các thiết bị IoT (Internet of Things). MQTT được phát triển bởi IBM vào những năm 1990 và được sử dụng rộng rãi trong các ứng dụng IoT. MQTT cho phép các thiết bị gửi và nhận thông tin từ nhau thông qua một trung tâm trung gian (broker), giúp tiết kiệm băng thông và năng lượng. MQTT sử dụng mô hình publish-subscribe, trong đó các thiết bị đăng ký để nhận thông tin từ một chủ đề (topic) cụ thể và các thiết bị khác phát thông tin đến chủ đề đó. MQTT là một giao thức đáng tin cậy, đơn giản và tiết kiệm năng lượng, thích hợp cho các ứng dụng IoT yêu cầu độ tin cậy và tiết kiệm năng lượng. -------------------------------------------------------------------------------- /services/mqtt/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | mosquitto: 5 | image: eclipse-mosquitto:2.0.12 6 | container_name: mosquitto 7 | ports: 8 | - "1883:1883" 9 | - "9001:9001" 10 | volumes: 11 | - ./mosquitto.conf:/mosquitto/config/mosquitto.conf 12 | # - ./password.txt:/mosquitto/config/password.txt 13 | - mosquitto_data:/mosquitto/data 14 | - mosquitto_log:/mosquitto/log 15 | #restart: always 16 | 17 | volumes: 18 | mosquitto_data: 19 | mosquitto_log: 20 | -------------------------------------------------------------------------------- /services/mqtt/mosquitto.conf: -------------------------------------------------------------------------------- 1 | listener 1883 2 | persistence false 3 | allow_anonymous true 4 | 5 | ## Authentication ## 6 | # By default, Mosquitto >=2.0 allows only authenticated connections. Change to true to enable anonymous connections. 7 | # allow_anonymous false 8 | # password_file /mosquitto/config/password.txt -------------------------------------------------------------------------------- /services/mqtt/password.txt: -------------------------------------------------------------------------------- 1 | admin:$6$utCGq9HKlEIB2HWO$Q77ea1FcXR9b1XoGU/iWQ1Yf9ptVZOgjW/gIxM/YECHdDECZrt0GONub3JtlkC0IGqFrZg4JemcqHzjc1QakQg== -------------------------------------------------------------------------------- /services/mssql/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | services: 3 | db1: 4 | image: "mcr.microsoft.com/mssql/server" 5 | environment: 6 | SA_PASSWORD: "Your_password123" 7 | ACCEPT_EULA: "Y" 8 | MSSQL_AGENT_ENABLED: "true" 9 | ports: 10 | - "1430:1433" 11 | networks: 12 | - db1 13 | networks: 14 | db1: 15 | driver: bridge 16 | -------------------------------------------------------------------------------- /services/mysql/README.md: -------------------------------------------------------------------------------- 1 | # MySQL 2 | 3 | https://hub.docker.com/_/mysql -------------------------------------------------------------------------------- /services/mysql/docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mysql: 3 | image: mysql:8.4.0 4 | container_name: mysql 5 | restart: always 6 | environment: 7 | - MYSQL_DATABASE=mydb 8 | - MYSQL_ROOT_PASSWORD=123456 9 | - MYSQL_USER=admin 10 | - MYSQL_PASSWORD=123456 11 | ports: 12 | - "3306:3306" 13 | volumes: 14 | - mysql-data:/var/lib/mysql 15 | - ./seed:/docker-entrypoint-initdb.d # Import SQL file 16 | 17 | volumes: 18 | mysql-data: -------------------------------------------------------------------------------- /services/mysql/export.sh: -------------------------------------------------------------------------------- 1 | docker exec mysql /usr/bin/mysqldump -u root --password=123456 mydb > ./export-mysql.sql -------------------------------------------------------------------------------- /services/mysql/seed/init.sql: -------------------------------------------------------------------------------- 1 | -- Create a new table for users 2 | CREATE TABLE IF NOT EXISTS users ( 3 | id INT AUTO_INCREMENT PRIMARY KEY, 4 | username VARCHAR(50) NOT NULL, 5 | email VARCHAR(100) NOT NULL, 6 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 7 | ); 8 | 9 | -- Insert sample data into the users table 10 | INSERT INTO users (username, email) VALUES 11 | ('alice', 'alice@example.com'), 12 | ('bob', 'bob@example.com'), 13 | ('carol', 'carol@example.com'); 14 | 15 | -- Create a table for articles 16 | CREATE TABLE IF NOT EXISTS articles ( 17 | id INT AUTO_INCREMENT PRIMARY KEY, 18 | user_id INT NOT NULL, 19 | title VARCHAR(255) NOT NULL, 20 | content TEXT NOT NULL, 21 | published_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 22 | FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE 23 | ); 24 | 25 | -- Insert sample data into the articles table 26 | INSERT INTO articles (user_id, title, content) VALUES 27 | (1, 'My First Article', 'This is the content of the first article.'), 28 | (2, 'Another Post', 'Here is another example article.'), 29 | (3, 'Exploring SQL', 'Content about SQL basics and best practices.'), 30 | (1, 'Docker for Databases', 'An article discussing how to use Docker for database management.'); 31 | -------------------------------------------------------------------------------- /services/n8n/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | 3 | services: 4 | n8n: 5 | image: docker.n8n.io/n8nio/n8n 6 | ports: 7 | - 5678:5678 8 | volumes: 9 | - /home/ubuntu/.n8n:/home/node/.n8n 10 | environment: 11 | - NODE_ENV=production 12 | -------------------------------------------------------------------------------- /services/n8n/postgresql/.env.example: -------------------------------------------------------------------------------- 1 | POSTGRES_USER=changeUser 2 | POSTGRES_PASSWORD=changePassword 3 | POSTGRES_DB=n8n 4 | 5 | POSTGRES_NON_ROOT_USER=changeUser 6 | POSTGRES_NON_ROOT_PASSWORD=changePassword 7 | 8 | N8N_BASIC_AUTH_USER=changeUser 9 | N8N_BASIC_AUTH_PASSWORD=changePassword -------------------------------------------------------------------------------- /services/n8n/postgresql/.gitignore: -------------------------------------------------------------------------------- 1 | .env -------------------------------------------------------------------------------- /services/n8n/postgresql/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.1' 2 | 3 | services: 4 | postgres: 5 | image: postgres:11 6 | restart: always 7 | environment: 8 | - POSTGRES_USER 9 | - POSTGRES_PASSWORD 10 | - POSTGRES_DB 11 | - POSTGRES_NON_ROOT_USER 12 | - POSTGRES_NON_ROOT_PASSWORD 13 | volumes: 14 | - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh 15 | 16 | n8n: 17 | image: n8nio/n8n 18 | restart: always 19 | environment: 20 | - DB_TYPE=postgresdb 21 | - DB_POSTGRESDB_HOST=postgres 22 | - DB_POSTGRESDB_PORT=5432 23 | - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} 24 | - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} 25 | - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} 26 | - N8N_BASIC_AUTH_ACTIVE=true 27 | - N8N_BASIC_AUTH_USER 28 | - N8N_BASIC_AUTH_PASSWORD 29 | ports: 30 | - 5678:5678 31 | links: 32 | - postgres 33 | volumes: 34 | - ./n8n:/home/node/.n8n 35 | # Wait 5 seconds to start n8n to make sure that PostgreSQL is ready 36 | # when n8n tries to connect to it 37 | command: /bin/sh -c "sleep 5; n8n start" -------------------------------------------------------------------------------- /services/n8n/postgresql/init-data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e; 3 | 4 | 5 | if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then 6 | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL 7 | CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}'; 8 | GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER}; 9 | EOSQL 10 | else 11 | echo "SETUP INFO: No Environment variables given!" 12 | fi -------------------------------------------------------------------------------- /services/n8n/postgresql/n8n/config: -------------------------------------------------------------------------------- 1 | { 2 | "encryptionKey": "JlgAx6ee7WD6fzmd+rRLannwMpsrRoMZ" 3 | } -------------------------------------------------------------------------------- /services/neo4j/.gitignore: -------------------------------------------------------------------------------- 1 | /conf 2 | /data 3 | /import 4 | /logs 5 | /plugins -------------------------------------------------------------------------------- /services/neo4j/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | neo4j: 4 | image: neo4j 5 | # restart: unless-stopped 6 | ports: 7 | - 7474:7474 8 | - 7687:7687 9 | volumes: 10 | - ./conf:/conf 11 | - ./data:/data 12 | - ./import:/import 13 | - ./logs:/logs 14 | - ./plugins:/plugins 15 | environment: 16 | # Raise memory limits 17 | - NEO4J_dbms_memory_pagecache_size=1G 18 | - NEO4J_dbms.memory.heap.initial_size=1G 19 | - NEO4J_dbms_memory_heap_max__size=1G -------------------------------------------------------------------------------- /services/nginx/README.md: -------------------------------------------------------------------------------- 1 | # NGINX with docker-compose 2 | 3 | ## NGINX là gì 4 | 5 | * Nó là 1 phần mền có thể đóng vai trò cân bằng tải () hoặc revert proxy () 6 | * Giúp điều hướng các request -------------------------------------------------------------------------------- /services/nginx/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | 3 | services: 4 | nginx: 5 | image: nginx:latest 6 | volumes: 7 | - ./nginx.conf:/etc/nginx/nginx.conf 8 | - ./openssl:/etc/nginx/certs # Mount the certificates directory 9 | ports: 10 | - 80:80 11 | - 443:443 12 | extra_hosts: 13 | - "host.docker.internal:host-gateway" 14 | -------------------------------------------------------------------------------- /services/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | events { 2 | worker_connections 768; 3 | } 4 | 5 | http { 6 | gzip on; 7 | server { 8 | listen 80; 9 | server_name nstack.org; 10 | return 301 https://$host$request_uri; 11 | } 12 | 13 | server { 14 | listen 443 ssl; 15 | server_name nstack.org; 16 | 17 | ssl_certificate /etc/nginx/certs/certificate.crt; 18 | ssl_certificate_key /etc/nginx/certs/private.key; 19 | 20 | location / { 21 | # root /usr/share/nginx/html; 22 | # index index.html; 23 | proxy_pass http://host.docker.internal:2001; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /services/nginx/openssl/Makefile: -------------------------------------------------------------------------------- 1 | gen: 2 | openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout private.key -out certificate.crt -config openssl.conf 3 | -------------------------------------------------------------------------------- /services/nginx/openssl/README.md: -------------------------------------------------------------------------------- 1 | # OpenSSL 2 | 3 | ## Generate a self-signed certificate 4 | 5 | file config: `openssl.conf` 6 | 7 | File này chứa các thông tin để tạo chứng chỉ ssl. thay đổi thông tin domain (CN, DNS.1, DNS.2) thành thông tin domain của bạn. Trên local muốn tạo domain thì ta có thể add domain vào file hosts và trỏ về ip `127.0.0.1` 8 | 9 | ```conf 10 | [req] 11 | default_bits = 2048 12 | default_keyfile = oats.key 13 | encrypt_key = no 14 | utf8 = yes 15 | distinguished_name = req_distinguished_name 16 | x509_extensions = v3_req 17 | prompt = no 18 | 19 | [req_distinguished_name] 20 | C = US 21 | ST = Cary 22 | L = Cary 23 | O = BigCompany 24 | CN = *.nstack.org 25 | 26 | [v3_req] 27 | keyUsage = critical, digitalSignature, keyAgreement 28 | extendedKeyUsage = serverAuth 29 | subjectAltName = @alt_names 30 | 31 | [alt_names] 32 | DNS.1 = nstack.org 33 | DNS.2 = *.nstack.org 34 | ``` 35 | 36 | Tạo chứng chỉ ssl: 37 | 38 | ```bash 39 | openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout private.key -out certificate.crt -config openssl.conf 40 | ``` 41 | 42 | Sau khi generate xong ta sẽ có 2 file `private.key` và `certificate.crt` 43 | 44 | Chúng ta có thể cấu hình chứng chỉ vào nginx như sau: 45 | 46 | ```nginx 47 | events { 48 | worker_connections 768; 49 | } 50 | 51 | http { 52 | gzip on; 53 | server { 54 | listen 80; 55 | server_name nstack.org; 56 | return 301 https://$host$request_uri; 57 | } 58 | 59 | server { 60 | listen 443 ssl; 61 | server_name nstack.org; 62 | 63 | ssl_certificate /etc/nginx/certs/certificate.crt; 64 | ssl_certificate_key /etc/nginx/certs/private.key; 65 | 66 | location / { 67 | # root /usr/share/nginx/html; 68 | # index index.html; 69 | proxy_pass http://host.docker.internal:2001; 70 | } 71 | } 72 | } 73 | ``` 74 | 75 | Để chứng chỉ hoạt động được trên local cần thêm chứng chỉ vào `Trusted Root Certification Authorities` của hệ điều hành. Windows thì sử dụng `Computer account` để thêm chứng chỉ vào `Trusted Root Certification Authorities` 76 | -------------------------------------------------------------------------------- /services/nginx/openssl/certificate.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDiDCCAnCgAwIBAgIUJibCidMYnz6pjmbok4Z4S1cKf6swDQYJKoZIhvcNAQEL 3 | BQAwVzELMAkGA1UEBhMCVVMxDTALBgNVBAgMBENhcnkxDTALBgNVBAcMBENhcnkx 4 | EzARBgNVBAoMCkJpZ0NvbXBhbnkxFTATBgNVBAMMDCoubnN0YWNrLm9yZzAeFw0y 5 | MzA2MTAxODIyMTZaFw0zMzA2MDcxODIyMTZaMFcxCzAJBgNVBAYTAlVTMQ0wCwYD 6 | VQQIDARDYXJ5MQ0wCwYDVQQHDARDYXJ5MRMwEQYDVQQKDApCaWdDb21wYW55MRUw 7 | EwYDVQQDDAwqLm5zdGFjay5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK 8 | AoIBAQDWKKTnTzNdx+npeGug6p8pX/IOb6mLuQM7ds0wzE5OX/aYWXjlADGjzNu7 9 | uk4kNsECcqL6eOLwy+8nDXKGVFF2XHg1kQPLliXkvkjCU+ml+YOqtUwiXoj9J/tY 10 | AlnMU7GjZiet9yxY+G7T0e36r3wQOySATyrwfFh1xkeHUM4Eihhc16uW1W/20K9G 11 | FqpiYNPkSFHXYq2q3EIJn9fc3nY+gsZAnZ9BmUmnxWxcui/EhjvQFqnemXR/De/e 12 | PvZd9dK4dzwV8yvltCqZoZHsp+Prw7LWwbdnHrxNsIlXHIS3Ur1YS+aopNAH3sST 13 | +QUEfuZa8ZnjWLJ32awrTbWPdiRvAgMBAAGjTDBKMA4GA1UdDwEB/wQEAwIDiDAT 14 | BgNVHSUEDDAKBggrBgEFBQcDATAjBgNVHREEHDAaggpuc3RhY2sub3JnggwqLm5z 15 | dGFjay5vcmcwDQYJKoZIhvcNAQELBQADggEBAKwvKSE9FncejzjpjSQ3ejMZ1/H3 16 | eDMc2pkJJt9jkPi2FmRK4CA72uHNfYUQ9p4UjsdS6TtcdHpVgYT3x+WHNMYEVgwl 17 | pibWyGw9cURFjWHJo8HUTZeOaTA0/vAk5+fejyilnLpOoQgGANBc0ixynIGpP1BE 18 | rnbmQsj+v0X70CVyN3dypypXxS3SxghoftHH9ut3KxipPwVGmadWCfO4NcUc0Aow 19 | IHQimZiq9GN8VLgatg9Jw9eYbq03BWnVUr7FXDETu6Kr0wKsfdwzmh9zpM+bsmHv 20 | IT5PHNFS/17aVTCMTS06PBj2d33IMxzagPh7Kps5cyUpSZ7JA+8OWz9sePk= 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /services/nginx/openssl/openssl.conf: -------------------------------------------------------------------------------- 1 | [req] 2 | default_bits = 2048 3 | default_keyfile = oats.key 4 | encrypt_key = no 5 | utf8 = yes 6 | distinguished_name = req_distinguished_name 7 | x509_extensions = v3_req 8 | prompt = no 9 | 10 | [req_distinguished_name] 11 | C = US 12 | ST = Cary 13 | L = Cary 14 | O = BigCompany 15 | CN = *.nstack.org 16 | 17 | [v3_req] 18 | keyUsage = critical, digitalSignature, keyAgreement 19 | extendedKeyUsage = serverAuth 20 | subjectAltName = @alt_names 21 | 22 | [alt_names] 23 | DNS.1 = nstack.org 24 | DNS.2 = *.nstack.org -------------------------------------------------------------------------------- /services/nginx/openssl/private.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDWKKTnTzNdx+np 3 | eGug6p8pX/IOb6mLuQM7ds0wzE5OX/aYWXjlADGjzNu7uk4kNsECcqL6eOLwy+8n 4 | DXKGVFF2XHg1kQPLliXkvkjCU+ml+YOqtUwiXoj9J/tYAlnMU7GjZiet9yxY+G7T 5 | 0e36r3wQOySATyrwfFh1xkeHUM4Eihhc16uW1W/20K9GFqpiYNPkSFHXYq2q3EIJ 6 | n9fc3nY+gsZAnZ9BmUmnxWxcui/EhjvQFqnemXR/De/ePvZd9dK4dzwV8yvltCqZ 7 | oZHsp+Prw7LWwbdnHrxNsIlXHIS3Ur1YS+aopNAH3sST+QUEfuZa8ZnjWLJ32awr 8 | TbWPdiRvAgMBAAECggEBAJGYQjwLiUVpoyoZtzpIJ/rOAtczrNWT65Giu+9ABsCb 9 | 1x9OPLWbQyQ0IvLmvzc5jlBmtUyJoOfKDYXES6btbhCE3yiztRvUsWBoyThsKf2v 10 | u4b0CJWZJZLOer8jof8aqzsGOVW5JAo8o8QYBa2XXkX+n1sn925VayJusbRaCCXm 11 | qhykwKQSF5yRGpu3chCTaG1yupo7Dm5T0OE9pjDO9/JrRvWnFHdmIJut1XFOYIuk 12 | PrZQSQyyY93fUI+LKw4MnunWUn6xvXo6EXvBxHPQtKWlrEs5Aletw0a9ZyxI8gbg 13 | RYQl7SJurTLQLEjcvZQJHziWlf29TbLRqPv4Un0L1PkCgYEA8FSghipdM6WftCDF 14 | 7J6PPZ16b5ZNdl+jC33k3NsCXvmpr11sIOlnlrprMHF6WkbT+Zct/zLPkC14PWK+ 15 | Cb/3bD5s52qjUzGYVNmnkhAsC6DBPzRrATm/xqd8/Vi3iCANUhShHbTsSJ7RBpOt 16 | RL0uIWWH2Tv4a2JabUy+Do5Fp5UCgYEA5B8uiZhrjQjpdpTyzNpfpk1b865iq4nu 17 | Q858mkUYV397TkhBHYywcv7rmYnoF5P5QCgIojsPosI3gVz6bOISHTF+Yummxy9h 18 | N06p/UFO/EmvrHLDNF87SOPgq9gO9cztuctTlKt2wRPEnDpJhOvD3yS8YNSt5lBm 19 | ZYLqVBeLSvMCgYEA0+c6VrHZ1eUOKKvQ+C5iTEijIOqcyGfRAhvyBI4SzB1EcXxl 20 | D6vdC3i5dFBKOnlDBEo5Y0+w1gZRg4ah20To6wcrzOwor/0FvKLg7pfVzjbizVDx 21 | nHYH0yfwvA1SXfMs65eG7AOPZwSpdywU1YwctZOpMXCAPGbPJppI5dqqLfUCgYEA 22 | 1insD+OXvS2LuPc3R1kQiVmBJTInkjIJDYGSe2a45pRZV/H/p9VIZn2rBFdzHIeg 23 | bjnneR8Hm97IK1v2Azjulpe7tvLyz3dMxpbEgm3I0JQBKF4Jo2ZwiwrdB5fs25jL 24 | 6izYR+/9qmB7qcwS74ZEOn8Ll8CzjlEXAOA6TD5aWD8CgYAEppU5xK7fpICS7F3e 25 | Bz/OzyOlOCXbP9YtnlKRwe9xWOeco+MhbGxKSoHIn5CSHPXNALeRSMcvdHpgRrZU 26 | RI4sgyGT1IvGgwmYsQZcfQOlDX7EacR7APGmGvNy5B/lQSWzAMJpazZqaFms80U4 27 | IEex0r71JTRQT/W2jWId9nqzVw== 28 | -----END PRIVATE KEY----- 29 | -------------------------------------------------------------------------------- /services/nocodb/README.md: -------------------------------------------------------------------------------- 1 | # Nocodb 2 | 3 | Công cụ gen api từ database 4 | -------------------------------------------------------------------------------- /services/nocodb/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.1' 2 | 3 | services: 4 | root_db: 5 | image: mysql:5.7 6 | volumes: 7 | - db_data:/var/lib/mysql 8 | # below line shows how to change charset and collation 9 | # uncomment it if necessary 10 | # command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 11 | restart: always 12 | environment: 13 | MYSQL_ROOT_PASSWORD: password 14 | MYSQL_DATABASE: root_db 15 | MYSQL_USER: noco 16 | MYSQL_PASSWORD: password 17 | healthcheck: 18 | test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ] 19 | timeout: 20s 20 | retries: 10 21 | 22 | nocodb: 23 | depends_on: 24 | root_db: 25 | condition: service_healthy 26 | image: nocodb/nocodb:latest 27 | ports: 28 | - "8080:8080" 29 | restart: always 30 | volumes: 31 | - nc_data:/usr/app/data 32 | environment: 33 | NC_DB: "mysql2://root_db:3306?u=noco&p=password&d=root_db" 34 | volumes: 35 | db_data: {} 36 | nc_data: {} 37 | -------------------------------------------------------------------------------- /services/pihole/.gitignore: -------------------------------------------------------------------------------- 1 | /etc-pihole 2 | /etc-dnsmasq.d -------------------------------------------------------------------------------- /services/pihole/docker-compose.yml: -------------------------------------------------------------------------------- 1 | 2 | # https://github.com/pi-hole/docker-pi-hole/blob/master/README.md 3 | 4 | services: 5 | pihole: 6 | container_name: pihole 7 | image: pihole/pihole:latest 8 | # For DHCP it is recommended to remove these ports and instead add: network_mode: "host" 9 | ports: 10 | - "53:53/tcp" 11 | - "53:53/udp" 12 | # - "67:67/udp" 13 | - "8080:80" 14 | environment: 15 | TZ: 'America/Chicago' 16 | # WEBPASSWORD: 'set a secure password here or it will be random' 17 | # Volumes store your data between container upgrades 18 | volumes: 19 | - etc-pihole:/etc/pihole 20 | - etc-dnsmasq.d:/etc/dnsmasq.d 21 | - var-log:/var/log/pihole 22 | # Recommended but not required (DHCP needs NET_ADMIN) 23 | # https://github.com/pi-hole/docker-pi-hole#note-on-capabilities 24 | # cap_add: 25 | # - NET_ADMIN 26 | restart: unless-stopped 27 | 28 | volumes: 29 | etc-pihole: 30 | driver: local 31 | etc-dnsmasq.d: 32 | driver: local 33 | var-log: 34 | driver: local 35 | -------------------------------------------------------------------------------- /services/portainer/README.md: -------------------------------------------------------------------------------- 1 | # Portainer 2 | 3 | Là công cụ dùng để quản lý docker và docker-compose trên giao diện 4 | 5 | ## Cài đặt 6 | 7 | Tạo portainer volume để chứa data của portainer. 8 | Cấu trúc lệnh `docker volume create ` 9 | 10 | ```bash 11 | docker volume create portainer_data 12 | ``` 13 | 14 | Chạy portainer 15 | 16 | ```bash 17 | docker run -d -p 8000:8000 -p 9443:9443 -p 9000:9000 --name portainer \ 18 | --restart=always \ 19 | -v /var/run/docker.sock:/var/run/docker.sock \ 20 | -v portainer_data:/data \ 21 | portainer/portainer-ce:alpine 22 | ``` 23 | 24 | | Tham số | Ý nghĩa | 25 | | ---------------- | ------------------------------ | 26 | | -d | Chạy container dưới nền | 27 | | -p | Map port ra ngoài máy host | 28 | | --name | Tên container | 29 | | --restart=always | Chạy lại container khi bị dừng | 30 | | -v | Mount volume | 31 | 32 | notes 33 | 34 | - portainer sẽ chạy trên port `9000`. Để truy cập vào portainer ta truy cập vào địa chỉ `http://:9000` 35 | 36 | - port `9443` là port để truy cập vào portainer qua https 37 | 38 | - port `8000` là port dùng để kết nối nhiều container ở nhiều host với nhau. 39 | 40 | ## Tham khảo 41 | 42 | https://docs.portainer.io/start/install/server/docker/linux 43 | -------------------------------------------------------------------------------- /services/postgres/README.md: -------------------------------------------------------------------------------- 1 | # Postgres 2 | -------------------------------------------------------------------------------- /services/postgres/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | postgres: 4 | image: postgres:13 5 | restart: always 6 | ports: 7 | - 5432:5432 8 | environment: 9 | - POSTGRES_USER=admin_postgre 10 | - POSTGRES_PASSWORD=123456 11 | - POSTGRES_DB=postgres 12 | volumes: 13 | - postgres-data:/var/lib/postgresql/data 14 | volumes: 15 | postgres-data: 16 | -------------------------------------------------------------------------------- /services/prometheus/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/npv2k1/learn-docker/01d1c9976fe174ad936f922696d3a2174aef73a2/services/prometheus/.gitignore -------------------------------------------------------------------------------- /services/prometheus/README.md: -------------------------------------------------------------------------------- 1 | # Prometheus 2 | 3 | -------------------------------------------------------------------------------- /services/prometheus/docker-compose.yml: -------------------------------------------------------------------------------- 1 | 2 | services: 3 | prometheus: 4 | image: prom/prometheus:latest 5 | container_name: prometheus 6 | volumes: 7 | - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml 8 | ports: 9 | - "9090:9090" 10 | command: 11 | - "--config.file=/etc/prometheus/prometheus.yml" 12 | 13 | grafana: 14 | image: grafana/grafana:latest 15 | container_name: grafana 16 | ports: 17 | - "3000:3000" 18 | environment: 19 | - GF_SECURITY_ADMIN_USER=admin 20 | - GF_SECURITY_ADMIN_PASSWORD=admin 21 | depends_on: 22 | - prometheus 23 | volumes: 24 | - grafana-data:/var/lib/grafana 25 | 26 | node_exporter: 27 | image: prom/node-exporter:latest 28 | container_name: node_exporter 29 | ports: 30 | - "9100:9100" 31 | command: 32 | - "--path.rootfs=/host" 33 | volumes: 34 | - /proc:/host/proc:ro 35 | - /sys:/host/sys:ro 36 | - /:/host:ro 37 | volumes: 38 | grafana-data: 39 | 40 | networks: 41 | default: 42 | name: monitoring 43 | -------------------------------------------------------------------------------- /services/prometheus/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 15s 3 | 4 | scrape_configs: 5 | - job_name: "node" 6 | static_configs: 7 | - targets: ["node_exporter:9100"] 8 | 9 | - job_name: "prometheus" 10 | static_configs: 11 | - targets: ["prometheus:9090"] 12 | 13 | - job_name: "grafana" 14 | static_configs: 15 | - targets: ["grafana:3000"] 16 | -------------------------------------------------------------------------------- /services/rabbitmq/README.md: -------------------------------------------------------------------------------- 1 | # Rabbitmq 2 | 3 | RabbitMQ là một hệ thống message broker mã nguồn mở được sử dụng để truyền tin nhắn giữa các ứng dụng. Nó hỗ trợ nhiều giao thức truyền thông khác nhau như AMQP, MQTT, STOMP, … 4 | RabbitMQ cho phép các ứng dụng gửi và nhận các tin nhắn một cách đáng tin cậy và có khả năng mở rộng, giúp xây dựng các ứng dụng phân tán và có khả năng chịu lỗi tốt hơn. Ngoài ra, RabbitMQ còn cung cấp nhiều tính năng như định tuyến tin nhắn, bảo mật, quản lý hàng đợi, … 5 | -------------------------------------------------------------------------------- /services/rabbitmq/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | rabbitmq: 4 | image: rabbitmq:3-management 5 | ports: 6 | - "5672:5672" 7 | - "15672:15672" 8 | volumes: 9 | - rabbitmq-data:/var/lib/rabbitmq 10 | volumes: 11 | rabbitmq-data: 12 | -------------------------------------------------------------------------------- /services/redis/README.md: -------------------------------------------------------------------------------- 1 | # Redis 2 | 3 | ## Cài đặt 4 | 5 | `docker-compose.yml` 6 | 7 | ```yaml 8 | version: '3.8' 9 | 10 | services: 11 | redis: 12 | image: redis/redis-stack:latest 13 | restart: on-failure 14 | volumes: 15 | - redis-data:/data 16 | ports: 17 | - 8001:8001 18 | - 6379:6379 19 | 20 | volumes: 21 | redis-data: 22 | ``` 23 | 24 | 25 | Chạy redis stack bao gồm redis và công cụ quản lý 26 | 27 | ```bash 28 | docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest 29 | ``` 30 | 31 | notes: 32 | 33 | - cổng `8001` để truy cập vào công cụ quản lý 34 | - cổng `6379` để truy cập vào redis 35 | 36 | ## Tham khảo 37 | 38 | - https://redis.io/docs/stack/get-started/install/docker/ 39 | -------------------------------------------------------------------------------- /services/redis/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | redis: 5 | image: redis/redis-stack:latest 6 | restart: on-failure 7 | volumes: 8 | - redis-data:/data 9 | ports: 10 | - 8001:8001 11 | - 6379:6379 12 | 13 | volumes: 14 | redis-data: -------------------------------------------------------------------------------- /services/strapi/.gitignore: -------------------------------------------------------------------------------- 1 | /app 2 | /client 3 | /data 4 | /next -------------------------------------------------------------------------------- /services/strapi/README.md: -------------------------------------------------------------------------------- 1 | strapi admin 2 | user: admin@local.com 3 | pass: Admin123 4 | 5 | 6 | docker-compose down -v --rmi all -------------------------------------------------------------------------------- /services/strapi/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | strapi: 4 | image: strapi/strapi 5 | environment: 6 | DATABASE_CLIENT: mongo 7 | DATABASE_NAME: strapi 8 | DATABASE_HOST: mongo 9 | DATABASE_PORT: 27017 10 | DATABASE_USERNAME: strapi 11 | DATABASE_PASSWORD: strapi 12 | volumes: 13 | - ./app:/srv/app 14 | ports: 15 | - "5000:1337" 16 | depends_on: 17 | - mongo 18 | mongo: 19 | image: mongo 20 | environment: 21 | MONGO_INITDB_DATABASE: strapi 22 | MONGO_INITDB_ROOT_USERNAME: strapi 23 | MONGO_INITDB_ROOT_PASSWORD: strapi 24 | volumes: 25 | - ./data:/data/db 26 | networks: 27 | strapi: 28 | -------------------------------------------------------------------------------- /services/traefik/README.md: -------------------------------------------------------------------------------- 1 | # Traefik 2 | -------------------------------------------------------------------------------- /services/traefik/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | 3 | services: 4 | 5 | traefik: 6 | image: "traefik:v2.10" 7 | container_name: "traefik" 8 | command: 9 | #- "--log.level=DEBUG" 10 | - "--api.insecure=true" 11 | - "--providers.docker=true" 12 | - "--providers.docker.exposedbydefault=false" 13 | - "--entrypoints.web.address=:80" 14 | ports: 15 | - "80:80" 16 | - "8080:8080" 17 | volumes: 18 | - "/var/run/docker.sock:/var/run/docker.sock:ro" 19 | 20 | whoami: 21 | image: "traefik/whoami" 22 | container_name: "simple-service" 23 | labels: 24 | - "traefik.enable=true" 25 | - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)" 26 | - "traefik.http.routers.whoami.entrypoints=web" -------------------------------------------------------------------------------- /services/typesence/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | typesence: 4 | image: typesense/typesense:0.25.0 5 | ports: 6 | - "8108:8108" 7 | - "8107:8107" 8 | volumes: 9 | - typesence-data:/data 10 | command: 11 | [ 12 | "--data-dir", 13 | "/data", 14 | "--api-key=xyz", 15 | "--listen-port=8108", 16 | "--enable-cors", 17 | "--enable-metrics", 18 | ] 19 | volumes: 20 | typesence-data: 21 | -------------------------------------------------------------------------------- /services/wordpress/README.md: -------------------------------------------------------------------------------- 1 | # Wordpress 2 | 3 | Để chạy ta dùng lệnh sau: 4 | 5 | ```bash 6 | docker-compose up -d 7 | ``` 8 | 9 | notes: 10 | 11 | - wordpress chạy trên port 8080 12 | - mysql chạy trên port 3306 13 | - phpmyadmin chạy trên port 8081 14 | - đã fix upload limit trong file `upload.ini` 15 | - Để cấu hình url thì vào `wp-config.php` và sửa lại `WP_HOME` và `WP_SITEURL` 16 | -------------------------------------------------------------------------------- /services/wordpress/docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | phpmyadmin: 3 | image: phpmyadmin 4 | depends_on: 5 | - db 6 | restart: always 7 | ports: 8 | - 8081:80 9 | environment: 10 | - PMA_ARBITRARY=1 11 | db: 12 | image: mariadb:10.6.4-focal 13 | command: '--default-authentication-plugin=mysql_native_password' 14 | volumes: 15 | - dbdata:/var/lib/mysql 16 | restart: always 17 | environment: 18 | - MYSQL_ROOT_PASSWORD=somewordpress 19 | - MYSQL_DATABASE=wordpress 20 | - MYSQL_USER=wordpress 21 | - MYSQL_PASSWORD=YEfk9KvRFCC6WxuR 22 | expose: 23 | - 3306 24 | ports: 25 | - 3306:80 26 | wordpress: 27 | image: wordpress:latest 28 | depends_on: 29 | - db 30 | ports: 31 | - 8080:80 32 | restart: always 33 | volumes: 34 | - ./public_html:/var/www/html 35 | - ./upload.ini:/usr/local/etc/php/conf.d/uploads.ini 36 | environment: 37 | - WORDPRESS_DB_HOST=db 38 | - WORDPRESS_DB_USER=wordpress 39 | - WORDPRESS_DB_PASSWORD=YEfk9KvRFCC6WxuR 40 | - WORDPRESS_DB_NAME=wordpress 41 | - WP_MEMORY_LIMIT=1G 42 | - WP_REDIS_HOST=redis 43 | redis: 44 | image: redis/redis-stack:latest 45 | restart: always 46 | volumes: 47 | - redis_data:/data 48 | ports: 49 | - 6379:6379 50 | - 8001:8001 51 | volumes: 52 | dbdata: 53 | redis_data: 54 | -------------------------------------------------------------------------------- /services/wordpress/upload.ini: -------------------------------------------------------------------------------- 1 | file_uploads = On 2 | memory_limit = 4G 3 | upload_max_filesize = 4G 4 | post_max_size = 4G 5 | max_execution_time = 600 -------------------------------------------------------------------------------- /services/x-ui/README.md: -------------------------------------------------------------------------------- 1 | # x-ui -------------------------------------------------------------------------------- /services/x-ui/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | x-ui: 4 | image: enwaiax/x-ui 5 | container_name: x-ui 6 | volumes: 7 | - xui-db:/etc/x-ui/ 8 | - xui-cert:/root/cert/ 9 | restart: unless-stopped 10 | network_mode: host 11 | volumes: 12 | xui-db: 13 | xui-cert: 14 | --------------------------------------------------------------------------------