Vendosni një aplikacion PHP duke përdorur Docker-compose

Aplikacionet PHP zakonisht përbëhen nga një server në internet, një sistem bazë të dhënash relacionale dhe vetë përkthyesi i gjuhës. Në këtë tutorial ne do të shfrytëzojmë një grumbull të plotë aplikacionesh PHP duke përdorur docker. Ky është një tutorial i thelluar në të cilin do të ndërtojmë dhe orkestrojmë kontejnerë për Nginx (webserver), MySQL (sistemi i bazës së të dhënave) dhe PHP.

Për hir të këtij tutoriali, ne do të shkruajmë një aplikacion të thjeshtë që lexon një listë qytetesh nga një bazë të dhënash dhe e shfaq atë në një faqe interneti, në këtë mënyrë do të demonstrojmë një aplikacion bazë, por funksional, PHP.

Ky udhëzues supozon që ju keni Docker-CE të instaluar tashmë dhe të paktën një njohuri minimale të punës për docker. Për këtë çështje, ju mund të rishikoni mësimet e mëposhtme:

Konfigurimi i mjedisit tonë të punës

Një aplikacion i vërtetë i bazuar në doker zakonisht përbëhet nga disa kontejnerë. Menaxhimi i tyre me dorë mund të bëhet lehtësisht mjaft i çrregullt dhe i rëndë. Këtu hyn në lojë docker-compose. Ju ndihmon të menaxhoni një numër kontejnerësh përmes një yamlskedari të thjeshtë konfigurimi.

Instaloni docker-compose.

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Krijo një dosje për të mbajtur të gjithë skedarët e nevojshëm të këtij shembulli dhe më pas cdnë të. Tani e tutje, kjo është drejtoria jonë e punës dhe çdo komandë do të ekzekutohet brenda kësaj dosje dhe çdo shteg do të referohet në lidhje me të. Kjo dosje mund të referohet më vonë si WORKING_DIR.

mkdir ~/docker
cd ~/docker

Tani krijoni edhe tre dosje të tjera.

mkdir php nginx app

phpDosje është ajo ku ne do të ndërtojmë tonë imazh porosi PHP, The nginxdosje do të mbajë dosjet e nevojshme për tonë imazhin porosi nginx dhe appdosje është ajo ku ne do të vënë kodin burimor dhe konfigurimin e aplikimit tonë mostrës.

Konfigurimi i kontejnerit PHP

Në këtë shembull, ne do të përdorim php-fpmpër t'u lidhur me uebserverin Nginx. Ne do të përdorim imazhin zyrtar të bazës PHP. Megjithatë, ne gjithashtu duhet të instalojmë dhe aktivizojmë disa shtesa në mënyrë që të mund të hyjmë në bazën e të dhënave. Brenda phpdosjes krijoni një skedar me emrin Dockerfiledhe vendosni përmbajtjen e mëposhtme në të.

FROM php:7.1-fpm-alpine3.4
RUN apk update --no-cache \
    && apk add --no-cache $PHPIZE_DEPS \
    && apk add --no-cache mysql-dev \
    && docker-php-ext-install pdo pdo_mysql

Vini re se ne po përdorim versionin Alpin të imazhit zyrtar PHP. Alpine është një shpërndarje shumë e vogël e synuar drejt kontejnerëve duke ofruar gjurmë shumë më të vogla. Gjithashtu, vini re përdorimin e komandës docker-php-ext-install, imazhi zyrtar PHP ofron këtë komandë për të lehtësuar procesin e instalimit dhe konfigurimit të shtesave PHP.

Tani, le të ndërtojmë këtë imazh Docker duke lëshuar sa vijon (brenda tonë WORKING_DIR):

docker build -t vultr-php php/

docker-compose.ymlfotografi

Siç u përmend tashmë, docker-composeju lejon të menaxhoni një numër kontejnerësh përmes një skedari të thjeshtë konfigurimi. Ky skedar konfigurimi zakonisht quhet docker-compose.yml. Krijo këtë skedar brenda appdosjes.

touch app/docker-compose.yml

Tani vendosni përmbajtjen e mëposhtme në këtë skedar.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

