Recently, I needed to install the PostgreSQL database along with my WPF app. However, putting the PostgreSQL 12.1 installer into my app’s installer as a custom action just didn’t work for some reason. The PostgreSQL installer kept shutting down and I didn’t want to spare anymore precious time on a solution I didn’t even really like.
So I’ve done some digging and it turned out, PostgreSQL has been kind enough to provide the raw bindary files, so you can install it your self. This process has been documented in a few blogposts I’ve found, however, none of them showed how to make your database run on a different that the default port. And that is something I wanted. Since I’m installing the database specifically for my app, I want the service name to be something like “myAppPostgreSQL12” and run it on a different port, so I don’t collide with possible preinstalled versions of PostgreSQL.
Let’s do this!
Download the binaries
Download the binaries zip file from here
Extract the binaries
Extract the files and put the contents of the pgsql folder wherever you like, for this example, we’ll put them in C:\Users\User\Desktop\CustomPostgreSQL
Create the data folder
Create a folder called data in the C:\Users\User\Desktop\CustomPostgreSQL
Launch CMD and cd into the bin directory
Now launch CMD as administrator and use this command to go to the bin directory cd C:\Users\User\Desktop\CustomPostgreSQL\bin
Create a database cluster
Now let’s create a db cluster. In this step, there are two options of setting the superuser password: manually setting the password from console, reading the password from a file.
Manually setting the password from console:
initdb -U postgres -A password -E utf8 -W -D "C:\Users\User\Desktop\CustomPostgreSQL\data"
Reading the password from a file (* it reads whatever is on the first line of the file and uses that as a password. The file pw.txt is created by me, it can by named whatever and be wherever you like):
initdb -U postgres -A password -E utf8 --pwfile "C:\Users\User\Desktop\CustomPostgreSQL\pw.txt" -D "C:\Users\User\Desktop\CustomPostgreSQL\data"
There are many parameters this can take, so I’ll go over the ones used here:
-U postgresis the name of the superuser
-A passwordis an authentication method
-E utf8is the default encoding
-Wmeans the program will prompt you to create a password manually
-Dis a path to the data directory
--pwfileis a path to the file that contains the password
You can take a look at all the parameters here
Register the database as a service
Finally, we register the thing as a windows service and we’re done.
pg_ctl register -N "OurCustomPostgreSQLService" -U "LocalSystem" -D "C:\Users\User\Desktop\CustomPostgreSQL\data" -w -o "-p 5434"
Let’s go over the parameters again:
-N "OurCustomPostgreSQLService"sets the name of the service to OurCustomPostgreSQLService
-U "LocalSystem"sets the user that's going to be running the service to LocalSystem user
-D "C:\Users\User\Desktop\CustomPostgreSQL\data"sets the path to our data directory
-wjust tells the program to wait for the result and report success/failure
-o "-p 5434"sets to port the service is gonna be running on to 5434 instead of the default 5432
Add some service description (optional)
If you want, you can set a description for the service so anyone else might be able to tell what it is.
sc description OurCustomPostgreSQLService "A custom PostgreSQL service running on port 5434"
I’ll update this post if I find out any other useful information. Cheers!