<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Chulakov_Dev</title><generator>teletype.in</generator><description><![CDATA[Chulakov_Dev]]></description><image><url>https://img3.teletype.in/files/21/b9/21b99e94-e410-4afd-95b6-685e47aff6db.png</url><title>Chulakov_Dev</title><link>https://teletype.in/@chulakov_dev</link></image><link>https://teletype.in/@chulakov_dev?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/chulakov_dev?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/chulakov_dev?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 14 May 2026 10:20:10 GMT</pubDate><lastBuildDate>Thu, 14 May 2026 10:20:10 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@chulakov_dev/ZhXNIw7gFdF</guid><link>https://teletype.in/@chulakov_dev/ZhXNIw7gFdF?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev</link><comments>https://teletype.in/@chulakov_dev/ZhXNIw7gFdF?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev#comments</comments><dc:creator>chulakov_dev</dc:creator><title>Изучаем BigInt в JavaScript</title><pubDate>Mon, 15 Apr 2024 12:15:10 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/60/1c/601c3976-9390-4787-80e7-ecd93992dba4.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/54/24/5424bb5e-4f28-483b-9c0b-ed7263f986a8.png"></img>Работаем с огромными числами без потери точности]]></description><content:encoded><![CDATA[
  <figure id="VshE" class="m_retina">
    <img src="https://img2.teletype.in/files/54/24/5424bb5e-4f28-483b-9c0b-ed7263f986a8.png" width="540" />
  </figure>
  <p id="gRPL">Работаем с огромными числами без потери точности</p>
  <p id="d9vZ"></p>
  <p id="T5tV"><strong>🔢 Что такое BigInt?</strong></p>
  <p id="B2m4">BigInt — это тип, который позволяет безопасно работать с большими целочисленными значениями. Наибольшее число, которое JavaScript может надежно представить с помощью примитива Number, — это 2^53 – 1, выраженное константой MAX_SAFE_INTEGER.</p>
  <p id="DOXB">В отличие от стандартного типа Number, BigInt способен представлять целые числа с произвольной точностью, что позволяет избежать проблем при работе с очень большими числами.</p>
  <p id="Odox"><strong>🌐 Как использовать BigInt?</strong></p>
  <p id="LUgN">Чтобы создать BigInt, добавьте n в конец целочисленного литерала или используйте функцию BigInt():</p>
  <p id="JohB"><code>const hugeNumber = 9007199254740991n; // BigInt</code></p>
  <p id="ixRb"><code>const anotherHugeNumber = BigInt(&quot;9007199254740991&quot;); // также BigInt</code></p>
  <p id="IK45">Пример потери точности:</p>
  <p id="hEQP"><strong>// Обычные числа</strong></p>
  <p id="BOfQ"><code>let regularNumber = 9007199254740992; // это максимальное целое число в JavaScript</code></p>
  <p id="4vfk"><code>console.log(regularNumber); // Вывод: 9007199254740992</code></p>
  <p id="l6FN"><code>console.log(regularNumber + 1); // Вывод: 9007199254740992</code> (потеря точности)</p>
  <p id="qSXQ"><strong>// Использование BigInt</strong></p>
  <p id="mgXS"><code>let bigIntNumber = BigInt(&quot;9007199254740992000&quot;); // используем строку для создания BigInt</code></p>
  <p id="w1hI"><code>console.log(bigIntNumber); // Вывод: 9007199254740992000n</code></p>
  <p id="3zUw"><code>console.log(bigIntNumber + 1n); // Вывод: 9007199254740992001n </code>(без потери точности)</p>
  <p id="iIGA"><strong>👾 Когда стоит использовать?</strong></p>
  <ol id="5kjx">
    <li id="ATWK">Когда вам нужно работать с очень большими числами, которые не помещаются в обычные числовые типы (например факториалы, числа Фибоначчи, большие простые числа).</li>
  </ol>
  <p id="3Q4w">Пример:</p>
  <p id="AXsc"><code>function factorial(n) {</code></p>
  <p id="WpBp"><code>if (n === 0n) return 1n;</code></p>
  <p id="qxyC"><code>return n * factorial(n - 1n);</code></p>
  <p id="YYCS"><code>}</code></p>
  <p id="fTyo"><code>const result = factorial(1000n); // очень большое число!</code></p>
  <ol id="9uia">
    <li id="xfxo">Когда вы обрабатываете большие объемы данных, например в финансовых приложениях или аналитике.</li>
  </ol>
  <p id="BpiW">Пример:</p>
  <p id="euKf"><code>const transactions = [1097857843333489700n, 297678444489000n, 506553670n, 1507899978870n]; // большие суммы</code></p>
  <p id="7mKK"><code>const totalAmount = transactions.reduce((sum, amount) =&gt; sum + amount, 0n);</code></p>
  <p id="ptPv">⚠️<strong> Ограничения:</strong></p>
  <ol id="ysiP">
    <li id="PHFY">BigInt не может быть использован с методами Math и не должен смешиваться с обычными числами типа Number в арифметических операциях.</li>
    <li id="4Hjz">Будьте осторожны при преобразовании между BigInt и Number (возможна потеря точности).</li>
  </ol>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@chulakov_dev/podkluchenie_Strapi_k_Postgres</guid><link>https://teletype.in/@chulakov_dev/podkluchenie_Strapi_k_Postgres?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev</link><comments>https://teletype.in/@chulakov_dev/podkluchenie_Strapi_k_Postgres?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev#comments</comments><dc:creator>chulakov_dev</dc:creator><title>Подключение Strapi к базе данных Postgres</title><pubDate>Fri, 15 Sep 2023 10:20:34 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/68/a8/68a8b79b-3169-4a7c-9b92-2b15f6601ceb.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/4b/6d/4b6d5cde-0b26-4f64-a8bf-645c61ab1aea.png"></img>Прежде чем настроить подключение, необходимо запустить саму базу данных. В нашем примере Postgres мы развернем в docker-окружении. Пример docker-compose может быть следующим:]]></description><content:encoded><![CDATA[
  <figure id="CRJI" class="m_column">
    <img src="https://img1.teletype.in/files/4b/6d/4b6d5cde-0b26-4f64-a8bf-645c61ab1aea.png" width="2400" />
  </figure>
  <p id="ByCl">Прежде чем настроить подключение, необходимо запустить саму базу данных. В нашем примере Postgres мы развернем в docker-окружении. Пример docker-compose может быть следующим:</p>
  <pre id="KBvh" data-lang="bash">version: &#x27;3.7&#x27;

