<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eduard Kazakov</title>
    <description>The latest articles on DEV Community by Eduard Kazakov (@kazakov_e).</description>
    <link>https://dev.to/kazakov_e</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3892597%2F344d823c-97b4-4df9-8c41-66cc8787579f.jpg</url>
      <title>DEV Community: Eduard Kazakov</title>
      <link>https://dev.to/kazakov_e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kazakov_e"/>
    <language>en</language>
    <item>
      <title>Deploy your own open-source Web GIS server instance on a VPS in 15 minutes with Docker</title>
      <dc:creator>Eduard Kazakov</dc:creator>
      <pubDate>Mon, 04 May 2026 09:21:51 +0000</pubDate>
      <link>https://dev.to/kazakov_e/deploy-your-own-open-source-web-gis-server-instance-on-a-vps-in-15-minutes-with-docker-1hp1</link>
      <guid>https://dev.to/kazakov_e/deploy-your-own-open-source-web-gis-server-instance-on-a-vps-in-15-minutes-with-docker-1hp1</guid>
      <description>&lt;p&gt;If your team works with geospatial data, sooner or later you need a place where maps, layers, users, and edits live together. There are many capable SaaS platforms and proprietary solutions you can deploy on your own infrastructure, but there is another path: self-hosting an open-source Web GIS server.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will deploy &lt;a href="https://github.com/nextgis/nextgisweb" rel="noopener noreferrer"&gt;NextGIS Web&lt;/a&gt; on a low-cost VPS using Docker, and then configure a reverse proxy with HTTPS.&lt;/p&gt;

&lt;p&gt;By the end, you will have your own Web GIS server up and running on the internet. We will also show how to establish connection between deployed NextGIS Web instance and &lt;a href="https://qgis.org" rel="noopener noreferrer"&gt;QGIS&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What we are building&lt;/li&gt;
&lt;li&gt;Why NextGIS Web&lt;/li&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Step 1. Prepare your server&lt;/li&gt;
&lt;li&gt;Step 2. Deploy NextGIS Web&lt;/li&gt;
&lt;li&gt;Step 3. Configure Nginx Reverse Proxy and DNS record&lt;/li&gt;
&lt;li&gt;Step 4. Add HTTPS&lt;/li&gt;
&lt;li&gt;Maintenance and backup&lt;/li&gt;
&lt;li&gt;Connect from QGIS and publish a project&lt;/li&gt;
&lt;li&gt;Edit data from QGIS and review version history&lt;/li&gt;
&lt;li&gt;API and SDK&lt;/li&gt;
&lt;li&gt;Summary &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we are building
&lt;/h2&gt;

&lt;p&gt;We'll deploy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nextgis/nextgisweb" rel="noopener noreferrer"&gt;NextGIS Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docker + Docker Compose&lt;/li&gt;
&lt;li&gt;Nginx Proxy Manager&lt;/li&gt;
&lt;li&gt;Free Let's Encrypt SSL certificate&lt;/li&gt;
&lt;li&gt;Public URL like gis.yourdomain.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup is typical, and relevant for GIS consultants, municipalities, research labs, internal mapping teams, and startups building location-based products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why NextGIS Web
&lt;/h2&gt;

&lt;p&gt;There are many mature components you can use to build a GIS stack: &lt;a href="https://trac.osgeo.org/postgis/" rel="noopener noreferrer"&gt;PostGIS&lt;/a&gt;, &lt;a href="https://github.com/geoserver/geoserver" rel="noopener noreferrer"&gt;GeoServer&lt;/a&gt;, &lt;a href="https://github.com/MapServer/MapServer" rel="noopener noreferrer"&gt;MapServer&lt;/a&gt;, &lt;a href="https://github.com/geosolutions-it/MapStore2" rel="noopener noreferrer"&gt;MapStore&lt;/a&gt;, and others. However, they typically function as separate building blocks: one handles data storage, another data publishing, and another map rendering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nextgis/nextgisweb" rel="noopener noreferrer"&gt;NextGIS Web&lt;/a&gt; takes a different approach. It is a complete, integrated solution covering everything from data storage and user management to data publishing and a built-in web map engine. It is a mature open-source product with over 12 years of development. One of its key strengths is deep integration with &lt;a href="https://qgis.org" rel="noopener noreferrer"&gt;QGIS&lt;/a&gt;, the leading open-source desktop GIS application.&lt;/p&gt;

