Nainstalujte Plesk na CentOS 7
Používáte jiný systém? Plesk je proprietární ovládací panel webového hostitele, který umožňuje uživatelům spravovat jejich osobní a/nebo klientské webové stránky, databáze
Buildbot je open source nástroj pro nepřetržitou integraci založený na Pythonu pro automatizaci tvorby, testování a nasazení softwaru. Buildbot se skládá z jednoho nebo více Buildbot master a několika pracovníků. Buildbot master nebo Buildmaster má centrální ovládání systému. Zodpovídá za správu prostředí stavby, pracovníků a činí všechna rozhodnutí o odesílání zakázek pracovníkům. Buildmaster detekuje změny v úložišti kódu a odesílá příkazy nebo úlohy pracovníkům k provedení. Pracovníci provedou úlohy a vrátí výsledek Buildmasterovi. Buildmaster poté informuje vývojáře prostřednictvím několika podporovaných kanálů. V tomto tutoriálu nainstalujeme Buildbot master and worker na CentOS 7. Nakonfigurujeme také ověřování a Nginx jako zabezpečený reverzní proxy.
Pro tento tutoriál použijeme 192.168.1.1
jako veřejnou IP adresu a ci.example.com
jako název domény směřující k instanci Vultr. Ujistěte se, že jste nahradili všechny výskyty vzorového názvu domény a IP adresy skutečnými.
Aktualizujte svůj základní systém pomocí průvodce Jak aktualizovat CentOS 7 . Jakmile bude váš systém aktualizován, pokračujte v instalaci PostgreSQL.
Nainstalujte Pip, což je správce balíčků pro Python.
sudo yum -y install epel-release
sudo yum -y install python-pip gcc python-devel git
sudo pip install --upgrade pip
Buildbot podporuje více typů databázových serverů, jako jsou MySQL, PostgreSQL a SQLite. V tomto tutoriálu použijeme PostgreSQL k hostování databázového serveru Buildbot.
PostgreSQL je objektově relační databázový systém, známý svou stabilitou a rychlostí. Výchozí yum
úložiště obsahuje starou verzi PostgreSQL, takže přidejte úložiště PostgreSQL.
sudo yum -y install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-1.noarch.rpm
Nainstalujte databázový server PostgreSQL.
sudo yum -y install postgresql10-server postgresql10-contrib postgresql10
Inicializujte databázi.
sudo /usr/pgsql-10/bin/postgresql-10-setup initdb
Spusťte PostgreSQL server a povolte jeho automatické spouštění při bootování.
sudo systemctl start postgresql-10
sudo systemctl enable postgresql-10
Změňte heslo pro výchozího uživatele PostgreSQL.
sudo passwd postgres
Přihlaste se jako uživatel PostgreSQL.
sudo su - postgres
Vytvořte nového uživatele PostgreSQL pro Buildbot.
createuser bb_user
Pokud chcete, můžete místo jména použít libovolné uživatelské jméno bb_user
. PostgreSQL poskytuje psql
prostředí pro spouštění dotazů na databázi. Přepněte do prostředí PostgreSQL.
psql
Nastavte heslo pro nově vytvořeného uživatele.
ALTER USER bb_user WITH ENCRYPTED password 'DBPassword';
Nahraďte jej DBPassword
bezpečným heslem.
Vytvořte novou databázi pro instalaci Buildbot.
CREATE DATABASE buildbot OWNER bb_user;
Vyjděte ze psql
skořápky.
\q
Přepnout na sudo
uživatele.
exit
Upravte pg_hba.conf
soubor, abyste povolili ověřování založené na MD5.
sudo nano /var/lib/pgsql/10/data/pg_hba.conf
Najděte následující řádky a změňte hodnoty peer
a ident
ve METHOD
sloupci na trust
a 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
Po aktualizaci bude konfigurace vypadat jako následující text.
# 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
Uložte soubor a ukončete editor. Nainstalujte databázový adaptér PostgreSQL pro Python.
sudo pip install psycopg2
Restartujte PostgreSQL, aby se změny projevily.
sudo systemctl restart postgresql-10
Nainstalujte Buildbot pomocí Pip.
sudo pip install 'buildbot[bundle]' pyopenssl service_identity
Výše uvedený příkaz nainstaluje Buildbot spolu s buildbot-www
, buildbot-worker
a několik web pluginů jako např buildbot-waterfall-view
.
Abyste se ujistili, že byl Buildbot úspěšně nainstalován, můžete to ověřit kontrolou verze Buildbota.
buildbot --version
Výstup by měl připomínat následující text.
[user@vultr ~]$ buildbot --version
Buildbot version: 0.9.15.post1
Twisted version: 17.9.0
Upravte pravidla brány firewall tak, aby umožňovala port 8010
. Buildbot používá tento port k naslouchání webovým požadavkům.
sudo firewall-cmd --zone=public --add-port=8010/tcp --permanent
sudo firewall-cmd --reload
Vytvořte nového neprivilegovaného uživatele, který bude spouštět hlavní a pracovní procesy Buildbot. Nedoporučuje se spouštět hlavní služby Buildbot jako root
uživatel.
sudo adduser buildbot
sudo passwd buildbot
Přihlaste se jako nově vytvořený buildbot
uživatel.
sudo su - buildbot
Nastavte hlavní Buildbot v /home/buildbot/master
adresáři. Tento adresář bude obsahovat soubory konfigurace, stavu a protokolu každého sestavení.
buildbot create-master --db 'postgresql://bb_user:DBPassword@localhost/buildbot' ~/master
Ujistěte se, že jste ve výše uvedeném příkazu nahradili přihlašovací údaje uživatele databáze.
Poznámka: Pokud chcete místo PostgreSQL používat databázi SQLite, jednoduše tuto --db 'postgresql://bb_user:DBpassword@localhost/buildbot'
volbu vynechejte . Databáze SQLite bude vytvořena ve stejném adresáři.
Výše uvedený příkaz vytvoří ~/master
adresář pro uložení souborů Buildmaster. Data také zapíše do databáze PostgreSQL. Získáte následující výstup.
[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
Zkopírujte ukázkový konfigurační soubor do živého konfiguračního souboru.
cp ~/master/master.cfg.sample ~/master/master.cfg
Upravte konfigurační soubor.
nano ~/master/master.cfg
Najděte následující řádky.
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",
}
Výše uvedená konfigurace má záznam pro vzorového pracovníka. Upravíme vzorový záznam pro pracovníka, na kterém budeme pracovat localhost
. Změňte jméno example-worker
na jakékoli vhodné jméno pro localhost
pracovníka a změňte pass
heslo na jiné. Poznamenejte si jméno a heslo pracovníka, protože to budeme později v tutoriálu vyžadovat. Změňte jméno pracovníka v seznamu stavitelů. Změňte název aplikace a URL projektu podle svých potřeb.
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
Vygenerované certifikáty budou pravděpodobně uloženy v /etc/letsencrypt/live/ci.example.com/
adresáři. SSL certifikát bude uložen jako fullchain.pem
a soukromý klíč bude uložen jako privkey.pem
.
Platnost certifikátů Let's Encrypt vyprší za 90 dní, proto se doporučuje nastavit automatické obnovování certifikátů pomocí úloh Cron.
Otevřete soubor úlohy cron pro root
uživatele.
sudo crontab -e
Přidejte následující řádek na konec souboru.
30 5 * * * /usr/bin/certbot renew --quiet
Výše uvedená úloha cron se spustí každý den v 5:30. Pokud má platnost certifikátu vypršet, automaticky je obnoví.
Nyní změňte výchozí konfigurační soubor Nginx, abyste odstranili default_server
řádek.
sudo sed -i 's/default_server//g' /etc/nginx/nginx.conf
Vytvořte nový konfigurační soubor pro webové rozhraní Buildbot.
sudo nano /etc/nginx/conf.d/buildbot.conf
Vyplňte soubor.
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;
}
}
Zkontrolujte chyby v novém konfiguračním souboru.
sudo nginx -t
Pokud uvidíte následující výstup, konfigurace je bez chyb.
[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
Pokud jste obdrželi nějaký druh chyby, nezapomeňte znovu zkontrolovat cestu k certifikátům SSL. Restartujte webový server Nginx, abyste provedli změnu konfigurace.
sudo systemctl restart nginx
Otevřete konfigurační soubor Buildmaster.
sudo su buildbot -c "nano /home/buildbot/master/master.cfg"
Najděte následující řádek.
c['buildbotURL'] = "http://192.168.1.1:8010/"
Změňte adresu URL podle názvu domény, kterou používáte.
c['buildbotURL'] = "https://ci.example.com/"
Restartujte hlavní službu Buildbot.
sudo systemctl restart buildbot
Nyní máte přístup k řídicímu panelu Buildbot na adrese https://ci.example.com
. Uvidíte, že připojení k Buildbotu jsou nyní zabezpečena pomocí SSL.
Přihlaste se pomocí přihlašovacích údajů správce a přidejte svůj první kanál, abyste mohli začít sestavovat aplikaci.
Používáte jiný systém? Plesk je proprietární ovládací panel webového hostitele, který umožňuje uživatelům spravovat jejich osobní a/nebo klientské webové stránky, databáze
Squid je populární bezplatný linuxový program, který vám umožňuje vytvořit webový proxy pro předávání. V této příručce uvidíte, jak nainstalovat Squid na CentOS, aby vás otočil
Úvod Lighttpd je fork Apache, jehož cílem je být mnohem méně náročný na zdroje. Je lehký, odtud jeho název, a jeho použití je docela jednoduché. Installin
VULTR nedávno provedl změny na jejich konci a vše by nyní mělo fungovat dobře po vybalení s povoleným NetworkManagerem. Pokud si přejete deaktivovat
Icinga2 je výkonný monitorovací systém a při použití v modelu master-client může nahradit potřebu monitorovacích kontrol založených na NRPE. Hlavní klient
Používáte jiný systém? Apache Cassandra je bezplatný a otevřený systém pro správu databází NoSQL, který je navržen tak, aby poskytoval škálovatelnost, vysokou
Používáte jiný systém? Microweber je open source drag and drop CMS a online obchod. Zdrojový kód Microweber je hostován na GitHubu. Tento průvodce vám to ukáže
Používáte jiný systém? Vanilla forum je open source aplikace fóra napsaná v PHP. Je plně přizpůsobitelný, snadno použitelný a podporuje externí
Používáte jiný systém? Mattermost je open source alternativa k zasílání zpráv Slack SAAS s vlastním hostitelem. Jinými slovy, s Mattermostem můžete ca
Co budete potřebovat Vultr VPS s alespoň 1 GB RAM. Přístup SSH (s oprávněními root/administrátor). Krok 1: Instalace BungeeCord První věci
Ovládací panel Plesk se vyznačuje velmi pěknou integrací pro Lets Encrypt. Lets Encrypt je jedním z jediných poskytovatelů SSL, kteří rozdávají kompletní certifikáty
Lets Encrypt je certifikační autorita určená k bezplatnému poskytování certifikátů SSL. cPanel vytvořil úhlednou integraci, takže vy a váš klient
Používáte jiný systém? Concrete5 je open source CMS, který nabízí mnoho charakteristických a užitečných funkcí, které pomáhají editorům snadno vytvářet obsah
Používáte jiný systém? Review Board je bezplatný a open source nástroj pro kontrolu zdrojového kódu, dokumentace, obrázků a mnoha dalších. Je to webový software
V této příručce se dozvíte, jak nastavit HTTP ověřování pro webový server Nginx běžící na CentOS 7. Požadavky Chcete-li začít, budete potřebovat
YOURLS (Your Own URL Shortener) je open source aplikace pro zkracování adres URL a analýzu dat. V tomto článku se budeme zabývat procesem instalace
Používáte jiný systém? Úvod ArangoDB je open source databáze NoSQL s flexibilním datovým modelem pro dokumenty, grafy a páry klíč–hodnota. to je
Úvod Adresář /etc/ hraje kritickou roli ve způsobu fungování systému Linux. Důvodem je skutečnost, že téměř každá konfigurace systému
Mnoho systémových administrátorů spravuje velké množství serverů. Když je potřeba přistupovat k souborům přes různé servery, přihlaste se ke každému zvlášť ca
Tento návod pokryje proces instalace herního serveru Half Life 2 na systém CentOS 6. Krok 1: Instalace předpokladů Aby bylo možné nastavit ou
Umělá inteligence není v budoucnosti, je zde přímo v současnosti V tomto blogu si přečtěte, jak aplikace umělé inteligence ovlivnily různé sektory.
Jste také obětí DDOS útoků a nemáte jasno v metodách prevence? Chcete-li vyřešit své dotazy, přečtěte si tento článek.
Možná jste slyšeli, že hackeři vydělávají spoustu peněz, ale napadlo vás někdy, jak takové peníze vydělávají? Pojďme diskutovat.
Chcete vidět revoluční vynálezy Google a jak tyto vynálezy změnily život každého dnešního člověka? Pak si přečtěte na blogu a podívejte se na vynálezy od Googlu.
Koncept aut s vlastním pohonem, která vyrazí na silnice s pomocí umělé inteligence, je snem, který už nějakou dobu máme. Ale přes několik slibů nejsou nikde vidět. Přečtěte si tento blog a dozvíte se více…
Jak se věda vyvíjí rychlým tempem a přebírá mnoho našeho úsilí, stoupá také riziko, že se vystavíme nevysvětlitelné singularitě. Přečtěte si, co pro nás může znamenat singularita.
Způsoby ukládání dat se mohou vyvíjet od narození dat. Tento blog se zabývá vývojem ukládání dat na základě infografiky.
Přečtěte si blog, abyste co nejjednodušším způsobem poznali různé vrstvy v architektuře velkých dat a jejich funkce.
V tomto digitálním světě se chytrá domácí zařízení stala klíčovou součástí života. Zde je několik úžasných výhod chytrých domácích zařízení o tom, jak náš život stojí za to žít a zjednodušit jej.
Apple nedávno vydal doplňkovou aktualizaci macOS Catalina 10.15.4, která opravuje problémy, ale zdá se, že aktualizace způsobuje další problémy, které vedou k zablokování počítačů mac. Přečtěte si tento článek a dozvíte se více