networks:
    backend-network:
        external:
            name: &quot;backend-network&quot;

services:
    postgres:
        image: postgres:14.0
        container_name: postgres
        restart: always
        environment:
            POSTGRES_USER: &quot;${POSTGRES_USER}&quot;
            POSTGRES_PASSWORD: &quot;${POSTGRES_PASSWORD}&quot;
        volumes:
            - ./data:/var/lib/postgresql/data:rw
        networks:
            - backend-network

    # Adminer container
    adminer:
        image: adminer:latest
        container_name: adminer
        restart: always
        depends_on:
          - postgres
        ports:
          - 9019:8080
        networks:
            - backend-network

volumes:
    data:
        driver: local</pre>
  <p id="U7ef"></p>
  <p id="5pSh">В примере для удобства просмотра через веб-интерфейс добавлен adminer. Для подключения к веб-интерфейсу необходимо в адресной строке браузера набрать <code>http://&lt;IP-адрес-сервера&gt;:8080</code></p>
  <p id="Uedr">В файле .env заполняем переменные: <code>POSTGRES_USER</code> — пользователь БД, <code>POSTGRES_PASSWORD</code> — пароль для подключения к БД.<br /><br />Запускаем окружение с помощью команды:</p>
  <pre id="IEbx" data-lang="bash">docker-compose up -d</pre>
  <p id="EMdJ"><br />Проверяем статус</p>
  <pre id="tzFe" data-lang="bash">[centos@vm-01]$ docker-compose ps