&lt;p&gt;The official Docker build (&lt;a href="https://github.com/nextgis/nextgisweb_ce" rel="noopener noreferrer"&gt;NextGIS Web Community Edition&lt;/a&gt;) makes deployment straightforward and fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;A basic VPS with x86-64 architecture is sufficient to follow this tutorial. For reference, I am using an &lt;a href="https://www.mvps.net/" rel="noopener noreferrer"&gt;MVPS&lt;/a&gt; VPS with the following configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 CPU cores&lt;/li&gt;
&lt;li&gt;4 GB RAM&lt;/li&gt;
&lt;li&gt;50 GB SSD&lt;/li&gt;
&lt;li&gt;Ubuntu 24.04&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also use a dedicated server or even a local machine.&lt;/p&gt;

&lt;p&gt;This tutorial assumes you have root SSH access to the host.&lt;/p&gt;

&lt;p&gt;Is is also assumed that you have a domain and access to its management panel, although this is optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Prepare your server
&lt;/h2&gt;

&lt;p&gt;First, SSH into the server:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh root@your-server-ip&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then update the packages:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install Docker:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -fsSL https://get.docker.com | sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install the Docker Compose plugin:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt install docker-compose-plugin -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Make sure you have Docker Compose version 2.x:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker --version&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker compose version&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2. Deploy NextGIS Web
&lt;/h2&gt;

&lt;p&gt;First, create a folder for NextGIS Web and navigate to it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir /srv/ngw_ce&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cd /srv/ngw_ce&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a /srv/ngw_ce/.env file with the current image version according to the &lt;a href="https://github.com/nextgis/nextgisweb_ce#installation" rel="noopener noreferrer"&gt;repository&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano .env&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Enter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;IMAGE_VERSION=26.04.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now create the Docker Compose file /srv/ngw_ce/docker-compose.yaml:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano docker-compose.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Fill it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nextgis/nextgisweb-ce:$IMAGE_VERSION&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;server&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;NEXTGISWEB__CORE__LOCALE__DEFAULT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en"&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;8080:8080&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;data:/opt/crater/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backup:/opt/crater/backup&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay attention to the environment section. General configuration of NextGIS Web is managed through environment variables.&lt;/p&gt;

&lt;p&gt;Run the stack:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now open &lt;a href="http://YOUR_SERVER_IP:8080" rel="noopener noreferrer"&gt;http://YOUR_SERVER_IP:8080&lt;/a&gt;. You should see the NextGIS Web authorization screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1mmw93w97j9gynnllnf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1mmw93w97j9gynnllnf.png" alt="NextGIS Web authorization screen" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, use &lt;strong&gt;administrator / admin&lt;/strong&gt; credentials. After logging in, you will see the administrative interface with the resource tree (initially containing only the default resource).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw1o9ucgzo5seje0miig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw1o9ucgzo5seje0miig.png" alt="NextGIS Web resource tree" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create resource&lt;/strong&gt; to access available resource types: folders, layers, maps, services, database connections, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeb2ecykxs86hhaqxplm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeb2ecykxs86hhaqxplm.png" alt="NextGIS available resources" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;! Important:&lt;/strong&gt; Change the default password.&lt;/p&gt;

&lt;p&gt;Go to Control Panel → Users&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkp11sa65s8re5dbg3y06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkp11sa65s8re5dbg3y06.png" alt="NextGIS Web control panel - users" width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Edit the Administrator account, and assign a new password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsge4oll6onaz0hbd6pmz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsge4oll6onaz0hbd6pmz.png" alt="NextGIS Web change password" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's return to the console. If you want to explore the list of available environment variables, while in /srv/ngw_ce/, run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker compose run --rm app nextgisweb-config --env-vars&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After setting up the required configuration in the environment section of /srv/ngw_ce/docker-compose.yaml, update the stack using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Configure Nginx Reverse Proxy and DNS record
&lt;/h2&gt;