Ne do ta shpjegojmë këtë sintaksë. Së pari, vini re rreshtin e parë.

version: '2'

Kjo specifikon versionin e docker-compose.ymlskedarit të konfigurimit të përdorur. Rreshti tjetër specifikon shërbimet, ose me fjalë të tjera, kontejnerët që do të ofrohen.

services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app

Vini re se çdo shërbim ka një çelës specifik brenda servicesbllokut. Emri i specifikuar këtu do të përdoret për t'iu referuar këtij kontejneri specifik më vonë. Vini re gjithashtu se brenda phpkonfigurimit, ne përcaktojmë imazhin e përdorur për të drejtuar kontejnerin (ky është imazhi që kemi ndërtuar më parë). Ne gjithashtu përcaktojmë një hartë vëllimi.

volumes:
  - ./:/app

Kjo tregon docker-composepër të hartuar direktoriumin aktual ( ./) në /appdrejtorinë brenda kontejnerit. Rreshti i fundit e vendos /appdosjen brenda kontejnerit si direktorium pune, që do të thotë se ky është dosja nga e cila ekzekutohen si parazgjedhje të gjitha komandat e ardhshme brenda një kontejneri.

Tani mund të orkestrojmë kontejnerët tanë.

cd ~/docker/app
docker-compose up -d

Ju mund të ekzekutoni komandën e mëposhtme për t'u siguruar që kontejneri PHP është ekzekutuar:

docker ps

Si të ekzekutoni komandat brenda kontejnerëve

Ende brenda appdosjes, ne mund të ekzekutojmë çdo komandë brenda një kontejneri të caktuar shërbimi me ndihmën e docker-composekomandës.

docker-compose exec [service] [command]

[service]Placeholder referohet kyç shërbimit. Në rastin tonë, kjo ishte php. Le të ekzekutojmë një komandë brenda kontejnerit për të kontrolluar versionin tonë PHP.

docker-compose exec php php -v

Do të shihni daljen e mëposhtme.

PHP 7.1.14 (cli) (built: Feb  7 2018 00:40:45) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

Konfigurimi i kontejnerit Nginx

Ashtu si kontejneri PHP, ne duhet të krijojmë një imazh të personalizuar për serverin në internet. Por në këtë rast, ne vetëm duhet të ofrojmë një konfigurim për tonën virtual host. Sigurohuni që jeni brenda WORKING_DIRdhe krijoni një dosje Dockerfilebrenda nginxdosjes:

cd ~/docker
touch nginx/Dockerfile

Tani vendosni përmbajtjen e mëposhtme në këtë Dockerfile:

FROM nginx:1.13.8-alpine
COPY ./default.conf /etc/nginx/conf.d/default.conf

Ne po përdorim imazhin e paracaktuar Nginx bazuar në Alpine. Në këtë skedar Docker ne thjesht kopjojmë një skedar konfigurimi në konfigurimin e aplikacionit tonë. Para se të ndërtoni këtë imazh, krijoni një skedar konfigurimi.

touch nginx/default.conf

Tani mbusheni me këtë përmbajtje.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.php;

    #server_name server_domain_or_IP;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Vini re se në fastcgi_pass php:9000rresht ne po i referohemi kontejnerit PHP me emrin e tij brenda servicebllokut të docker-compose.ymlskedarit të konfigurimit. Brenda docker-composekrijon një rrjet dhe cakton emrin e shërbimit si emër pritës për secilin prej shërbimeve të përcaktuara. Tani mund të ndërtojmë imazhin Nginx.

docker build -t vultr-nginx nginx/

Po përditësohet docker-compose.yml

Tani përditësoni app/docker-compose.ymlskedarin.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80

Ne kemi shtuar vetëm një shërbim të ri. Konfigurimi është pothuajse i njëjtë, me përjashtim të sa vijon.

depends_on:
  - php
ports:
  - 80:80

Once the Nginx container needs the PHP service to be fully initialized, we force this requirement in the depends_on option. The ports configuration key maps a host port to a container port, here we map the port 80 in the host to the port 80 in the container.

Now create a file called index.php inside the app folder and put the following in it.

<?php phpinfo();