Name                   Command                 State     Ports
------------------------------------------------------------------
adminer         entrypoint.sh php -S [::]: ...   Up      0.0.0.0:9019-&gt;8080/tcp
postgres-14.0   docker-entrypoint.sh postgres    Up      5432/tcp</pre>
  <p id="QAfK"></p>
  <p id="J5JG">Заходим в контейнер с помощью команды <code>docker exec -it postgres-14.0 bash</code></p>
  <p id="sN30">Для подключения к созданной БД используем команду <code>psql -Uusername</code>, где username — это пользователь БД, заданный в переменной <code>POSTGRES_USER</code> в файле .env</p>
  <p id="mDk3">При успешном подключении должна появиться командная строка, например:</p>
  <pre id="RA1g" data-lang="bash">81fbb2d54a29:/# psql -Uusername
psql (14.8)
Type &quot;help&quot; for help.
postgreadmin=#</pre>
  <p id="mHGz"></p>
  <p id="QdTK">Создаем БД с помощью команды:</p>
  <pre id="4EP4" data-lang="bash">CREATE DATABASE strapidb WITH OWNER username;</pre>
  <p id="Kun3"></p>
  <p id="fx8p">Проверяем, что база данных успешно создана, набрав команду: <code>\l</code></p>
  <pre id="pa2g" data-lang="bash">postgreadmin-# \l
                                         List of databases
     Name      |    Owner     | Encoding |  Collate   |   Ctype    |       Access privileges
---------------+--------------+----------+------------+------------+-------------------------------
   strapidb    |   username   | UTF8     | en_US.utf8 | en_US.utf8 |</pre>
  <p id="DclQ"></p>
  <p id="31u8">Теперь в docker-окружении Strapi в файле .env указываем данные для подключения к нашей созданной БД, например:</p>
  <pre id="c3qK">DATABASE_CLIENT=postgres
