<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Chulakov_Dev</title><author><name>Chulakov_Dev</name></author><id>https://teletype.in/atom/chulakov_dev</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/chulakov_dev?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@chulakov_dev?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=chulakov_dev"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/chulakov_dev?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-14T10:20:18.346Z</updated><entry><id>chulakov_dev:ZhXNIw7gFdF</id><link rel="alternate" type="text/html" href="https://teletype.in/@chulakov_dev/ZhXNIw7gFdF?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=chulakov_dev"></link><title>Изучаем BigInt в JavaScript</title><published>2024-04-15T12:15:10.676Z</published><updated>2024-04-25T08:13:48.869Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/60/1c/601c3976-9390-4787-80e7-ecd93992dba4.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/54/24/5424bb5e-4f28-483b-9c0b-ed7263f986a8.png&quot;&gt;Работаем с огромными числами без потери точности</summary><content type="html">
  &lt;figure id=&quot;VshE&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/54/24/5424bb5e-4f28-483b-9c0b-ed7263f986a8.png&quot; width=&quot;540&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gRPL&quot;&gt;Работаем с огромными числами без потери точности&lt;/p&gt;
  &lt;p id=&quot;d9vZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;T5tV&quot;&gt;&lt;strong&gt;🔢 Что такое BigInt?&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;B2m4&quot;&gt;BigInt — это тип, который позволяет безопасно работать с большими целочисленными значениями. Наибольшее число, которое JavaScript может надежно представить с помощью примитива Number, — это 2^53 – 1, выраженное константой MAX_SAFE_INTEGER.&lt;/p&gt;
  &lt;p id=&quot;DOXB&quot;&gt;В отличие от стандартного типа Number, BigInt способен представлять целые числа с произвольной точностью, что позволяет избежать проблем при работе с очень большими числами.&lt;/p&gt;
  &lt;p id=&quot;Odox&quot;&gt;&lt;strong&gt;🌐 Как использовать BigInt?&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;LUgN&quot;&gt;Чтобы создать BigInt, добавьте n в конец целочисленного литерала или используйте функцию BigInt():&lt;/p&gt;
  &lt;p id=&quot;JohB&quot;&gt;&lt;code&gt;const hugeNumber = 9007199254740991n; // BigInt&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ixRb&quot;&gt;&lt;code&gt;const anotherHugeNumber = BigInt(&amp;quot;9007199254740991&amp;quot;); // также BigInt&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;IK45&quot;&gt;Пример потери точности:&lt;/p&gt;
  &lt;p id=&quot;hEQP&quot;&gt;&lt;strong&gt;// Обычные числа&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;BOfQ&quot;&gt;&lt;code&gt;let regularNumber = 9007199254740992; // это максимальное целое число в JavaScript&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4vfk&quot;&gt;&lt;code&gt;console.log(regularNumber); // Вывод: 9007199254740992&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;l6FN&quot;&gt;&lt;code&gt;console.log(regularNumber + 1); // Вывод: 9007199254740992&lt;/code&gt; (потеря точности)&lt;/p&gt;
  &lt;p id=&quot;qSXQ&quot;&gt;&lt;strong&gt;// Использование BigInt&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;mgXS&quot;&gt;&lt;code&gt;let bigIntNumber = BigInt(&amp;quot;9007199254740992000&amp;quot;); // используем строку для создания BigInt&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;w1hI&quot;&gt;&lt;code&gt;console.log(bigIntNumber); // Вывод: 9007199254740992000n&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3zUw&quot;&gt;&lt;code&gt;console.log(bigIntNumber + 1n); // Вывод: 9007199254740992001n &lt;/code&gt;(без потери точности)&lt;/p&gt;
  &lt;p id=&quot;iIGA&quot;&gt;&lt;strong&gt;👾 Когда стоит использовать?&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;5kjx&quot;&gt;
    &lt;li id=&quot;ATWK&quot;&gt;Когда вам нужно работать с очень большими числами, которые не помещаются в обычные числовые типы (например факториалы, числа Фибоначчи, большие простые числа).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;3Q4w&quot;&gt;Пример:&lt;/p&gt;
  &lt;p id=&quot;AXsc&quot;&gt;&lt;code&gt;function factorial(n) {&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;WpBp&quot;&gt;&lt;code&gt;if (n === 0n) return 1n;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;qxyC&quot;&gt;&lt;code&gt;return n * factorial(n - 1n);&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YYCS&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;fTyo&quot;&gt;&lt;code&gt;const result = factorial(1000n); // очень большое число!&lt;/code&gt;&lt;/p&gt;
  &lt;ol id=&quot;9uia&quot;&gt;
    &lt;li id=&quot;xfxo&quot;&gt;Когда вы обрабатываете большие объемы данных, например в финансовых приложениях или аналитике.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;BpiW&quot;&gt;Пример:&lt;/p&gt;
  &lt;p id=&quot;euKf&quot;&gt;&lt;code&gt;const transactions = [1097857843333489700n, 297678444489000n, 506553670n, 1507899978870n]; // большие суммы&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;7mKK&quot;&gt;&lt;code&gt;const totalAmount = transactions.reduce((sum, amount) =&amp;gt; sum + amount, 0n);&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ptPv&quot;&gt;⚠️&lt;strong&gt; Ограничения:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;ysiP&quot;&gt;
    &lt;li id=&quot;PHFY&quot;&gt;BigInt не может быть использован с методами Math и не должен смешиваться с обычными числами типа Number в арифметических операциях.&lt;/li&gt;
    &lt;li id=&quot;4Hjz&quot;&gt;Будьте осторожны при преобразовании между BigInt и Number (возможна потеря точности).&lt;/li&gt;
  &lt;/ol&gt;

</content></entry><entry><id>chulakov_dev:podkluchenie_Strapi_k_Postgres</id><link rel="alternate" type="text/html" href="https://teletype.in/@chulakov_dev/podkluchenie_Strapi_k_Postgres?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=chulakov_dev"></link><title>Подключение Strapi к базе данных Postgres</title><published>2023-09-15T10:20:34.950Z</published><updated>2023-09-15T12:59:05.751Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/68/a8/68a8b79b-3169-4a7c-9b92-2b15f6601ceb.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/4b/6d/4b6d5cde-0b26-4f64-a8bf-645c61ab1aea.png&quot;&gt;Прежде чем настроить подключение, необходимо запустить саму базу данных. В нашем примере Postgres мы развернем в docker-окружении. Пример docker-compose может быть следующим:</summary><content type="html">
  &lt;figure id=&quot;CRJI&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4b/6d/4b6d5cde-0b26-4f64-a8bf-645c61ab1aea.png&quot; width=&quot;2400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ByCl&quot;&gt;Прежде чем настроить подключение, необходимо запустить саму базу данных. В нашем примере Postgres мы развернем в docker-окружении. Пример docker-compose может быть следующим:&lt;/p&gt;
  &lt;pre id=&quot;KBvh&quot; data-lang=&quot;bash&quot;&gt;version: &amp;#x27;3.7&amp;#x27;

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

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

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

</content></entry><entry><id>chulakov_dev:Zapusk_Strapi_v4_v_Docker</id><link rel="alternate" type="text/html" href="https://teletype.in/@chulakov_dev/Zapusk_Strapi_v4_v_Docker?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=chulakov_dev"></link><title>Запуск Strapi v4 в Docker</title><published>2023-08-04T10:10:53.872Z</published><updated>2023-08-04T14:42:57.537Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/49/e0/49e0904c-6aa3-4736-ba5f-76b493cfb8b9.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/ca/28/ca289606-05c0-47c3-9017-f26bf5923560.jpeg&quot;&gt;ㅤ</summary><content type="html">
  &lt;figure id=&quot;CGxE&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ca/28/ca289606-05c0-47c3-9017-f26bf5923560.jpeg&quot; width=&quot;2400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ELcA&quot;&gt;ㅤ&lt;/p&gt;
  &lt;p id=&quot;IEVc&quot;&gt;ㅤ&lt;/p&gt;
  &lt;h2 id=&quot;U2Lp&quot;&gt;Инструкция&lt;/h2&gt;
  &lt;p id=&quot;JG6F&quot;&gt;Docker-compose-файл может выглядеть следующим образом:&lt;/p&gt;
  &lt;pre id=&quot;bAhg&quot; data-lang=&quot;bash&quot;&gt;version: &amp;#x27;3.7&amp;#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: &amp;#x27;json-file&amp;#x27;
            options:
                max-file: &amp;#x27;2&amp;#x27;
                max-size: &amp;#x27;5m&amp;#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: &amp;quot;strapi-data&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;adVU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;v1MC&quot;&gt;Создаем файл с переменными окружения с именем .env&lt;/p&gt;
  &lt;p id=&quot;UziE&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;g2VU&quot;&gt;Пример заполнения переменных окружения&lt;/h3&gt;
  &lt;p id=&quot;ue6f&quot;&gt;PORT=3000 — порт, по которому доступно приложение Node.JS.&lt;br /&gt;HOST_URL — адрес, по которому приложение будет доступно в браузере.&lt;br /&gt;API_HTTP_SCHEME=http:// — при локальной разработке используется http-схема.&lt;br /&gt;API_HTTP_DOMAIN=admin.hostname.local — API-адрес для получения изображений.&lt;br /&gt;CLIENT_API_URL=&lt;a href=&quot;http://admin.hostname.local/api&quot; target=&quot;_blank&quot;&gt;http://admin.hostname.local/api&lt;/a&gt; — адрес, по которому осуществляется получение данных API с клиента через DNS-сервер.&lt;br /&gt;SSR_API_URL=&lt;a href=&quot;http://strapi-nginx/api&quot; target=&quot;_blank&quot;&gt;http://strapi-nginx/api&lt;/a&gt; — адрес, по которому будем получать данные при выполнении запроса с сервера NODE JS.&lt;br /&gt;ASSET_PREFIX= — используется для отображения статики.&lt;br /&gt;STRAPI_PORT=1337 — порт, на котором работает Strapi.&lt;br /&gt;APP_KEYS=&amp;quot;examplekey1,examplekey2&amp;quot; — секретные ключи для cookies.&lt;br /&gt;API_TOKEN_SALT=example — используется для шифрования канала.&lt;br /&gt;ADMIN_JWT_SECRET=examplekey — JWT-ключ для административной панели.&lt;br /&gt;JWT_SECRET=examplekey — JWT-ключ для пользовательских прав.&lt;br /&gt;NODE_ENV=development — запуск сборки разработчика, production — prod режим.&lt;br /&gt;DATABASE_CLIENT=postgres — используемый клиент базы данных. &lt;br /&gt;DATABASE_HOST=strapiDB — название хоста, на котором развернута база данных.&lt;br /&gt;DATABASE_PORT=5432 — порт, на котором работает postgres.&lt;br /&gt;DATABASE_NAME=strapidb — название базы данных.&lt;br /&gt;DATABASE_USERNAME=strapi — имя пользователя базы данных.&lt;br /&gt;DATABASE_PASSWORD=12345678 — пароль к базе данных.&lt;/p&gt;
  &lt;p id=&quot;lEKV&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;zMOr&quot;&gt;Запускаем приложение с помощью команды&lt;/p&gt;
  &lt;pre id=&quot;zCWt&quot; data-lang=&quot;bash&quot;&gt;docker-compose up -d&lt;/pre&gt;
  &lt;p id=&quot;dQh3&quot;&gt;В файле /etc/hosts необходимо указать хост, по которому наше приложение будет доступно с браузера. В нашем случае это:&lt;/p&gt;
  &lt;pre id=&quot;wCRP&quot; data-lang=&quot;bash&quot;&gt;127.0.0.1 admin.hostname.local&lt;/pre&gt;
  &lt;p id=&quot;ASDZ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;jMfM&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://t.me/chulakov_dev&quot; target=&quot;_blank&quot;&gt;Вернуться в Chulakov Dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</content></entry><entry><id>chulakov_dev:Sozdanie-obraza-Strapi-v4</id><link rel="alternate" type="text/html" href="https://teletype.in/@chulakov_dev/Sozdanie-obraza-Strapi-v4?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=chulakov_dev"></link><title>Создание образа Strapi v4</title><published>2023-07-25T11:00:54.132Z</published><updated>2023-07-25T14:50:43.508Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/6b/a1/6ba1a81d-01ba-4e3b-b251-368ff60c5eba.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/67/29/67295a10-cc1e-4f99-a7d5-00edff6f8718.jpeg&quot;&gt;1. После клонирования репозитория в корневой папке проекта удаляем файл yarn.lock и запускаем команду</summary><content type="html">
  &lt;figure id=&quot;YCHH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/67/29/67295a10-cc1e-4f99-a7d5-00edff6f8718.jpeg&quot; width=&quot;2400&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;MYAx&quot;&gt;ㅤ&lt;/h2&gt;
  &lt;h2 id=&quot;7OWS&quot;&gt;Пошаговая инструкция&lt;/h2&gt;
  &lt;p id=&quot;yr68&quot;&gt;1. После клонирования &lt;a href=&quot;https://github.com/strapi/strapi/releases&quot; target=&quot;_blank&quot;&gt;репозитория&lt;/a&gt; в корневой папке проекта удаляем файл yarn.lock и запускаем команду&lt;/p&gt;
  &lt;pre id=&quot;R1hI&quot; data-lang=&quot;bash&quot;&gt;yarn setup&lt;/pre&gt;
  &lt;p id=&quot;CaeW&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;7x6M&quot;&gt;2. После завершения процесса запускаем команду&lt;/p&gt;
  &lt;pre id=&quot;BeI9&quot; data-lang=&quot;bash&quot;&gt;yarn publish:packages&lt;/pre&gt;
  &lt;p id=&quot;AMuY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;8ota&quot;&gt;3. В интерфейсе выбираем опцию &lt;strong&gt;Custom version&lt;/strong&gt; и указываем новую версию пакетов, например &lt;strong&gt;4.11.5-1.0.0.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;UsRg&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;N4p3&quot;&gt;4. В папке &lt;strong&gt;Images/base&lt;/strong&gt; удаляем &lt;strong&gt;yarn.lock&lt;/strong&gt;. В файле &lt;strong&gt;package.json&lt;/strong&gt; для образов, где указана старая версия, например 4.5.6, добавляем новый префикс, например &lt;strong&gt;4.11.5-1.0.0&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;uTq6&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;NdZw&quot;&gt;5. Для формирования нового файла &lt;strong&gt;yarn.lock&lt;/strong&gt;, находясь в директории &lt;strong&gt;Images/base&lt;/strong&gt;, запускаем команду&lt;/p&gt;
  &lt;pre id=&quot;sXL3&quot; data-lang=&quot;bash&quot;&gt;yarn&lt;/pre&gt;
  &lt;p id=&quot;HuH6&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;1H4H&quot;&gt;6. Для запуска проекта в среде Docker запускаем процесс сборки образа&lt;/p&gt;
  &lt;pre id=&quot;O4Tt&quot; data-lang=&quot;bash&quot;&gt;docker build --build-arg NODE_ENV=development -t 
gitlab.org/docker/images/strapi:4.11.5-1.0.0 -f Dockerfile .&lt;/pre&gt;
  &lt;p id=&quot;7Gvn&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;QPXI&quot;&gt;Если требуется продакшен сборка, то команда будет &lt;/p&gt;
  &lt;pre id=&quot;tIhU&quot; data-lang=&quot;bash&quot;&gt;docker build --build-arg NODE_ENV=production -t 
gitlab.org/docker/images/strapi:4.11.5-1.0.0 -f Dockerfile .&lt;/pre&gt;
  &lt;p id=&quot;dMk2&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;kOlX&quot;&gt;7. Загружаем образ в репозиторий&lt;/p&gt;
  &lt;pre id=&quot;FTu4&quot; data-lang=&quot;bash&quot;&gt;docker push gitlab.org/docker/images/strapi:4.11.5-1.0.0&lt;/pre&gt;
  &lt;p id=&quot;zK9y&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;GS1B&quot;&gt;&lt;strong&gt;Пример docker-compose-файла для запуска Strapi может выглядеть следующим образом:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;f4su&quot; data-lang=&quot;bash&quot;&gt;services:
    app:
        image: gitlab.org/docker/images/strapi:4.11.5-1.0.0
        logging:
            driver: &amp;#x27;json-file&amp;#x27;
            options:
                max-file: &amp;#x27;2&amp;#x27;
                max-size: &amp;#x27;5m&amp;#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&lt;/pre&gt;
  &lt;p id=&quot;zxvU&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;9ZRD&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;oaw3&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://t.me/chulakov_dev&quot; target=&quot;_blank&quot;&gt;Вернуться в Chulakov Dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</content></entry></feed>