&lt;p&gt;A Web GIS server handles users and data, so using it without encryption could be risky from a security perspective. It is highly recommended to run it behind a reverse proxy that handles TLS termination.&lt;/p&gt;

&lt;p&gt;First, install Nginx:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt install nginx -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a new config:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano /etc/nginx/sites-available/nextgis_web&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Fill in content (replace gis.yourdomain.com with your domain):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;map&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt; &lt;span class="nv"&gt;$proxy_connection&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;default&lt;/span&gt; &lt;span class="s"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;''&lt;/span&gt;      &lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;gis.yourdomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="s"&gt;3600s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://localhost:8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$http_host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="nv"&gt;$proxy_connection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And enable the site&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ln -s /etc/nginx/sites-available/nextgis_web /etc/nginx/sites-enabled/&lt;/code&gt;&lt;br&gt;
&lt;code&gt;nginx -t&lt;/code&gt;&lt;br&gt;
&lt;code&gt;systemctl reload nginx&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;In your domain management panel, create a DNS record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type: A&lt;/li&gt;
&lt;li&gt;Host: gis (for gis.yourdomain.com)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example of how it looks in the &lt;a href="https://porkbun.com/" rel="noopener noreferrer"&gt;Porkbun&lt;/a&gt; interface:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszslyxfmln5b6nujmeit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszslyxfmln5b6nujmeit.png" alt="DNS settings" width="525" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait 5-15 minutes (more in rare cases) for DNS propagation. Test it using &lt;a href="https://toolbox.googleapps.com/apps/dig/" rel="noopener noreferrer"&gt;dig&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you see the IP address displayed correctly, DNS propagation is complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Add HTTPS
&lt;/h2&gt;

&lt;p&gt;The simplest and most straightforward way to obtain a certificate is to use Certbot with python3-certbot-nginx. First, install them:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt install certbot python3-certbot-nginx -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Request a certificate:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;certbot --nginx -d gis.yourdomain.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Certbot will automatically update the Nginx configuration.&lt;/p&gt;

&lt;p&gt;Then open &lt;a href="https://gis.yourdomain.com" rel="noopener noreferrer"&gt;https://gis.yourdomain.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt; You have just properly set up HTTPS access to your own NextGIS Web instance, and can now use it safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintenance and backup
&lt;/h2&gt;

&lt;p&gt;To use NextGIS Web sustainably, it is important to set up regular maintenance and backups.&lt;/p&gt;

&lt;p&gt;Run maintenance:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd /srv/ngw_ce&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker compose exec app nextgisweb maintenance&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This removes unreferenced files and performs cleanup tasks.&lt;/p&gt;

&lt;p&gt;Create a backup:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd /srv/ngw_ce&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker compose exec app nextgisweb backup&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Backups are stored in /opt/crater/backup/ with timestamps.&lt;/p&gt;

&lt;p&gt;Set up regular cron jobs for automated maintenance and backups.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect from QGIS and publish a project
&lt;/h2&gt;

&lt;p&gt;NextGIS Web can be fully managed via the web interface, but it is designed to integrate tightly with QGIS.&lt;/p&gt;

&lt;p&gt;Install the latest stable version of QGIS from &lt;a href="https://qgis.org" rel="noopener noreferrer"&gt;qgis.org&lt;/a&gt;, then run the QGIS Desktop application.&lt;/p&gt;