DATABASE_HOST=postgres-14.0
DATABASE_PORT=5432
DATABASE_NAME=strapidb
DATABASE_USERNAME=username
DATABASE_PASSWORD=12345678</pre>
  <p id="j81Q"></p>
  <p id="6eQ8"><code>DATABASE_CLIENT</code> — указывает на то, что в качестве клиента Strapi будет использовать Postgres.</p>
  <p id="IPxT"><code>DATABASE_HOST</code> — указывает наименование запущенного контейнера Postgres, в нашем примере это <strong>postgres-14.0</strong>.</p>
  <p id="cZJF"><code>DATABASE_PORT</code> — порт, на котором работает БД.</p>
  <p id="xUha"><code>DATABASE_NAME</code> — имя базы данных, в нашем примере <strong>strapidb</strong>.</p>
  <p id="UXRS"><code>DATABASE_USERNAME</code> — пользователь, указанный в переменной <strong>POSTGRES_USER</strong>,</p>
  <p id="cyxF"><code>DATABASE_PASSWORD</code> — пароль, указанный в переменной <strong>POSTGRES_PASSWORD</strong>.</p>
  <p id="LQUD"></p>
  <p id="OkM3"><a href="https://t.me/chulakov_dev" target="_blank">Вернуться в Chulakov Dev</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@chulakov_dev/5nHdVVKilSY</guid><link>https://teletype.in/@chulakov_dev/5nHdVVKilSY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev</link><comments>https://teletype.in/@chulakov_dev/5nHdVVKilSY?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev#comments</comments><dc:creator>chulakov_dev</dc:creator><title>Поверхностное и глубокое копирование в JavaScript</title><pubDate>Tue, 12 Sep 2023 07:45:15 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/38/7b/387b1640-1025-4058-8bf1-8ed59846d3cd.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/08/da/08dafcbc-23a0-41a5-b89c-991b6492ec21.png"></img>Прежде чем перейти к подробному рассмотрению способов копирования данных, давайте сперва разберемся, в чем разница между передачей данных по значению и по ссылке.]]></description><content:encoded><![CDATA[
  <figure id="AmKe" class="m_column">
    <img src="https://img1.teletype.in/files/08/da/08dafcbc-23a0-41a5-b89c-991b6492ec21.png" width="2400" />
  </figure>
  <p id="638s">Прежде чем перейти к подробному рассмотрению способов копирования данных, давайте сперва разберемся, в чем разница между передачей данных по значению и по ссылке.</p>
  <p id="Cmb1">Как мы знаем, в JavaScript данные в переменную передаются либо по значению, либо по ссылке. В первом случае по значению передаются только примитивы. К ним относятся такие типы, как строка, число, булево значение, символ и т.д. А во втором случае по ссылке передаются объекты.</p>
  <p id="SnE2">Что значит передача по значению? Это когда в переменной записывается конкретное значение, которое имеет свой уникальный адрес в памяти.</p>
  <p id="HyVZ">Пример:</p>
  <pre id="XYzV" data-lang="javascript">let user1 = &quot;Ivan&quot;;</pre>
  <pre id="UWSd" data-lang="javascript">let user2 = &quot;Alex&quot;;</pre>
  <p id="HAzA"></p>
  <p id="PXDB">Также мы можем скопировать в переменную user2 другую переменную user1. И обе эти переменные будут иметь уникальные адреса в памяти и между собой никак не будут связаны.</p>
  <p id="in72">В случае передачи по ссылке при копировании объекта мы лишь присваиваем ссылку на данные, то есть назначаем адрес памяти объекта оригинальной переменной.</p>
  <p id="Z8VF"></p>
  <h3 id="7kr9"><strong>Поверхностное копирование</strong></h3>
  <p id="rqqW">Рассмотрим способы поверхностного копирования объектов.</p>
  <p id="ZyMb">1. Самый короткий и простой способ скопировать объект — это использовать синтаксис spread.</p>
  <p id="w7V8">Пример:</p>
  <pre id="PD9O" data-lang="javascript">const person = { name: &quot;Ivan&quot;, age: 23 };</pre>
  <pre id="frlr" data-lang="javascript">const clonedPerson = { ...person }; // Object { name: &quot;Ivan&quot;, age: 23 }</pre>
  <p id="mfkX"></p>
  <p id="e4Mw">2. Также для копирования объекта можно использовать метод Object.assign().</p>
  <p id="NjoA">Пример:</p>
  <pre id="xXRT" data-lang="javascript">const person = { name: &quot;Ivan&quot;, age: 23 };</pre>
  <pre id="SmOC" data-lang="javascript">const clonedPerson = Object.assign({}, person); // Object { name: &quot;Ivan&quot;, age: 23 }</pre>
  <p id="c9w3"></p>
  <p id="wHer">Проблема с этими двумя подходами заключается в том, что они просто создают новый объект, который имеет точную копию значений в исходном объекте. Но, если любое из полей объекта является ссылкой на другие объекты, копируются только ссылочные адреса, то есть копируется только адрес памяти. Изменение такого поля ссылки будет отражено в обоих объектах.</p>
  <p id="IiQm">Получается, что эти два метода являются полезными, но они не сработают, когда у вас есть вложенный объект для копирования.</p>
  <h3 id="p5my"></h3>
  <h3 id="id1o">Глубокое копирование</h3>
  <p id="EQV5">Теперь давайте рассмотрим современные способы глубокого копирования объектов.</p>
  <p id="VfsB">1. В JavaScript есть функция structuredClone() для глубокого копирования массивов или объектов. Она доступна в NodeJS начиная с версии 17.0.0. StructuredClone может клонировать бесконечно вложенные объекты и массивы, циклические ссылки, широкий спектр типов JavaScript, такие как Date, Set, Map, Error, RegExp, ArrayBuffer, Blob, File, ImageData и многие другие. Однако structuredClone не копирует функции, DOM-узлы и дескрипторы свойств.</p>
  <p id="pAXt">2. Применение комбинации JSON.parse() и JSON.stringify(). На самом деле это отличный способ и на удивление производительный, но есть некоторые нюансы. Такой метод может обрабатывать только объекты базовых типов, поэтому, например, new Date превратится в [object Object].</p>
  <p id="EDR9">3. Использование функции cloneDeep библиотеки Lodash. Отметим, что cloneDeep работает на основе рекурсивного обхода объекта, а это «дорогая операция», поэтому лучше использовать ее, когда это действительно необходимо. К тому же мы всегда можем написать подобную функцию самостоятельно.</p>
  <p id="V5pq"></p>
  <h3 id="vESp">Заключение</h3>
  <p id="PkxU">При создании копии нужно убедиться, хотим ли мы обновлять оригинал при изменении этой копии или нет.</p>
  <p id="0WEA">Если нам нужно обновлять оригинал, мы можем применять поверхностную копию, которая следует концепции передачи по ссылке. В противном случае можем использовать глубокую копию, которая следует концепции передачи по значению.</p>
  <p id="n4o9">Нужно понимать, что глубокое копирование может сильно влиять на производительность, поэтому используйте его, лишь когда это действительно необходимо.</p>
  <p id="pXld"></p>
  <p id="LyT1"><a href="https://t.me/chulakov_dev" target="_blank">Вернуться в Chulakov Dev</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@chulakov_dev/Zapusk_Strapi_v4_v_Docker</guid><link>https://teletype.in/@chulakov_dev/Zapusk_Strapi_v4_v_Docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev</link><comments>https://teletype.in/@chulakov_dev/Zapusk_Strapi_v4_v_Docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev#comments</comments><dc:creator>chulakov_dev</dc:creator><title>Запуск Strapi v4 в Docker</title><pubDate>Fri, 04 Aug 2023 10:10:53 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/49/e0/49e0904c-6aa3-4736-ba5f-76b493cfb8b9.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/ca/28/ca289606-05c0-47c3-9017-f26bf5923560.jpeg"></img>ㅤ]]></description><content:encoded><![CDATA[
  <figure id="CGxE" class="m_column">
    <img src="https://img1.teletype.in/files/ca/28/ca289606-05c0-47c3-9017-f26bf5923560.jpeg" width="2400" />
  </figure>
  <p id="ELcA">ㅤ</p>
  <p id="IEVc">ㅤ</p>
  <h2 id="U2Lp">Инструкция</h2>
  <p id="JG6F">Docker-compose-файл может выглядеть следующим образом:</p>
  <pre id="bAhg" data-lang="bash">version: &#x27;3.7&#x27;

