Як встановити та налаштувати Concourse CI в Ubuntu 16.04

Вступ

Безперервна інтеграція — це практика розробки програмного забезпечення DevOps, яка дозволяє розробникам часто об’єднувати змінений код у спільне сховище багато разів на день. Після кожного злиття виконуються автоматичні збірки та тестування для виявлення проблем у коді. Це дозволяє розробникам швидко знаходити та усувати помилки, щоб покращити якість програмного забезпечення та забезпечити безперервну доставку програмного забезпечення. Перемикатися з Concourse туди і назад дуже легко, оскільки він зберігає всю свою конфігурацію в декларативних файлах, які можна перевірити в системі контролю версій. Він також забезпечує веб-інтерфейс користувача, який відображає інформацію про збірку в інтерактивному режимі.

Компоненти залу.
  • ATC є основним компонентом Concourse. Він відповідає за запуск веб-інтерфейсу та API. Він також піклується про все планування конвеєра.
  • TSA — це спеціально створений SSH-сервер. Він відповідає за безпечну реєстрацію працівника в ATC.
  • Workers також управляє двома різними службами:
    1. Garden — це середовище виконання контейнера та інтерфейс для віддаленого керування контейнерами на робочому.
    2. Baggageclaim — це сервер керування кешом та артефактами.
  • Fly — це інтерфейс командного рядка, який використовується для взаємодії з ATC для налаштування конвеєрів Concourse.

Передумови

  • Примірник сервера Vultr Ubuntu 16.04.
  • Користувач sudo .

Обов’язково замініть усі випадки 192.0.2.1 та ci.example.com на вашу фактичну публічну IP-адресу Vultr та фактичне доменне ім’я.

Оновіть свою базову систему за допомогою посібника Як оновити Ubuntu 16.04 . Після оновлення системи перейдіть до встановлення PostgreSQL.

Встановіть та налаштуйте базу даних PostgreSQL

PostgreSQL - це об'єктно-реляційна система баз даних. Concourse зберігає свої дані конвеєра в базі даних PostgreSQL. Додайте репозиторій PostgreSQL.

echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update

Встановіть сервер бази даних PostgreSQL.

sudo apt -y install postgresql

Запустіть сервер PostgreSQL і ввімкніть його автоматичний запуск під час завантаження.

sudo systemctl start postgresql
sudo systemctl enable postgresql

Змініть пароль для користувача PostgreSQL за замовчуванням.

sudo passwd postgres

Увійдіть як користувач PostgreSQL:

sudo su - postgres

Створіть нового користувача PostgreSQL для Concourse CI.

createuser concourse

Примітка . Користувача PostgreSQL за замовчуванням можна використовувати для аутентифікації бази даних, але рекомендується використовувати спеціального користувача для автентифікації бази даних Concourse у виробничих налаштуваннях.

PostgreSQL надає оболонку для виконання запитів до бази даних. Перейдіть до оболонки PostgreSQL.

psql

Встановіть пароль для щойно створеного користувача бази даних Concourse.

ALTER USER concourse WITH ENCRYPTED password 'DBPassword';

Важливо : замініть DBPassword надійним паролем. Запишіть пароль, оскільки він знадобиться пізніше в підручнику.

Створіть нову базу даних для Concourse.

CREATE DATABASE concourse OWNER concourse;

Вийдіть з psql оболонки.

\q

Перейдіть до користувача sudo з поточного postgresкористувача.

exit

Завантажте та встановіть Concourse CI

Завантажте останню версію виконуваного файлу Concourse і збережіть його, /usr/bin щоб його можна було виконувати безпосередньо. Останню версію двійкових файлів Concourse і Fly можна знайти на сторінці завантаження Concourse . Нові випуски дуже часті. Замініть посилання нижче новим посиланням для останньої версії.

sudo wget https://github.com/concourse/concourse/releases/download/v3.10.0/concourse_linux_amd64 -O /usr/bin/concourse

Аналогічно завантажте останню версію виконуваного файлу fly і збережіть його в /usr/bin.

sudo wget https://github.com/concourse/concourse/releases/download/v3.10.0/fly_linux_amd64 -O /usr/bin/fly

