speedtech-website/public/en/blog/mariadb-replicazione-master-master-tramite-internet/index.html
2025-12-12 18:05:59 +01:00

142 lines
No EOL
27 KiB
HTML

<!doctype html><html lang=en><head><meta charset=utf-8><meta name=robots content="all,follow"><meta name=googlebot content="index,follow,snippet,archive"><meta name=viewport content="width=device-width,initial-scale=1"><title>SpeedTech | Blog - MariaDB replication master-master via Internet</title>
<meta name=author content><meta name=keywords content="IT Services,Software development,Security,VPN,Firewall,Servers with Linux,Private email"><meta name=description content="SpeedTech - Information technology services"><meta name=generator content="Hugo 0.123.7"><link href=/css/main.css rel=stylesheet><link rel="shortcut icon" href=/img/favicon.ico type=image/x-icon><link rel=apple-touch-icon href=/img/apple-touch-icon.png><meta property="og:title" content="MariaDB replication master-master via Internet"><meta property="og:description" content="MariaDB (and MySQL) allow master-slave replication to be configured between two servers.
A master-master type of replication can be implemented via Galera, but it requires
at least 3 servers. If you have 2 servers, you can configure master-master replication by
by cross-duplicating the master-slave replication."><meta property="og:type" content="article"><meta property="og:url" content="https://speedtech.it/en/blog/mariadb-replicazione-master-master-tramite-internet/"><meta property="og:image" content="https://speedtech.it/images/blog/mariadb-replication-master-master.jpg"><meta property="article:section" content="blog"><meta property="article:published_time" content="2022-07-19T00:00:00+00:00"><meta property="article:modified_time" content="2022-12-11T00:00:00+00:00"><meta property="og:site_name" content="SpeedTech"><script src=/js/htmx/htmx.min.js defer></script><script src=/js/main.js defer></script></head><body hx-boost=true lang=en><nav id=topnav><div class=container><a class=navbar-brand href=/en><img class=img-fluid src=/img/logo.svg alt=SpeedTech></a><div id=topmenu><button id=responsive-button onclick='htmx.toggleClass(htmx.find("#topmenu"),"responsive")'><i class="icon icon-menu"></i></button><ul><li class=dropdown><a href=/en/#home-bottom role=button>Services</a><ul class=submenu><li><a href=/en/service/applications-development/ title="Software applications design and development"><i class="icon icon-desktop"></i>
Application development</a></li><li><a href=/en/service/e-commerce/ title="E-commerce platforms design, development and integration"><i class="icon icon-cart"></i>
E-commerce solutions</a></li><li><a href=/en/service/custom-cms/ title="Websites and custom CMS development and integration"><i class="icon icon-layers"></i>
Websites backends and CMS</a></li><li><a href=/en/service/private-e-mail/ title="Private E-mail: hosting, security, privacy and archiving"><i class="icon icon-email"></i>
Private E-mail</a></li><li><a href=/en/service/managed-linux-servers/ title="Installation, configuration and maintenance of Linux servers on both physical and virtual (VPS) hardware"><i class="icon icon-server"></i>
Managed Linux servers</a></li><li><a href=/en/service/online-offline-collaboration-solutions/ title="Online and offline collaboration solutions"><i class="icon icon-cloud"></i>
On/off-line collaboration</a></li><li><a href=/en/service/linux-clients/ title="Linux clients: installation and configuration"><i class="icon icon-computer"></i>
Linux clients</a></li><li><a href=/en/service/security-firewalls-vpn/ title="Security structures: firewalls, VPN, encryption, backups"><i class="icon icon-security"></i>
Security</a></li><li><a href=/en/service/domotic-opensource/ title="Open source home automation solutions"><i class="icon icon-robot"></i>
Open source domotic</a></li></ul></li><li><a href=https://brainminder.it>BrainMinder</a></li><li><a href=https://gitea.speedtech.it/explore/repos>Git repository</a></li><li><a href=/en/#contact>Contact</a></li><li><a href=/en/blog>Blog</a></li><li><a href=https://speedtech.it/blog/mariadb-replicazione-master-master-tramite-internet/>IT</a></li></ul></div></div></nav><header class=blog-single><div class=container><div class=row><div class="col s12 m9 l9"><h2><a href=/en/blog/>Blog</a></h2><h3 class=title>MariaDB replication master-master via Internet</h3></div></div></div></header><div id=page-content><div class=container><div class=row><div class="col s12 m9 l9 articlecontent"><p class=text-center><img class=img-fluid src=/images/blog/mariadb-replication-master-master.jpg width=400></p><div style=text-align:justify;margin-bottom:16px><p><a href=https://mariadb.org>MariaDB</a> (and MySQL) allow master-slave replication to be configured between two servers.
A master-master type of replication can be implemented via <a href=https://galeracluster.com/>Galera</a>, but it requires
at least 3 servers. If you have 2 servers, you can configure master-master replication by
by cross-duplicating the master-slave replication.</p><p>This functionality can also be implemented through servers connected to each other via the Internet,
by encrypting MariaDB&rsquo;s native connection via SSL certificates and controlling access to the service
via software firewalls (<a href=https://help.ubuntu.com/community/UFW>ufw</a> for example).</p><p>Assuming then that we have 2 servers <code>server1</code> and <code>server2</code> the procedures
to follow are as follows.</p><h4 id=1-setting-up-firewall-rules>1. Setting up firewall rules</h4><p>In order for the two servers to communicate with each other, it is necessary to allow communication on the TCP port of
MariaDB (default 3306)</p><p>On <code>server2</code></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>ufw allow from server1-ip to server2-ip <span style=color:#ae81ff>3306</span> comment <span style=color:#e6db74>&#34;Allow replication from server1&#34;</span>
</span></span></code></pre></div><p>On <code>server1</code></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>ufw allow from server2-ip to server1-ip <span style=color:#ae81ff>3306</span> comment <span style=color:#e6db74>&#34;Allow replication from server2&#34;</span>
</span></span></code></pre></div><h5 id=2-ssl-certificates-generation>2. SSL certificates generation</h5><p>To secure the connection between the two servers, one can take advantage of the SSL connectivity already present in MariaDB by
by generating your own CA (Certification Authority) and respective certificates for the two servers.</p><p><a href=https://hohnstaedt.de/xca/>XCA</a> is an excellent visual software for generating and maintaining SSL certificates.</p><p>An alternative to a direct, encrypted connection via SSL is to create a VPN linking the two servers.</p><h5 id=3-data-servers-alignment>3. Data servers alignment</h5><p>In case the two servers already contain data, it will be necessary to proceed with an alignment
beforehand by exporting and importing the affected databases, so that both
servers contain the same databases, tables, and records.</p><h5 id=4-create-the-dedicated-users-on-each-server-to-enable-replication>4. Create the dedicated users on each server to enable replication</h5><p>On <code>server1</code> create the user for the connection from <code>server2</code> and give it permissions
for replication to <code>server1</code></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span><span style=color:#66d9ef>CREATE</span> <span style=color:#66d9ef>USER</span> <span style=color:#e6db74>&#39;server2&#39;</span><span style=color:#f92672>@</span><span style=color:#e6db74>&#39;server2-ip&#39;</span> IDENTIFIED <span style=color:#66d9ef>BY</span> <span style=color:#e6db74>&#39;server2pwd&#39;</span>;
</span></span><span style=display:flex><span><span style=color:#66d9ef>GRANT</span> REPLICATION SLAVE <span style=color:#66d9ef>ON</span> <span style=color:#f92672>*</span>.<span style=color:#f92672>*</span> <span style=color:#66d9ef>TO</span> <span style=color:#e6db74>&#39;server2&#39;</span><span style=color:#f92672>@</span><span style=color:#e6db74>&#39;server2-ip&#39;</span>;
</span></span><span style=display:flex><span>FLUSH <span style=color:#66d9ef>PRIVILEGES</span>;
</span></span></code></pre></div><p>On <code>server2</code> create the user for the connection from <code>server1</code> and give it permissions
for replication to <code>server2</code></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span><span style=color:#66d9ef>CREATE</span> <span style=color:#66d9ef>USER</span> <span style=color:#e6db74>&#39;server1&#39;</span><span style=color:#f92672>@</span><span style=color:#e6db74>&#39;server1-ip&#39;</span> IDENTIFIED <span style=color:#66d9ef>BY</span> <span style=color:#e6db74>&#39;server1pwd&#39;</span>;
</span></span><span style=display:flex><span><span style=color:#66d9ef>GRANT</span> REPLICATION SLAVE <span style=color:#66d9ef>ON</span> <span style=color:#f92672>*</span>.<span style=color:#f92672>*</span> <span style=color:#66d9ef>TO</span> <span style=color:#e6db74>&#39;server1&#39;</span><span style=color:#f92672>@</span><span style=color:#e6db74>&#39;server1-ip&#39;</span>;
</span></span><span style=display:flex><span>FLUSH <span style=color:#66d9ef>PRIVILEGES</span>;
</span></span></code></pre></div><h5 id=5-configure-server1>5. Configure <code>server1</code></h5><p>In file server.conf :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>key_buffer_size <span style=color:#f92672>=</span> 64M
</span></span><span style=display:flex><span>max_allowed_packet <span style=color:#f92672>=</span> 64M
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>server-id <span style=color:#f92672>=</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span>report_host <span style=color:#f92672>=</span> server1
</span></span><span style=display:flex><span>log_bin <span style=color:#f92672>=</span> /var/log/mysql/mysql-bin.log
</span></span><span style=display:flex><span>expire_logs_days <span style=color:#f92672>=</span> <span style=color:#ae81ff>10</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>relay_log <span style=color:#f92672>=</span> /var/lib/mysql/relay-bin
</span></span><span style=display:flex><span>relay_log_index <span style=color:#f92672>=</span> /var/lib/mysql/relay-bin.index
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>log-slave-updates
</span></span><span style=display:flex><span>auto_increment_increment<span style=color:#f92672>=</span><span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span>auto_increment_offset<span style=color:#f92672>=</span><span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span>slave-skip-errors<span style=color:#f92672>=</span>1062,1032,1007,1008,1050,1396
</span></span><span style=display:flex><span>skip-slave-start<span style=color:#f92672>=</span>FALSE
</span></span></code></pre></div><h5 id=6-configure-server2>6. Configure <code>server2</code></h5><p>In file server.conf :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>key_buffer_size <span style=color:#f92672>=</span> 64M
</span></span><span style=display:flex><span>max_allowed_packet <span style=color:#f92672>=</span> 64M
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>server-id <span style=color:#f92672>=</span> <span style=color:#ae81ff>2</span>
</span></span><span style=display:flex><span>report_host <span style=color:#f92672>=</span> server2
</span></span><span style=display:flex><span>log_bin <span style=color:#f92672>=</span> /var/log/mysql/mysql-bin.log
</span></span><span style=display:flex><span>expire_logs_days <span style=color:#f92672>=</span> <span style=color:#ae81ff>10</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>relay_log <span style=color:#f92672>=</span> /var/lib/mysql/relay-bin
</span></span><span style=display:flex><span>relay_log_index <span style=color:#f92672>=</span> /var/lib/mysql/relay-bin.index
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>log-slave-updates
</span></span><span style=display:flex><span>auto_increment_increment<span style=color:#f92672>=</span><span style=color:#ae81ff>2</span>
</span></span><span style=display:flex><span>auto_increment_offset<span style=color:#f92672>=</span><span style=color:#ae81ff>2</span>
</span></span><span style=display:flex><span>slave-skip-errors<span style=color:#f92672>=</span>1062,1032,1007,1008,1050,1396
</span></span><span style=display:flex><span>skip-slave-start<span style=color:#f92672>=</span>FALSE
</span></span></code></pre></div><h5 id=7-configure-server1-as-server2-slave>7. Configure <code>server1</code> as <code>server2</code> slave</h5><p>On <code>server2</code> execute the command :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span><span style=color:#66d9ef>SHOW</span> MASTER STATUS <span style=color:#960050;background-color:#1e0010>\</span><span style=color:#66d9ef>G</span>;
</span></span></code></pre></div><p>and take note of the values : <code>File</code> and <code>Position</code> which are to be replaced in the
variables <code>MASTER_LOG_FILE</code> and <code>MASTER_LOG_POS</code> respectively in the following code
to be executed on <code>server1</code> :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span>CHANGE MASTER <span style=color:#66d9ef>TO</span>
</span></span><span style=display:flex><span> MASTER_HOST<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;server2-ip&#39;</span>,
</span></span><span style=display:flex><span> MASTER_USER<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;server1&#39;</span>,
</span></span><span style=display:flex><span> MASTER_PASSWORD<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;server1pwd&#39;</span>,
</span></span><span style=display:flex><span> MASTER_PORT<span style=color:#f92672>=</span><span style=color:#ae81ff>3306</span>,
</span></span><span style=display:flex><span> MASTER_LOG_FILE<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;mysql-bin.000004&#39;</span>,
</span></span><span style=display:flex><span> MASTER_LOG_POS<span style=color:#f92672>=</span><span style=color:#ae81ff>17680369</span>,
</span></span><span style=display:flex><span> MASTER_CONNECT_RETRY<span style=color:#f92672>=</span><span style=color:#ae81ff>10</span>,
</span></span><span style=display:flex><span> MASTER_SSL<span style=color:#f92672>=</span><span style=color:#ae81ff>1</span>,
</span></span><span style=display:flex><span> MASTER_SSL_CA<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;/etc/mysql/ssl/ca.crt&#39;</span>,
</span></span><span style=display:flex><span> MASTER_SSL_CERT<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;/etc/mysql/ssl/server1.crt&#39;</span>,
</span></span><span style=display:flex><span> MASTER_SSL_KEY<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;/etc/mysql/ssl/server1.key&#39;</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>START</span> SLAVE;
</span></span></code></pre></div><p>Check the status of slave replication with the command :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span><span style=color:#66d9ef>SHOW</span> SLAVE STATUS<span style=color:#960050;background-color:#1e0010>\</span><span style=color:#66d9ef>G</span>;
</span></span></code></pre></div><h5 id=8-configure-server2-as-server1-slave>8. Configure <code>server2</code> as <code>server1</code> slave</h5><p>On <code>server1</code> execute the command :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span><span style=color:#66d9ef>SHOW</span> MASTER STATUS <span style=color:#960050;background-color:#1e0010>\</span><span style=color:#66d9ef>G</span>;
</span></span></code></pre></div><p>and take note of the values : <code>File</code> and <code>Position</code> which are to be replaced in the
variables <code>MASTER_LOG_FILE</code> and <code>MASTER_LOG_POS</code> respectively in the following code
to be executed on <code>server2</code> :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span>CHANGE MASTER <span style=color:#66d9ef>TO</span>
</span></span><span style=display:flex><span> MASTER_HOST<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;server1-ip&#39;</span>,
</span></span><span style=display:flex><span> MASTER_USER<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;server2&#39;</span>,
</span></span><span style=display:flex><span> MASTER_PASSWORD<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;server2pwd&#39;</span>,
</span></span><span style=display:flex><span> MASTER_PORT<span style=color:#f92672>=</span><span style=color:#ae81ff>3306</span>,
</span></span><span style=display:flex><span> MASTER_LOG_FILE<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;mysql-bin.000051&#39;</span>,
</span></span><span style=display:flex><span> MASTER_LOG_POS<span style=color:#f92672>=</span><span style=color:#ae81ff>825490817</span>,
</span></span><span style=display:flex><span> MASTER_CONNECT_RETRY<span style=color:#f92672>=</span><span style=color:#ae81ff>10</span>,
</span></span><span style=display:flex><span> MASTER_SSL<span style=color:#f92672>=</span><span style=color:#ae81ff>1</span>,
</span></span><span style=display:flex><span> MASTER_SSL_CA<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;/etc/mysql/ssl/ca.crt&#39;</span>,
</span></span><span style=display:flex><span> MASTER_SSL_CERT<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;/etc/mysql/ssl/server2.crt&#39;</span>,
</span></span><span style=display:flex><span> MASTER_SSL_KEY<span style=color:#f92672>=</span><span style=color:#e6db74>&#39;/etc/mysql/ssl/server2.key&#39;</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>START</span> SLAVE;
</span></span></code></pre></div><p>Check the status of slave replication with the command :</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sql data-lang=sql><span style=display:flex><span><span style=color:#66d9ef>SHOW</span> SLAVE STATUS<span style=color:#960050;background-color:#1e0010>\</span><span style=color:#66d9ef>G</span>;
</span></span></code></pre></div></div><small>Publish date : 2022-07-19</small> | <small>Last change : 2022-12-11</small><p><small><a href=/en/categories/solutions/>Solutions</a> |
<a href=/en/categories/technology/>Technology</a> |
<a href=/en/tags/server/>Server</a>
|
<a href=/en/tags/database/>Database</a>
|
<a href=/en/tags/firewall/>Firewall</a>
|
<a href=/en/tags/mariadb/>MariaDB</a>
|
<a href=/en/tags/openssl/>OpenSSL</a>
|
<a href=/en/tags/ufw/>UFW</a></small></p></div><section class="col s12 m3 l3 text-center blogsidebar"><div class=tags><h4 class=text-center>Tags</h4><small><a href=/en/tags/custom-cms/>Custom CMS</a>
<a href=/en/tags/database/>Database</a>
<a href=/en/tags/desktop-application/>Desktop Application</a>
<a href=/en/tags/dovecot/>Dovecot</a>
<a href=/en/tags/e-commerce/>E-Commerce</a>
<a href=/en/tags/file-server/>File Server</a>
<a href=/en/tags/firewall/>Firewall</a>
<a href=/en/tags/home-assistant/>Home Assistant</a>
<a href=/en/tags/home-automation/>Home Automation</a>
<a href=/en/tags/linux/>Linux</a>
<a href=/en/tags/mariadb/>MariaDB</a>
<a href=/en/tags/nas/>NAS</a>
<a href=/en/tags/networking/>Networking</a>
<a href=/en/tags/office-server/>Office Server</a>
<a href=/en/tags/openssl/>OpenSSL</a>
<a href=/en/tags/opnsense/>OpnSense</a>
<a href=/en/tags/oracle-database/>Oracle Database</a>
<a href=/en/tags/pascal/>Pascal</a>
<a href=/en/tags/postgresql/>PostgreSQL</a>
<a href=/en/tags/privacy/>Privacy</a>
<a href=/en/tags/pwa/>PWA</a>
<a href=/en/tags/router/>Router</a>
<a href=/en/tags/security/>Security</a>
<a href=/en/tags/server/>Server</a>
<a href=/en/tags/software-development/>Software Development</a>
<a href=/en/tags/system-administration/>System Administration</a>
<a href=/en/tags/ufw/>UFW</a>
<a href=/en/tags/vpn/>VPN</a>
<a href=/en/tags/web-application/>Web Application</a></small></div><div class="row articles"><h4 class=text-center>Latest articles</h4><div class="col s12 m12 l12 article" style=text-align:center><div class=article-wrapper><a href=https://speedtech.it/en/blog/home-automation-with-home-assistant/><img class=img-fluid src=/images/blog/home-assistant_hud8587ebef75f9af2ca0bbe5f5b19dc45_61256_200x0_resize_q75_box.jpg width=200 height=142 alt="Home automation with Home Assistant" class=img-fluid title="Home automation with Home Assistant"></a><div class=caption style=max-width:250px;margin:auto><div class=caption-text><a class=text-title style=font-weight:400;font-size:14px href=https://speedtech.it/en/blog/home-automation-with-home-assistant/>Home automation with Home Assistant</a></div><div class=caption-bg></div></div></div></div><div class="col s12 m12 l12 article" style=text-align:center><div class=article-wrapper><a href=https://speedtech.it/en/blog/brainminder-intro/><img class=img-fluid src=/images/blog/brainminder_hu1e83e6fcbe10acdd81c6d0d0e9901bac_73079_200x0_resize_box_3.png width=200 height=123 alt="BrainMinder - second brain web application" class=img-fluid title="BrainMinder - second brain web application"></a><div class=caption style=max-width:250px;margin:auto><div class=caption-text><a class=text-title style=font-weight:400;font-size:14px href=https://speedtech.it/en/blog/brainminder-intro/>BrainMinder - second brain web application</a></div><div class=caption-bg></div></div></div></div><div class="col s12 m12 l12 article" style=text-align:center><div class=article-wrapper><a href=https://speedtech.it/en/blog/wmtrento-spreadsheet-sync/><img class=img-fluid src=/images/project/wmtrento-jspreadsheet_hu80e88a9b53e97bd051be5a21f49c7525_29205_200x0_resize_q75_box.jpg width=200 height=123 alt="Web spreadsheet application with sync capabilities" class=img-fluid title="Web spreadsheet application with sync capabilities"></a><div class=caption style=max-width:250px;margin:auto><div class=caption-text><a class=text-title style=font-weight:400;font-size:14px href=https://speedtech.it/en/blog/wmtrento-spreadsheet-sync/>Web spreadsheet application with sync capabilities</a></div><div class=caption-bg></div></div></div></div><div class="col s12 m12 l12 article" style=text-align:center><div class=article-wrapper><a href=https://speedtech.it/en/blog/postgresql-database-link/><img class=img-fluid src=/images/blog/postgresql_hu0d75c994c55fb1d165504c57f70131c4_34984_200x0_resize_q75_box.jpg width=200 height=142 alt="Database link with PostgreSQL" class=img-fluid title="Database link with PostgreSQL"></a><div class=caption style=max-width:250px;margin:auto><div class=caption-text><a class=text-title style=font-weight:400;font-size:14px href=https://speedtech.it/en/blog/postgresql-database-link/>Database link with PostgreSQL</a></div><div class=caption-bg></div></div></div></div></div></section></div></div></div><footer><div class="row container menu"><div class="col m3 l3"><h4>Software development and integration</h4><ul><li><a href=/en/service/applications-development/>Web applications</a></li><li><a href=/en/service/applications-development/>Desktop applications</a></li><li><a href=/en/service/applications-development/>Mobile applications (PWA)</a></li><li><a href=/en/service/custom-cms/>Static and dynamic multilingual websites</a></li><li><a href=/en/service/custom-cms/>Customized CMS</a></li><li><a href=/en/service/e-commerce/>E-commerce</a></li></ul></div><div class="col m3 l3"><h4>Collaboration and communication</h4><ul><li><a href=/en/service/private-e-mail/>Private email</a></li><li><a href=/en/service/private-e-mail/>GPG for email</a></li><li><a href=/en/service/online-offline-collaboration-solutions/>Nextcloud</a></li><li><a href=/en/service/online-offline-collaboration-solutions/>TrueNAS</a></li><li><a href=/en/service/online-offline-collaboration-solutions/>Seafile</a></li><li><a href=/en/service/managed-linux-servers/>Servers with Linux</a></li></ul></div><div class="col m3 l3"><h4>Security</h4><ul><li><a href=/en/service/security-firewalls-vpn/>Firewall OpnSense</a></li><li><a href=/en/service/security-firewalls-vpn/>Password manager Vaultwarden</a></li><li><a href=/en/service/security-firewalls-vpn/>Wireguard VPN</a></li><li><a href=/en/service/security-firewalls-vpn/>Fritz!Box VPN</a></li><li><a href=/en/service/security-firewalls-vpn/>Data encryption</a></li><li><a href=/en/service/security-firewalls-vpn/>Backup in Cloud</a></li><li><a href=/en/service/security-firewalls-vpn/>Ransomware protection</a></li></ul></div><div class="col m3 l3"><h4>Open Source Domotic</h4><ul><li><a href=/en/service/domotic-opensource/>HomeAssistant</a></li><li><a href=/en/service/domotic-opensource/>Tasmota</a></li><li><a href=/en/service/domotic-opensource/>Integration with Shelly devices</a></li><li><a href=/en/service/domotic-opensource/>Integration with Sonoff devices</a></li></ul></div></div><div class="row container"><div class="col m4 l4 footer-contact-details"><p>SpeedTech di Gerola Ing. Roberto</p><p>VAT ID : IT02446960227</p><p>REA : TN - 225335</p><p class=copyright>2001-2024</p></div><div class="col m4 l4 footer-contact-details" id=contact><p><span class=footer-title><i class="icon icon-phone"></i>Phone : </span><a href=tel:+390464414131 title="Telephone contact">+39 0464 414131</a></p><p><span class=footer-title><i class="icon icon-email"></i>Email : </span><a href=mailto:%72%6f%62%65%72%74%6f%40%73%70%65%65%64%74%65%63%68%2e%69%74>Send an email</a></p><h4 style=margin-top:20px><i class="icon icon-location"></i>Location</h4><p>Viale Trento, 31<br>IT-38068 Rovereto (TN) ITALY</p></div><div class="col m4 l4 footer-contact-details"><h4 style=margin-top:20px><i class="icon icon-link"></i>Links</h4><p><i class="icon icon-git"></i> <a href=https://forgejo.speedtech.it/explore/repos>Git code repository</a></p><p><img alt=BrainMinder style=width:32px;vertical-align:middle src=https://brainminder.it/brainminder-icon.svg><a href=https://brainminder.it>BrainMinder</a></p></div></div></footer></body></html>