networks:
    frontend:
        external:
            name: frontend-network
    backend-network:
        external:
            name: backend-network

            
services:
    strapi-app:
        image: gitlab.org/docker/images/strapi:4.11.5-1.0.0
        logging:
            driver: &#x27;json-file&#x27;
            options:
                max-file: &#x27;2&#x27;
                max-size: &#x27;5m&#x27;
        container_name: strapi
        restart: always
        env_file: .env
        environment:
            PORT: ${PORT}
            DATABASE_CLIENT: ${DATABASE_CLIENT}
            DATABASE_HOST: ${DATABASE_HOST}
            DATABASE_PORT: ${DATABASE_PORT}
            DATABASE_NAME: ${DATABASE_NAME}
            DATABASE_USERNAME: ${DATABASE_USERNAME}
            DATABASE_PASSWORD: ${DATABASE_PASSWORD}
            JWT_SECRET: ${JWT_SECRET}
            ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
            APP_KEYS: ${APP_KEYS}
            API_TOKEN_SALT: ${API_TOKEN_SALT}
            NODE_ENV: ${NODE_ENV}
        volumes:
            - ./../../app/src:/opt/app/src
            - ./../../app/public/uploads:/opt/app/public/uploads
            - ./../../app/config:/opt/app/config
        networks:
            - backend-network