Fly — це інтерфейс командного рядка, який використовується для підключення до API ATC Concourse CI. Fly доступний для кількох платформ, таких як Linux, Windows і MacOS.

Призначте дозвіл на виконання завантаженим concourse і fly двійковим файлам.

sudo chmod +x /usr/bin/concourse /usr/bin/fly

Перевірте, чи Concourse і Fly працюють правильно, перевіривши їх версію.

concourse -version
fly -version

Створення та налаштування ключів RSA

Пари ключів RSA забезпечують спосіб шифрування зв'язку між компонентами Concourse.

Щоб Concourse працював, необхідно створити принаймні три пари ключів. Для шифрування даних сеансу створіть файл session_signing_key. Цей ключ також буде використовуватися TSA для підпису запитів, які він робить до ATC. Щоб захистити сервер TSA SSH, створіть файл tsa_host_key. Нарешті, згенеруйте worker_key для кожного працівника.

Створіть новий каталог для зберігання ключів і конфігурації, пов’язаних із Concourse CI.

sudo mkdir /opt/concourse

Згенеруйте необхідні ключі.

sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/session_signing_key
sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/tsa_host_key
sudo ssh-keygen -t rsa -q -N '' -f /opt/concourse/worker_key

Авторизуйте відкритий ключ працівників, скопіювавши його вміст у authorized_worker_keys файл.

sudo cp /opt/concourse/worker_key.pub /opt/concourse/authorized_worker_keys

Початковий зал

Concourse надає два окремих компонента, які потрібно запустити: веб і робочий файл. Запустіть веб-сайт Concourse.

sudo concourse web \
  --basic-auth-username admin \
  --basic-auth-password StrongPass \
  --session-signing-key /opt/concourse/session_signing_key \
  --tsa-host-key /opt/concourse/tsa_host_key \
  --tsa-authorized-keys /opt/concourse/authorized_worker_keys \
  --postgres-user=concourse \
  --postgres-password=DBPassword \
  --postgres-database=concourse \
  --external-url http://192.0.2.1:8080

За basic-auth бажанням змініть ім’я користувача та пароль . Переконайтеся, що шлях до файлів ключів правильний, і переконайтеся, що надано правильне значення імені користувача та пароля в конфігурації бази даних PostgreSQL.

Примітка : ATC слухатиме порт за замовчуванням, 8080 а TSA слухатиме порт 2222. Якщо автентифікація не потрібна, передайте --no-really-i-dont-want-any-authпараметр після видалення основних параметрів аутентифікації.

Після запуску веб-сервера відобразиться такий результат.

{"timestamp":"1503657859.661247969","source":"tsa","message":"tsa.listening","log_level":1,"data":{}}
{"timestamp":"1503657859.666907549","source":"atc","message":"atc.listening","log_level":1,"data":{"debug":"127.0.0.1:8079","http":"0.0.0.0:8080"}}

Наразі зупиніть сервер, оскільки потрібно налаштувати ще кілька речей.

Запустіть Concourse CI Worker.

sudo concourse worker \
  --work-dir /opt/concourse/worker \
  --tsa-host 127.0.0.1 \
  --tsa-public-key /opt/concourse/tsa_host_key.pub \
  --tsa-worker-private-key /opt/concourse/worker_key

Наведена вище команда припускатиме, що TSA працює на локальному хості та прослуховує порт за замовчуванням 2222.

Хоча веб-сайт Concourse і worker можна легко запустити за допомогою наведених вище команд, для керування сервером рекомендується використовувати Systemd.

Налаштуйте середовище та службу Systemd

Використання служби Systemd для керування програмою гарантує, що програма автоматично запускатиметься у разі збою та під час завантаження. Сервер Concourse не бере дані з будь-якого конфігураційного файлу, але може отримати доступ до даних зі змінних середовища. Замість того, щоб встановлювати глобальні змінні середовища, створіть новий файл для зберігання змінних середовища, а потім передайте змінні в Concourse CI за допомогою служби Systemd.

Створіть новий файл середовища для Concourse web.

sudo nano /opt/concourse/web.env

Заповніть файл.

