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:
parent
65edb54e88
commit
35e64f2e4a
1
.icons/pgadmin.svg
Normal file
1
.icons/pgadmin.svg
Normal file
@ -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 |
BIN
registry/AJ0070/.images/avatar.jpeg
Normal file
BIN
registry/AJ0070/.images/avatar.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
7
registry/AJ0070/README.md
Normal file
7
registry/AJ0070/README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
display_name: Jash
|
||||||
|
bio: Coder user and contributor.
|
||||||
|
github: AJ0070
|
||||||
|
avatar: ./.images/avatar.png
|
||||||
|
status: community
|
||||||
|
---
|
||||||
23
registry/AJ0070/modules/pgadmin/README.md
Normal file
23
registry/AJ0070/modules/pgadmin/README.md
Normal file
@ -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
|
||||||
|
}
|
||||||
|
```
|
||||||
10
registry/AJ0070/modules/pgadmin/main.test.ts
Normal file
10
registry/AJ0070/modules/pgadmin/main.test.ts
Normal file
@ -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",
|
||||||
|
});
|
||||||
|
});
|
||||||
108
registry/AJ0070/modules/pgadmin/main.tf
Normal file
108
registry/AJ0070/modules/pgadmin/main.tf
Normal file
@ -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))
|
||||||
|
)
|
||||||
|
])
|
||||||
|
}
|
||||||
76
registry/AJ0070/modules/pgadmin/run.sh
Normal file
76
registry/AJ0070/modules/pgadmin/run.sh
Normal file
@ -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
|
||||||
Loading…
x
Reference in New Issue
Block a user