volumes:
  strapi-data:
    name: &quot;strapi-data&quot;</pre>
  <p id="adVU"></p>
  <p id="v1MC">Создаем файл с переменными окружения с именем .env</p>
  <p id="UziE"></p>
  <h3 id="g2VU">Пример заполнения переменных окружения</h3>
  <p id="ue6f">PORT=3000 — порт, по которому доступно приложение Node.JS.<br />HOST_URL — адрес, по которому приложение будет доступно в браузере.<br />API_HTTP_SCHEME=http:// — при локальной разработке используется http-схема.<br />API_HTTP_DOMAIN=admin.hostname.local — API-адрес для получения изображений.<br />CLIENT_API_URL=<a href="http://admin.hostname.local/api" target="_blank">http://admin.hostname.local/api</a> — адрес, по которому осуществляется получение данных API с клиента через DNS-сервер.<br />SSR_API_URL=<a href="http://strapi-nginx/api" target="_blank">http://strapi-nginx/api</a> — адрес, по которому будем получать данные при выполнении запроса с сервера NODE JS.<br />ASSET_PREFIX= — используется для отображения статики.<br />STRAPI_PORT=1337 — порт, на котором работает Strapi.<br />APP_KEYS=&quot;examplekey1,examplekey2&quot; — секретные ключи для cookies.<br />API_TOKEN_SALT=example — используется для шифрования канала.<br />ADMIN_JWT_SECRET=examplekey — JWT-ключ для административной панели.<br />JWT_SECRET=examplekey — JWT-ключ для пользовательских прав.<br />NODE_ENV=development — запуск сборки разработчика, production — prod режим.<br />DATABASE_CLIENT=postgres — используемый клиент базы данных. <br />DATABASE_HOST=strapiDB — название хоста, на котором развернута база данных.<br />DATABASE_PORT=5432 — порт, на котором работает postgres.<br />DATABASE_NAME=strapidb — название базы данных.<br />DATABASE_USERNAME=strapi — имя пользователя базы данных.<br />DATABASE_PASSWORD=12345678 — пароль к базе данных.</p>
  <p id="lEKV"></p>
  <p id="zMOr">Запускаем приложение с помощью команды</p>
  <pre id="zCWt" data-lang="bash">docker-compose up -d</pre>
  <p id="dQh3">В файле /etc/hosts необходимо указать хост, по которому наше приложение будет доступно с браузера. В нашем случае это:</p>
  <pre id="wCRP" data-lang="bash">127.0.0.1 admin.hostname.local</pre>
  <p id="ASDZ"></p>
  <p id="jMfM"><strong><a href="https://t.me/chulakov_dev" target="_blank">Вернуться в Chulakov Dev</a></strong></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@chulakov_dev/Sozdanie-obraza-Strapi-v4</guid><link>https://teletype.in/@chulakov_dev/Sozdanie-obraza-Strapi-v4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev</link><comments>https://teletype.in/@chulakov_dev/Sozdanie-obraza-Strapi-v4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chulakov_dev#comments</comments><dc:creator>chulakov_dev</dc:creator><title>Создание образа Strapi v4</title><pubDate>Tue, 25 Jul 2023 11:00:54 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/6b/a1/6ba1a81d-01ba-4e3b-b251-368ff60c5eba.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/67/29/67295a10-cc1e-4f99-a7d5-00edff6f8718.jpeg"></img>1. После клонирования репозитория в корневой папке проекта удаляем файл yarn.lock и запускаем команду]]></description><content:encoded><![CDATA[
  <figure id="YCHH" class="m_column">
    <img src="https://img3.teletype.in/files/67/29/67295a10-cc1e-4f99-a7d5-00edff6f8718.jpeg" width="2400" />
  </figure>
  <h2 id="MYAx">ㅤ</h2>
  <h2 id="7OWS">Пошаговая инструкция</h2>
  <p id="yr68">1. После клонирования <a href="https://github.com/strapi/strapi/releases" target="_blank">репозитория</a> в корневой папке проекта удаляем файл yarn.lock и запускаем команду</p>
  <pre id="R1hI" data-lang="bash">yarn setup</pre>
  <p id="CaeW"></p>
  <p id="7x6M">2. После завершения процесса запускаем команду</p>
  <pre id="BeI9" data-lang="bash">yarn publish:packages</pre>
  <p id="AMuY"></p>
  <p id="8ota">3. В интерфейсе выбираем опцию <strong>Custom version</strong> и указываем новую версию пакетов, например <strong>4.11.5-1.0.0.</strong></p>
  <p id="UsRg"></p>
  <p id="N4p3">4. В папке <strong>Images/base</strong> удаляем <strong>yarn.lock</strong>. В файле <strong>package.json</strong> для образов, где указана старая версия, например 4.5.6, добавляем новый префикс, например <strong>4.11.5-1.0.0</strong>.</p>
  <p id="uTq6"></p>
  <p id="NdZw">5. Для формирования нового файла <strong>yarn.lock</strong>, находясь в директории <strong>Images/base</strong>, запускаем команду</p>
  <pre id="sXL3" data-lang="bash">yarn</pre>
  <p id="HuH6"></p>
  <p id="1H4H">6. Для запуска проекта в среде Docker запускаем процесс сборки образа</p>
  <pre id="O4Tt" data-lang="bash">docker build --build-arg NODE_ENV=development -t 