&lt;p&gt;If you don't work with QGIS, download this sample: &lt;a href="https://ekazakov.me/content/files/2026/05/Mostar_QGIS.zip" rel="noopener noreferrer"&gt;Mostar_QGIS.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unpack the archive, and open the file &lt;strong&gt;Mostar.qgz&lt;/strong&gt; in QGIS. This project is compact but includes different types of data with advanced styling. Enable or disable different layers in the Layers panel to explore it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmfede0s91ag67v6jtao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmfede0s91ag67v6jtao.png" alt="QGIS Project" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install the NextGIS Connect plugin in QGIS (Plugins - Manage and Install Plugins - All - NextGIS Connect):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kvpu27bdvcilpq1wi96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kvpu27bdvcilpq1wi96.png" alt="NextGIS Connect installation" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the NextGIS Connect panel, open Settings&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq78pyt1oxe6ybfeeyeus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq78pyt1oxe6ybfeeyeus.png" alt="NextGIS Connect settings button" width="315" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then create a new connection. Use your Web GIS address and set up basic authentication with the administrator as the login and the password you defined in Step 2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5ehstmkxz325hpqle22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5ehstmkxz325hpqle22.png" alt="NextGIS Connect establish connection" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can see the resource tree of your Web GIS inside QGIS. Select the Main resource group, then use Add to Web GIS → Upload All.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfqt82m4fjj6zrl0frj3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfqt82m4fjj6zrl0frj3.png" alt="NextGIS Connect upload data to NextGIS Web" width="680" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the data and styles are uploaded to NextGIS Web, and a web map is created and opened automatically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0iyck7zl3r4qcv8l23t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0iyck7zl3r4qcv8l23t.png" alt="NextGIS Web Web Map" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The web map in display mode has its own link, so you can share and embed it.&lt;/p&gt;

&lt;p&gt;You can continue working with the uploaded data independently via the web interface, as well as adjust web map settings, resource permissions, and everything else. Explore the uploaded resources and what you can do with them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08bd0j68f57jz6ahn3jp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08bd0j68f57jz6ahn3jp.png" alt="NextGIS Web resource tree with uploaded layers" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Edit data from QGIS and review version history
&lt;/h2&gt;

&lt;p&gt;You can also connect to the published data from QGIS. Reopen QGIS and, in the NextGIS Connect panel, find a published map. Right-click on it and select Add to QGIS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15oog1fer4xh77ebu5ne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15oog1fer4xh77ebu5ne.png" alt="NextGIS Connect add remote data" width="469" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project will be rebuilt, and all layers will be linked to the web storage. If you edit any of the layers, for example, by adding a new feature, the change will be automatically synchronized with the server, and the new object will become visible on the web map.&lt;/p&gt;

&lt;p&gt;You can also review the history of a vector layer to see who made changes, when, and what was modified. To view the change you made, find the layer in the Web GIS interface and select Version History from its context menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qncaaztvam3kykc6kng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qncaaztvam3kykc6kng.png" alt="NextGIS Web open version history" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is also possible to roll back changes to a desired state or create a layer branch using the context menu of a particular version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgnwzquj4y4ia69fl4hhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgnwzquj4y4ia69fl4hhy.png" alt="NextGIS Web rollback changes" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  API and SDK
&lt;/h2&gt;

&lt;p&gt;NextGIS Web provides an API that covers all core functions, including user, data, service, and map management. You can explore the available methods for your deployed instance at gis.yourdomain.com/doc/api (or use the public sandbox as an example: &lt;a href="https://sandbox.nextgis.com/doc/api" rel="noopener noreferrer"&gt;sandbox.nextgis.com/doc/api&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;There is also a public JavaScript SDK to help you quickly build custom web applications on top of the NextGIS Web API: &lt;a href="https://github.com/nextgis/nextgis_frontend" rel="noopener noreferrer"&gt;https://github.com/nextgis/nextgis_frontend&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The demonstrated steps allow you to quickly deploy your own instance of NextGIS Web and set it up for sustainable long-term use, as well as establish a connection with QGIS for data export and collaborative editing.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://github.com/nextgis/nextgisweb" rel="noopener noreferrer"&gt;application GitHub page&lt;/a&gt; to learn more about how to use it or to report a bug.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
