Встановіть Plesk на CentOS 7
Використання іншої системи? Plesk — це власна панель керування веб-хостом, яка дозволяє користувачам адмініструвати свої персональні та/або клієнтські веб-сайти, бази даних
Buildbot — це інструмент безперервної інтеграції з відкритим вихідним кодом на основі Python для автоматизації створення, тестування та розгортання програмного забезпечення. Buildbot складається з одного або кількох майстрів Buildbot і кількох працівників. Майстер Buildbot або Buildmaster має центральне управління системою. Він відповідає за керування середовищем будівництва, робітниками та приймає всі рішення щодо надсилання робочих місць працівникам. Buildmaster виявляє зміни в репозиторії коду і надсилає команди або завдання працівникам для виконання. Робітники виконують завдання і повертають результат до Buildmaster. Потім Buildmaster сповіщає розробників через кілька підтримуваних каналів. У цьому посібнику ми встановимо Buildbot master і worker на CentOS 7. Ми також налаштуємо автентифікацію та Nginx як захищений зворотний проксі-сервер.
У цьому підручнику ми будемо використовувати 192.168.1.1
як загальнодоступну IP-адресу та ci.example.com
як доменне ім’я, спрямоване на екземпляр Vultr. Будь ласка, не забудьте замінити всі приклади доменного імені та IP-адреси фактичними.
Оновіть свою базову систему за допомогою посібника Як оновити CentOS 7 . Після оновлення системи перейдіть до встановлення PostgreSQL.
Встановіть Pip, який є менеджером пакетів для Python.
sudo yum -y install epel-release
sudo yum -y install python-pip gcc python-devel git
sudo pip install --upgrade pip
Buildbot підтримує кілька типів серверів баз даних, таких як MySQL, PostgreSQL і SQLite. У цьому підручнику ми будемо використовувати PostgreSQL для розміщення сервера бази даних Buildbot.
PostgreSQL — це об'єктно-реляційна система баз даних, відома своєю стабільністю та швидкістю. yum
Сховище за замовчуванням містить стару версію PostgreSQL, тому додайте репозиторій PostgreSQL.
sudo yum -y install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-1.noarch.rpm
Встановіть сервер бази даних PostgreSQL.
sudo yum -y install postgresql10-server postgresql10-contrib postgresql10
Ініціалізуйте базу даних.
sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
Запустіть сервер PostgreSQL і ввімкніть його автоматичний запуск під час завантаження.
sudo systemctl start postgresql-10
sudo systemctl enable postgresql-10
Змініть пароль для користувача PostgreSQL за замовчуванням.
sudo passwd postgres
Увійдіть як користувач PostgreSQL.
sudo su - postgres
Створіть нового користувача PostgreSQL для Buildbot.
createuser bb_user
Ви можете використовувати будь-яке ім’я користувача замість bb_user
, якщо хочете. PostgreSQL надає psql
оболонку для виконання запитів до бази даних. Перейдіть до оболонки PostgreSQL.
psql
Встановіть пароль для новоствореного користувача.
ALTER USER bb_user WITH ENCRYPTED password 'DBPassword';
Замінити DBPassword
надійним паролем.
Створіть нову базу даних для встановлення Buildbot.
CREATE DATABASE buildbot OWNER bb_user;
Вихід з psql
оболонки.
\q
Перейти до sudo
користувача.
exit
Відредагуйте pg_hba.conf
файл, щоб увімкнути автентифікацію на основі MD5.
sudo nano /var/lib/pgsql/10/data/pg_hba.conf
Знайдіть наступні рядки та змініть значення peer
та ident
, у METHOD
стовпці, на trust
та md5
, відповідно.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
Після оновлення конфігурація матиме вигляд наступного тексту.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
Збережіть файл і вийдіть з редактора. Встановіть адаптер бази даних PostgreSQL для Python.
sudo pip install psycopg2
Перезапустіть PostgreSQL, щоб зміни вступили в силу.
sudo systemctl restart postgresql-10
Встановіть Buildbot за допомогою Pip.
sudo pip install 'buildbot[bundle]' pyopenssl service_identity
Наведена вище команда встановить Buildbot разом із buildbot-www
, buildbot-worker
, та кількома веб-плагінами, такими як buildbot-waterfall-view
.
Щоб переконатися, що Buildbot було успішно встановлено, ви можете перевірити версію Buildbot.
buildbot --version
Результат повинен нагадувати наступний текст.
[user@vultr ~]$ buildbot --version
Buildbot version: 0.9.15.post1
Twisted version: 17.9.0
Змініть правила брандмауера, щоб дозволити порт 8010
. Buildbot використовує цей порт для прослуховування веб-запитів.
sudo firewall-cmd --zone=public --add-port=8010/tcp --permanent
sudo firewall-cmd --reload
Створіть нового непривілейованого користувача для запуску головних і робочих процесів Buildbot. Не рекомендується запускати головні служби Buildbot як root
користувач.
sudo adduser buildbot
sudo passwd buildbot
Увійдіть як новостворений buildbot
користувач.
sudo su - buildbot
Налаштуйте майстер Buildbot в /home/buildbot/master
каталозі. Цей каталог міститиме файли конфігурації, стану та журналів кожної збірки.
buildbot create-master --db 'postgresql://bb_user:DBPassword@localhost/buildbot' ~/master
Обов’язково замініть облікові дані користувача бази даних у наведеній вище команді.
Примітка. Якщо ви хочете використовувати базу даних SQLite замість PostgreSQL, просто пропустіть цей --db 'postgresql://bb_user:DBpassword@localhost/buildbot'
параметр. База даних SQLite буде створена в тому ж каталозі.
Наведена вище команда створить ~/master
каталог для зберігання файлів Buildmaster. Він також запише дані в базу даних PostgreSQL. Ви отримаєте наступний результат.
[buildbot@vultr ~]$ buildbot create-master --db 'postgresql://bb_user:DBPassword@localhost/buildbot' ~/master
mkdir /home/buildbot/master
creating /home/buildbot/master/master.cfg.sample
creating database (postgresql://bb_user:DBPassword@localhost/buildbot)
buildmaster configured in /home/buildbot/master
Скопіюйте зразок файлу конфігурації в живий файл конфігурації.
cp ~/master/master.cfg.sample ~/master/master.cfg
Відредагуйте файл конфігурації.
nano ~/master/master.cfg
Знайдіть наступні рядки.
c['workers'] = [worker.Worker("example-worker", "pass")]
...
c['builders'].append(
util.BuilderConfig(name="runtests",
workernames=["example-worker"],
factory=factory))
...
c['title'] = "Hello World CI"
c['titleURL'] = "https://buildbot.github.io/hello-world/"
...
c['buildbotURL'] = "http://localhost:8010/"
...
c['db'] = {
'db_url' : "postgresql://bb_user:DBpassword@localhost/buildbot",
}
У наведеній вище конфігурації є запис для зразка робітника. Ми змінимо зразок запису для воркера, на якому ми будемо працювати localhost
. Змініть його example-worker
на будь-яке відповідне ім’я для localhost
працівника та змініть його pass
на інший пароль. Запишіть ім’я та пароль працівника, оскільки вони знадобляться пізніше в підручнику. Змініть прізвище робітника в списку будівельників. Змініть назву програми та URL-адресу проекту відповідно до ваших потреб.
Change the Buildbot URL from localhost
to your actual domain name or public IP address. Also, verify that the database information in the configuration file matches your actual database credentials.
At the end of the file, add c['buildbotNetUsageData'] = None
. This parameter will disable sending the software version information and plugin usage details to the developers. However, to enable sending the uses information, change the option to Full
.
The configuration should look like the following text.
c['workers'] = [worker.Worker("localhost-worker", "Password123")]
...
c['builders'].append(
util.BuilderConfig(name="runtests",
workernames=["localhost-worker"],
factory=factory))
...
c['title'] = "My Application CI"
c['titleURL'] = "https://example.com/my-app"
...
c['buildbotURL'] = "http://192.168.1.1:8010/"
...
c['db'] = {
'db_url' : "postgresql://bb_user:DBpassword@localhost/buildbot",
}
...
c['buildbotNetUsageData'] = None
Save the file and exit the editor. Check the configuration file for errors.
buildbot checkconfig ~/master
If the configuration file has no errors, you will see following output.
[buildbot@vultr ~]$ buildbot checkconfig ~/master
Config file is good!
Now that everything is configured correctly, you can start the Buildbot master.
buildbot start ~/master
You will see the following output.
[buildbot@vultr ~]$ buildbot start ~/master
Following twistd.log until startup finished..
The buildmaster appears to have (re)started correctly.
Now that the Buildbot master has started correctly, the web user interface is accessible at http://192.168.1.1:8010
. You should see the following Buildbot interface.
Since we have already modified the worker configuration in ~/master/master.cfg
, we can proceed to create a new worker.
buildbot-worker create-worker ~/worker localhost localhost-worker Password123
Make sure that you use the exact same worker name and password as mentioned in ~/master/master.cfg
file. If there's a mismatch in worker name or password, the worker will not be able to connect to the Buildbot master. You will see the following output upon successful execution.
[buildbot@vultr ~]$ buildbot-worker create-worker ~/worker localhost example-worker pass
mkdir /home/buildbot/worker
mkdir /home/buildbot/worker/info
Creating info/admin, you need to edit it appropriately.
Creating info/host, you need to edit it appropriately.
Not creating info/access_uri - add it if you wish
Please edit the files in /home/buildbot/worker/info appropriately.
worker configured in /home/buildbot/worker
Information about the worker is stored in the /info
directory. Edit the administrative information about the developer.
nano ~/worker/info/admin
Replace the example name with your actual name and email.
Your Name <[email protected]>
Now, open the file containing information about the host.
nano ~/worker/info/host
Replace the example instruction with the actual information about the host system.
Localhost, CentOS 7
The worker admin and host information is only used to tell the users about the system. You can also add additional information about the system such as Buildbot version and Twisted version.
Start the worker.
buildbot-worker start ~/worker
The output will look like the following text.
[buildbot@vultr ~]$ buildbot-worker start ~/worker
Following twistd.log until startup finished..
The buildbot-worker appears to have (re)started correctly.
To check if the worker is registered, head to the web interface of Buildbot and navigate to Builds >> Workers
from the left navigation. You should see that the worker is up and ready to build.
To run a sample build, to check if the Buildbot worker is running successfully, navigate to Builds >> Builders
. Click on the runtests
builder name to open the builder interface and click on the Force
button to force a build. Provide your name and click on the Start Build
button to start the build. Since it is a sample build test to check the Buildbot environment, it will finish in a couple of seconds. You will get a success message and the build result.
Although the Buildbot master and worker can be easily started using the commands above, it is recommended to use Systemd units to run and manage the Buildbot services. This will ensure that they are automatically started on system restart and failures.
Note: Switch to the sudo
user again by running either exit
or su <username>
. From now on all the commands need to be executed by the sudo
user.
Stop the running Buildbot worker and master service.
sudo su buildbot -c "buildbot stop /home/buildbot/master"
sudo su buildbot -c "buildbot-worker stop ~/worker"
Create a new Systemd unit file for the Buildbot master.
sudo nano /etc/systemd/system/buildbot.service
Populate the file.
[Unit]
Description=BuildBot master service
After=network.target
[Service]
Type=forking
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/master
ExecStart=/usr/bin/buildbot start
ExecStop=/usr/bin/buildbot stop
ExecReload=/usr/bin/buildbot restart
[Install]
WantedBy=multi-user.target
Start the Buildbot master and enable it to automatically start at boot time.
sudo systemctl start buildbot
sudo systemctl enable buildbot
Create a new Systemd unit file for the Buildbot worker.
sudo nano /etc/systemd/system/buildbot-worker.service
Populate the file.
[Unit]
Description=BuildBot worker service
After=network.target
[Service]
Type=forking
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/worker
ExecStart=/usr/bin/buildbot-worker start
ExecStop=/usr/bin/buildbot-worker stop
ExecReload=/usr/bin/buildbot-worker restart
[Install]
WantedBy=multi-user.target
Start the Buildbot worker and enable it to automatically start at boot time.
sudo systemctl start buildbot-worker
sudo systemctl enable buildbot-worker
You can check the status of the services.
sudo systemctl status buildbot buildbot-worker
If the services are running smoothly, you will see that in the output.
[user@vultr ~]$ sudo systemctl status buildbot buildbot-worker
● buildbot.service - BuildBot master service
...
Active: active (running) since Fri 2018-01-12 16:00:59 UTC; 1min 25s ago
...
Jan 12 16:00:59 vultr.guest systemd[1]: Started BuildBot master service.
● buildbot-worker.service - BuildBot worker service
...
Active: active (running) since Fri 2018-01-12 16:02:00 UTC; 24s ago
...
Jan 12 16:02:00 vultr.guest systemd[1]: Started BuildBot worker service.
By default, authentication is not enabled in the Buildbot web interface. For internet facing sites, it is strongly recommended to setup authentication so that only the authorized users can have the ability to perform administrative tasks. To set up authentication, reopen the Buildbot master configuration file.
sudo su buildbot -c "nano /home/buildbot/master/master.cfg"
Add the following lines to the end of the file.
c['www']['authz'] = util.Authz(
allowRules = [
util.AnyEndpointMatcher(role="admins")
],
roleMatchers = [
util.RolesFromUsername(roles=['admins'], usernames=['admin_user'])
]
)
c['www']['auth'] = util.UserPasswordAuth({'admin_user': 'AdminPassword'})
Replace both occurrences of admin_user
with the actual username you want to use and AdminPassword
with a strong password.
Check for errors in the configuration file.
sudo su buildbot -c "buildbot checkconfig /home/buildbot/master"
Restart Buildbot master service so that the changes can take effect.
sudo systemctl restart buildbot
Browse the web interface again to see that the anonymous users can only view the basic details about the build server. Now, log in using the credentials set in the master.cfg
file and you will see that all other administrative functions are only available to the logged in admin user.
By default, Buildbot listens to the port 8010
on unsecured connections. Securing the web interface with HTTPS
is recommended to ensure that the data is safe during transportation from the browser to the server. In this section of the tutorial, we will install and secure Nginx with Let's Encrypt free SSL certificates. The Nginx web server will work as a reverse proxy to forward the incoming requests to Buildbot's HTTP endpoint.
Install Nginx.
sudo yum -y install nginx
Start Nginx and enable it to automatically start at boot time.
sudo systemctl start nginx
sudo systemctl enable nginx
Install Certbot, which is the client application for Let's Encrypt CA.
sudo yum -y install certbot
Before you can request the certificates, you will need to allow ports 80
and 443
or standard HTTP
and HTTPS
services through the firewall. Also, remove port 8010
, which listens to the unsecured connections.
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --zone=public --remove-port=8010/tcp --permanent
sudo firewall-cmd --reload
Note: To obtain certificates from Let's Encrypt CA, the domain for which the certificates are to be generated must be pointed towards the server. If not, make the necessary changes to the DNS records of the domain and wait for the DNS to propagate before making the certificate request again. Certbot checks the domain authority before providing the certificates.
Generate the SSL certificates.
sudo certbot certonly --webroot -w /usr/share/nginx/html -d ci.example.com
Згенеровані сертифікати, ймовірно, будуть збережені в /etc/letsencrypt/live/ci.example.com/
каталозі. Сертифікат SSL буде збережено як, fullchain.pem
а закритий ключ – як privkey.pem
.
Термін дії сертифікатів Let's Encrypt закінчується через 90 днів, тому рекомендується налаштувати автоматичне оновлення сертифікатів за допомогою завдань Cron.
Відкрийте файл завдання cron для root
користувача.
sudo crontab -e
Додайте наступний рядок у кінці файлу.
30 5 * * * /usr/bin/certbot renew --quiet
Вищезазначене завдання cron виконуватиметься щодня о 5:30 ранку. Якщо термін дії сертифіката закінчився, він автоматично поновить його.
Тепер змініть файл конфігурації Nginx за замовчуванням, щоб видалити default_server
рядок.
sudo sed -i 's/default_server//g' /etc/nginx/nginx.conf
Створіть новий файл конфігурації для веб-інтерфейсу Buildbot.
sudo nano /etc/nginx/conf.d/buildbot.conf
Заповніть файл.
upstream buildbot {
server 127.0.0.1:8010;
}
server {
listen 80 default_server;
server_name ci.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 default_server;
server_name ci.example.com;
root html;
index index.html index.htm;
ssl on;
ssl_certificate /etc/letsencrypt/live/ci.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ci.example.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
access_log /var/log/nginx/buildbot.access.log;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Host $host;
location / {
proxy_pass http://buildbot;
}
location /sse/ {
proxy_buffering off;
proxy_pass http://buildbot/sse/;
}
location /ws {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://buildbot/ws;
proxy_read_timeout 6000s;
}
}
Перевірте, чи немає помилок у новому файлі конфігурації.
sudo nginx -t
Якщо ви бачите наведений нижче вихід, конфігурація безпомилкова.
[user@vultr ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Якщо ви отримали якусь помилку, обов’язково перевірте шлях до сертифікатів SSL. Перезапустіть веб-сервер Nginx, щоб змінити конфігурацію.
sudo systemctl restart nginx
Відкрийте файл конфігурації Buildmaster.
sudo su buildbot -c "nano /home/buildbot/master/master.cfg"
Знайдіть наступний рядок.
c['buildbotURL'] = "http://192.168.1.1:8010/"
Змініть URL-адресу відповідно до доменного імені, яке ви використовуєте.
c['buildbotURL'] = "https://ci.example.com/"
Перезапустіть головну службу Buildbot.
sudo systemctl restart buildbot
Тепер ви можете отримати доступ до інформаційної панелі Buildbot за адресою https://ci.example.com
. Ви побачите, що підключення до Buildbot тепер захищені за допомогою SSL.
Увійдіть, використовуючи облікові дані адміністратора, і додайте свій перший конвеєр, щоб почати створювати програму.
Використання іншої системи? Plesk — це власна панель керування веб-хостом, яка дозволяє користувачам адмініструвати свої персональні та/або клієнтські веб-сайти, бази даних
Squid — популярна безкоштовна програма для Linux, яка дозволяє створювати веб-проксі для переадресації. У цьому посібнику ви дізнаєтеся, як встановити Squid на CentOS, щоб перетворити вас
Вступ Lighttpd — це форк Apache, який має набагато меншу ресурсомісткість. Він легкий, звідси його назва, і досить простий у використанні. Встановити
VULTR нещодавно вніс зміни на свою сторону, і тепер усе має працювати нормально з коробки з увімкненим NetworkManager. Якщо ви бажаєте вимкнути
Icinga2 — це потужна система моніторингу, і при використанні в моделі «майстер-клієнт» вона може замінити потребу в перевірках моніторингу на основі NRPE. Майстер-клієнт
Використання іншої системи? Apache Cassandra — це безкоштовна система керування базами даних NoSQL з відкритим вихідним кодом, яка розроблена для забезпечення масштабованості, високої
Використання іншої системи? Microweber — це CMS та інтернет-магазин із відкритим вихідним кодом. Вихідний код Microweber розміщено на GitHub. Цей посібник покаже вам
Використання іншої системи? Vanilla forum — це програма з відкритим вихідним кодом, написана на PHP. Це повністю настроюваний, простий у використанні та підтримує зовнішній вигляд
Використання іншої системи? Mattermost — це автономна альтернатива службі обміну повідомленнями Slack SAAS з відкритим кодом. Іншими словами, з Mattermost ви бл
Панель керування Plesk має дуже гарну інтеграцію для Lets Encrypt. Lets Encrypt є одним із єдиних постачальників SSL, які надають сертифікати повністю
Lets Encrypt — це центр сертифікації, який надає безкоштовні сертифікати SSL. cPanel створив чітку інтеграцію, щоб ви і ваш клієнт
Використання іншої системи? Concrete5 — це CMS з відкритим вихідним кодом, яка пропонує багато відмінних і корисних функцій, які допомагають редакторам легко створювати вміст.
Використання іншої системи? Review Board — це безкоштовний інструмент з відкритим кодом для перегляду вихідного коду, документації, зображень та багато іншого. Це веб-програмне забезпечення
У цьому посібнику ви дізнаєтеся, як налаштувати автентифікацію HTTP для веб-сервера Nginx, що працює на CentOS 7. Вимоги Щоб почати, вам знадобиться
Використання іншої системи? GoAccess — це аналізатор веб-журналів з відкритим вихідним кодом. Ви можете використовувати його для аналізу журналів у режимі реального часу в терміналі або
YOURLS (Your Own URL Shortener) — програма для скорочення URL-адрес і аналізу даних із відкритим вихідним кодом. У цій статті ми розглянемо процес встановлення
Використання іншої системи? Вступ ArangoDB — це відкрита база даних NoSQL з гнучкою моделлю даних для документів, графіків і ключів-значень. це є
Вступ Каталог /etc/ відіграє важливу роль у функціонуванні системи Linux. Причина цього в тому, що майже кожна конфігурація системи
Багато системних адміністраторів керують великою кількістю серверів. Якщо потрібно отримати доступ до файлів на різних серверах, увійти на кожен окремо бл
У цьому посібнику буде описано процес встановлення ігрового сервера Half Life 2 на систему CentOS 6. Крок 1: Встановлення необхідних умов Щоб налаштувати ou
Штучний інтелект не в майбутньому, він тут прямо в сьогоденні У цьому блозі Прочитайте, як програми штучного інтелекту вплинули на різні сектори.
Ви також стали жертвою DDOS-атак і спантеличені методами запобігання? Прочитайте цю статтю, щоб вирішити свої запитання.
Можливо, ви чули, що хакери заробляють багато грошей, але чи замислювалися ви коли-небудь, як вони заробляють такі гроші? давайте обговоримо.
Ви хочете побачити революційні винаходи Google і як ці винаходи змінили життя кожної людини сьогодні? Тоді читайте в блозі, щоб побачити винаходи Google.
Концепція самокерованих автомобілів, щоб вирушати в дороги за допомогою штучного інтелекту, є мрією, яку ми давно мріємо. Але, незважаючи на кілька обіцянок, їх ніде не видно. Прочитайте цей блог, щоб дізнатися більше…
Оскільки наука розвивається швидкими темпами, бере на себе багато наших зусиль, ризики піддати себе незрозумілій Сингулярності також зростає. Читайте, що може означати для нас сингулярність.
Методи зберігання даних можуть розвиватися з моменту народження Даних. Цей блог висвітлює еволюцію зберігання даних на основі інфографіки.
Прочитайте блог, щоб дізнатися про різні шари архітектури великих даних та їх функціональні можливості найпростішим способом.
У цьому цифровому світі пристрої розумного дому стали важливою частиною життя. Ось кілька дивовижних переваг пристроїв розумного дому щодо того, як вони роблять наше життя гідним життя та спрощують його.
Нещодавно Apple випустила додаткове оновлення macOS Catalina 10.15.4, щоб виправити проблеми, але схоже, що оновлення викликає більше проблем, що призводять до блокування комп’ютерів Mac. Прочитайте цю статтю, щоб дізнатися більше