CONCOURSE_SESSION_SIGNING_KEY=/opt/concourse/session_signing_key
CONCOURSE_TSA_HOST_KEY=/opt/concourse/tsa_host_key
CONCOURSE_TSA_AUTHORIZED_KEYS=/opt/concourse/authorized_worker_keys

CONCOURSE_POSTGRES_USER=concourse
CONCOURSE_POSTGRES_PASSWORD=DBPassword
CONCOURSE_POSTGRES_DATABASE=concourse

CONCOURSE_BASIC_AUTH_USERNAME=admin
CONCOURSE_BASIC_AUTH_PASSWORD=StrongPass
CONCOURSE_EXTERNAL_URL=http://192.0.2.1:8080

Change the username and password of the BASIC_AUTH if desired. Make sure that the path to the key files are correct and make sure that the correct value for username and password in the PostgreSQL database configuration is provided.

Similarly, create an environment file for the worker.

sudo nano /opt/concourse/worker.env

Populate the file.

CONCOURSE_WORK_DIR=/opt/concourse/worker
CONCOURSE_TSA_WORKER_PRIVATE_KEY=/opt/concourse/worker_key
CONCOURSE_TSA_PUBLIC_KEY=/opt/concourse/tsa_host_key.pub
CONCOURSE_TSA_HOST=127.0.0.1

As the environment files contain usernames and passwords, change its permissions so that it cannot be accessed by other users.

