{"id":85994,"date":"2024-11-29T12:51:45","date_gmt":"2024-11-29T09:21:45","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/minio-integration-with-nestjs-file-upload-retrieve-f41\/"},"modified":"2024-11-29T12:51:45","modified_gmt":"2024-11-29T09:21:45","slug":"minio-integration-with-nestjs-file-upload-retrieve-f41","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/minio-integration-with-nestjs-file-upload-retrieve-f41\/","title":{"rendered":"\u0627\u062f\u063a\u0627\u0645 Minio \u0628\u0627 nestjs | \u0622\u067e\u0644\u0648\u062f \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0641\u0627\u06cc\u0644"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n              \u0645\u06cc\u0646\u06cc\u0648 \u0686\u06cc\u0633\u062a\u061f Minio *\u0631\u0627\u06cc\u06af\u0627\u0646\u060c \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0628\u0627 S3 \u0633\u0627\u0632\u06af\u0627\u0631 \u0627\u0633\u062a \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0627\u0634\u06cc\u0627.<\/p>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u062f\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 docker \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0646 \u0627\u0632 \u067e\u06a9\u06cc\u062c \u0645\u06cc\u0646\u06cc\u0648 \u0628\u06cc\u062a\u0646\u0627\u0645\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u06a9\u0646\u0645. \u0633\u0631\u0648\u06cc\u0633 \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u0628\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f docker-compose.yaml:<\/p>\n<p>services:<br \/>\n  minio:<br \/>\n    image: bitnami\/minio:2024.11.7<br \/>\n    restart: always<br \/>\n    ports:<br \/>\n      &#8211; ${MINIO_PORT}:${MINIO_PORT}<br \/>\n      &#8211; ${MINIO_CONSOLE_PORT}:${MINIO_CONSOLE_PORT}<br \/>\n    environment:<br \/>\n      MINIO_ROOT_USER: ${MINIO_USER}<br \/>\n      MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}<br \/>\n      MINIO_DEFAULT_BUCKETS: ${MINIO_BUCKET}<br \/>\n      MINIO_API_PORT_NUMBER: ${MINIO_PORT}<br \/>\n      MINIO_CONSOLE_PORT_NUMBER: ${MINIO_CONSOLE_PORT}<br \/>\n    volumes:<br \/>\n      &#8211; minio-data:\/bitnami\/minio\/data<\/p>\n<p>volumes:<br \/>\n  minio-data:<br \/>\n    driver: local<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u0627\u06cc\u0646 \u0631\u0627 \u0633\u0631\u06cc\u0639 \u062a\u0648\u0636\u06cc\u062d \u062f\u0647\u0645:<\/p>\n<p>ports: MINIO_PORT \u067e\u0648\u0631\u062a minio \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc API \u0627\u0633\u062a\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0627\u0632 \u0646\u0627\u0645\u0634 \u0645\u0634\u062e\u0635 \u0627\u0633\u062a MINIO_CONSOLE_PORT \u067e\u0648\u0631\u062a \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u06cc\u0646\u06cc\u0648 \u0627\u0633\u062a:<br \/>\nMINIO_ROOT_USER  &#038; MINIO_ROOT_PASSWORD \u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u06a9\u0646\u0633\u0648\u0644 Minio \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f env \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc\u0646\u06cc\u0648 \u062f\u0627\u06a9\u0631\u060c \u0627\u0632 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0645\u06cc\u0646\u06cc\u0648\u0646 \u0628\u06cc\u062a\u0646\u0627\u0645\u06cc \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0628\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f .env \u0641\u0627\u06cc\u0644:<\/p>\n<p>MINIO_PORT=9000<br \/>\nMINIO_CONSOLE_PORT=8000<br \/>\nMINIO_USER=&#8221;admin&#8221;<br \/>\nMINIO_PASSWORD=&#8221;veryhardpassword&#8221;<br \/>\nMINIO_BUCKET=&#8221;main&#8221;<br \/>\nMINIO_ENDPOINT=&#8221;localhost&#8221;<br \/>\nMINIO_ACCESS_KEY=&#8221;&#8221;<br \/>\nMINIO_SECRET_KEY=&#8221;&#8221;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0647 \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u0648 \u0631\u0627\u0632 \u06a9\u0644\u06cc\u062f\u0647\u0627:<\/p>\n<p>\u0628\u0647 \u06a9\u0646\u0633\u0648\u0644 Minio \u0628\u0631\u0648\u06cc\u062f (\u062f\u0631 \u0645\u062b\u0627\u0644 \u0645\u0627 http:\/\/localhost:8000 \u0627\u0633\u062a) &#038; \u0648\u0627\u0631\u062f \u0634\u0648\u06cc\u062f<br \/>\n\u0628\u0631\u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0648 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0644\u06cc\u062f \u062f\u0633\u062a\u0631\u0633\u06cc<br \/>\n\u06a9\u067e\u06cc \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc\/\u0645\u062e\u0641\u06cc \u0628\u0647 .env<\/p>\n<p>\u0628\u0633\u062a\u0647 npm \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/p>\n<p>pnpm add minio<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f minio\/minio.decorator.ts &#038; minio\/minio.module.ts<\/p>\n<p>import { Inject } from &#8216;@nestjs\/common&#8217;;<\/p>\n<p>export const MINIO_TOKEN = &#8216;MINIO_INJECT_TOKEN&#8217;;<\/p>\n<p>export function InjectMinio(): ParameterDecorator {<br \/>\n  return Inject(MINIO_TOKEN);<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>import { Global, Module } from &#8216;@nestjs\/common&#8217;;<br \/>\nimport { ConfigService } from &#8216;@nestjs\/config&#8217;;<br \/>\nimport { MINIO_TOKEN } from &#8216;.\/minio.decorator&#8217;;<br \/>\nimport * as Minio from &#8216;minio&#8217;;<\/p>\n<p>@Global()<br \/>\n@Module({<br \/>\n  exports: [MINIO_TOKEN],<br \/>\n  providers: [<br \/>\n    {<br \/>\n      inject: [ConfigService],<br \/>\n      provide: MINIO_TOKEN,<br \/>\n      useFactory: async (<br \/>\n        configService: ConfigService,<br \/>\n      ): Promise&lt;Minio.Client&gt; =&gt; {<br \/>\n        const client = new Minio.Client({<br \/>\n          endPoint: configService.getOrThrow(&#8220;MINIO_ENDPOINT&#8221;),<br \/>\n          port: +configService.getOrThrow(&#8220;MINIO_PORT&#8221;),<br \/>\n          accessKey: configService.getOrThrow(&#8220;MINIO_ACCESS_KEY&#8221;),<br \/>\n          secretKey: configService.getOrThrow(&#8220;MINIO_SECRET_KEY&#8221;),<br \/>\n          useSSL: false,<br \/>\n        });<br \/>\n        return client;<br \/>\n      },<br \/>\n    },<br \/>\n  ],<br \/>\n})<br \/>\nexport class MinioModule {}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0632 \u0645\u06cc\u0646\u06cc\u0648 \u0641\u0642\u0637 \u062f\u0631 \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f (\u0645\u062b\u0644\u0627\u064b \u0645\u0627\u0698\u0648\u0644 \u0641\u0627\u06cc\u0644) \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f @Global() \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631<\/p>\n<p>\u0622\u0646 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f app.module.ts:<\/p>\n<p>@Module({<br \/>\n  imports: [<br \/>\n    &#8230;<br \/>\n    MinioModule,<br \/>\n  ],<br \/>\n})<br \/>\nexport class AppModule {}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645. Minio \u0631\u0627 \u0628\u0647 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u062a\u0632\u0631\u06cc\u0642 \u06a9\u0646\u06cc\u062f (files.service.ts \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644)<\/p>\n<p>import { Injectable } from &#8216;@nestjs\/common&#8217;;<br \/>\nimport { randomUUID } from &#8216;crypto&#8217;;<br \/>\nimport * as Minio from &#8216;minio&#8217;;<br \/>\nimport { InjectMinio } from &#8216;src\/minio\/minio.decorator&#8217;;<\/p>\n<p>@Injectable()<br \/>\nexport class FilesService {<br \/>\n  protected _bucketName = &#8216;main&#8217;;<\/p>\n<p>  constructor(@InjectMinio() private readonly minioService: Minio.Client) {}<\/p>\n<p>  async bucketsList() {<br \/>\n    return await this.minioService.listBuckets();<br \/>\n  }<\/p>\n<p>  async getFile(filename: string) {<br \/>\n    return await this.minioService.presignedUrl(<br \/>\n      &#8216;GET&#8217;,<br \/>\n      this._bucketName,<br \/>\n      filename,<br \/>\n    );<br \/>\n  }<\/p>\n<p>  uploadFile(file: Express.Multer.File) {<br \/>\n    return new Promise((resolve, reject) =&gt; {<br \/>\n      const filename = `${randomUUID().toString()}-${file.originalname}`;<br \/>\n      this.minioService.putObject(<br \/>\n        this._bucketName,<br \/>\n        filename,<br \/>\n        file.buffer,<br \/>\n        file.size,<br \/>\n        (error, objInfo) =&gt; {<br \/>\n          if (error) {<br \/>\n            reject(error);<br \/>\n          } else {<br \/>\n            resolve(objInfo);<br \/>\n          }<br \/>\n        },<br \/>\n      );<br \/>\n    });<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u0645\u0627\u0644 \u0645\u0646 \u0627\u0633\u062a files.controller.ts<\/p>\n<p>import { Body, Controller, Get, Param, Post, UploadedFile, UseInterceptors } from &#8216;@nestjs\/common&#8217;;<br \/>\nimport { FilesService } from &#8216;.\/files.service&#8217;;<br \/>\nimport { FileInterceptor } from &#8216;@nestjs\/platform-express&#8217;;<\/p>\n<p>@Controller(&#8216;files&#8217;)<br \/>\nexport class FilesController {<br \/>\n  constructor(readonly service: FilesService) {}<\/p>\n<p>  @Get(&#8216;buckets&#8217;)<br \/>\n  bucketsList() {<br \/>\n    return this.service.bucketsList();<br \/>\n  }<\/p>\n<p>  @Get(&#8216;file-url\/:name&#8217;)<br \/>\n  getFile(@Param(&#8216;name&#8217;) name: string) {<br \/>\n    return this.service.getFile(name);<br \/>\n  }<\/p>\n<p>  @Post(&#8216;upload&#8217;)<br \/>\n  @UseInterceptors(FileInterceptor(&#8216;file&#8217;))<br \/>\n  uploadFile(<br \/>\n    @UploadedFile(&#8216;file&#8217;) file: Express.Multer.File,<br \/>\n  ) {<br \/>\n    payload.file = file;<br \/>\n    return this.service.uploadFile(file);<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0631\u0633\u0627\u0644 \u0641\u0627\u06cc\u0644 \u0628\u0647 POST \/files\/upload \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u067e\u0627\u0633\u062e \u0631\u0627 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f:<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0632 \u06a9\u0646\u0633\u0648\u0644 minio \u0628\u0627\u0632\u062f\u06cc\u062f \u06a9\u0646\u06cc\u0645 \u0648 \u0628\u0647 \u0633\u0637\u0644 \u0627\u0635\u0644\u06cc \u0628\u0631\u0648\u06cc\u0645 \u062a\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0622\u06cc\u0627 \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631\u0622\u067e\u0644\u0648\u062f \u0634\u062f \ud83e\udd73<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f URL \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645 (\u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0641\u0627\u06cc\u0644) GET \/files\/file-url\/. \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0641\u0627\u06cc\u0644 \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f URL \u0631\u0627 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f:http:\/\/localhost:8000\/main\/2254a964-28dd-4c35-8494-5e767693cd26-iOS%2BSyllabus.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=m0iWmenUgJi2xBcFNNPF%2F20241129%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20241129T065735Z&amp;X-Amz-Expires=604800&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=a052b98dcfa95a4d1cdb1c9b0b91d1263440adf184aab5238e6d572c0f42e7c5\u0627\u06af\u0631 \u0627\u0632 \u0627\u06cc\u0646 URL \u0628\u0627\u0632\u062f\u06cc\u062f \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u0644\u06cc\u0646\u06a9 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<p>*\u0631\u0627\u06cc\u06af\u0627\u0646 &#8211; MinIO \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u062f \u0645\u06cc\u0632\u0628\u0627\u0646 \u062a\u062d\u062a \u0645\u062c\u0648\u0632 GNU AGPLv3 \u0631\u0627\u06cc\u06af\u0627\u0646 \u0627\u0633\u062a\u060c \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0648 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0647\u0631 \u06af\u0648\u0646\u0647 \u062a\u063a\u06cc\u06cc\u0631\u06cc \u06a9\u0647 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u06cc\u062f \u0646\u06cc\u0632 \u062a\u062d\u062a \u0647\u0645\u0627\u0646 \u0645\u062c\u0648\u0632 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f. \u0627\u06cc\u0646 \u0645\u062c\u0648\u0632 \u0622\u0632\u0627\u062f\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u0645\u0637\u0627\u0644\u0639\u0647\u060c \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0631\u06cc \u0648 \u0627\u0635\u0644\u0627\u062d \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0647\u0645\u06cc\u0646. \u0628\u0627 \u062a\u0634\u06a9\u0631 \u0627\u0632 \u062e\u0648\u0627\u0646\u062f\u0646\u060c \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f. \u0627\u06af\u0631 \u0627\u0634\u062a\u0628\u0627\u0647 \u06cc\u0627 \u0645\u0634\u06a9\u0644\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u06cc\u062f\u060c \u062f\u0631 \u0646\u0638\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06cc\u0627 \u0628\u0647 \u0645\u0646 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f.<\/p>\n<div data-article-id=\"2126340\" id=\"article-body\">\n<p>\u0645\u06cc\u0646\u06cc\u0648 \u0686\u06cc\u0633\u062a\u061f Minio *\u0631\u0627\u06cc\u06af\u0627\u0646\u060c \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0628\u0627 S3 \u0633\u0627\u0632\u06af\u0627\u0631 \u0627\u0633\u062a <strong>\u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0627\u0634\u06cc\u0627<\/strong>.<\/p>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u062f\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 docker \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0646 \u0627\u0632 \u067e\u06a9\u06cc\u062c \u0645\u06cc\u0646\u06cc\u0648 \u0628\u06cc\u062a\u0646\u0627\u0645\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u06a9\u0646\u0645. \u0633\u0631\u0648\u06cc\u0633 \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u0628\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>docker-compose.yaml<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">minio<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">bitnami\/minio:2024.11.7<\/span>\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">${MINIO_PORT}:${MINIO_PORT}<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">${MINIO_CONSOLE_PORT}:${MINIO_CONSOLE_PORT}<\/span>\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">MINIO_ROOT_USER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${MINIO_USER}<\/span>\n      <span class=\"na\">MINIO_ROOT_PASSWORD<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${MINIO_PASSWORD}<\/span>\n      <span class=\"na\">MINIO_DEFAULT_BUCKETS<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${MINIO_BUCKET}<\/span>\n      <span class=\"na\">MINIO_API_PORT_NUMBER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${MINIO_PORT}<\/span>\n      <span class=\"na\">MINIO_CONSOLE_PORT_NUMBER<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${MINIO_CONSOLE_PORT}<\/span>\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">minio-data:\/bitnami\/minio\/data<\/span>\n\n<span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">minio-data<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">driver<\/span><span class=\"pi\">:<\/span> <span class=\"s\">local<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u0627\u06cc\u0646 \u0631\u0627 \u0633\u0631\u06cc\u0639 \u062a\u0648\u0636\u06cc\u062d \u062f\u0647\u0645:<\/p>\n<ol>\n<li>\n<p><code>ports<\/code>: <code>MINIO_PORT<\/code> \u067e\u0648\u0631\u062a minio \u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc API \u0627\u0633\u062a\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0627\u0632 \u0646\u0627\u0645\u0634 \u0645\u0634\u062e\u0635 \u0627\u0633\u062a <code>MINIO_CONSOLE_PORT<\/code> \u067e\u0648\u0631\u062a \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u0645\u06cc\u0646\u06cc\u0648 \u0627\u0633\u062a:<br \/><\/p>\n<\/li>\n<li>\n<p><code>MINIO_ROOT_USER<\/code>  &#038; <code>MINIO_ROOT_PASSWORD<\/code> \u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u062f\u0627\u0634\u0628\u0648\u0631\u062f \u06a9\u0646\u0633\u0648\u0644 Minio \u0647\u0633\u062a\u0646\u062f.<\/p>\n<\/li>\n<\/ol>\n<p><em>\u0628\u0631\u0627\u06cc \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0645\u0648\u0631\u062f <code>env<\/code> \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc\u0646\u06cc\u0648 \u062f\u0627\u06a9\u0631\u060c \u0627\u0632 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0645\u06cc\u0646\u06cc\u0648\u0646 \u0628\u06cc\u062a\u0646\u0627\u0645\u06cc \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f<\/em><\/p>\n<p>\u0627\u06cc\u0646 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627 \u0631\u0627 \u0628\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>.env<\/code> \u0641\u0627\u06cc\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>MINIO_PORT=9000\nMINIO_CONSOLE_PORT=8000\nMINIO_USER=\"admin\"\nMINIO_PASSWORD=\"veryhardpassword\"\nMINIO_BUCKET=\"main\"\nMINIO_ENDPOINT=\"localhost\"\nMINIO_ACCESS_KEY=\"\"\nMINIO_SECRET_KEY=\"\"\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0647 <strong>\u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u0648 \u0631\u0627\u0632<\/strong> \u06a9\u0644\u06cc\u062f\u0647\u0627:<\/p>\n<ol>\n<li>\n<p>\u0628\u0647 \u06a9\u0646\u0633\u0648\u0644 Minio \u0628\u0631\u0648\u06cc\u062f <em>(\u062f\u0631 \u0645\u062b\u0627\u0644 \u0645\u0627 http:\/\/localhost:8000 \u0627\u0633\u062a)<\/em> &#038; \u0648\u0627\u0631\u062f \u0634\u0648\u06cc\u062f<\/p>\n<\/li>\n<li>\n<p>\u0628\u0631\u0648 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0648 <strong>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0644\u06cc\u062f \u062f\u0633\u062a\u0631\u0633\u06cc<\/strong><br \/><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcmil47z9gwj9giiso6st.png\" alt=\"\u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u06a9\u0646\u0633\u0648\u0644 Minio\" loading=\"lazy\" width=\"800\" height=\"521\" title=\"\"><br \/><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7q9yvle8yxtcj09cpk0.png\" alt=\"\u06a9\u0644\u06cc\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u0633\u0648\u0644 Minio\" loading=\"lazy\" width=\"800\" height=\"521\" title=\"\"><\/p>\n<\/li>\n<li>\n<p>\u06a9\u067e\u06cc \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc\/\u0645\u062e\u0641\u06cc \u0628\u0647 <code>.env<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0628\u0633\u062a\u0647 npm \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm add minio\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>minio\/minio.decorator.ts<\/code> &#038; <code>minio\/minio.module.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Inject<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">MINIO_TOKEN<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">MINIO_INJECT_TOKEN<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">InjectMinio<\/span><span class=\"p\">():<\/span> <span class=\"nx\">ParameterDecorator<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nc\">Inject<\/span><span class=\"p\">(<\/span><span class=\"nx\">MINIO_TOKEN<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Global<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Module<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ConfigService<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/config<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">MINIO_TOKEN<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/minio.decorator<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">Minio<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">minio<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"p\">@<\/span><span class=\"nd\">Global<\/span><span class=\"p\">()<\/span>\n<span class=\"p\">@<\/span><span class=\"nd\">Module<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">exports<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">MINIO_TOKEN<\/span><span class=\"p\">],<\/span>\n  <span class=\"na\">providers<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">inject<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">ConfigService<\/span><span class=\"p\">],<\/span>\n      <span class=\"na\">provide<\/span><span class=\"p\">:<\/span> <span class=\"nx\">MINIO_TOKEN<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">useFactory<\/span><span class=\"p\">:<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span>\n        <span class=\"na\">configService<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ConfigService<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">):<\/span> <span class=\"nb\">Promise<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Minio<\/span><span class=\"p\">.<\/span><span class=\"nx\">Client<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Minio<\/span><span class=\"p\">.<\/span><span class=\"nc\">Client<\/span><span class=\"p\">({<\/span>\n          <span class=\"na\">endPoint<\/span><span class=\"p\">:<\/span> <span class=\"nx\">configService<\/span><span class=\"p\">.<\/span><span class=\"nf\">getOrThrow<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">MINIO_ENDPOINT<\/span><span class=\"dl\">\"<\/span><span class=\"p\">),<\/span>\n          <span class=\"na\">port<\/span><span class=\"p\">:<\/span> <span class=\"o\">+<\/span><span class=\"nx\">configService<\/span><span class=\"p\">.<\/span><span class=\"nf\">getOrThrow<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">MINIO_PORT<\/span><span class=\"dl\">\"<\/span><span class=\"p\">),<\/span>\n          <span class=\"na\">accessKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">configService<\/span><span class=\"p\">.<\/span><span class=\"nf\">getOrThrow<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">MINIO_ACCESS_KEY<\/span><span class=\"dl\">\"<\/span><span class=\"p\">),<\/span>\n          <span class=\"na\">secretKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">configService<\/span><span class=\"p\">.<\/span><span class=\"nf\">getOrThrow<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">MINIO_SECRET_KEY<\/span><span class=\"dl\">\"<\/span><span class=\"p\">),<\/span>\n          <span class=\"na\">useSSL<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">});<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">client<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">],<\/span>\n<span class=\"p\">})<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">MinioModule<\/span> <span class=\"p\">{}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0632 \u0645\u06cc\u0646\u06cc\u0648 \u0641\u0642\u0637 \u062f\u0631 \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f <em>(\u0645\u062b\u0644\u0627\u064b \u0645\u0627\u0698\u0648\u0644 \u0641\u0627\u06cc\u0644)<\/em> \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f <code>@Global()<\/code> \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631<\/p>\n<p>\u0622\u0646 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f <code>app.module.ts<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"p\">@<\/span><span class=\"nd\">Module<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">imports<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n    <span class=\"p\">...<\/span>\n    <span class=\"nx\">MinioModule<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">],<\/span>\n<span class=\"p\">})<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">AppModule<\/span> <span class=\"p\">{}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645. Minio \u0631\u0627 \u0628\u0647 \u0633\u0631\u0648\u0631 \u062e\u0648\u062f \u062a\u0632\u0631\u06cc\u0642 \u06a9\u0646\u06cc\u062f <em>(<code>files.service.ts<\/code> \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644)<\/em><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Injectable<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">randomUUID<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">crypto<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">Minio<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">minio<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">InjectMinio<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">src\/minio\/minio.decorator<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"p\">@<\/span><span class=\"nd\">Injectable<\/span><span class=\"p\">()<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">FilesService<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">protected<\/span> <span class=\"nx\">_bucketName<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">main<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(@<\/span><span class=\"nd\">InjectMinio<\/span><span class=\"p\">()<\/span> <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"nx\">minioService<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Minio<\/span><span class=\"p\">.<\/span><span class=\"nx\">Client<\/span><span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">bucketsList<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">await<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">minioService<\/span><span class=\"p\">.<\/span><span class=\"nf\">listBuckets<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">async<\/span> <span class=\"nf\">getFile<\/span><span class=\"p\">(<\/span><span class=\"nx\">filename<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">await<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">minioService<\/span><span class=\"p\">.<\/span><span class=\"nf\">presignedUrl<\/span><span class=\"p\">(<\/span>\n      <span class=\"dl\">'<\/span><span class=\"s1\">GET<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">_bucketName<\/span><span class=\"p\">,<\/span>\n      <span class=\"nx\">filename<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">uploadFile<\/span><span class=\"p\">(<\/span><span class=\"nx\">file<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Express<\/span><span class=\"p\">.<\/span><span class=\"nx\">Multer<\/span><span class=\"p\">.<\/span><span class=\"nx\">File<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Promise<\/span><span class=\"p\">((<\/span><span class=\"nx\">resolve<\/span><span class=\"p\">,<\/span> <span class=\"nx\">reject<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">filename<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nf\">randomUUID<\/span><span class=\"p\">().<\/span><span class=\"nf\">toString<\/span><span class=\"p\">()}<\/span><span class=\"s2\">-<\/span><span class=\"p\">${<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">originalname<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">minioService<\/span><span class=\"p\">.<\/span><span class=\"nf\">putObject<\/span><span class=\"p\">(<\/span>\n        <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">_bucketName<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">filename<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">buffer<\/span><span class=\"p\">,<\/span>\n        <span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">size<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">,<\/span> <span class=\"nx\">objInfo<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nf\">reject<\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">);<\/span>\n          <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nf\">resolve<\/span><span class=\"p\">(<\/span><span class=\"nx\">objInfo<\/span><span class=\"p\">);<\/span>\n          <span class=\"p\">}<\/span>\n        <span class=\"p\">},<\/span>\n      <span class=\"p\">);<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0645\u0627\u0644 \u0645\u0646 \u0627\u0633\u062a <code>files.controller.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Body<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Controller<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Get<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Param<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Post<\/span><span class=\"p\">,<\/span> <span class=\"nx\">UploadedFile<\/span><span class=\"p\">,<\/span> <span class=\"nx\">UseInterceptors<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/common<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FilesService<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/files.service<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FileInterceptor<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@nestjs\/platform-express<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n\n<span class=\"p\">@<\/span><span class=\"nd\">Controller<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">files<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">FilesController<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor<\/span><span class=\"p\">(<\/span><span class=\"k\">readonly<\/span> <span class=\"nx\">service<\/span><span class=\"p\">:<\/span> <span class=\"nx\">FilesService<\/span><span class=\"p\">)<\/span> <span class=\"p\">{}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">Get<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">buckets<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"nf\">bucketsList<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">service<\/span><span class=\"p\">.<\/span><span class=\"nf\">bucketsList<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">Get<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">file-url\/:name<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"nf\">getFile<\/span><span class=\"p\">(@<\/span><span class=\"nd\">Param<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">name<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"nx\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">service<\/span><span class=\"p\">.<\/span><span class=\"nf\">getFile<\/span><span class=\"p\">(<\/span><span class=\"nx\">name<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"p\">@<\/span><span class=\"nd\">Post<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">upload<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">@<\/span><span class=\"nd\">UseInterceptors<\/span><span class=\"p\">(<\/span><span class=\"nc\">FileInterceptor<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">file<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span>\n  <span class=\"nf\">uploadFile<\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">@<\/span><span class=\"nd\">UploadedFile<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">file<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"nx\">file<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Express<\/span><span class=\"p\">.<\/span><span class=\"nx\">Multer<\/span><span class=\"p\">.<\/span><span class=\"nx\">File<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">payload<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">file<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">return<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">service<\/span><span class=\"p\">.<\/span><span class=\"nf\">uploadFile<\/span><span class=\"p\">(<\/span><span class=\"nx\">file<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0631\u0633\u0627\u0644 \u0641\u0627\u06cc\u0644 \u0628\u0647 <code>POST \/files\/upload<\/code> \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u067e\u0627\u0633\u062e \u0631\u0627 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f:<br \/><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfgjn6j6ny7xscwoxxt3.png\" alt=\"\u0627\u062f\u063a\u0627\u0645 Minio \u0628\u0627 nestjs | \u0622\u067e\u0644\u0648\u062f \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0641\u0627\u06cc\u0644\" loading=\"lazy\" width=\"800\" height=\"353\" title=\"\"><\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0632 \u06a9\u0646\u0633\u0648\u0644 minio \u0628\u0627\u0632\u062f\u06cc\u062f \u06a9\u0646\u06cc\u0645 \u0648 \u0628\u0647 \u0633\u0637\u0644 \u0627\u0635\u0644\u06cc \u0628\u0631\u0648\u06cc\u0645 \u062a\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0622\u06cc\u0627 \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631<br \/><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5x3wnvgy5v9dsk4lsvxq.png\" alt=\"\u0627\u062f\u063a\u0627\u0645 Minio \u0628\u0627 nestjs | \u0622\u067e\u0644\u0648\u062f \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0641\u0627\u06cc\u0644\" loading=\"lazy\" width=\"800\" height=\"453\" title=\"\"><br \/>\u0622\u067e\u0644\u0648\u062f \u0634\u062f \ud83e\udd73<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f URL \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644 \u0622\u067e\u0644\u0648\u062f \u0634\u062f\u0647 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645 (\u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0641\u0627\u06cc\u0644) <code>GET \/files\/file-url\/<file_name\/><\/code>. \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0641\u0627\u06cc\u0644 \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f URL \u0631\u0627 \u0628\u0631\u06af\u0631\u062f\u0627\u0646\u062f:<br \/><code>http:\/\/localhost:8000\/main\/2254a964-28dd-4c35-8494-5e767693cd26-iOS%2BSyllabus.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=m0iWmenUgJi2xBcFNNPF%2F20241129%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20241129T065735Z&amp;X-Amz-Expires=604800&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Signature=a052b98dcfa95a4d1cdb1c9b0b91d1263440adf184aab5238e6d572c0f42e7c5<\/code><br \/>\u0627\u06af\u0631 \u0627\u0632 \u0627\u06cc\u0646 URL \u0628\u0627\u0632\u062f\u06cc\u062f \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0622\u0646 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<blockquote>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u0644\u06cc\u0646\u06a9 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<\/blockquote>\n<hr\/>\n<p><em>*\u0631\u0627\u06cc\u06af\u0627\u0646 &#8211; MinIO \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u062f \u0645\u06cc\u0632\u0628\u0627\u0646 \u062a\u062d\u062a \u0645\u062c\u0648\u0632 GNU AGPLv3 \u0631\u0627\u06cc\u06af\u0627\u0646 \u0627\u0633\u062a\u060c \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0648 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0647\u0631 \u06af\u0648\u0646\u0647 \u062a\u063a\u06cc\u06cc\u0631\u06cc \u06a9\u0647 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u06cc\u062f \u0646\u06cc\u0632 \u062a\u062d\u062a \u0647\u0645\u0627\u0646 \u0645\u062c\u0648\u0632 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f. \u0627\u06cc\u0646 \u0645\u062c\u0648\u0632 \u0622\u0632\u0627\u062f\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u060c \u0645\u0637\u0627\u0644\u0639\u0647\u060c \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0631\u06cc \u0648 \u0627\u0635\u0644\u0627\u062d \u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u0631\u0627 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f.<\/em><\/p>\n<p><em>\u0647\u0645\u06cc\u0646. \u0628\u0627 \u062a\u0634\u06a9\u0631 \u0627\u0632 \u062e\u0648\u0627\u0646\u062f\u0646\u060c \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u0645 \u0628\u0631\u0627\u06cc \u0634\u0645\u0627 \u0645\u0641\u06cc\u062f \u0628\u0627\u0634\u062f. \u0627\u06af\u0631 \u0627\u0634\u062a\u0628\u0627\u0647 \u06cc\u0627 \u0645\u0634\u06a9\u0644\u06cc \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u06cc\u062f\u060c \u062f\u0631 \u0646\u0638\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06cc\u0627 \u0628\u0647 \u0645\u0646 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f.<\/em><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0645\u06cc\u0646\u06cc\u0648 \u0686\u06cc\u0633\u062a\u061f Minio *\u0631\u0627\u06cc\u06af\u0627\u0646\u060c \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0648 \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0628\u0627 S3 \u0633\u0627\u0632\u06af\u0627\u0631 \u0627\u0633\u062a \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u0627\u0634\u06cc\u0627. \u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u062f\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 docker \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0646 \u0627\u0632 \u067e\u06a9\u06cc\u062c \u0645\u06cc\u0646\u06cc\u0648 \u0628\u06cc\u062a\u0646\u0627\u0645\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u06a9\u0646\u0645. \u0633\u0631\u0648\u06cc\u0633 \u0645\u06cc\u0646\u06cc\u0648 \u0631\u0627 \u0628\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f docker-compose.yaml: services: minio: &hellip;<\/p>\n","protected":false},"author":2,"featured_media":85995,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-85994","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/85994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=85994"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/85994\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/85995"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=85994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=85994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=85994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}