[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6PBVNEKFKE6JSG2BQB5WT6R":3,"skill-same:01M6PBVNEKFKE6JSG2BQB5WT6R":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":27,"commitSha":52,"skillDirectory":53,"forksCount":13,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M6PBVNEKFKE6JSG2BQB5WT6R","postgresql-devsec",null,"Administer PostgreSQL databases. Configure replication, backups, and performance tuning. Use when managing PostgreSQL deployments.","duc-duy-1612\u002FOnline-Delivery-Systems-Web","duc-duy-1612","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F192231384?v=4","01M6NSDKQQDKVTHZ8DZMZ1VYY6","01M6NSDKW8DDVTQHBT1HBDDJPT",0,"MIT","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fpostgresql-devsec\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"postgresql devsec","postgresql","databases","relevant","replication","scripts","critical","os","platform","main","community","security","agent-skills","only","configure","access","devops-security","tuning","license","performance","2026-11-10 10:12:30",false,"---\nname: postgresql-devsec\ndescription: Administer PostgreSQL databases. Configure replication, backups, and\n  performance tuning. Use when managing PostgreSQL deployments.\ncategory: devops\nrisk: critical\nsource: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\nsource_repo: BagelHole\u002FDevOps-Security-Agent-Skills\nsource_type: community\ndate_added: '2026-09-20'\nlicense: MIT\nlicense_source: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE\ncompatibility: Requires the relevant OS\u002Fplatform tooling and privileged access where\n  noted. Docs-only; helper scripts and templates not bundled.\nmetadata:\n  author: devops-skills\n  version: '1.0'\n---\n\n# PostgreSQL\n\nAdminister, optimize, and secure PostgreSQL databases in development and production environments.\n\n## When to Use\n\n- You need a reliable, ACID-compliant relational database.\n- Your application requires advanced features such as JSONB, full-text search, or CTEs.\n- You are setting up streaming replication or point-in-time recovery.\n- You need to tune an existing PostgreSQL deployment for better throughput.\n\n## Prerequisites\n\n- Linux server (Debian\u002FUbuntu or RHEL-based) or Docker.\n- Root or sudo access for package installation.\n- Familiarity with SQL fundamentals.\n\n## Installation and Setup\n\n```bash\n# Debian \u002F Ubuntu\nsudo apt update\nsudo apt install -y postgresql postgresql-contrib\n\n# RHEL \u002F Amazon Linux\nsudo dnf install -y postgresql15-server postgresql15-contrib\nsudo postgresql-setup --initdb\nsudo systemctl enable --now postgresql\n\n# Verify\npsql --version\nsudo systemctl status postgresql\n```\n\n## Initial User and Database Setup\n\n```bash\n# Switch to the postgres system user\nsudo -u postgres psql\n```\n\n```sql\n-- Create an application user\nCREATE USER myapp WITH PASSWORD 'strong_password_here';\n\n-- Create the database owned by that user\nCREATE DATABASE mydb OWNER myapp;\n\n-- Grant connection privileges\nGRANT ALL PRIVILEGES ON DATABASE mydb TO myapp;\n\n-- Connect to the database and set default privileges\n\\c mydb\nALTER DEFAULT PRIVILEGES IN SCHEMA public\n  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO myapp;\n```\n\n## psql Commands Reference\n\n```\n\\l              -- list databases\n\\dt             -- list tables in current database\n\\d+ tablename   -- describe table with storage info\n\\du             -- list roles\n\\x              -- toggle expanded output\n\\timing on      -- show query execution time\n\\i file.sql     -- execute SQL from file\n\\copy           -- fast client-side COPY\n```\n\n## Configuration Tuning\n\nEdit `\u002Fetc\u002Fpostgresql\u002F15\u002Fmain\u002Fpostgresql.conf` (path varies by OS and version).\n\n```ini\n# Connection settings\nlisten_addresses = '*'\nmax_connections = 200\n\n# Memory — adjust to ~25% of total RAM for shared_buffers\nshared_buffers = 4GB\neffective_cache_size = 12GB\nwork_mem = 16MB\nmaintenance_work_mem = 512MB\n\n# WAL \u002F write performance\nwal_buffers = 64MB\ncheckpoint_completion_target = 0.9\nmin_wal_size = 1GB\nmax_wal_size = 4GB\n\n# Planner\nrandom_page_cost = 1.1          # lower for SSD\neffective_io_concurrency = 200  # for SSD\n\n# Logging\nlog_min_duration_statement = 250   # log queries slower than 250 ms\nlog_checkpoints = on\nlog_connections = on\nlog_disconnections = on\nlog_lock_waits = on\n```\n\n```bash\n# Reload configuration without restart\nsudo -u postgres psql -c \"SELECT pg_reload_conf();\"\n\n# Some settings (shared_buffers, max_connections) require a full restart\nsudo systemctl restart postgresql\n```\n\n## pg_hba.conf — Client Authentication\n\n```\n# \u002Fetc\u002Fpostgresql\u002F15\u002Fmain\u002Fpg_hba.conf\n# TYPE  DATABASE  USER      ADDRESS         METHOD\nlocal   all       postgres                  peer\nhost    mydb      myapp     10.0.0.0\u002F8      scram-sha-256\nhost    all       all       0.0.0.0\u002F0       reject\n```\n\n```bash\nsudo systemctl reload postgresql\n```\n\n## Backup and Restore\n\n### Logical Backups with pg_dump\n\n```bash\n# Plain SQL backup\npg_dump -U myapp -h localhost mydb > \u002Fbackups\u002Fmydb_$(date +%F).sql\n\n# Custom compressed format (recommended)\npg_dump -U myapp -h localhost -Fc mydb > \u002Fbackups\u002Fmydb_$(date +%F).dump\n\n# Backup a single table\npg_dump -U myapp -h localhost -t orders -Fc mydb > \u002Fbackups\u002Forders.dump\n\n# Restore from custom format\npg_restore -U myapp -h localhost -d mydb --clean --if-exists \u002Fbackups\u002Fmydb_2025-01-15.dump\n\n# Restore plain SQL\npsql -U myapp -h localhost -d mydb \u003C \u002Fbackups\u002Fmydb_2025-01-15.sql\n```\n\n### Physical Backups with pg_basebackup\n\n```bash\n# Full base backup (used for PITR and replica seeding)\npg_basebackup -h localhost -U replicator -D \u002Fbackups\u002Fbase_$(date +%F) \\\n  --wal-method=stream --checkpoint=fast --progress --verbose\n\n# Verify the backup\npg_verifybackup \u002Fbackups\u002Fbase_2025-01-15\n```\n\n## Streaming Replication\n\n### Primary Server\n\n```sql\n-- Create replication user\nCREATE USER replicator WITH REPLICATION LOGIN PASSWORD 'repl_secret';\n```\n\n```ini\n# postgresql.conf on primary\nwal_level = replica\nmax_wal_senders = 5\nwal_keep_size = 1GB\n```\n\n```\n# pg_hba.conf on primary\nhost replication replicator 10.0.0.0\u002F8 scram-sha-256\n```\n\n### Replica Server\n\n```bash\n# Stop PostgreSQL on the replica\nsudo systemctl stop postgresql\n\n# Remove existing data directory\nls \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain\u002F*  # verify this is the correct data dir first\nsudo find \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain -mindepth 1 -delete  # empty the data dir; snapshots must exist (see Limitations)\n\n# Base backup from primary\nsudo -u postgres pg_basebackup \\\n  -h 10.0.0.1 -U replicator \\\n  -D \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain \\\n  --wal-method=stream --checkpoint=fast --progress\n\n# Create standby signal file\nsudo -u postgres touch \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain\u002Fstandby.signal\n```\n\n```ini\n# postgresql.conf on replica\nprimary_conninfo = 'host=10.0.0.1 port=5432 user=replicator password=repl_secret'\nhot_standby = on\n```\n\n```bash\nsudo systemctl start postgresql\n```\n\n### Verify Replication\n\n```sql\n-- On primary\nSELECT client_addr, state, sent_lsn, replay_lsn\nFROM pg_stat_replication;\n\n-- On replica\nSELECT pg_is_in_recovery();           -- should return true\nSELECT pg_last_wal_receive_lsn();\nSELECT pg_last_wal_replay_lsn();\n```\n\n## Monitoring Queries\n\n```sql\n-- Active connections by state\nSELECT state, COUNT(*)\nFROM pg_stat_activity\nGROUP BY state;\n\n-- Long-running queries (> 30 seconds)\nSELECT pid, now() - query_start AS duration, query\nFROM pg_stat_activity\nWHERE state = 'active'\n  AND now() - query_start > interval '30 seconds'\nORDER BY duration DESC;\n\n-- Table bloat and dead tuples\nSELECT relname,\n       n_live_tup,\n       n_dead_tup,\n       ROUND(n_dead_tup::numeric \u002F GREATEST(n_live_tup, 1) * 100, 2) AS dead_pct\nFROM pg_stat_user_tables\nORDER BY n_dead_tup DESC\nLIMIT 10;\n\n-- Index usage statistics\nSELECT relname, indexrelname, idx_scan, idx_tup_read, idx_tup_fetch\nFROM pg_stat_user_indexes\nORDER BY idx_scan ASC\nLIMIT 10;\n\n-- Cache hit ratio (should be > 99%)\nSELECT ROUND(\n  100.0 * sum(blks_hit) \u002F NULLIF(sum(blks_hit) + sum(blks_read), 0), 2\n) AS cache_hit_pct\nFROM pg_stat_database;\n\n-- Database size\nSELECT pg_database.datname,\n       pg_size_pretty(pg_database_size(pg_database.datname)) AS size\nFROM pg_database\nORDER BY pg_database_size(pg_database.datname) DESC;\n```\n\n## Docker Compose Setup\n\n```yaml\n# docker-compose.yml\nversion: \"3.9\"\n\nservices:\n  postgres:\n    image: postgres:16-alpine\n    restart: unless-stopped\n    ports:\n      - \"5432:5432\"\n    environment:\n      POSTGRES_USER: myapp\n      POSTGRES_PASSWORD: secret\n      POSTGRES_DB: mydb\n    volumes:\n      - pg_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n      - .\u002Finit.sql:\u002Fdocker-entrypoint-initdb.d\u002Finit.sql\n    command: >\n      postgres\n        -c shared_buffers=256MB\n        -c work_mem=8MB\n        -c maintenance_work_mem=128MB\n        -c effective_cache_size=768MB\n        -c log_min_duration_statement=250\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U myapp -d mydb\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\n  pgbouncer:\n    image: edoburu\u002Fpgbouncer:latest\n    restart: unless-stopped\n    ports:\n      - \"6432:6432\"\n    environment:\n      DATABASE_URL: postgres:\u002F\u002Fmyapp:secret@postgres:5432\u002Fmydb\n      POOL_MODE: transaction\n      MAX_CLIENT_CONN: 500\n      DEFAULT_POOL_SIZE: 40\n    depends_on:\n      postgres:\n        condition: service_healthy\n\nvolumes:\n  pg_data:\n```\n\n```bash\ndocker compose up -d\npsql -h 127.0.0.1 -p 6432 -U myapp mydb\n```\n\n## Maintenance Tasks\n\n```bash\n# Manual VACUUM and ANALYZE\nsudo -u postgres psql -d mydb -c \"VACUUM ANALYZE;\"\n\n# Reindex a bloated index\nsudo -u postgres psql -d mydb -c \"REINDEX INDEX CONCURRENTLY idx_orders_user_id;\"\n\n# Check for unused indexes\nsudo -u postgres psql -d mydb -c \"\n  SELECT indexrelname, idx_scan\n  FROM pg_stat_user_indexes\n  WHERE idx_scan = 0\n  ORDER BY pg_relation_size(indexrelid) DESC;\"\n```\n\n## Troubleshooting\n\n| Symptom | Likely Cause | Fix |\n|---|---|---|\n| `FATAL: too many connections` | Connection limit reached | Increase `max_connections` or add PgBouncer |\n| Slow SELECT on large table | Missing index or stale statistics | Run `EXPLAIN ANALYZE`; add index; run `ANALYZE` |\n| High CPU from autovacuum | Large number of dead tuples | Tune `autovacuum_vacuum_cost_delay`; run manual `VACUUM` |\n| Replication lag increasing | Replica under-provisioned or network bottleneck | Check `pg_stat_replication`; increase `wal_keep_size` |\n| `could not access file \"base\u002F...\"` | Disk full or corrupt data directory | Free disk space; restore from `pg_basebackup` |\n| `FATAL: password authentication failed` | Wrong credentials or pg_hba.conf mismatch | Verify pg_hba.conf entries and reload |\n\n## Related Skills\n\n- mysql (`mysql`) - Alternative relational database\n- database-backups (`database-backups`) - Automated backup strategies\n- redis (`redis`) - Caching layer to reduce database load\n- planetscale (`planetscale`) - Managed MySQL-compatible alternative\n\n## Limitations\n\n- Infrastructure commands can disrupt services: confirm target host\u002Fscope and have backups\u002Fsnapshots before mutating state.\n- Docs-only import: upstream scripts and templates not bundled.\n\n","# PostgreSQL\n\nAdminister, optimize, and secure PostgreSQL databases in development and production environments.\n\n## When to Use\n\n- You need a reliable, ACID-compliant relational database.\n- Your application requires advanced features such as JSONB, full-text search, or CTEs.\n- You are setting up streaming replication or point-in-time recovery.\n- You need to tune an existing PostgreSQL deployment for better throughput.\n\n## Prerequisites\n\n- Linux server (Debian\u002FUbuntu or RHEL-based) or Docker.\n- Root or sudo access for package installation.\n- Familiarity with SQL fundamentals.\n\n## Installation and Setup\n\n```bash\n# Debian \u002F Ubuntu\nsudo apt update\nsudo apt install -y postgresql postgresql-contrib\n\n# RHEL \u002F Amazon Linux\nsudo dnf install -y postgresql15-server postgresql15-contrib\nsudo postgresql-setup --initdb\nsudo systemctl enable --now postgresql\n\n# Verify\npsql --version\nsudo systemctl status postgresql\n```\n\n## Initial User and Database Setup\n\n```bash\n# Switch to the postgres system user\nsudo -u postgres psql\n```\n\n```sql\n-- Create an application user\nCREATE USER myapp WITH PASSWORD 'strong_password_here';\n\n-- Create the database owned by that user\nCREATE DATABASE mydb OWNER myapp;\n\n-- Grant connection privileges\nGRANT ALL PRIVILEGES ON DATABASE mydb TO myapp;\n\n-- Connect to the database and set default privileges\n\\c mydb\nALTER DEFAULT PRIVILEGES IN SCHEMA public\n  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO myapp;\n```\n\n## psql Commands Reference\n\n```\n\\l              -- list databases\n\\dt             -- list tables in current database\n\\d+ tablename   -- describe table with storage info\n\\du             -- list roles\n\\x              -- toggle expanded output\n\\timing on      -- show query execution time\n\\i file.sql     -- execute SQL from file\n\\copy           -- fast client-side COPY\n```\n\n## Configuration Tuning\n\nEdit `\u002Fetc\u002Fpostgresql\u002F15\u002Fmain\u002Fpostgresql.conf` (path varies by OS and version).\n\n```ini\n# Connection settings\nlisten_addresses = '*'\nmax_connections = 200\n\n# Memory — adjust to ~25% of total RAM for shared_buffers\nshared_buffers = 4GB\neffective_cache_size = 12GB\nwork_mem = 16MB\nmaintenance_work_mem = 512MB\n\n# WAL \u002F write performance\nwal_buffers = 64MB\ncheckpoint_completion_target = 0.9\nmin_wal_size = 1GB\nmax_wal_size = 4GB\n\n# Planner\nrandom_page_cost = 1.1          # lower for SSD\neffective_io_concurrency = 200  # for SSD\n\n# Logging\nlog_min_duration_statement = 250   # log queries slower than 250 ms\nlog_checkpoints = on\nlog_connections = on\nlog_disconnections = on\nlog_lock_waits = on\n```\n\n```bash\n# Reload configuration without restart\nsudo -u postgres psql -c \"SELECT pg_reload_conf();\"\n\n# Some settings (shared_buffers, max_connections) require a full restart\nsudo systemctl restart postgresql\n```\n\n## pg_hba.conf — Client Authentication\n\n```\n# \u002Fetc\u002Fpostgresql\u002F15\u002Fmain\u002Fpg_hba.conf\n# TYPE  DATABASE  USER      ADDRESS         METHOD\nlocal   all       postgres                  peer\nhost    mydb      myapp     10.0.0.0\u002F8      scram-sha-256\nhost    all       all       0.0.0.0\u002F0       reject\n```\n\n```bash\nsudo systemctl reload postgresql\n```\n\n## Backup and Restore\n\n### Logical Backups with pg_dump\n\n```bash\n# Plain SQL backup\npg_dump -U myapp -h localhost mydb > \u002Fbackups\u002Fmydb_$(date +%F).sql\n\n# Custom compressed format (recommended)\npg_dump -U myapp -h localhost -Fc mydb > \u002Fbackups\u002Fmydb_$(date +%F).dump\n\n# Backup a single table\npg_dump -U myapp -h localhost -t orders -Fc mydb > \u002Fbackups\u002Forders.dump\n\n# Restore from custom format\npg_restore -U myapp -h localhost -d mydb --clean --if-exists \u002Fbackups\u002Fmydb_2025-01-15.dump\n\n# Restore plain SQL\npsql -U myapp -h localhost -d mydb \u003C \u002Fbackups\u002Fmydb_2025-01-15.sql\n```\n\n### Physical Backups with pg_basebackup\n\n```bash\n# Full base backup (used for PITR and replica seeding)\npg_basebackup -h localhost -U replicator -D \u002Fbackups\u002Fbase_$(date +%F) \\\n  --wal-method=stream --checkpoint=fast --progress --verbose\n\n# Verify the backup\npg_verifybackup \u002Fbackups\u002Fbase_2025-01-15\n```\n\n## Streaming Replication\n\n### Primary Server\n\n```sql\n-- Create replication user\nCREATE USER replicator WITH REPLICATION LOGIN PASSWORD 'repl_secret';\n```\n\n```ini\n# postgresql.conf on primary\nwal_level = replica\nmax_wal_senders = 5\nwal_keep_size = 1GB\n```\n\n```\n# pg_hba.conf on primary\nhost replication replicator 10.0.0.0\u002F8 scram-sha-256\n```\n\n### Replica Server\n\n```bash\n# Stop PostgreSQL on the replica\nsudo systemctl stop postgresql\n\n# Remove existing data directory\nls \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain\u002F*  # verify this is the correct data dir first\nsudo find \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain -mindepth 1 -delete  # empty the data dir; snapshots must exist (see Limitations)\n\n# Base backup from primary\nsudo -u postgres pg_basebackup \\\n  -h 10.0.0.1 -U replicator \\\n  -D \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain \\\n  --wal-method=stream --checkpoint=fast --progress\n\n# Create standby signal file\nsudo -u postgres touch \u002Fvar\u002Flib\u002Fpostgresql\u002F15\u002Fmain\u002Fstandby.signal\n```\n\n```ini\n# postgresql.conf on replica\nprimary_conninfo = 'host=10.0.0.1 port=5432 user=replicator password=repl_secret'\nhot_standby = on\n```\n\n```bash\nsudo systemctl start postgresql\n```\n\n### Verify Replication\n\n```sql\n-- On primary\nSELECT client_addr, state, sent_lsn, replay_lsn\nFROM pg_stat_replication;\n\n-- On replica\nSELECT pg_is_in_recovery();           -- should return true\nSELECT pg_last_wal_receive_lsn();\nSELECT pg_last_wal_replay_lsn();\n```\n\n## Monitoring Queries\n\n```sql\n-- Active connections by state\nSELECT state, COUNT(*)\nFROM pg_stat_activity\nGROUP BY state;\n\n-- Long-running queries (> 30 seconds)\nSELECT pid, now() - query_start AS duration, query\nFROM pg_stat_activity\nWHERE state = 'active'\n  AND now() - query_start > interval '30 seconds'\nORDER BY duration DESC;\n\n-- Table bloat and dead tuples\nSELECT relname,\n       n_live_tup,\n       n_dead_tup,\n       ROUND(n_dead_tup::numeric \u002F GREATEST(n_live_tup, 1) * 100, 2) AS dead_pct\nFROM pg_stat_user_tables\nORDER BY n_dead_tup DESC\nLIMIT 10;\n\n-- Index usage statistics\nSELECT relname, indexrelname, idx_scan, idx_tup_read, idx_tup_fetch\nFROM pg_stat_user_indexes\nORDER BY idx_scan ASC\nLIMIT 10;\n\n-- Cache hit ratio (should be > 99%)\nSELECT ROUND(\n  100.0 * sum(blks_hit) \u002F NULLIF(sum(blks_hit) + sum(blks_read), 0), 2\n) AS cache_hit_pct\nFROM pg_stat_database;\n\n-- Database size\nSELECT pg_database.datname,\n       pg_size_pretty(pg_database_size(pg_database.datname)) AS size\nFROM pg_database\nORDER BY pg_database_size(pg_database.datname) DESC;\n```\n\n## Docker Compose Setup\n\n```yaml\n# docker-compose.yml\nversion: \"3.9\"\n\nservices:\n  postgres:\n    image: postgres:16-alpine\n    restart: unless-stopped\n    ports:\n      - \"5432:5432\"\n    environment:\n      POSTGRES_USER: myapp\n      POSTGRES_PASSWORD: secret\n      POSTGRES_DB: mydb\n    volumes:\n      - pg_data:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n      - .\u002Finit.sql:\u002Fdocker-entrypoint-initdb.d\u002Finit.sql\n    command: >\n      postgres\n        -c shared_buffers=256MB\n        -c work_mem=8MB\n        -c maintenance_work_mem=128MB\n        -c effective_cache_size=768MB\n        -c log_min_duration_statement=250\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U myapp -d mydb\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\n  pgbouncer:\n    image: edoburu\u002Fpgbouncer:latest\n    restart: unless-stopped\n    ports:\n      - \"6432:6432\"\n    environment:\n      DATABASE_URL: postgres:\u002F\u002Fmyapp:secret@postgres:5432\u002Fmydb\n      POOL_MODE: transaction\n      MAX_CLIENT_CONN: 500\n      DEFAULT_POOL_SIZE: 40\n    depends_on:\n      postgres:\n        condition: service_healthy\n\nvolumes:\n  pg_data:\n```\n\n```bash\ndocker compose up -d\npsql -h 127.0.0.1 -p 6432 -U myapp mydb\n```\n\n## Maintenance Tasks\n\n```bash\n# Manual VACUUM and ANALYZE\nsudo -u postgres psql -d mydb -c \"VACUUM ANALYZE;\"\n\n# Reindex a bloated index\nsudo -u postgres psql -d mydb -c \"REINDEX INDEX CONCURRENTLY idx_orders_user_id;\"\n\n# Check for unused indexes\nsudo -u postgres psql -d mydb -c \"\n  SELECT indexrelname, idx_scan\n  FROM pg_stat_user_indexes\n  WHERE idx_scan = 0\n  ORDER BY pg_relation_size(indexrelid) DESC;\"\n```\n\n## Troubleshooting\n\n| Symptom | Likely Cause | Fix |\n|---|---|---|\n| `FATAL: too many connections` | Connection limit reached | Increase `max_connections` or add PgBouncer |\n| Slow SELECT on large table | Missing index or stale statistics | Run `EXPLAIN ANALYZE`; add index; run `ANALYZE` |\n| High CPU from autovacuum | Large number of dead tuples | Tune `autovacuum_vacuum_cost_delay`; run manual `VACUUM` |\n| Replication lag increasing | Replica under-provisioned or network bottleneck | Check `pg_stat_replication`; increase `wal_keep_size` |\n| `could not access file \"base\u002F...\"` | Disk full or corrupt data directory | Free disk space; restore from `pg_basebackup` |\n| `FATAL: password authentication failed` | Wrong credentials or pg_hba.conf mismatch | Verify pg_hba.conf entries and reload |\n\n## Related Skills\n\n- mysql (`mysql`) - Alternative relational database\n- database-backups (`database-backups`) - Automated backup strategies\n- redis (`redis`) - Caching layer to reduce database load\n- planetscale (`planetscale`) - Managed MySQL-compatible alternative\n\n## Limitations\n\n- Infrastructure commands can disrupt services: confirm target host\u002Fscope and have backups\u002Fsnapshots before mutating state.\n- Docs-only import: upstream scripts and templates not bundled.\n\n",{"name":5,"risk":24,"source":43,"license":14,"category":44,"metadata":45,"date_added":48,"description":7,"source_repo":49,"source_type":28,"compatibility":50,"license_source":51},"https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills","devops",{"author":46,"version":47},"devops-skills","1.0","2026-09-20","BagelHole\u002FDevOps-Security-Agent-Skills","Requires the relevant OS\u002Fplatform tooling and privileged access where noted. Docs-only; helper scripts and templates not bundled.","https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE","f3312ba749561b6159f477dbfc9313c875d40a56",".agents\u002Fskills_archive\u002Fpostgresql-devsec","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612","2026-10-25 23:50:58",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill postgresql-devsec",{"tool":63,"command":64},"bunx","bunx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill postgresql-devsec",{"tool":66,"command":67},"pnpm","pnpm dlx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill postgresql-devsec","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fpostgresql-devsec\u002FSKILL.md",true,[],[72,94,118,142,170,194],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":83,"publishedAt":38},"01M6Q0FA5FZ410Z33Z3TFQ4DBA","zero-trust","Implement zero-trust network architecture. Configure identity-based access, micro-segmentation, and continuous verification. Use when implementing modern security architectures.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzero-trust\u002FSKILL.md",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[84,85,86,87,88,89,74,90,34,33,32,31,28,27,91,24,92,23,21,93],"ZeRO","trust","zero trust","architecture","assessment","verification","segmentation","active","scope","implementing",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":38},"01M6Q0F1YZJW3KX5FBKEVZ8CV4","zcode-delegate","Delegate coding tasks to the Z.AI ZCode CLI only when the user explicitly requests it, while the orchestrator retains review and landing responsibility.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzcode-delegate\u002FSKILL.md",[],[101,102,103,104,105,106,107,108,109,110,111,112,113,31,114,28,115,116,24,117],"delegate","zcode","zcode delegate","review","cli","orchestration","tasks","run","Bash","model","node","read","orchestrator","files","desktop app","app","agent-orchestration",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":38},"01M6Q0ETK41VGNMYEXW0T00AJN","youtube-transcript","Fetch YouTube transcripts through DeepAPI or local fallback tooling and save clean text output.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript\u002FSKILL.md",[],[125,126,127,128,129,130,131,36,132,133,134,135,136,28,27,137,138,139,140,141],"transcript","youtube transcript","youtube","safe","github","codex","research","https","text","fetch","tooling","clean","local","output","deepapi","youtube transcripts","blob",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":159,"publishedAt":38},"01M6Q0EPPH2PVMDW40017F8WX0","youtube-transcript-skills","Fetch YouTube video transcripts, search videos\u002Fchannels, browse channels, and extract playlists via the getyoutubetranscript.com API - free tier, no card required.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript-skills\u002FSKILL.md",[148,151,154],{"categoryNo":149,"categoryName":150,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":152,"categoryName":153,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":155,"categoryName":156,"taxonomyType":157,"taxonomyTypeDesc":158},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[125,126,127,160,128,161,129,130,36,162,163,164,165,134,166,28,27,167,168,169],"youtube transcript skills","gemini","search","api","Video","browse","api-integration","free","card","channels",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":180,"publishedAt":38},"01M6Q0EAB96PX83W5PTE8A0R8D","youtube-notetaker","Turn YouTube talks into local study notes with slides, transcripts, editable annotations, and a markdown-backed viewer.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-notetaker\u002FSKILL.md",[176,179],{"categoryNo":177,"categoryName":178,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":152,"categoryName":153,"taxonomyType":81,"taxonomyTypeDesc":82},[127,181,182,105,128,183,184,185,186,36,164,187,188,189,190,27,191,137,192,193],"youtube notetaker","notetaker","workflow","official","notes","code","markdown","slides","annotations","README","study","dair-academy","viewer",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":38},"01M6Q0E55F0GW5MX48V8HXS8B5","youtube-full","Fetch YouTube transcripts, search videos, browse channels, and extract playlists via TranscriptAPI — no yt-dlp, no Google API key, works from any cloud server.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-full\u002FSKILL.md",[200],{"categoryNo":149,"categoryName":150,"taxonomyType":81,"taxonomyTypeDesc":82},[202,127,203,204,128,161,162,205,206,163,164,165,134,207,166,28,27,167,208,140],"youtube full","full","google","server","dlp","credits","automatic"]