Make sure the port 80 is accessible through your firewall and execute the following.

cd ~/docker/app
docker-compose up -d

Once again, double check that the service is up.

docker ps

Open a browser and access [vultr-instance-ip]. You may find out your Vultr instance IP address by running the following.

hostname -I

You will see the PHP info page.

Configuring the MySQL container

The official MySQL image allows you to configure the container through simple environment variables. This can be done with an environment option inside the service block definition. Update the ~/docker/app/docker-compose.yml file to the following.

version: '2'
services:
  php:
    image: vultr-php
    volumes:
      - ./:/app
    working_dir: /app
  web:
    image: vultr-nginx
    volumes:
      - ./:/app
    depends_on:
      - php
    ports:
      - 80:80
  mysql:
    image: mysql:5.7.21
    volumes:
      - ./:/app
      - dbdata:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=world
      - MYSQL_ROOT_PASSWORD=root
    working_dir: /app
volumes:
  dbdata:

Now we've defined a new service for the database. Notice the line dbdata:/var/lib/mysql. This mounts the path on the container /var/lib/mysql to a persistent volume managed by Docker, this way the database data persists after the container is removed. This volume needs to be defined in a top-level block as you can see in the end of the file.

Përpara se të orkestrojmë konfigurimin tonë të ri, le të shkarkojmë një mostër bazë të dhënash MySQL. Dokumentacioni zyrtar MySQL ofron disa mostra të bazave të të dhënave. Ne do të përdorim bazën e të dhënave të njohur botërore. Kjo bazë të dhënash ofron një listë të vendeve dhe qyteteve. Për të shkarkuar këtë mostër, ekzekutoni sa më poshtë brenda dosjes së aplikacionit tonë.

curl -L http://downloads.mysql.com/docs/world.sql.gz -o world.sql.gz
gunzip world.sql.gz

Tani le të orkestrojmë kontejnerët tanë.

docker-compose up -d

Siç mund ta keni vënë re tashmë, docker-compose upkomanda fillon vetëm kontejnerët që nuk janë nisur tashmë. Ai kontrollon për dallimet midis docker-compose.ymlskedarit tuaj dhe konfigurimit aktual të kontejnerëve që funksionojnë.

Një herë tjetër, kontrolloni që kontejneri MySQL të jetë nisur.

docker ps

Tani plotësoni bazën e të dhënave botërore.

docker-compose exec -T mysql mysql -uroot -proot world < world.sql

Ju mund të verifikoni që baza e të dhënave është e mbushur duke zgjedhur të dhënat direkt nga baza e të dhënave. Fillimisht hyni në kërkesën MySQL brenda kontejnerit.

docker-compose exec mysql mysql -uroot -proot world

Në prompt MySQL, ekzekutoni sa më poshtë.

select * from city limit 10;

Do të shihni një listë të qyteteve. Tani dilni nga prompti MySQL.

mysql> exit

Ndërtimi i aplikacionit tonë

Tani që të gjithë kontejnerët e nevojshëm janë gati dhe funksionojnë, ne mund të përqendrohemi në aplikimin tonë të mostrës. Përditësoni app/index.phpskedarin në vijim.

<?php

$pdo = new PDO('mysql:host=mysql;dbname=world;charset=utf8', 'root', 'root');

