mirror of
https://github.com/coder/registry.git
synced 2026-06-02 20:48:14 +00:00
feat(pgadmin): add new module for pgAdmin (#228)
Co-authored-by: DevCats <christofer@coder.com> Co-authored-by: Atif Ali <atif@coder.com>
This commit is contained in:
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="64" viewBox="0 0 25.6 25.6" width="64"><style><![CDATA[.B{stroke-linecap:round}.C{stroke-linejoin:round}.D{stroke-linejoin:miter}.E{stroke-width:.716}]]></style><g fill="none" stroke="#fff"><path d="M18.983 18.636c.163-1.357.114-1.555 1.124-1.336l.257.023c.777.035 1.793-.125 2.4-.402 1.285-.596 2.047-1.592.78-1.33-2.89.596-3.1-.383-3.1-.383 3.053-4.53 4.33-10.28 3.227-11.687-3.004-3.84-8.205-2.024-8.292-1.976l-.028.005c-.57-.12-1.2-.19-1.93-.2-1.308-.02-2.3.343-3.054.914 0 0-9.277-3.822-8.846 4.807.092 1.836 2.63 13.9 5.66 10.25C8.29 15.987 9.36 14.86 9.36 14.86c.53.353 1.167.533 1.834.468l.052-.044a2.01 2.01 0 0 0 .021.518c-.78.872-.55 1.025-2.11 1.346-1.578.325-.65.904-.046 1.056.734.184 2.432.444 3.58-1.162l-.046.183c.306.245.285 1.76.33 2.842s.116 2.093.337 2.688.48 2.13 2.53 1.7c1.713-.367 3.023-.896 3.143-5.81" fill="#000" stroke="#000" stroke-linecap="butt" stroke-width="2.149" class="D"/><path d="M23.535 15.6c-2.89.596-3.1-.383-3.1-.383 3.053-4.53 4.33-10.28 3.228-11.687-3.004-3.84-8.205-2.023-8.292-1.976l-.028.005a10.31 10.31 0 0 0-1.929-.201c-1.308-.02-2.3.343-3.054.914 0 0-9.278-3.822-8.846 4.807.092 1.836 2.63 13.9 5.66 10.25C8.29 15.987 9.36 14.86 9.36 14.86c.53.353 1.167.533 1.834.468l.052-.044a2.02 2.02 0 0 0 .021.518c-.78.872-.55 1.025-2.11 1.346-1.578.325-.65.904-.046 1.056.734.184 2.432.444 3.58-1.162l-.046.183c.306.245.52 1.593.484 2.815s-.06 2.06.18 2.716.48 2.13 2.53 1.7c1.713-.367 2.6-1.32 2.725-2.906.088-1.128.286-.962.3-1.97l.16-.478c.183-1.53.03-2.023 1.085-1.793l.257.023c.777.035 1.794-.125 2.39-.402 1.285-.596 2.047-1.592.78-1.33z" fill="#336791" stroke="none"/><g class="E"><g class="B"><path d="M12.814 16.467c-.08 2.846.02 5.712.298 6.4s.875 2.05 2.926 1.612c1.713-.367 2.337-1.078 2.607-2.647l.633-5.017M10.356 2.2S1.072-1.596 1.504 7.033c.092 1.836 2.63 13.9 5.66 10.25C8.27 15.95 9.27 14.907 9.27 14.907m6.1-13.4c-.32.1 5.164-2.005 8.282 1.978 1.1 1.407-.175 7.157-3.228 11.687" class="C"/><path d="M20.425 15.17s.2.98 3.1.382c1.267-.262.504.734-.78 1.33-1.054.49-3.418.615-3.457-.06-.1-1.745 1.244-1.215 1.147-1.652-.088-.394-.69-.78-1.086-1.744-.347-.84-4.76-7.29 1.224-6.333.22-.045-1.56-5.7-7.16-5.782S7.99 8.196 7.99 8.196" stroke-linejoin="bevel"/></g><g class="C"><path d="M11.247 15.768c-.78.872-.55 1.025-2.11 1.346-1.578.325-.65.904-.046 1.056.734.184 2.432.444 3.58-1.163.35-.49-.002-1.27-.482-1.468-.232-.096-.542-.216-.94.23z"/><path d="M11.196 15.753c-.08-.513.168-1.122.433-1.836.398-1.07 1.316-2.14.582-5.537-.547-2.53-4.22-.527-4.22-.184s.166 1.74-.06 3.365c-.297 2.122 1.35 3.916 3.246 3.733" class="B"/></g></g><g fill="#fff" class="D"><path d="M10.322 8.145c-.017.117.215.43.516.472s.558-.202.575-.32-.215-.246-.516-.288-.56.02-.575.136z" stroke-width=".239"/><path d="M19.486 7.906c.016.117-.215.43-.516.472s-.56-.202-.575-.32.215-.246.516-.288.56.02.575.136z" stroke-width=".119"/></g><path d="M20.562 7.095c.05.92-.198 1.545-.23 2.524-.046 1.422.678 3.05-.413 4.68" class="B C E"/></g></svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
@@ -0,0 +1,7 @@
|
||||
---
|
||||
display_name: Jash
|
||||
bio: Coder user and contributor.
|
||||
github: AJ0070
|
||||
avatar: ./.images/avatar.png
|
||||
status: community
|
||||
---
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
display_name: "pgAdmin"
|
||||
description: "A web-based interface for managing PostgreSQL databases in your Coder workspace."
|
||||
icon: "../../../../.icons/pgadmin.svg"
|
||||
maintainer_github: "AJ0070"
|
||||
verified: false
|
||||
tags: ["database", "postgres", "pgadmin", "web-ide"]
|
||||
---
|
||||
|
||||
# pgAdmin
|
||||
|
||||
This module adds a pgAdmin app to your Coder workspace, providing a powerful web-based interface for managing PostgreSQL databases.
|
||||
|
||||
It can be served on a Coder subdomain for easy access, or on `localhost` if you prefer to use port-forwarding.
|
||||
|
||||
```tf
|
||||
module "pgadmin" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/AJ0070/pgadmin/coder"
|
||||
version = "1.0.0"
|
||||
agent_id = coder_agent.example.id
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,10 @@
|
||||
import { describe } from "bun:test";
|
||||
import { runTerraformInit, testRequiredVariables } from "~test";
|
||||
|
||||
describe("pgadmin", async () => {
|
||||
await runTerraformInit(import.meta.dir);
|
||||
|
||||
testRequiredVariables(import.meta.dir, {
|
||||
agent_id: "foo",
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,108 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variable "agent_id" {
|
||||
type = string
|
||||
description = "The agent to install pgAdmin on."
|
||||
}
|
||||
|
||||
variable "port" {
|
||||
type = number
|
||||
description = "The port to run pgAdmin on."
|
||||
default = 5050
|
||||
}
|
||||
|
||||
variable "subdomain" {
|
||||
type = bool
|
||||
description = "If true, the app will be served on a subdomain."
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "config" {
|
||||
type = any
|
||||
description = "A map of pgAdmin configuration settings."
|
||||
default = {
|
||||
DEFAULT_EMAIL = "admin@coder.com"
|
||||
DEFAULT_PASSWORD = "coderPASSWORD"
|
||||
SERVER_MODE = false
|
||||
MASTER_PASSWORD_REQUIRED = false
|
||||
LISTEN_ADDRESS = "127.0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_workspace" "me" {}
|
||||
data "coder_workspace_owner" "me" {}
|
||||
|
||||
resource "coder_app" "pgadmin" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
agent_id = var.agent_id
|
||||
display_name = "pgAdmin"
|
||||
slug = "pgadmin"
|
||||
icon = "/icon/pgadmin.svg"
|
||||
url = local.url
|
||||
subdomain = var.subdomain
|
||||
share = "owner"
|
||||
|
||||
healthcheck {
|
||||
url = local.healthcheck_url
|
||||
interval = 5
|
||||
threshold = 6
|
||||
}
|
||||
}
|
||||
|
||||
resource "coder_script" "pgadmin" {
|
||||
agent_id = var.agent_id
|
||||
display_name = "Install and run pgAdmin"
|
||||
icon = "/icon/pgadmin.svg"
|
||||
run_on_start = true
|
||||
script = templatefile("${path.module}/run.sh", {
|
||||
PORT = var.port,
|
||||
LOG_PATH = "/tmp/pgadmin.log",
|
||||
SERVER_BASE_PATH = local.server_base_path,
|
||||
CONFIG = local.config_content,
|
||||
PGADMIN_DATA_DIR = local.pgadmin_data_dir,
|
||||
PGADMIN_LOG_DIR = local.pgadmin_log_dir,
|
||||
PGADMIN_VENV_DIR = local.pgadmin_venv_dir
|
||||
})
|
||||
}
|
||||
|
||||
locals {
|
||||
server_base_path = var.subdomain ? "" : format("/@%s/%s/apps/%s", data.coder_workspace_owner.me.name, data.coder_workspace.me.name, "pgadmin")
|
||||
url = "http://localhost:${var.port}${local.server_base_path}"
|
||||
healthcheck_url = "http://localhost:${var.port}${local.server_base_path}/"
|
||||
|
||||
# pgAdmin data directories (user-local paths)
|
||||
pgadmin_data_dir = "$HOME/.pgadmin"
|
||||
pgadmin_log_dir = "$HOME/.pgadmin/logs"
|
||||
pgadmin_venv_dir = "$HOME/.pgadmin/venv"
|
||||
|
||||
base_config = merge(var.config, {
|
||||
LISTEN_PORT = var.port
|
||||
# Override paths for user installation
|
||||
DATA_DIR = local.pgadmin_data_dir
|
||||
LOG_FILE = "${local.pgadmin_log_dir}/pgadmin4.log"
|
||||
SQLITE_PATH = "${local.pgadmin_data_dir}/pgadmin4.db"
|
||||
SESSION_DB_PATH = "${local.pgadmin_data_dir}/sessions"
|
||||
STORAGE_DIR = "${local.pgadmin_data_dir}/storage"
|
||||
# Disable initial setup prompts for automated deployment
|
||||
SETUP_AUTH = false
|
||||
})
|
||||
|
||||
config_with_path = var.subdomain ? local.base_config : merge(local.base_config, {
|
||||
APPLICATION_ROOT = local.server_base_path
|
||||
})
|
||||
|
||||
config_content = join("\n", [
|
||||
for key, value in local.config_with_path :
|
||||
format("%s = %s", key,
|
||||
can(regex("^(true|false)$", tostring(value))) ? (value ? "True" : "False") :
|
||||
can(tonumber(value)) ? tostring(value) :
|
||||
format("'%s'", tostring(value))
|
||||
)
|
||||
])
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
PORT=${PORT}
|
||||
LOG_PATH=${LOG_PATH}
|
||||
SERVER_BASE_PATH=${SERVER_BASE_PATH}
|
||||
|
||||
BOLD='\033[0;1m'
|
||||
|
||||
printf "$${BOLD}Installing pgAdmin!\n"
|
||||
|
||||
# Check if Python 3 is available
|
||||
if ! command -v python3 > /dev/null 2>&1; then
|
||||
echo "⚠️ Warning: Python 3 is not installed. Please install Python 3 before using this module."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Setup pgAdmin directories (from Terraform configuration)
|
||||
PGADMIN_DATA_DIR="${PGADMIN_DATA_DIR}"
|
||||
PGADMIN_LOG_DIR="${PGADMIN_LOG_DIR}"
|
||||
PGADMIN_VENV_DIR="${PGADMIN_VENV_DIR}"
|
||||
|
||||
printf "Setting up pgAdmin directories...\n"
|
||||
mkdir -p "$PGADMIN_DATA_DIR"
|
||||
mkdir -p "$PGADMIN_LOG_DIR"
|
||||
|
||||
# Check if pgAdmin virtual environment already exists and is working
|
||||
if [ -f "$PGADMIN_VENV_DIR/bin/pgadmin4" ] && [ -f "$PGADMIN_VENV_DIR/bin/activate" ]; then
|
||||
printf "🥳 pgAdmin virtual environment already exists\n\n"
|
||||
else
|
||||
printf "Creating Python virtual environment for pgAdmin...\n"
|
||||
if ! python3 -m venv "$PGADMIN_VENV_DIR"; then
|
||||
echo "⚠️ Warning: Failed to create virtual environment"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
printf "Installing pgAdmin 4 in virtual environment...\n"
|
||||
if ! "$PGADMIN_VENV_DIR/bin/pip" install pgadmin4; then
|
||||
echo "⚠️ Warning: Failed to install pgAdmin4"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
printf "🥳 pgAdmin has been installed successfully\n\n"
|
||||
fi
|
||||
|
||||
printf "$${BOLD}Configuring pgAdmin...\n"
|
||||
|
||||
if [ -f "$PGADMIN_VENV_DIR/bin/pgadmin4" ]; then
|
||||
# pgAdmin installs to a predictable location in the virtual environment
|
||||
PYTHON_VERSION=$("$PGADMIN_VENV_DIR/bin/python" -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
|
||||
PGADMIN_INSTALL_DIR="$PGADMIN_VENV_DIR/lib/python$PYTHON_VERSION/site-packages/pgadmin4"
|
||||
|
||||
# Create pgAdmin config file in the correct location (next to config.py)
|
||||
cat > "$PGADMIN_INSTALL_DIR/config_local.py" << EOF
|
||||
# pgAdmin configuration for Coder workspace
|
||||
${CONFIG}
|
||||
EOF
|
||||
|
||||
printf "📄 Config written to $PGADMIN_INSTALL_DIR/config_local.py\n"
|
||||
|
||||
printf "$${BOLD}Starting pgAdmin in background...\n"
|
||||
printf "📝 Check logs at $${LOG_PATH}\n"
|
||||
printf "🌐 Serving at http://localhost:${PORT}${SERVER_BASE_PATH}\n"
|
||||
|
||||
# Create required directories
|
||||
mkdir -p "$PGADMIN_DATA_DIR/sessions"
|
||||
mkdir -p "$PGADMIN_DATA_DIR/storage"
|
||||
|
||||
# Start pgadmin4 from the virtual environment with proper environment
|
||||
cd "$PGADMIN_DATA_DIR"
|
||||
PYTHONPATH="$PGADMIN_INSTALL_DIR:$${PYTHONPATH:-}" "$PGADMIN_VENV_DIR/bin/pgadmin4" > "$${LOG_PATH}" 2>&1 &
|
||||
else
|
||||
printf "⚠️ Warning: pgAdmin4 virtual environment not found\n"
|
||||
printf "📝 Installation may have failed - check logs above\n"
|
||||
fi
|
||||
Reference in New Issue
Block a user