Exposing a local Postgres server for remote access on a custom domain using Nginx as a reverse proxy can be a useful configuration for a variety of scenarios, such as hosting a database for a web application or enabling remote access for database administration tasks. In this blog post, we'll explore some ideas for setting up this configuration on a server running Ubuntu 18.04.

Throughout this post, we'll brainstorm different approaches to setting up a Postgres server for remote access on a custom domain with Nginx reverse proxy, considering factors such as security, performance, and maintenance. Whether you're a seasoned Postgres administrator or just getting started, we hope that this post will provide some useful insights and ideas for setting up this configuration.

Setting up Nginx as a reverse proxy

To set up Nginx as a reverse proxy for a Postgres server, you will need to perform the following steps:

  1. Install Nginx on your server: To install Nginx on a server running Ubuntu 18.04, you can use the following command:
sudo apt-get update
sudo apt-get install nginx

2. Configure Nginx as a reverse proxy: To configure Nginx as a reverse proxy, you will need to create a new configuration file in the /etc/nginx/conf.d directory. For example, you might create a file named postgres.conf with the following contents:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:5432;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

This configuration will cause Nginx to listen for incoming requests on port 80 and forward them to the Postgres server listening on port 5432. You will need to replace example.com with the domain that you want to use for your Postgres server.

3. Restart Nginx: After saving the configuration file, you will need to restart Nginx to apply the changes. You can do this by running the following command:

sudo systemctl restart nginx

Test the configuration: To test the configuration, you can use a tool such as curl to send a request to the Postgres server through Nginx. For example:

curl http://example.com

If the configuration is working correctly, you should receive a response from the Postgres server.

Allowing remote connections to the Postgres server

By default, Postgres is configured to only listen for connections from localhost. To allow remote connections to the Postgres server, you will need to perform the following steps:

  1. Edit the postgresql.conf file: Open the postgresql.conf file in a text editor and locate the listen_addresses parameter. Set this parameter to '*' to allow Postgres to listen for connections from any host.
  2. Edit the pg_hba.conf file: Open the pg_hba.conf file in a text editor and add a line to allow connections from the IP address of the server where Nginx is running. For example:

host    all             all             1.2.3.4/32            md5

Replace 1.2.3.4 with the actual IP address of the server where Nginx is running.

3. Restart the Postgres server: After making these changes, you will need to restart the Postgres server to apply the changes. You can do this by running the following command:

sudo service postgresql restart

4. Test the configuration: To test the configuration, you can use a tool such as psql to connect to the Postgres server from a remote location. For example:

psql -h example.com -U postgres

If the configuration is working correctly, you should be able to connect to the Postgres server from a remote location.

Configuring SSL/TLS for HTTPS

To secure the connection between the client and the Postgres server using HTTPS, you will need to obtain an SSL/TLS certificate and configure Nginx to use it. There are two main options for obtaining a certificate:

  1. Obtain a certificate from a trusted certificate authority (CA): One option is to obtain a certificate from a trusted CA such as Let's Encrypt or DigiCert. These CAs offer free and low-cost certificates that are widely recognized as trusted by web browsers and other clients. To obtain a certificate from a CA, you will need to follow the CA's specific instructions for generating and installing a certificate.
  2. Use a self-signed certificate: Another option is to generate a self-signed certificate for testing or development purposes. While self-signed certificates are not trusted by web browsers and other clients by default, they can be useful for testing or prototyping. To generate a self-signed certificate, you can use the openssl tool. For example:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.key -out example.crt

This command will generate a self-signed certificate and a private key, which you can use to configure Nginx.

To configure Nginx to use an SSL/TLS certificate, you will need to modify the Nginx configuration file that you created earlier. Specifically, you will need to add the following lines to the server block:

listen 443 ssl;
    ssl_certificate /path/to/example.crt;
    ssl_certificate_key /path/to/example.key;

Make sure to replace /path/to/example.crt and /path/to/example.key with the actual paths to the certificate and private key files.

After making these changes, you will need to restart Nginx to apply the changes. You can do this by running the following command:

sudo systemctl restart nginx

To test the configuration, you can use a tool such as curl to send a request to the Postgres server over HTTPS. For example:

curl --insecure https://example.com

If the configuration is working correctly, you should receive a response from the Postgres server.

Testing the setup

To test the setup and ensure that everything is working as expected, you can use a tool such as psql to connect to the Postgres server from a remote location.

To connect to the Postgres server using psql, you will need to specify the hostname of the server (e.g., example.com) and the username of a Postgres user that has the necessary privileges to connect to the server.

For example:

psql -h example.com -U postgres

If the setup is working correctly, you should be able to connect to the Postgres server and perform database tasks such as creating tables and inserting data.

You can also use other tools such as pgadmin or a web-based administration tool to connect to the Postgres server and perform database tasks.

Conclusion

In this blog post, we explored some ideas for setting up a Postgres server for remote access on a custom domain with Nginx as a reverse proxy. We considered factors such as security, performance, and maintenance, and brainstormed different approaches to configuring Nginx and Postgres to allow remote connections.

Please note that these ideas are for brainstorming purposes only and have not been tested. If you have tried any of these approaches and encountered any issues, or if you have any suggestions for improving the setup, please leave a comment below. We'd love to hear from you!

Whether you are a seasoned Postgres administrator or just getting started, we hope that you found this post helpful and informative. If you have any further questions or need more assistance with this topic, please don't hesitate to reach out. We'd be happy to help!


References

  1. https://www.postgresql.org/docs/
  2. https://nginx.org/en/docs/
  3. https://letsencrypt.org/
  4. https://www.openssl.org/docs/
  5. https://www.postgresql.org/docs/current/app-psql.html
  6. https://wiki.postgresql.org/
  7. https://www.pgadmin.org/docs/