$stmt = $pdo->prepare("
    select city.Name, city.District, country.Name as Country, city.Population
    from city
    left join country on city.CountryCode = country.Code
    order by Population desc
    limit 10
");
$stmt->execute();
$cities = $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vultr Rocks!</title>
</head>
<body>
    <h2>Most Populous Cities In The World</h2>
    <table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Country</th>
            <th>District</th>
            <th>Population</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($cities as $city): ?>
            <tr>
                <td><?=$city['Name']?></td>
                <td><?=$city['Country']?></td>
                <td><?=$city['District']?></td>
                <td><?=number_format($city['Population'], 0)?></td>
            </tr>
        <?php endforeach ?>
    </tbody>
    </table>
</body>
</html>

Nëse hyni [vultr-instance-ip]në një shfletues uebi, do të shihni një listë të qyteteve më të populluara në botë. Urime, ju keni vendosur një aplikacion PHP që funksionon plotësisht duke përdorur docker.

konkluzioni

Në këtë tutorial, unë kam demonstruar hap pas hapi se si të konfiguroni një aplikacion PHP që funksionon plotësisht. Ne ndërtuam imazhe të personalizuara për PHP dhe Nginx dhe konfiguruam docker-compose për të orkestruar kontejnerët tanë. Pavarësisht se është shumë bazë dhe i thjeshtë, ky konfigurim pasqyron një skenar të jetës reale.

Në këtë udhëzues, ne kemi ndërtuar dhe etiketuar imazhet tona në nivel lokal. Për një konfigurim më fleksibël, mund t'i shtyni këto imazhe në një regjistër doker . Ju mund të shtyni në regjistrin zyrtar të dokerit ose madje të konfiguroni regjistrin tuaj të dokerit. Në çdo rast, kjo do t'ju lejojë të ndërtoni imazhet tuaja në një host dhe t'i përdorni ato në një tjetër.

Për një përdorim më të detajuar të docker-compose, duhet t'i referoheni dokumentacionit zyrtar .

Në varësi të kërkesave të aplikacionit tuaj dhe kornizës PHP që përdorni, mund të dëshironi të shtoni më shumë shtesa. Kjo mund të bëhet lehtësisht duke modifikuar atë që Dockerfilepërdoret për të ndërtuar imazhin tonë të personalizuar PHP. Megjithatë, disa shtesa kanë nevojë për varësi shtesë për t'u instaluar në kontejner. Ju duhet t'i referoheni listës së shtesave në dokumentacionin zyrtar të PHP-së për të shqyrtuar kërkesat bazë të secilës shtesë.


Ja se si të shikoni kontejnerët Hyper-V në Windows 10 Insider

Ja se si të shikoni kontejnerët Hyper-V në Windows 10 Insider

Microsoft ka shpjeguar në një postim të ri në blog se si Windows Insiders mund të testojë kontejnerët Hyper-V në Windows 10, një zgjidhje e re virtualizimi për të lejuar që aplikacionet të funksionojnë pa ndikuar në pjesën tjetër të sistemit tuaj operativ.

Si të instaloni Harbor në CentOS 7

Si të instaloni Harbor në CentOS 7

Harbor është një server regjistri me burim të hapur të klasës së ndërmarrjes që ruan dhe shpërndan imazhet e Docker. Harbor zgjeron Shpërndarjen Docker me burim të hapur b

Instaloni Rancher OS nëpërmjet iPXE

Instaloni Rancher OS nëpërmjet iPXE

Rancher OS është një shpërndarje Linux shumë e lehtë e ndërtuar rreth Docker. Vetë OS peshon rreth 20 MB. Ky tutorial do t'ju vërë në punë

Në CoreOS, konfiguroni Regjistrin tuaj Docker

Në CoreOS, konfiguroni Regjistrin tuaj Docker

Ne të gjithë e njohim dhe e duam Docker, një platformë për të krijuar, menaxhuar dhe shpërndarë kontejnerë aplikacionesh nëpër makina të shumta. Docker Inc ofron një shërbim t

Instalimi i docker-compose në CoreOS

Instalimi i docker-compose në CoreOS

Ky artikull shpjegon se si të instaloni docker-compose në CoreOS. Në CoreOS, dosja /usr/ është e pandryshueshme kështu që shtegu standard /usr/local/bin nuk është i disponueshëm për

Instaloni Rancher në CentOS 7

Instaloni Rancher në CentOS 7

Përdorimi i një sistemi të ndryshëm? Hyrje Rancher është një platformë me burim të hapur për drejtimin e kontejnerëve dhe ndërtimin e një shërbimi privat të kontejnerëve. Rancher është bazë

Instaloni Docker CE në Ubuntu 18.04

Instaloni Docker CE në Ubuntu 18.04

Hyrje Docker është një aplikacion që na lejon të vendosim programe që ekzekutohen si kontejnerë. Është shkruar në gjuhën popullore të programimit Go

Krijo një Swarm Docker në Alpine Linux 3.9.0

Krijo një Swarm Docker në Alpine Linux 3.9.0

Hyrje Ky udhëzues do t'ju tregojë se si të krijoni dhe konfiguroni një tufë Docker duke përdorur shumë serverë Alpine Linux 3.9.0 dhe Portainer. Ju lutemi kini parasysh se

Vendosni një aplikacion PHP duke përdorur Docker-compose

Vendosni një aplikacion PHP duke përdorur Docker-compose

Aplikacionet PHP zakonisht përbëhen nga një server në internet, një sistem bazë të dhënash relacionale dhe vetë përkthyesi i gjuhës. Në këtë tutorial ne do të jemi leveragin

Ngarkoni balancën me Docker

Ngarkoni balancën me Docker

Kur ekzekutoni një aplikacion ueb, zakonisht dëshironi të përfitoni sa më shumë nga burimet tuaja pa pasur nevojë të konvertoni softuerin tuaj për të përdorur multithreading o

Vendosni një aplikacion Node.js duke përdorur Docker

Vendosni një aplikacion Node.js duke përdorur Docker

Ky artikull do t'ju tregojë se si të vendosni aplikacionin tuaj Node brenda një kontejneri Docker. Shënim: Ky udhëzues supozon që ju keni instaluar dhe lexuar Docker

Instalimi i Docker CE në CentOS 7

Instalimi i Docker CE në CentOS 7

Teknologjia e kontejnerëve Docker ju lejon të ekzekutoni aplikacione në një mjedis specifik dhe të izoluar. Docker Community Edition (CE) është emri i ri për fre

Instalimi i Docker në CentOS 7

Instalimi i Docker në CentOS 7

Përdorimi i një sistemi të ndryshëm? Docker është një aplikacion që lejon vendosjen e softuerit brenda kontejnerëve virtualë. Ishte shkruar në programin Go

Instalimi i Docker CE në Debian 9

Instalimi i Docker CE në Debian 9

Përdorimi i një sistemi të ndryshëm? Hyrje Docker është një aplikacion që lejon vendosjen e softuerit brenda kontejnerëve virtualë. Ishte shkruar në G

Filloni me SQL Server 2017 (MS-SQL) në CentOS 7 me Docker

Filloni me SQL Server 2017 (MS-SQL) në CentOS 7 me Docker

Parakushtet Docker engine 1.8+. Minimumi 4 GB hapësirë ​​në disk. Minimumi 4 GB RAM. Hapi 1. Instalo Docker Për të instaluar SQL-Server, Docker mus

Sesion ngjitës me Docker Swarm (CE) në Debian 9

Sesion ngjitës me Docker Swarm (CE) në Debian 9

Përdorimi i një sistemi të ndryshëm? Hyrje Docker Swarm i kthen serverët tuaj individualë në një grup kompjuterash; lehtësimi i shkallëzimit, disponueshmëria e lartë dhe

Dy Mjete Menaxhimi Grafik Docker: DockerUI dhe Kantieri i anijeve

Dy Mjete Menaxhimi Grafik Docker: DockerUI dhe Kantieri i anijeve

Me ndihmën e aplikacionit Vultr Docker, ju mund të vendosni lehtësisht Docker në shembullin e serverit tuaj Vultr. Ndërkohë, ju mund të lehtësoni detyrën e menaxhimit të Docker

Instaloni serverin Rancher në RancherOS

Instaloni serverin Rancher në RancherOS

Përmbledhje RancherOS është një sistem operativ tepër i lehtë (vetëm rreth 60 MB) që drejton një sistem Docker daemon si PID 0 për ekzekutimin e shërbimeve të sistemit

Fillimi me Kubernetes në CentOS 7

Fillimi me Kubernetes në CentOS 7

Kubernetes është një platformë me burim të hapur e zhvilluar nga Google për menaxhimin e aplikacioneve me kontejnerë nëpër një grup serverësh. Ajo ndërtohet mbi një dekadë dhe

Instaloni Rancher në Ubuntu 16.04

Instaloni Rancher në Ubuntu 16.04

Përdorimi i një sistemi të ndryshëm? Hyrje Rancher është një platformë me burim të hapur për drejtimin e kontejnerëve dhe ndërtimin e një shërbimi privat të kontejnerëve. Rancher është bazë

Ngritja e makinave: Aplikimet në botën reale të AI

Ngritja e makinave: Aplikimet në botën reale të AI

Inteligjenca Artificiale nuk është në të ardhmen, është këtu në të tashmen Në këtë blog Lexoni se si aplikacionet e inteligjencës artificiale kanë ndikuar në sektorë të ndryshëm.

Sulmet DDOS: Një përmbledhje e shkurtër

Sulmet DDOS: Një përmbledhje e shkurtër

A jeni edhe ju viktimë e Sulmeve DDOS dhe jeni konfuz në lidhje me metodat e parandalimit? Lexoni këtë artikull për të zgjidhur pyetjet tuaja.

A e keni pyetur ndonjëherë veten se si fitojnë para hakerët?

A e keni pyetur ndonjëherë veten se si fitojnë para hakerët?

Ju mund të keni dëgjuar se hakerët fitojnë shumë para, por a keni menduar ndonjëherë se si i fitojnë ato para? Le te diskutojme.

Shpikjet revolucionare nga Google që do tju bëjnë të lehtë jetën tuaj.

Shpikjet revolucionare nga Google që do tju bëjnë të lehtë jetën tuaj.

Dëshironi të shihni shpikjet revolucionare nga Google dhe se si këto shpikje ndryshuan jetën e çdo njeriu sot? Më pas lexoni në blog për të parë shpikjet nga Google.

E Premte Thelbësore: Çfarë ndodhi me Makinat e drejtuara nga AI?

E Premte Thelbësore: Çfarë ndodhi me Makinat e drejtuara nga AI?

Koncepti i makinave vetë-drejtuese për të dalë në rrugë me ndihmën e inteligjencës artificiale është një ëndërr që e kemi prej kohësh. Por, pavarësisht nga disa premtime, ato nuk shihen askund. Lexoni këtë blog për të mësuar më shumë…

Singulariteti teknologjik: Një e ardhme e largët e qytetërimit njerëzor?

Singulariteti teknologjik: Një e ardhme e largët e qytetërimit njerëzor?

Ndërsa Shkenca evoluon me një ritëm të shpejtë, duke marrë përsipër shumë nga përpjekjet tona, rriten edhe rreziqet për t'iu nënshtruar një Singulariteti të pashpjegueshëm. Lexoni, çfarë mund të thotë singulariteti për ne.

Evolucioni i ruajtjes së të dhënave - Infografik

Evolucioni i ruajtjes së të dhënave - Infografik

Metodat e ruajtjes së të dhënave kanë evoluar mund të jenë që nga lindja e të dhënave. Ky blog mbulon evolucionin e ruajtjes së të dhënave në bazë të një infografike.

Funksionalitetet e shtresave të arkitekturës së referencës së të dhënave të mëdha

Funksionalitetet e shtresave të arkitekturës së referencës së të dhënave të mëdha

Lexoni blogun për të njohur shtresat e ndryshme në arkitekturën e të dhënave të mëdha dhe funksionalitetet e tyre në mënyrën më të thjeshtë.

6 Përfitimet e mahnitshme të të pasurit pajisje shtëpiake inteligjente në jetën tonë

6 Përfitimet e mahnitshme të të pasurit pajisje shtëpiake inteligjente në jetën tonë

Në këtë botë të drejtuar nga dixhitali, pajisjet inteligjente të shtëpisë janë bërë një pjesë thelbësore e jetës. Këtu janë disa përfitime të mahnitshme të pajisjeve shtëpiake inteligjente se si ato e bëjnë jetën tonë të vlefshme dhe më të thjeshtë.

Përditësimi shtesë i macOS Catalina 10.15.4 po shkakton më shumë probleme sesa zgjidhja

Përditësimi shtesë i macOS Catalina 10.15.4 po shkakton më shumë probleme sesa zgjidhja

Së fundmi Apple lëshoi ​​macOS Catalina 10.15.4 një përditësim shtesë për të rregulluar problemet, por duket se përditësimi po shkakton më shumë probleme që çojnë në bricking të makinerive mac. Lexoni këtë artikull për të mësuar më shumë