{"id":33468,"date":"2024-06-09T18:27:13","date_gmt":"2024-06-09T16:27:13","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=33468"},"modified":"2024-06-09T18:49:34","modified_gmt":"2024-06-09T16:49:34","slug":"cloudnativepg-configuring-the-postgresql-instance","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/","title":{"rendered":"CloudNativePG \u2013 Configuring the PostgreSQL instance"},"content":{"rendered":"\n<p>In the <a href=\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-bootstrapping-an-empty-cluster\/\">last post<\/a> we&#8217;ve created a more detailed version of the cluster definition for CloudNativePG. This gave us a PostgreSQL cluster with enabled data checksum, the correct locale, an increased size of the WAL segments and the possibility to run custom statements or scripts after initdb. What we didn&#8217;t touch at all, was the configuration of PostgreSQL, and this is the scope of this post.<\/p>\n\n\n\n<p>This is the last configuration we&#8217;ve used in previous post:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1]; title: ; notranslate\" title=\"\">\nminicube@micro-minicube:~&gt; cat pg.yaml \napiVersion: postgresql.cnpg.io\/v1\nkind: Cluster\nmetadata:\n  name: my-pg-cluster\nspec:\n  instances: 3\n\n  bootstrap:\n    initdb:\n      database: db1\n      owner: db1\n      dataChecksums: true\n      walSegmentSize: 32\n      localeCollate: &#039;en_US.utf8&#039;\n      localeCType: &#039;en_US.utf8&#039;\n      postInitSQL:\n      - create user db2\n      - create database db2 with owner = db2\n  storage:\n    size: 1Gi\n<\/pre><\/div>\n\n\n<p>There is nothing in it which configures the PostgreSQL instance as of now. Doing this is quite simple, it just requires an additional section called &#8220;postgresql&#8221; on the same level as &#8220;instances&#8221; or &#8220;bootstrap&#8221;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\napiVersion: postgresql.cnpg.io\/v1\nkind: Cluster\nmetadata:\n  name: my-pg-cluster\nspec:\n  instances: 3\n\n  bootstrap:\n    initdb:\n      database: db1\n      owner: db1\n      dataChecksums: true\n      walSegmentSize: 32\n      localeCollate: &#039;en_US.utf8&#039;\n      localeCType: &#039;en_US.utf8&#039;\n      postInitSQL:\n      - create user db2\n      - create database db2 with owner = db2\n\n  postgresql:\n    parameters:\n      work_mem: &quot;8MB&quot;\n\n  storage:\n    size: 1Gi\n<\/pre><\/div>\n\n\n<p>This will change work_mem from the default of 4MB to 8MB:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,3,7]; title: ; notranslate\" title=\"\">\nminicube@micro-minicube:~&gt; kubectl exec my-pg-cluster-1 -i -t -- \/bin\/bash\nDefaulted container &quot;postgres&quot; out of: postgres, bootstrap-controller (init)\npostgres@my-pg-cluster-1:\/$ psql\npsql (16.2 (Debian 16.2-1.pgdg110+2))\nType &quot;help&quot; for help.\n\npostgres=# show work_mem;\n work_mem \n----------\n 8MB\n(1 row)\n\npostgres=# \n\\q\ncould not save history to file &quot;\/var\/lib\/postgresql\/.psql_history&quot;: No such file or directory\npostgres@my-pg-cluster-1:\/$ \nexit\n<\/pre><\/div>\n\n\n<p>Changing a parameter is done in the same way: Change the value in yaml file, and re-apply it:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,3,5,7,11]; title: ; notranslate\" title=\"\">\nminicube@micro-minicube:~&gt; grep work_mem pg.yaml \n      work_mem: &quot;12MB&quot;\nminicube@micro-minicube:~&gt; kubectl apply -f pg.yaml\ncluster.postgresql.cnpg.io\/my-pg-cluster configured\nminicube@micro-minicube:~&gt; kubectl exec my-pg-cluster-1 -i -t -- \/bin\/bash\nDefaulted container &quot;postgres&quot; out of: postgres, bootstrap-controller (init)\npostgres@my-pg-cluster-1:\/$ psql\npsql (16.2 (Debian 16.2-1.pgdg110+2))\nType &quot;help&quot; for help.\n\npostgres=# show work_mem;\n work_mem \n----------\n 12MB\n(1 row)\n<\/pre><\/div>\n\n\n<p>What you shouldn&#8217;t do is to change parameters either directly in the PostgreSQL configuration files (postgresql.conf, postgresql.auto.conf) or by using &#8220;<a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-altersystem.html\">alter system<\/a>&#8220;. The <a href=\"https:\/\/www.dbi-services.com\/blog\/postgresql-17-add-allow_alter_system-guc\/\">new feature in PostgreSQL 17<\/a>, which allows to disable the &#8220;alter system&#8221; command came in exactly for this reason: In such a setup, where all the configuration is driven externally, this should be the only source of truth. Changing a configuration directly in PostgreSQL must be avoided.<\/p>\n\n\n\n<p>Another topic you need to think about is access control, meaning <a href=\"https:\/\/www.postgresql.org\/docs\/current\/auth-pg-hba-conf.html\" target=\"_blank\" rel=\"noreferrer noopener\">pg_hba.conf<\/a>. Same principle here: This needs to be done in the yaml, in an additional section under the &#8220;postgresql&#8221; section, not directly in the hba file itself:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; highlight: [23,24]; title: ; notranslate\" title=\"\">\napiVersion: postgresql.cnpg.io\/v1\nkind: Cluster\nmetadata:\n  name: my-pg-cluster\nspec:\n  instances: 3\n\n  bootstrap:\n    initdb:\n      database: db1\n      owner: db1\n      dataChecksums: true\n      walSegmentSize: 32\n      localeCollate: &#039;en_US.utf8&#039;\n      localeCType: &#039;en_US.utf8&#039;\n      postInitSQL:\n      - create user db2\n      - create database db2 with owner = db2\n\n  postgresql:\n    parameters:\n      work_mem: &quot;12MB&quot;\n    pg_hba:\n      - host all all 192.168.122.0\/24 scram-sha-256\n\n  storage:\n    size: 1Gi\n<\/pre><\/div>\n\n\n<p>Re-apply, and it&#8217;s done:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; highlight: [1,3,5,9]; title: ; notranslate\" title=\"\">\nminicube@micro-minicube:~&gt; kubectl apply -f pg.yaml\ncluster.postgresql.cnpg.io\/my-pg-cluster configured\nminicube@micro-minicube:~&gt; kubectl exec my-pg-cluster-1 -i -t -- \/bin\/bash\nDefaulted container &quot;postgres&quot; out of: postgres, bootstrap-controller (init)\npostgres@my-pg-cluster-1:\/$ psql\npsql (16.2 (Debian 16.2-1.pgdg110+2))\nType &quot;help&quot; for help.\n\npostgres=# select database,user_name,address,netmask from pg_hba_file_rules where address like &#039;%122%&#039;;\n database | user_name |    address    |    netmask    \n----------+-----------+---------------+---------------\n {all}    | {all}     | 192.168.122.0 | 255.255.255.0\n(1 row)\n\npostgres=# \n<\/pre><\/div>\n\n\n<p>There are some parameters which cannot be changed and are managed entirely by the operator, e.g. the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-wal.html#GUC-ARCHIVE-COMMAND\">archive_command<\/a>. Check the <a href=\"https:\/\/cloudnative-pg.io\/documentation\/1.23\/postgresql_conf\/\">documentation<\/a> for the full list. This is mostly to guarantee archiving is working and streaming replication is properly setup.<\/p>\n\n\n\n<p>That&#8217;s it for this post. In the next post we&#8217;ll look at which PostgreSQL extensions are available in CloudNativePG and how you can use and configure them.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the last post we&#8217;ve created a more detailed version of the cluster definition for CloudNativePG. This gave us a PostgreSQL cluster with enabled data checksum, the correct locale, an increased size of the WAL segments and the possibility to run custom statements or scripts after initdb. What we didn&#8217;t touch at all, was the [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[955,198,368,1320],"tags":[77],"type_dbi":[],"class_list":["post-33468","post","type-post","status-publish","format-standard","hentry","category-cloud","category-database-management","category-development-performance","category-devops","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>CloudNativePG \u2013 Configuring the PostgreSQL instance - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CloudNativePG \u2013 Configuring the PostgreSQL instance\" \/>\n<meta property=\"og:description\" content=\"In the last post we&#8217;ve created a more detailed version of the cluster definition for CloudNativePG. This gave us a PostgreSQL cluster with enabled data checksum, the correct locale, an increased size of the WAL segments and the possibility to run custom statements or scripts after initdb. What we didn&#8217;t touch at all, was the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-09T16:27:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-09T16:49:34+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"CloudNativePG \u2013 Configuring the PostgreSQL instance\",\"datePublished\":\"2024-06-09T16:27:13+00:00\",\"dateModified\":\"2024-06-09T16:49:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/\"},\"wordCount\":336,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Cloud\",\"Database management\",\"Development &amp; Performance\",\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/\",\"name\":\"CloudNativePG \u2013 Configuring the PostgreSQL instance - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2024-06-09T16:27:13+00:00\",\"dateModified\":\"2024-06-09T16:49:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CloudNativePG \u2013 Configuring the PostgreSQL instance\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"CloudNativePG \u2013 Configuring the PostgreSQL instance - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/","og_locale":"en_US","og_type":"article","og_title":"CloudNativePG \u2013 Configuring the PostgreSQL instance","og_description":"In the last post we&#8217;ve created a more detailed version of the cluster definition for CloudNativePG. This gave us a PostgreSQL cluster with enabled data checksum, the correct locale, an increased size of the WAL segments and the possibility to run custom statements or scripts after initdb. What we didn&#8217;t touch at all, was the [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/","og_site_name":"dbi Blog","article_published_time":"2024-06-09T16:27:13+00:00","article_modified_time":"2024-06-09T16:49:34+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"CloudNativePG \u2013 Configuring the PostgreSQL instance","datePublished":"2024-06-09T16:27:13+00:00","dateModified":"2024-06-09T16:49:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/"},"wordCount":336,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Cloud","Database management","Development &amp; Performance","DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/","url":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/","name":"CloudNativePG \u2013 Configuring the PostgreSQL instance - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2024-06-09T16:27:13+00:00","dateModified":"2024-06-09T16:49:34+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/cloudnativepg-configuring-the-postgresql-instance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"CloudNativePG \u2013 Configuring the PostgreSQL instance"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/33468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=33468"}],"version-history":[{"count":10,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/33468\/revisions"}],"predecessor-version":[{"id":33526,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/33468\/revisions\/33526"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=33468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=33468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=33468"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=33468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}