Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - fly-apps/postgres-ha: Postgres + Stolon for HA clusters as Fly apps. · GitHub
Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - fly-apps/postgres-ha: Postgres + Stolon for HA clusters as Fly apps. · GitHub
Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - fly-apps/postgres-ha: Postgres + Stolon for HA clusters as Fly apps. · GitHub
Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - fly-apps/postgres-ha: Postgres + Stolon for HA clusters as Fly apps. · GitHub
Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - fly-apps/postgres-ha: Postgres + Stolon for HA clusters as Fly apps. · GitHub
Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - fly-apps/postgres-ha: Postgres + Stolon for HA clusters as Fly apps. · GitHub
Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - fly-apps/postgres-ha: Postgres + Stolon for HA clusters as Fly apps. · GitHub
Skip to content

Repository files navigation

High Availability Postgres on Fly.io

This repo contains all the code and configuration necessary to run a highly available Postgres cluster in a Fly.io organization's private network. This source is packaged into Docker images which allow you to track and upgrade versions cleanly as new features are added.

If you just want to get a standard Postgres standalone or highly-available setup on Fly, check out the docs.

Customizing cluster behavior

Fly Postgres clusters are just regular Fly applications. If you need to customize Postgres in any way, you may fork this repo and deploy using normal Fly deployment procedures. You won't be able to use fly postgres commands with custom clusters. But it's a great way to experiment and potentially contribute back useful features!

Follow the rest of this README to run a customized setup.

Prepare a new application

You'll need a fresh Fly application in your preferred region to get started. Run these commands within the fork of this repository.

fly launch --no-deploy

This gets you started with a Fly application and an associated config file. Choose yes when asked whether to copy the existing configuration to the newly generated app.

Set secrets

This app requires a few secret environment variables. Generate a secure string for each, and save them.

SU_PASSWORD is the PostgreSQL super user password. The username is flypgadmin. Use these credentials to run high privilege administration tasks.

REPL_PASSWORD is used to replicate between instances.

OPERATOR_PASSWORD is the password for the standard user postgres. Use these credentials for connecting from your application.

fly secrets set SU_PASSWORD=<PASSWORD> REPL_PASSWORD=<PASSWORD> OPERATOR_PASSWORD=<PASSWORD>

Set the PRIMARY_REGION environment variable within your fly.toml

The PRIMARY_REGION value lets Stolon know which Postgres instances are eligible for election in the event of a failover. If this value is not set to the correct region, your cluster may not boot properly.

Deploy one instance

First, get one instance deployed in your preferred start region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly deploy
  3. fly status

Add a replica

Scaling up will automatically setup a replica for you. Do that now in the same region.

  1. fly volumes create pg_data --region ord --size 10
  2. fly scale count 2
  3. fly status

Add a replica in another region

Scale to another region by creating a volume there. Now you should have a primary/replica pair in ord and a replica in syd.

  1. fly volumes create pg_data --region syd --size 10
  2. fly scale count 3
  3. fly status

Connecting

Fly apps within the same organization can connect to your Postgres using the following URI:

postgres://postgres:<operator_password>@<postgres-app-name>.internal:5432/<database-name>

Connecting to Postgres from your local machine

  1. Forward the server port to your local system with flyctl proxy:
flyctl proxy 5432 -a <postgres-app-name>
  1. Postgres needs to be installed on your local machine.

  2. Use psql to connect to your Postgres instance on the forwarded port.

psql postgres://postgres:<operator_password>@localhost:5432

Enabling TimescaleDB

This app includes the TimescaleDB extension. To enable TimescaleDB, take the following steps:

  1. Ensure your Postgres app is running >= v0.0.28.
# View your image details
fly image show --app <app-name>
# Update to the latest ( Nomad-based apps )
fly image update --app <app-name>
  1. Configure Postgres to preload the TimescaleDB library
fly pg config update --shared-preload-libraries timescaledb --app <app-name>
  1. Restart Postgres
fly postgres restart --app <app-name>
  1. Create the extension
# Connect to your target database
fly pg connect --app <app-name> --database <db-name>
# Create the extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

Having trouble?

Create an issue or ask a question here: https://community.fly.io/

Contributing

If you're looking to get involved, fork the project and send pull requests.

About

Postgres + Stolon for HA clusters as Fly apps.

Resources

Stars

332 stars

Watchers

10 watching

Forks

Releases

Packages

Used by

Contributors

Languages