sudo chmod 600 /opt/concourse/*.env

Now create a new user for Concourse to run the web environment. This will ensure that the web server is running in an isolated environment.

sudo useradd concourse

Give the concourse user ownership over Concourse CI file's directory.

sudo chown -R concourse:concourse /opt/concourse

Create a new systemd service file for the Concourse web service.

sudo nano /etc/systemd/system/concourse-web.service

Populate the file.

[Unit]
Description=Concourse CI web server

[Service]
Type=simple
User=concourse
Group=concourse
Restart=on-failure
EnvironmentFile=/opt/concourse/web.env
ExecStart=/usr/bin/concourse web
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_web

[Install]
WantedBy=multi-user.target

Save and close the file. Create a new service file for the Concourse worker service.

sudo nano /etc/systemd/system/concourse-worker.service

Populate the file.

[Unit]
Description=Concourse CI worker process

[Service]
Type=simple
Restart=on-failure
EnvironmentFile=/opt/concourse/worker.env
ExecStart=/usr/bin/concourse worker
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=concourse_worker

[Install]
WantedBy=multi-user.target

The web and worker service can now be started directly.

sudo systemctl start concourse-web concourse-worker

To enable the worker and web process to automatically start at boot time, run the following.

sudo systemctl enable concourse-worker concourse-web

To check the status of services, run the following.

sudo systemctl status concourse-worker concourse-web

If the service is not started, or in the FAILED state, remove the cache from the /tmp directory.

sudo rm -rf /tmp/*

Restart the services.

sudo systemctl restart concourse-worker concourse-web

Notice that this time the services have started correctly. The output upon verifying the status of the services will be similar to the following.

[user@vultr ~]$ sudo systemctl status concourse-worker concourse-web
● concourse-worker.service - Concourse CI worker process
   Loaded: loaded (/etc/systemd/system/concourse-worker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
 Main PID: 3037 (concourse)
   CGroup: /system.slice/concourse-worker.service
           └─3037 /usr/bin/concourse worker

Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.934722900","source":"tsa","message":"t...""}}
Aug 26 07:27:42 vultr.guest concourse_worker[3037]: {"timestamp":"1503732462.941227913","source":"guardian","messag...0"}}

...

● concourse-web.service - Concourse CI web server
   Loaded: loaded (/etc/systemd/system/concourse-web.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-08-26 07:27:37 UTC; 55s ago
 Main PID: 3036 (concourse)
   CGroup: /system.slice/concourse-web.service
           └─3036 /usr/bin/concourse web

Aug 26 07:27:57 vultr.guest concourse_web[3036]: {"timestamp":"1503732477.925554752","source":"tsa","message":"tsa...ve"}}
Aug 26 07:28:02 vultr.guest concourse_web[3036]: {"timestamp":"1503732482.925430775","source":"tsa","message":"tsa...ve"}}
...
Hint: Some lines were ellipsized, use -l to show in full.

Connecting to the Server

Once the server is started, the web interface of the Concourse CI can be accessed by going to http://192.0.2.1:8080 in any browser. Log in using the username and password provided in the environment file.

To connect to the server using Fly, run the following.

fly -t my-ci login -c http://192.0.2.1:8080

The above command is used for the initial login to the server. -t is used to provide a target name. replace my-ci with any desired target name. The above command will log in to the default team main. It will ask for the username and password provided in the environment file.

The output will look like the following.

[user@vultr ~]$ fly -t my-ci login -c http://192.0.2.1:8080
logging in to team 'main'

username: admin
password:

target saved

The target login will be saved for a day. After that, it will expire.

To log out immediately.

fly -t my-ci logout

Fly can be used to login to the server outside of the network, but only if the server has a public IP address and it is accessible from outside the network. The Windows or MacOS binary can be downloaded from the download site or from the web UI of the server.

Setting Up Nginx Reverse Proxy

Вхідні дані та інша інформація, надіслана через веб-інтерфейс на сервер Concourse, не захищені. З'єднання не зашифроване. Зворотний проксі-сервер Nginx можна налаштувати за допомогою безкоштовного SSL Let's Encrypt.

Встановіть Nginx.

sudo apt -y install nginx

Запустіть Nginx і ввімкніть його автоматичний запуск під час завантаження.

sudo systemctl start nginx
sudo systemctl enable nginx

Додайте сховище Certbot.

sudo add-apt-repository --yes ppa:certbot/certbot
sudo apt-get update

Установіть Certbot, який є клієнтською програмою для Let's Encrypt CA.

sudo apt -y install certbot

Примітка : щоб отримати сертифікати від Let's Encrypt CA, домен, для якого мають бути створені сертифікати, має бути спрямований на сервер. Якщо ні, внесіть необхідні зміни в записи DNS домену та зачекайте, поки DNS пошириться, перш ніж знову надсилати запит на сертифікат. Certbot перевіряє авторитет домену перед наданням сертифікатів.

Згенеруйте сертифікати SSL.

sudo certbot certonly --webroot -w /var/www/html -d ci.example.com

Згенеровані сертифікати, ймовірно, будуть збережені в /etc/letsencrypt/live/ci.example.com/ каталозі. Сертифікат SSL буде збережено як, fullchain.pem а закритий ключ – як privkey.pem.

Термін дії сертифікатів Let's Encrypt закінчується через 90 днів, тому рекомендується автоматичне оновлення для сертифікатів, налаштованих за допомогою cronjobs. Cron — це системна служба, яка використовується для виконання періодичних завдань.

Відкрийте файл завдання cron.

sudo crontab -e

Додайте наступний рядок у кінці файлу.

30 5 * * * /usr/bin/certbot renew --quiet

Вищезазначене завдання cron виконуватиметься щодня о 5:30 ранку. Якщо термін дії сертифіката закінчився, його буде автоматично поновлено.

Створіть новий віртуальний хост.

sudo nano /etc/nginx/sites-available/concourse

Заповніть файл.

server {
    listen 80;
    server_name ci.example.com;
    return 301 https://$host$request_uri;
}
server {

    listen 443;
    server_name ci.example.com;

    ssl_certificate           /etc/letsencrypt/live/ci.example.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/ci.example.com/privkey.pem;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log    /var/log/nginx/concourse.access.log;

    location / {

      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_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://ci.example.com;
    }
  }

Примітка . Замініть ci.example.com на фактичний домен.

Активуйте файл конфігурації.

sudo ln -s /etc/nginx/sites-available/concourse /etc/nginx/sites-enabled/concourse

Відредагуйте файл середовища, створений для Concours Web.

sudo nano /opt/concourse/web.env

Змініть значення, CONCOURSE_EXTERNAL_URL а також додайте ще два рядки в кінці файлу.

CONCOURSE_EXTERNAL_URL=https://ci.example.com
CONCOURSE_BIND_IP=127.0.0.1
CONCOURSE_BIND_PORT=8080

Збережіть файл і перезапустіть Concourse Web, Worker і Nginx.

sudo systemctl restart concourse-worker concourse-web nginx

Усі дані, що надсилаються до та з браузера, тепер захищені за допомогою шифрування SSL.


Як встановити Jenkins на CentOS 7

Як встановити Jenkins на CentOS 7

Jenkins — популярний інструмент CI (безперервна інтеграція) з відкритим кодом, який широко використовується для розробки, розгортання та автоматизації проектів. Ця стаття буде

Як встановити та налаштувати Concourse CI в Ubuntu 16.04

Як встановити та налаштувати Concourse CI в Ubuntu 16.04

Використання іншої системи? Вступ Постійна інтеграція – це практика розробки програмного забезпечення DevOps, яка дозволяє розробникам часто об’єднувати

Як встановити та налаштувати Ansible на Debian 9 для використання з Windows Server

Як встановити та налаштувати Ansible на Debian 9 для використання з Windows Server

Використання іншої системи? Ansible — інструмент з відкритим кодом для автоматизації завдань. Він керує конфігурацією ваших серверів Linux і Windows. Це працює

Як встановити та налаштувати GoCD на CentOS 7

Як встановити та налаштувати GoCD на CentOS 7

Використання іншої системи? GoCD — це система безперервної доставки та автоматизації з відкритим вихідним кодом. Він дозволяє моделювати складні робочі процеси, використовуючи його паралельний an

Використання SaltStack With Pillars в Ubuntu 17.04

Використання SaltStack With Pillars в Ubuntu 17.04

Хоча SaltStack є чудовим інструментом для одночасного виконання операцій на багатьох серверах, він також підтримує певні налаштування конфігурації для кожного хоста, що зберігаються в

Як встановити та налаштувати Ansible на CentOS 7 для використання з Windows Server

Як встановити та налаштувати Ansible на CentOS 7 для використання з Windows Server

Використання іншої системи? Ansible — інструмент з відкритим кодом для автоматизації завдань. Він керує конфігурацією ваших серверів Linux і Windows. Це працює

Як встановити Drone CI на Ubuntu 18.04

Як встановити Drone CI на Ubuntu 18.04

Вступ Drone — це автоматизована платформа безперервного тестування та доставки, яка працює на вашій власній інфраструктурі. Дрон підтримує будь-яку мову, сервіс о

Балансувальники навантаження Vultr

Балансувальники навантаження Vultr

Що таке Load Balancer Балансувальники навантаження розташовані перед вашою програмою і розподіляють вхідний трафік між кількома екземплярами вашої програми. Fo

Як встановити Foreman на CentOS 7

Як встановити Foreman на CentOS 7

Використання іншої системи? Foreman — це безкоштовний інструмент з відкритим вихідним кодом, який допоможе вам налаштувати та керувати фізичними та віртуальними серверами. Предварня

Як встановити SaltStack на CentOS 7

Як встановити SaltStack на CentOS 7

SaltStack, або Salt, — це популярне рішення для керування конфігурацією з відкритим вихідним кодом, яке можна використовувати для реалізації віддаленого виконання, керування конфігурацією, код

Як встановити Strider CD на Ubuntu 18.04

Як встановити Strider CD на Ubuntu 18.04

Вступ Strider CD — це платформа безперервного розгортання з відкритим вихідним кодом. Програма написана на Node.js і використовує MongoDB як бекенд сховища. Шрок

Використання диспетчера пакетів Chocolatey у Windows

Використання диспетчера пакетів Chocolatey у Windows

Вступ Chocolatey забезпечує керування пакетами, що спрощує адміністрування програмного забезпечення та залежностей у Linux у Windows. Можна швидко і легко

Створення знімків за допомогою Packer

Створення знімків за допомогою Packer

Що таке Пакер? Packer — це інструмент створення зображень сервера, розроблений HashiCorp. Обробка зображень сервера; або, як альтернатива, незмінна інфраструктура; є популярною альтернативою

Як встановити та налаштувати Concourse CI на CentOS 7

Як встановити та налаштувати Concourse CI на CentOS 7

Використання іншої системи? Вступ Постійна інтеграція – це практика розробки програмного забезпечення DevOps, яка дозволяє розробникам часто об’єднувати

Використання Chef-solo для налаштування програми Django в Ubuntu

Використання Chef-solo для налаштування програми Django в Ubuntu

Є багато способів автоматизувати процес налаштування та налаштування коробки. З будь-якої причини, якщо вся наша система на даний момент складається з справедливих

Як встановити Foreman на Ubuntu 16.04 LTS

Як встановити Foreman на Ubuntu 16.04 LTS

Використання іншої системи? Foreman — це безкоштовний інструмент з відкритим вихідним кодом, який допоможе вам налаштувати та керувати фізичними та віртуальними серверами. Предварня

Початок роботи з SaltStack в Ubuntu 17.04

Початок роботи з SaltStack в Ubuntu 17.04

SaltStack — це програма керування конфігурацією на основі Python, яка оптимізована для автоматизації файлів конфігурації, розгортань та всього іншого.

Повстання машин: застосування ШІ в реальному світі

Повстання машин: застосування ШІ в реальному світі

Штучний інтелект не в майбутньому, він тут прямо в сьогоденні У цьому блозі Прочитайте, як програми штучного інтелекту вплинули на різні сектори.

DDOS-атаки: короткий огляд

DDOS-атаки: короткий огляд

Ви також стали жертвою DDOS-атак і спантеличені методами запобігання? Прочитайте цю статтю, щоб вирішити свої запитання.

Ви коли-небудь замислювалися, як хакери заробляють гроші?

Ви коли-небудь замислювалися, як хакери заробляють гроші?

Можливо, ви чули, що хакери заробляють багато грошей, але чи замислювалися ви коли-небудь, як вони заробляють такі гроші? давайте обговоримо.

Революційні винаходи від Google, які полегшать ваше життя.

Революційні винаходи від Google, які полегшать ваше життя.

Ви хочете побачити революційні винаходи Google і як ці винаходи змінили життя кожної людини сьогодні? Тоді читайте в блозі, щоб побачити винаходи Google.

Friday Essential: Що сталося з автомобілями, керованими штучним інтелектом?

Friday Essential: Що сталося з автомобілями, керованими штучним інтелектом?

Концепція самокерованих автомобілів, щоб вирушати в дороги за допомогою штучного інтелекту, є мрією, яку ми давно мріємо. Але, незважаючи на кілька обіцянок, їх ніде не видно. Прочитайте цей блог, щоб дізнатися більше…

Технологічна сингулярність: віддалене майбутнє людської цивілізації?

Технологічна сингулярність: віддалене майбутнє людської цивілізації?

Оскільки наука розвивається швидкими темпами, бере на себе багато наших зусиль, ризики піддати себе незрозумілій Сингулярності також зростає. Читайте, що може означати для нас сингулярність.

Еволюція зберігання даних – інфографіка

Еволюція зберігання даних – інфографіка

Методи зберігання даних можуть розвиватися з моменту народження Даних. Цей блог висвітлює еволюцію зберігання даних на основі інфографіки.

Функціональні можливості шарів еталонної архітектури великих даних

Функціональні можливості шарів еталонної архітектури великих даних

Прочитайте блог, щоб дізнатися про різні шари архітектури великих даних та їх функціональні можливості найпростішим способом.

6 дивовижних переваг використання пристроїв розумного дому в нашому житті

6 дивовижних переваг використання пристроїв розумного дому в нашому житті

У цьому цифровому світі пристрої розумного дому стали важливою частиною життя. Ось кілька дивовижних переваг пристроїв розумного дому щодо того, як вони роблять наше життя гідним життя та спрощують його.

Оновлення доповнення macOS Catalina 10.15.4 спричиняє більше проблем, ніж вирішує

Оновлення доповнення macOS Catalina 10.15.4 спричиняє більше проблем, ніж вирішує

Нещодавно Apple випустила додаткове оновлення macOS Catalina 10.15.4, щоб виправити проблеми, але схоже, що оновлення викликає більше проблем, що призводять до блокування комп’ютерів Mac. Прочитайте цю статтю, щоб дізнатися більше