{"id":132927,"date":"2026-05-24T19:02:59","date_gmt":"2026-05-24T19:02:59","guid":{"rendered":"\/uk\/tutorials\/metabase-docker-analytics-dashboard"},"modified":"2026-05-24T19:02:59","modified_gmt":"2026-05-24T19:02:59","slug":"metabase-docker-analytics-dashboard","status":"publish","type":"post","link":"\/uk\/tutorials\/metabase-docker-analytics-dashboard","title":{"rendered":"How to create a self-hosted analytics dashboard with Metabase and Docker"},"content":{"rendered":"<p>To create a self-hosted analytics dashboard with Metabase and Docker, deploy the Metabase container, store its application data in PostgreSQL, connect your business database, and build dashboards from saved questions and visualizations. This setup gives you a private business intelligence environment where you control the server, database connections, users, permissions, and reporting workflow.<\/p><p>Metabase works well for self-hosted analytics because it combines a visual query builder, SQL editor, dashboard filters, scheduled reports, and team permissions in one interface. Docker makes the deployment portable, while PostgreSQL keeps Metabase data such as users, dashboards, saved questions, and settings outside the container.<\/p><p>The fastest setup is to run the official Metabase Docker image and open the setup wizard on port 3000. For long-term reporting, use Docker Compose with PostgreSQL or deploy the Metabase Docker template on Hostinger VPS to reduce manual configuration.<\/p><h2 class=\"wp-block-heading\" id=\"h-what-do-you-need-before-installing-metabase-with-docker\">What do you need before installing Metabase with Docker?<\/h2><p>Before installing Metabase with Docker, <a href=\"\/uk\/tutorials\/how-to-set-up-vps\">set up the basic private server,<\/a> database, and access details needed to run the container and complete the setup wizard.<\/p><p>You need:<\/p><ul class=\"wp-block-list\">\n<li>A server or local machine with Docker installed.<\/li>\n\n\n\n<li>Terminal access to run Docker commands.<\/li>\n\n\n\n<li>An available port for the Metabase web interface. Metabase uses port 3000 by default.<\/li>\n\n\n\n<li>A <a href=\"\/uk\/tutorials\/what-is-postgresql\">PostgreSQL<\/a> database for long-term Metabase application data, such as users, dashboards, saved questions, permissions, and settings.<\/li>\n\n\n\n<li>The connection details for the business database you want to analyze, including the host, port, database name, username, and password.<\/li>\n<\/ul><p>The PostgreSQL application database is different from the business database you connect to analytics. PostgreSQL stores Metabase&rsquo;s own settings and saved assets, while the connected business database provides the data used to create charts, reports, and dashboards.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-install-metabase-with-docker\">How to install Metabase with Docker<\/h2><p>You can install Metabase with Docker by pulling the official Metabase image, running it as a container, and opening the setup wizard in your browser. This method is best for testing Metabase or creating a basic self-hosted analytics dashboard before moving to a production setup.<\/p><p>Before starting, make sure <a href=\"\/uk\/tutorials\/how-to-install-docker-on-ubuntu\">Docker is installed on your server<\/a> or local machine. You also need access to the terminal and an available port, such as 3000, for the Metabase web interface.<\/p><h3 class=\"wp-block-heading\">1. Pull the official Metabase Docker image<\/h3><p>First, download the official Metabase image from Docker Hub:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker pull metabase\/metabase:latest<\/pre><p>This command downloads the latest open-source Metabase Docker image to your server. Docker uses this image to create and run the Metabase container.<\/p><h3 class=\"wp-block-heading\">2. Run the Metabase container<\/h3><p>After downloading the image, start Metabase with this command:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d -p 3000:3000 --name metabase metabase\/metabase<\/pre><p>Here is what each part of the command does:<\/p><ul class=\"wp-block-list\">\n<li>docker run creates and starts a new container.<\/li>\n\n\n\n<li>-d runs the container in the background.<\/li>\n\n\n\n<li>-p 3000:3000 maps port 3000 on your server to port 3000 inside the container.<\/li>\n\n\n\n<li>&ndash;name metabase gives the container a readable name.<\/li>\n\n\n\n<li>metabase\/metabase tells Docker which image to use.<\/li>\n<\/ul><p>Metabase starts on port 3000 by default. If another application already uses this port, map Metabase to a different host port:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d -p 3001:3000 --name metabase metabase\/metabase<\/pre><p>With this command, Metabase still uses port 3000 inside the container, but you access it through port 3001 on your server.<\/p><h3 class=\"wp-block-heading\">3. Check if the Metabase container is running<\/h3><p>To confirm that the container started correctly, list your running Docker containers:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker ps<\/pre><p>You should see a container named metabase in the output.<\/p><p>You can also check the Metabase logs:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker logs -f metabase<\/pre><p>Wait until the logs show that Metabase has finished starting. The first launch can take a few minutes because Metabase initializes its application files.<\/p><h3 class=\"wp-block-heading\">4. Open the Metabase setup wizard<\/h3><p>Once the container is running, open Metabase in your browser.<\/p><p>If you installed Metabase on a local machine, go to:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/localhost:3000<\/pre><p>If you installed Metabase on a VPS, use your server IP address:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/your-server-ip:3000<\/pre><p>Replace your-server-ip with the actual IP address of your VPS.<\/p><p>The Metabase setup wizard will ask you to create an admin account, choose your language, and connect your first data source. After completing the setup, you can start creating questions, charts, and dashboards from your business data.<\/p><h3 class=\"wp-block-heading\">5. Stop or restart the Metabase container<\/h3><p>To stop Metabase, run:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker stop metabase<\/pre><p>To start it again, run:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker start metabase<\/pre><p>To restart Metabase after a configuration change, use:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker restart metabase<\/pre><p>This basic Docker setup is useful for testing Metabase, but it is not the best option for production. By default, Metabase uses an embedded application database inside the container. For a long-term business intelligence dashboard, run Metabase with PostgreSQL and Docker Compose so your dashboards, users, settings, and saved questions remain stored safely outside the container.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-run-metabase-with-docker-compose-and-postgresql\">How to run Metabase with Docker Compose and PostgreSQL<\/h2><p>The basic Docker installation works for testing, but a production Metabase setup should use PostgreSQL as the application database. PostgreSQL stores your Metabase users, dashboards, saved questions, settings, and permissions outside the Metabase container, so your analytics workspace remains intact when you update, recreate, or restart the container.<\/p><p><a href=\"\/uk\/tutorials\/what-is-docker-compose\">Docker Compose<\/a> lets you run Metabase and PostgreSQL together from one configuration file. This makes the setup easier to manage than manually starting each container.<\/p><h3 class=\"wp-block-heading\">1. Create a project directory<\/h3><p>First, create a separate directory for your Metabase deployment:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mkdir metabase-docker\ncd metabase-docker<\/pre><p>This directory will store your Docker Compose configuration file.<\/p><h3 class=\"wp-block-heading\">2. Create a Docker Compose file<\/h3><p>Create a new docker-compose.yml file:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">nano docker-compose.yml<\/pre><p>Then, add the following configuration:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\npostgres:\nimage: postgres:16\ncontainer_name: metabase-postgres\nrestart: unless-stopped\nenvironment:\nPOSTGRES_DB: metabase\nPOSTGRES_USER: metabase\nPOSTGRES_PASSWORD: change_this_password\nvolumes:\n- metabase-postgres-data:\/var\/lib\/postgresql\/data\nmetabase:\nimage: metabase\/metabase:latest\ncontainer_name: metabase\nrestart: unless-stopped\nports:\n- \"3000:3000\"\nenvironment:\nMB_DB_TYPE: postgres\nMB_DB_DBNAME: metabase\nMB_DB_PORT: 5432\nMB_DB_USER: metabase\nMB_DB_PASS: change_this_password\nMB_DB_HOST: postgres\ndepends_on:\n- postgres\nvolumes:\nmetabase-postgres-data:<\/pre><p>Replace change_this_password with a strong password before starting the containers. Use the same password for POSTGRES_PASSWORD and MB_DB_PASS, as Metabase uses it to connect to the PostgreSQL database.<\/p><h3 class=\"wp-block-heading\">3. Start Metabase and PostgreSQL<\/h3><p>Run the following command from the same directory as your docker-compose.yml file:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose up -d<\/pre><p>Docker Compose will download the required images, create the PostgreSQL database container, and start the Metabase container in the background.<\/p><p>To check if both containers are running, use:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose ps<\/pre><p>You should see two services: postgres and metabase.<\/p><h3 class=\"wp-block-heading\">4. Check the Metabase logs<\/h3><p>Metabase can take a few minutes to start during the first launch. Check the logs with:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose logs -f metabase<\/pre><p>Wait until the logs show that Metabase has finished initializing. If Metabase cannot connect to PostgreSQL, ensure the database name, username, password, port, and host match across both service configurations.<\/p><h3 class=\"wp-block-heading\">5. Open Metabase in your browser<\/h3><p>After the containers are running, open Metabase in your browser:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/your-server-ip:3000<\/pre><p>Replace your-server-ip with your VPS IP address. If you are running the setup locally, use:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/localhost:3000<\/pre><p>The setup wizard will ask you to create an admin account and configure your first data source. This data source is separate from the PostgreSQL application database used by Metabase itself.<\/p><h3 class=\"wp-block-heading\">6. Manage the Docker Compose deployment<\/h3><p>Use these commands to manage your Metabase deployment:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose stop<\/pre><p>This stops the Metabase and PostgreSQL containers.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose start<\/pre><p>This starts the containers again.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose restart<\/pre><p>This restarts both services.<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose down<\/pre><p>This stops and removes the containers, but keeps the PostgreSQL volume unless you explicitly remove volumes.<\/p><p>Avoid running docker compose down -v unless you want to delete the PostgreSQL volume. That volume contains your Metabase application data, including dashboards, saved questions, users, and settings.<\/p><h3 class=\"wp-block-heading\">7. Update Metabase with Docker Compose<\/h3><p>To update Metabase, pull the latest image and recreate the container:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose pull metabase\ndocker compose up -d metabase<\/pre><p>Docker Compose replaces the Metabase container with a new one using the updated image. Your application data remains stored in the PostgreSQL volume.<\/p><p>Before updating a production Metabase instance, back up your PostgreSQL database. This protects your dashboards, saved questions, permissions, and configuration if the update fails or introduces compatibility issues.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-deploy-metabase-faster-with-hostinger-vps\">How to deploy Metabase faster with Hostinger VPS<\/h2><p>You can deploy Metabase faster with Hostinger VPS by using the ready-made <a href=\"\/uk\/vps\/docker\/metabase\">Metabase Docker template<\/a>, which eliminates the need to manually configure the Docker image, PostgreSQL database, and container settings. This option is better if you want to launch a self-hosted business intelligence dashboard without writing a Docker Compose file.<\/p><p>Hostinger&rsquo;s Metabase Docker template includes a pre-configured PostgreSQL backend, so Metabase has a reliable place to store application data such as users, dashboards, saved questions, permissions, and settings. This setup gives you control of self-hosting while reducing the manual work needed to prepare the environment.<\/p><p>To deploy Metabase, open Hostinger&rsquo;s Metabase Docker template page, choose a VPS plan, and complete the setup from hPanel. Hostinger will provision the VPS with the selected Docker template, so you can access Metabase through your server IP address once the deployment is ready:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">http:\/\/your-server-ip:3000<\/pre><p>Replace your-server-ip with the IP address of your VPS. After opening Metabase, complete the setup wizard by creating an admin account, choosing your workspace settings, and connecting your first business data source.<\/p><p>The connected business data source is separate from the PostgreSQL backend included with the template. PostgreSQL stores Metabase&rsquo;s own application data, while your connected data source stores the business data you want to analyze, such as sales records, product usage data, marketing performance, or customer activity.<\/p><p>After connecting a data source, you can create questions, turn them into charts, and combine those charts into a business intelligence dashboard. For a long-term setup, connect a domain, enable HTTPS, assign user permissions, and regularly back up your Metabase application database.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-create-a-business-intelligence-dashboard-in-metabase\">How to create a business intelligence dashboard in Metabase<\/h2><p>After installing Metabase, create a business intelligence dashboard by connecting a data source, asking questions of your data, choosing visualizations, and grouping the results. This workflow turns raw business data into charts, tables, and key performance indicators that teams can use to track performance.<\/p><h3 class=\"wp-block-heading\">1. Connect your business data source<\/h3><p>Start by opening Metabase and clicking <strong>Add your data<\/strong>. Choose the database type that stores your business data, such as PostgreSQL, MySQL, MongoDB, BigQuery, or Snowflake.<\/p><p>Then, enter the required connection details, including the database host, port, name, username, and password. After the connection is active, Metabase scans the database schema and makes the available tables searchable from the interface.<\/p><p>The connected data source stores the business data you want to analyze. This is different from the Metabase application database, which stores users, dashboards, saved questions, permissions, and settings.<\/p><h3 class=\"wp-block-heading\">2. Create your first question<\/h3><p>Next, create a question from your connected data source. In Metabase, a question is a saved query that answers a specific business need.<\/p><p>For example, a sales team might ask, &ldquo;How much revenue did we generate this month?&rdquo; A marketing team might ask, &ldquo;Which campaign brought the most signups?&rdquo; A product team might ask, &ldquo;How many users activated a feature after signing up?&rdquo;<\/p><p>You can create questions with the visual query builder or write SQL directly if you need more control over joins, filters, or calculations.<\/p><h3 class=\"wp-block-heading\">3. Choose the right visualization<\/h3><p>After creating a question, choose a visualization that matches the answer.<\/p><p>Use a number chart for a single key metric, such as monthly recurring revenue or total signups. Use a line chart for trends over time, such as daily active users or weekly revenue. Use a bar chart to compare categories, such as revenue by product or leads by campaign. Use a table when users need to inspect individual records or detailed breakdowns.<\/p><p>The visualization should make the answer easier to understand, not just display the data. For example, a line chart is clearer than a table when the main goal is to show whether revenue increased or decreased over time.<\/p><h3 class=\"wp-block-heading\">4. Add saved questions to a dashboard<\/h3><p>After saving several questions, open <strong>Dashboards<\/strong> and create a new dashboard. Add the saved questions to the dashboard and arrange them by importance.<\/p><p>Place the most important metrics near the top, such as revenue, conversion rate, active users, or churn. Use the middle and lower sections for supporting charts, such as performance by product, channel, region, or customer segment.<\/p><p>A clear dashboard should address a single business goal. For example, create separate dashboards for sales performance, marketing attribution, product usage, and executive reporting, rather than combining all metrics into a single view.<\/p><h3 class=\"wp-block-heading\">5. Add dashboard filters<\/h3><p>Add filters so users can adjust the dashboard without creating new questions. Common filters include date range, region, product, campaign, customer segment, and account owner.<\/p><p>For example, a date filter lets users switch between daily, weekly, monthly, and quarterly views. A region filter helps managers compare markets. A product filter helps teams analyze performance for a specific service, plan, or feature.<\/p><p>Filters make the same dashboard useful for different teams while keeping the main layout simple.<\/p><h3 class=\"wp-block-heading\">6. Share the dashboard with your team<\/h3><p>Finally, share the dashboard with the users who need access to the metrics. Use permissions to control who can view dashboards, create questions, or access specific databases.<\/p><p>For recurring reporting, schedule email updates or connect team notifications so stakeholders receive key metrics without opening Metabase manually.<\/p><p>Before sharing the dashboard widely, review the layout, filters, and permissions. This helps prevent users from seeing irrelevant data or accessing tables they should not use.<\/p><h2 class=\"wp-block-heading\" id=\"h-business-intelligence-dashboard-examples-you-can-build-with-metabase\">Business intelligence dashboard examples you can build with Metabase<\/h2><p>Metabase lets you create different business intelligence dashboards for different teams, data sources, and reporting goals. The best dashboard type depends on the business question you want to answer, such as where revenue comes from, which campaigns drive customer acquisition, or how users interact with your product.<\/p><figure tabindex=\"0\" class=\"wp-block-table\"><table><tbody><tr><td colspan=\"1\" rowspan=\"1\"><p><strong>Dashboard type<\/strong><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><strong>Main users<\/strong><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><strong>Metrics to include<\/strong><\/p><\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\"><p><span>Sales dashboard<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Sales teams and managers<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Revenue, closed deals, win rate, pipeline value, average deal size<\/span><\/p><\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\"><p><span>Marketing dashboard<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Marketing teams<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Traffic, leads, signups, conversion rate, customer acquisition cost<\/span><\/p><\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\"><p><span>Product dashboard<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Product and growth teams<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Active users, feature usage, activation rate, retention, churn<\/span><\/p><\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\"><p><span>Ecommerce dashboard<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Store owners and operations teams<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Orders, revenue, average order value, abandoned carts, refund rate<\/span><\/p><\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\"><p><span>Customer support dashboard<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Support and success teams<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Ticket volume, response time, resolution time, satisfaction score<\/span><\/p><\/td><\/tr><tr><td colspan=\"1\" rowspan=\"1\"><p><span>Executive dashboard<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Founders and leadership teams<\/span><\/p><\/td><td colspan=\"1\" rowspan=\"1\"><p><span>Revenue, profit margin, growth rate, churn, customer lifetime value<\/span><\/p><\/td><\/tr><\/tbody><\/table><\/figure><p>A <strong>sales dashboard<\/strong> helps revenue teams track pipeline health and sales performance. For example, you can connect Metabase to a customer relationship management database and visualize monthly revenue, open opportunities, closed deals, and win rate by sales representative.<\/p><p>A <strong>marketing dashboard<\/strong> shows how campaigns turn visitors into leads or customers. For example, you can compare traffic sources, landing page conversion rates, paid campaign performance, and customer acquisition costs in a single view.<\/p><p>A <strong>product dashboard<\/strong> helps teams understand user behavior after signup. For example, you can track active users, activation rate, feature adoption, retention, and churn to see which parts of the product create long-term value.<\/p><p>An <strong>ecommerce dashboard<\/strong> gives store owners a clear view of sales activity. For example, you can monitor daily orders, revenue by product, average order value, refund rate, and abandoned carts to identify issues in the buying journey.<\/p><p>A <strong>customer support dashboard<\/strong> helps support teams manage workload and service quality. For example, you can track ticket volume, first response time, resolution time, backlog, and customer satisfaction score to find bottlenecks in the support process.<\/p><p>An <strong>executive dashboard<\/strong> gives leadership a high-level view of business performance. For example, you can combine revenue, churn, customer lifetime value, profit margin, and growth rate into one dashboard for weekly or monthly reporting.<\/p><p>Start with a single dashboard that answers a single business question. Once the first dashboard is useful, create separate dashboards for each team so users can focus on the metrics that affect their decisions.<\/p><h2 class=\"wp-block-heading\" id=\"h-next-steps-for-your-self-hosted-analytics-dashboard\">Next steps for your self-hosted analytics dashboard<\/h2><p>After deploying Metabase with Docker, the next step is to make your analytics dashboard reliable, secure, and useful for daily decision-making. Start by moving from a basic container setup to a PostgreSQL-backed deployment if you plan to use Metabase for long-term business reporting.<\/p><p>First, connect the database that contains your most important business data. This can be a sales database, ecommerce database, a product analytics database, a marketing warehouse, or a customer support database. Then, create one focused dashboard around a single business question, such as &ldquo;Which channels generate the most revenue?&rdquo; or &ldquo;How many users become active after signing up?&rdquo;<\/p><p>Once the first dashboard is useful, improve the setup with filters, permissions, scheduled reports, and regular database backups. Filters help teams analyze specific time periods, regions, products, or campaigns. Permissions keep sensitive data visible only to the right users. Scheduled reports deliver key metrics to stakeholders without requiring them to open Metabase manually.<\/p><p>For production use, connect a domain, enable HTTPS, monitor VPS resources, and back up the PostgreSQL database that stores Metabase&rsquo;s application data. These steps protect your dashboards, saved questions, users, and settings as your reporting workflow grows.<\/p><p>A self-hosted Metabase dashboard gives you full control over your analytics environment. Docker makes deployments portable, PostgreSQL keeps your Metabase data persistent, and Hostinger VPS gives you a faster way to launch the stack without manually configuring every container.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>To create a self-hosted analytics dashboard with Metabase and Docker, deploy the Metabase container, store its application data in PostgreSQL, connect your business database, and build dashboards from saved questions and visualizations. This setup gives you a private business intelligence environment where you control the server, database connections, users, permissions, and reporting workflow. Metabase works [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/uk\/tutorials\/metabase-docker-analytics-dashboard\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":342,"featured_media":132928,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"How to create a Metabase dashboard with Docker","rank_math_description":"Learn how to deploy Metabase with Docker, connect business data, and build a self-hosted analytics dashboard on your VPS.","rank_math_focus_keyword":"metabase docker","footnotes":""},"categories":[22640],"tags":[],"class_list":["post-132927","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vps"],"hreflangs":[{"locale":"en-US","link":"https:\/\/www.hostinger.com\/tutorials\/metabase-docker-analytics-dashboard","default":1},{"locale":"en-PH","link":"https:\/\/www.hostinger.com\/ph\/tutorials\/metabase-docker-analytics-dashboard","default":0},{"locale":"en-MY","link":"https:\/\/www.hostinger.com\/my\/tutorials\/metabase-docker-analytics-dashboard","default":0},{"locale":"en-UK","link":"https:\/\/www.hostinger.com\/uk\/tutorials\/metabase-docker-analytics-dashboard","default":0},{"locale":"en-IN","link":"https:\/\/www.hostinger.com\/in\/tutorials\/metabase-docker-analytics-dashboard","default":0},{"locale":"en-CA","link":"https:\/\/www.hostinger.com\/ca\/tutorials\/metabase-docker-analytics-dashboard","default":0},{"locale":"en-AU","link":"https:\/\/www.hostinger.com\/au\/tutorials\/metabase-docker-analytics-dashboard","default":0},{"locale":"en-NG","link":"https:\/\/www.hostinger.com\/ng\/tutorials\/metabase-docker-analytics-dashboard","default":0}],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/posts\/132927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/users\/342"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/comments?post=132927"}],"version-history":[{"count":0,"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/posts\/132927\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/media\/132928"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/media?parent=132927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/categories?post=132927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/uk\/tutorials\/wp-json\/wp\/v2\/tags?post=132927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}