gitlab.org/docker/images/strapi:4.11.5-1.0.0 -f Dockerfile .</pre>
  <p id="7Gvn"></p>
  <p id="QPXI">Если требуется продакшен сборка, то команда будет </p>
  <pre id="tIhU" data-lang="bash">docker build --build-arg NODE_ENV=production -t 
gitlab.org/docker/images/strapi:4.11.5-1.0.0 -f Dockerfile .</pre>
  <p id="dMk2"></p>
  <p id="kOlX">7. Загружаем образ в репозиторий</p>
  <pre id="FTu4" data-lang="bash">docker push gitlab.org/docker/images/strapi:4.11.5-1.0.0</pre>
  <p id="zK9y"></p>
  <p id="GS1B"><strong>Пример docker-compose-файла для запуска Strapi может выглядеть следующим образом:</strong></p>
  <pre id="f4su" data-lang="bash">services:
    app:
        image: gitlab.org/docker/images/strapi:4.11.5-1.0.0
        logging:
            driver: &#x27;json-file&#x27;
            options:
                max-file: &#x27;2&#x27;
                max-size: &#x27;5m&#x27;
        container_name: strapi
        restart: always
        env_file: .env
        environment:
            PORT: ${PORT}
            DATABASE_CLIENT: ${DATABASE_CLIENT}
            DATABASE_HOST: ${DATABASE_HOST}
            DATABASE_PORT: ${DATABASE_PORT}
            DATABASE_NAME: ${DATABASE_NAME}
            DATABASE_USERNAME: ${DATABASE_USERNAME}
            DATABASE_PASSWORD: ${DATABASE_PASSWORD}
            JWT_SECRET: ${JWT_SECRET}
            ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
            APP_KEYS: ${APP_KEYS}
            API_TOKEN_SALT: ${API_TOKEN_SALT}
            NODE_ENV: ${NODE_ENV}
        volumes:
            - ./../../app/src:/opt/app/src
            - ./../../app/public/uploads:/opt/app/public/uploads
            - ./../../app/config:/opt/app/config
        networks:
            - private-network</pre>
  <p id="zxvU"></p>
  <p id="9ZRD"></p>
  <p id="oaw3"><strong><a href="https://t.me/chulakov_dev" target="_blank">Вернуться в Chulakov Dev</a></strong></p>

]]></content:encoded></item></channel></rss>