[{"data":1,"prerenderedAt":1314},["ShallowReactive",2],{"navigation_docs":3,"-engineering-deployment-capability-exchange":348,"-engineering-deployment-capability-exchange-surround":1309},[4,8,68,98,216,245,259,280,344],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"icon":10,"path":11,"stem":12,"children":13,"page":63},"Company","i-lucide-building-2","\u002Fcompany","1.company",[14,18,22,26,30,34,38,42,46,50,64],{"title":15,"path":16,"stem":17},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":19,"path":20,"stem":21},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":23,"path":24,"stem":25},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":27,"path":28,"stem":29},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":31,"path":32,"stem":33},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":35,"path":36,"stem":37},"Manchester Office","\u002Fcompany\u002Foffice","1.company\u002Foffice",{"title":39,"path":40,"stem":41},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":43,"path":44,"stem":45},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":47,"path":48,"stem":49},"Product Strategy","\u002Fcompany\u002Fproduct-strategy","1.company\u002Fproduct-strategy",{"title":51,"path":52,"stem":53,"children":54,"page":63},"Products","\u002Fcompany\u002Fproducts","1.company\u002Fproducts",[55,59],{"title":56,"path":57,"stem":58},"Capability Exchange","\u002Fcompany\u002Fproducts\u002Fcapability-exchange","1.company\u002Fproducts\u002Fcapability-exchange",{"title":60,"path":61,"stem":62},"ESProfiler Platform","\u002Fcompany\u002Fproducts\u002Fesprofiler","1.company\u002Fproducts\u002Fesprofiler",false,{"title":65,"path":66,"stem":67},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",{"title":69,"icon":70,"path":71,"stem":72,"children":73,"page":63},"People Ops","i-lucide-users","\u002Fpeople-ops","2.people-ops",[74,78,82,86,90,94],{"title":75,"path":76,"stem":77},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":79,"path":80,"stem":81},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":83,"path":84,"stem":85},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":87,"path":88,"stem":89},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":91,"path":92,"stem":93},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":95,"path":96,"stem":97},"Recruitment","\u002Fpeople-ops\u002Frecruitment","2.people-ops\u002Frecruitment",{"title":99,"icon":100,"path":101,"stem":102,"children":103,"page":63},"Engineering","i-lucide-rocket","\u002Fengineering","3.engineering",[104,147,151,171,192,196,204,208,212],{"title":105,"path":106,"stem":107,"children":108,"page":63},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",[109,113,117,121,125,138],{"title":110,"path":111,"stem":112},"Development Setup","\u002Fengineering\u002Fcontributing\u002Fdevelopment-setup","3.engineering\u002Fcontributing\u002F1.development-setup",{"title":114,"path":115,"stem":116},"Engineering Operations","\u002Fengineering\u002Fcontributing\u002Fengineering-operations","3.engineering\u002Fcontributing\u002F2.engineering-operations",{"title":118,"path":119,"stem":120},"Documentation","\u002Fengineering\u002Fcontributing\u002Fdocumentation","3.engineering\u002Fcontributing\u002F3.documentation",{"title":122,"path":123,"stem":124},"Agentic Coding","\u002Fengineering\u002Fcontributing\u002Fagentic-coding","3.engineering\u002Fcontributing\u002Fagentic-coding",{"title":126,"path":127,"stem":128,"children":129,"page":63},"Back End","\u002Fengineering\u002Fcontributing\u002Fback-end","3.engineering\u002Fcontributing\u002Fback-end",[130,134],{"title":131,"path":132,"stem":133},"API Guidelines","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines","3.engineering\u002Fcontributing\u002Fback-end\u002Fapi-guidelines",{"title":135,"path":136,"stem":137},"LLM Prompts & Langfuse Integration","\u002Fengineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts","3.engineering\u002Fcontributing\u002Fback-end\u002Fllm-prompts",{"title":139,"path":140,"stem":141,"children":142,"page":63},"Front End","\u002Fengineering\u002Fcontributing\u002Ffront-end","3.engineering\u002Fcontributing\u002Ffront-end",[143],{"title":144,"path":145,"stem":146},"Testing","\u002Fengineering\u002Fcontributing\u002Ffront-end\u002Ftesting","3.engineering\u002Fcontributing\u002Ffront-end\u002Ftesting",{"title":148,"path":149,"stem":150},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":152,"path":153,"stem":154,"children":155},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",[156,159,163,167],{"title":56,"path":157,"stem":158},"\u002Fengineering\u002Fdeployment\u002Fcapability-exchange","3.engineering\u002Fdeployment\u002Fcapability-exchange",{"title":160,"path":161,"stem":162},"Langfuse Deployment","\u002Fengineering\u002Fdeployment\u002Fecs-langfuse-deployment","3.engineering\u002Fdeployment\u002Fecs-langfuse-deployment",{"title":164,"path":165,"stem":166},"ESP Platform Configuration","\u002Fengineering\u002Fdeployment\u002Fesp-platform-configuration","3.engineering\u002Fdeployment\u002Fesp-platform-configuration",{"title":168,"path":169,"stem":170},"Platform","\u002Fengineering\u002Fdeployment\u002Fplatform","3.engineering\u002Fdeployment\u002Fplatform",{"title":172,"path":173,"stem":174,"children":175,"page":63},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[176,180,184,188],{"title":177,"path":178,"stem":179},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":181,"path":182,"stem":183},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":185,"path":186,"stem":187},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":189,"path":190,"stem":191},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":193,"path":194,"stem":195},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":168,"path":197,"stem":198,"children":199,"page":63},"\u002Fengineering\u002Fplatform","3.engineering\u002Fplatform",[200],{"title":201,"path":202,"stem":203},"useAPI","\u002Fengineering\u002Fplatform\u002Fuse-api","3.engineering\u002Fplatform\u002Fuse-api",{"title":205,"path":206,"stem":207},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":209,"path":210,"stem":211},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":213,"path":214,"stem":215},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":217,"icon":218,"path":219,"stem":220,"children":221,"page":63},"Design","i-lucide-palette","\u002Fdesign","4.design",[222,226,230,234,238,241],{"title":223,"path":224,"stem":225},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002F1.design-thinking",{"title":227,"path":228,"stem":229},"Figma","\u002Fdesign\u002Ffigma-structure","4.design\u002F2.figma-structure",{"title":231,"path":232,"stem":233},"Design & Development","\u002Fdesign\u002Fdesign-and-development","4.design\u002F3.design-and-development",{"title":235,"path":236,"stem":237},"Branding","\u002Fdesign\u002Fbranding","4.design\u002F4.branding",{"title":213,"path":239,"stem":240},"\u002Fdesign\u002Ftools","4.design\u002F5.tools",{"title":242,"path":243,"stem":244},"Customer Success","\u002Fdesign\u002Fworking-with-customers","4.design\u002F6.working-with-customers",{"title":246,"icon":247,"path":248,"stem":249,"children":250,"page":63},"Sales","i-lucide-dollar-sign","\u002Fsales","4.sales",[251,255],{"title":252,"path":253,"stem":254},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":256,"path":257,"stem":258},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":63},"Marketing","i-lucide-book-image","\u002Fmarketing","5.marketing",[265,269,273,276],{"title":266,"path":267,"stem":268},"Content","\u002Fmarketing\u002Fcontent","5.marketing\u002Fcontent",{"title":270,"path":271,"stem":272},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":213,"path":274,"stem":275},"\u002Fmarketing\u002Ftools","5.marketing\u002Ftools",{"title":277,"path":278,"stem":279},"Website","\u002Fmarketing\u002Fwebsite","5.marketing\u002Fwebsite",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":63},"AI & Data Ops","i-lucide-database","\u002Fdata-ops","6.data-ops",[286,294,298,323,340],{"title":56,"path":287,"stem":288,"children":289,"page":63},"\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[290],{"title":291,"path":292,"stem":293},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":295,"path":296,"stem":297},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":299,"path":300,"stem":301,"children":302,"page":63},"Data Management","\u002Fdata-ops\u002Fdata-management","6.data-ops\u002Fdata-management",[303,307,311,315,319],{"title":304,"path":305,"stem":306},"Adding Products","\u002Fdata-ops\u002Fdata-management\u002Fadding-products","6.data-ops\u002Fdata-management\u002Fadding-products",{"title":308,"path":309,"stem":310},"Adding Vendors","\u002Fdata-ops\u002Fdata-management\u002Fadding-vendors","6.data-ops\u002Fdata-management\u002Fadding-vendors",{"title":312,"path":313,"stem":314},"Framework Mapping","\u002Fdata-ops\u002Fdata-management\u002Fframework-mapping","6.data-ops\u002Fdata-management\u002Fframework-mapping",{"title":316,"path":317,"stem":318},"Refreshing Vendors","\u002Fdata-ops\u002Fdata-management\u002Frefreshing-vendors","6.data-ops\u002Fdata-management\u002Frefreshing-vendors",{"title":320,"path":321,"stem":322},"Reviewing Draft Vendors","\u002Fdata-ops\u002Fdata-management\u002Freviewing-draft-vendors","6.data-ops\u002Fdata-management\u002Freviewing-draft-vendors",{"title":324,"path":325,"stem":326,"children":327,"page":63},"LLM Ops","\u002Fdata-ops\u002Fllm-ops","6.data-ops\u002Fllm-ops",[328,332,336],{"title":329,"path":330,"stem":331},"Agents","\u002Fdata-ops\u002Fllm-ops\u002Fagents","6.data-ops\u002Fllm-ops\u002F1.agents",{"title":333,"path":334,"stem":335},"ESPi Architecture & Query Flow","\u002Fdata-ops\u002Fllm-ops\u002Fespi-architecture","6.data-ops\u002Fllm-ops\u002F2.espi-architecture",{"title":337,"path":338,"stem":339},"Evaluating Agents","\u002Fdata-ops\u002Fllm-ops\u002Fevaluations","6.data-ops\u002Fllm-ops\u002F3.evaluations",{"title":341,"path":342,"stem":343},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":345,"path":346,"stem":347},"Glossary","\u002Fglossary","glossary",{"id":349,"title":56,"body":350,"description":1302,"extension":1303,"links":1304,"meta":1305,"navigation":1306,"path":157,"seo":1307,"stem":158,"__hash__":1308},"docs\u002F3.engineering\u002Fdeployment\u002Fcapability-exchange.md",{"type":351,"value":352,"toc":1285},"minimark",[353,357,373,378,400,404,441,445,477,481,487,492,506,524,528,790,794,797,847,851,931,935,997,1000,1003,1006,1110,1114,1124,1142,1281],[354,355,356],"p",{},"This guide walks you through deploying an updated version of the Capability Exchange (PCX) service in production using the AWS Console. No technical background required — just follow each step in order.",[358,359,361,362,367,368,372],"callout",{"icon":360},"i-lucide-info","If your release includes database schema changes, complete the ",[363,364,366],"a",{"href":365},"#database-migrations-if-required","database migrations"," ",[369,370,371],"strong",{},"before"," updating the ECS service.",[374,375,377],"h2",{"id":376},"prerequisites","Prerequisites",[379,380,381,389],"ul",{},[382,383,384,385,388],"li",{},"You have access to the ",[369,386,387],{},"AWS Console"," (via the ESProfiler Secured Workspace or direct login)",[382,390,391,392,395,396,399],{},"You are logged in as ",[369,393,394],{},"ESPROFILER"," in the ",[369,397,398],{},"Europe (London)"," region",[374,401,403],{"id":402},"part-1-navigate-to-ecs","Part 1: Navigate to ECS",[405,406,407,413,427,433],"ol",{},[382,408,409,410,412],{},"Open the ",[369,411,387],{},".",[382,414,415,416,422,423,426],{},"In the search bar at the top, type ",[369,417,418],{},[419,420,421],"code",{},"ECS"," and select ",[369,424,425],{},"Elastic Container Service"," from the results.",[382,428,429,430,412],{},"In the left-hand menu, click ",[369,431,432],{},"Clusters",[382,434,435,436,412],{},"You will see a list of clusters. Click on ",[369,437,438],{},[419,439,440],{},"esp-infrastructure",[374,442,444],{"id":443},"part-2-find-the-pcx-service","Part 2: Find the PCX Service",[405,446,448,458,467],{"start":447},5,[382,449,450,451,453,454,457],{},"Inside the ",[419,452,440],{}," cluster, click on the ",[369,455,456],{},"Services"," tab.",[382,459,460,461,466],{},"Find and click on the service named ",[369,462,463],{},[419,464,465],{},"esp-pcx-service-2bjz1boz"," (or the current PCX service listed).",[382,468,469,470,473,474,412],{},"You are now on the service's ",[369,471,472],{},"Health and metrics"," page. Confirm the status shows ",[369,475,476],{},"Active",[374,478,480],{"id":479},"part-3-database-migrations-if-required","Part 3: Database Migrations (if required)",[354,482,483,484,486],{},"If the release includes Prisma schema changes, run migrations against the production PCX database ",[369,485,371],{}," deploying the new service revision. The new container image will expect the updated schema to already be in place.",[488,489,491],"h3",{"id":490},"where-migrations-run-from","Where migrations run from",[354,493,494,495,498,499,502,503,412],{},"Production RDS lives in a ",[369,496,497],{},"private AWS network"," and is not reachable directly from your laptop. You need ",[369,500,501],{},"PuTTY"," (or an equivalent SSH client) to open a tunnel through the AWS jump box before you can connect. Full setup is documented in ",[363,504,148],{"href":505},"\u002F3.engineering\u002Fdatabase-connection",[354,507,508,509,512,513,515,516,519,520,523],{},"Migrations are ",[369,510,511],{},"not"," applied by deploying a new ECS task. The live container does ",[369,514,511],{}," run migrations on startup. The migration is triggered by running a command on ",[369,517,518],{},"your machine",", using the migration files in your ",[369,521,522],{},"local PCX checkout"," of the release branch. The new container image does not need to be live in AWS first — you are pushing schema changes to the database ahead of the code deployment.",[488,525,527],{"id":526},"migration-workflow","Migration workflow",[405,529,530,540,561,575,702,728,752,779],{},[382,531,532,535,536,539],{},[369,533,534],{},"Check out the release"," — ensure your local PCX repo includes the migration files for this release. This should be the ",[419,537,538],{},"main"," branch.",[382,541,542,545,546,549,550,553,554,556,557],{},[369,543,544],{},"Open an SSH tunnel in PuTTY"," — forward local port ",[419,547,548],{},"15432"," to the PCX RDS endpoint on port ",[419,551,552],{},"5432"," (see ",[363,555,148],{"href":505}," if you have not done this before), then keep the session open.",[358,558,560],{"icon":559},"i-lucide-triangle-alert","Keep the PuTTY session open for the entire migration. The tunnel only works while the connection is active.",[382,562,563,566,567,570,571,574],{},[369,564,565],{},"Retrieve credentials"," — in AWS RDS (",[419,568,569],{},"eu-west-2","), open the PCX PostgreSQL instance, follow the linked secret in ",[369,572,573],{},"Configuration",", and copy the username and password from Secrets Manager. Do not store these permanently — they rotate regularly.",[382,576,577,580,581,584,585,588,589,592,593,596,597,607,609,610,628,630,631,634,635,634,638,641,642,655,657,658,660,661],{},[369,578,579],{},"Point your local environment at production"," — PCX uses Prisma, which reads the database connection from a ",[419,582,583],{},"DATABASE_URL"," environment variable. With the SSH tunnel from step 2 running, use ",[419,586,587],{},"127.0.0.1:15432"," as the host.",[590,591],"br",{},"In the PCX repository, open (or create) a ",[419,594,595],{},".env"," file in the project root and set:",[598,599,605],"pre",{"className":600,"code":602,"language":603,"meta":604},[601],"language-text","DATABASE_URL=\"postgresql:\u002F\u002F\u003Cusername>:\u003Cpassword>@127.0.0.1:15432\u002F\u003Cdatabase_name>\"\n","text","",[419,606,602],{"__ignoreMap":604},[590,608],{},"Replace:",[379,611,612,622],{},[382,613,614,617,618,621],{},[419,615,616],{},"\u003Cusername>"," and ",[419,619,620],{},"\u003Cpassword>"," — from Secrets Manager (step 3)",[382,623,624,627],{},[419,625,626],{},"\u003Cdatabase_name>"," — the database name shown in the RDS instance or secret (often the same as the instance identifier)",[590,629],{},"If the password contains special characters (e.g. ",[419,632,633],{},"@",", ",[419,636,637],{},"#",[419,639,640],{},"\u002F","), URL-encode them in the connection string.",[358,643,644,645,648,649,651,652,654],{"icon":559},"This points your local tooling at ",[369,646,647],{},"production",". Do not commit ",[419,650,595],{}," with production credentials, and revert or remove the production ",[419,653,583],{}," once migrations are complete.",[590,656],{},"To avoid editing ",[419,659,595],{}," permanently, you can set the variable for a single command instead:",[598,662,666],{"className":663,"code":664,"language":665,"meta":604,"style":604},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","DATABASE_URL=\"postgresql:\u002F\u002F\u003Cusername>:\u003Cpassword>@127.0.0.1:15432\u002F\u003Cdatabase_name>\" npx prisma migrate deploy\n","bash",[419,667,668],{"__ignoreMap":604},[669,670,673,676,680,683,687,689,693,696,699],"span",{"class":671,"line":672},"line",1,[669,674,583],{"class":675},"sTEyZ",[669,677,679],{"class":678},"sMK4o","=",[669,681,682],{"class":678},"\"",[669,684,686],{"class":685},"sfazB","postgresql:\u002F\u002F\u003Cusername>:\u003Cpassword>@127.0.0.1:15432\u002F\u003Cdatabase_name>",[669,688,682],{"class":678},[669,690,692],{"class":691},"sBMFI"," npx",[669,694,695],{"class":685}," prisma",[669,697,698],{"class":685}," migrate",[669,700,701],{"class":685}," deploy\n",[382,703,704,707,708,725,727],{},[369,705,706],{},"Confirm the connection"," — before running migrations:",[598,709,711],{"className":663,"code":710,"language":665,"meta":604,"style":604},"npx prisma migrate status\n",[419,712,713],{"__ignoreMap":604},[669,714,715,718,720,722],{"class":671,"line":672},[669,716,717],{"class":691},"npx",[669,719,695],{"class":685},[669,721,698],{"class":685},[669,723,724],{"class":685}," status\n",[590,726],{},"This should connect successfully and list any pending migrations.",[382,729,730,733,734,749,751],{},[369,731,732],{},"Run migrations"," — from the PCX project locally:",[598,735,737],{"className":663,"code":736,"language":665,"meta":604,"style":604},"npx prisma migrate deploy\n",[419,738,739],{"__ignoreMap":604},[669,740,741,743,745,747],{"class":671,"line":672},[669,742,717],{"class":691},[669,744,695],{"class":685},[669,746,698],{"class":685},[669,748,701],{"class":685},[590,750],{},"Review pending migrations first and confirm they match what is in the release.",[382,753,754,757,758,772,774,775,778],{},[369,755,756],{},"Verify"," — confirm migrations are complete:",[598,759,760],{"className":663,"code":710,"language":665,"meta":604,"style":604},[419,761,762],{"__ignoreMap":604},[669,763,764,766,768,770],{"class":671,"line":672},[669,765,717],{"class":691},[669,767,695],{"class":685},[669,769,698],{"class":685},[669,771,724],{"class":685},[590,773],{},"This should report ",[369,776,777],{},"Database schema is up to date!"," before proceeding to the ECS deployment below.",[382,780,781,784,785,787,788,412],{},[369,782,783],{},"Close the tunnel"," — once migrations are complete and verified, close the PuTTY session and revert or remove the production ",[419,786,583],{}," from your local ",[419,789,595],{},[374,791,793],{"id":792},"part-4-create-a-new-task-definition-revision","Part 4: Create a New Task Definition Revision",[354,795,796],{},"Before updating the service, you need to create a new version (revision) of the task definition with the latest image.",[405,798,800,805,813,822,836],{"start":799},9,[382,801,429,802,412],{},[369,803,804],{},"Task definitions",[382,806,807,808,412],{},"In the list of task definitions, click on ",[369,809,810],{},[419,811,812],{},"esp-pcx",[382,814,815,816,821],{},"You will see a list of revisions (e.g., esp-pcx:17, esp-pcx:16, etc.). Click the ",[369,817,818],{},[419,819,820],{},"Create new revision"," button in the top right.",[382,823,824,825,828,829,832,833,412],{},"On the new revision form, the container image should already point to the latest image (",[419,826,827],{},"esp-pcx:latest","). ",[369,830,831],{},"Do not change anything"," — just scroll to the bottom and click ",[369,834,835],{},"Create",[382,837,838,839,842,843,846],{},"You should see a green confirmation banner: ",[369,840,841],{},"\"Task definition successfully created\""," (e.g., ",[419,844,845],{},"esp-pcx:18",").",[374,848,850],{"id":849},"part-5-update-the-service-to-use-the-new-revision","Part 5: Update the Service to Use the New Revision",[405,852,854,876,884,916,925],{"start":853},14,[382,855,856,857],{},"Navigate back to the PCX service:\n",[379,858,859],{},[382,860,861,862,864,865,869,870,869,872],{},"Click ",[369,863,432],{}," in the left menu → ",[369,866,867],{},[419,868,440],{}," → ",[369,871,456],{},[369,873,874],{},[419,875,465],{},[382,877,878,879,821],{},"Click the orange ",[369,880,881],{},[419,882,883],{},"Update service",[382,885,886,887,890,891],{},"On the update screen, under ",[369,888,889],{},"Deployment configuration",":\n",[379,892,893,902,913],{},[382,894,895,896,899,900],{},"Confirm the ",[369,897,898],{},"Task definition family"," is set to ",[419,901,812],{},[382,903,904,905,908,909,912],{},"Set the ",[369,906,907],{},"Task definition revision"," to the latest revision number (e.g., ",[419,910,911],{},"18 (LATEST)",")",[382,914,915],{},"Leave all other settings as they are",[382,917,918,919,924],{},"Scroll to the bottom and click the orange ",[369,920,921],{},[419,922,923],{},"Update"," button.",[382,926,927,928],{},"You should see a green banner: ",[369,929,930],{},"\"Service updated: esp-infrastructure:esp-pcx-service-2bjz1boz\"",[374,932,934],{"id":933},"part-6-confirm-the-deployment","Part 6: Confirm the Deployment",[405,936,938,945,960,973],{"start":937},19,[382,939,940,941,944],{},"You will be taken to the ",[369,942,943],{},"Tasks"," tab of the service.",[382,946,947,948,951,952,955,956,959],{},"Watch the task list — you should briefly see ",[369,949,950],{},"2 tasks",": the old one (",[419,953,954],{},"Running",") and the new one (",[419,957,958],{},"Provisioning","). The old task will stop once the new one is healthy.",[382,961,962,963,966,967,969,970,412],{},"Once complete, you should see ",[369,964,965],{},"1 task"," with status ",[369,968,954],{}," and the load balancer showing ",[369,971,972],{},"Healthy",[382,974,975,976,978,979],{},"On the ",[369,977,472],{}," tab, confirm:\n",[379,980,981,990],{},[382,982,983,986,987],{},[369,984,985],{},"Deployment status"," = ",[419,988,989],{},"Success",[382,991,992,986,995],{},[369,993,994],{},"Target health",[419,996,972],{},[354,998,999],{},"✅ The PCX service has been successfully updated in production.",[1001,1002],"hr",{},[374,1004,185],{"id":1005},"troubleshooting",[1007,1008,1009,1022],"table",{},[1010,1011,1012],"thead",{},[1013,1014,1015,1019],"tr",{},[1016,1017,1018],"th",{},"Issue",[1016,1020,1021],{},"What to check",[1023,1024,1025,1045,1068,1078,1090,1098],"tbody",{},[1013,1026,1027,1037],{},[1028,1029,1030,1033,1034],"td",{},[419,1031,1032],{},"migrate deploy"," fails with ",[369,1035,1036],{},"P3005",[1028,1038,1039,1040,1044],{},"Database has schema but no Prisma migration history — see ",[363,1041,1043],{"href":1042},"#baselining-an-existing-production-database-p3005","baselining"," below. Production has already been baselined; this should only recur after a snapshot restore or similar.",[1013,1046,1047,1056],{},[1028,1048,1049,1033,1052,1055],{},[419,1050,1051],{},"migrate dev",[369,1053,1054],{},"P3006"," \u002F shadow database errors",[1028,1057,1058,1059,1061,1062,1064,1065,1067],{},"Do ",[369,1060,511],{}," use ",[419,1063,1051],{}," on production; use ",[419,1066,1032],{}," only.",[1013,1069,1070,1075],{},[1028,1071,1072,1073],{},"Connection refused on ",[419,1074,587],{},[1028,1076,1077],{},"PuTTY tunnel is not open, or local port forwarding is misconfigured.",[1013,1079,1080,1083],{},[1028,1081,1082],{},"Task stays in \"Provisioning\" for a long time",[1028,1084,1085,1086,1089],{},"Click the ",[369,1087,1088],{},"Events"," tab to see deployment messages",[1013,1091,1092,1095],{},[1028,1093,1094],{},"Deployment status shows \"In progress\"",[1028,1096,1097],{},"Wait 2–3 minutes and refresh — this is normal during rollover",[1013,1099,1100,1103],{},[1028,1101,1102],{},"Load balancer shows \"Unhealthy\"",[1028,1104,1105,1106,1109],{},"Check the ",[369,1107,1108],{},"Logs"," tab on the service for container errors",[488,1111,1113],{"id":1112},"baselining-an-existing-production-database-p3005","Baselining an existing production database (P3005)",[354,1115,1116,1117,617,1121,1067],{},"Production PCX has already been baselined. You should not need this for routine releases — use the ",[363,1118,1120],{"href":1119},"#migration-workflow","migration workflow",[419,1122,1123],{},"npx prisma migrate deploy",[354,1125,1126,1127,1033,1129,1131,1132,1135,1136,412],{},"Use this if ",[419,1128,1032],{},[369,1130,1036],{}," (\"database schema is not empty\"), typically after restoring from an RDS snapshot or bringing a database online that was created with ",[419,1133,1134],{},"prisma db push"," rather than migrations. See also ",[363,1137,1141],{"href":1138,"rel":1139},"https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Form\u002Fprisma-migrate\u002Fworkflows\u002Fbaselining",[1140],"nofollow","Prisma baselining",[405,1143,1144,1153,1179,1209,1246,1265,1276],{},[382,1145,1146,1147,1149,1150,1152],{},"Complete steps 1–5 of the ",[363,1148,1120],{"href":1119}," (tunnel, credentials, ",[419,1151,583],{},", confirm connection).",[382,1154,1155,1158,1159,1173,1175,1176,412],{},[369,1156,1157],{},"List pending migrations",":",[598,1160,1161],{"className":663,"code":710,"language":665,"meta":604,"style":604},[419,1162,1163],{"__ignoreMap":604},[669,1164,1165,1167,1169,1171],{"class":671,"line":672},[669,1166,717],{"class":691},[669,1168,695],{"class":685},[669,1170,698],{"class":685},[669,1172,724],{"class":685},[590,1174],{},"Note every migration folder listed as ",[369,1177,1178],{},"not yet applied",[382,1180,1181,1184,1185,1187,1188,1191,1192],{},[369,1182,1183],{},"Decide which migrations the database already has"," — for each pending migration, check whether its schema changes are already live (inspect via your client on ",[419,1186,587],{},", or read ",[419,1189,1190],{},"prisma\u002Fmigrations\u002F\u003Cfolder>\u002Fmigration.sql"," and confirm the objects exist). Split into:",[379,1193,1194,1200],{},[382,1195,1196,1199],{},[369,1197,1198],{},"Already in the database"," — mark as applied in step 4",[382,1201,1202,1205,1206,1208],{},[369,1203,1204],{},"Not yet in the database"," — leave for ",[419,1207,1032],{}," in step 5",[382,1210,1211,1214,1215,1158,1218],{},[369,1212,1213],{},"Mark each baseline migration as applied"," — run ",[369,1216,1217],{},"once per folder",[598,1219,1221],{"className":663,"code":1220,"language":665,"meta":604,"style":604},"npx prisma migrate resolve --applied \"\u003Cmigration_folder_name>\"\n",[419,1222,1223],{"__ignoreMap":604},[669,1224,1225,1227,1229,1231,1234,1237,1240,1243],{"class":671,"line":672},[669,1226,717],{"class":691},[669,1228,695],{"class":685},[669,1230,698],{"class":685},[669,1232,1233],{"class":685}," resolve",[669,1235,1236],{"class":685}," --applied",[669,1238,1239],{"class":678}," \"",[669,1241,1242],{"class":685},"\u003Cmigration_folder_name>",[669,1244,1245],{"class":678},"\"\n",[382,1247,1248,1158,1251],{},[369,1249,1250],{},"Deploy remaining migrations",[598,1252,1253],{"className":663,"code":736,"language":665,"meta":604,"style":604},[419,1254,1255],{"__ignoreMap":604},[669,1256,1257,1259,1261,1263],{"class":671,"line":672},[669,1258,717],{"class":691},[669,1260,695],{"class":685},[669,1262,698],{"class":685},[669,1264,701],{"class":685},[382,1266,1267,1269,1270,1273,1274],{},[369,1268,756],{}," with ",[419,1271,1272],{},"npx prisma migrate status"," — should report ",[369,1275,777],{},[382,1277,1278,1279,412],{},"Close the tunnel and revert your local ",[419,1280,583],{},[1282,1283,1284],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":604,"searchDepth":1286,"depth":1286,"links":1287},2,[1288,1289,1290,1291,1296,1297,1298,1299],{"id":376,"depth":1286,"text":377},{"id":402,"depth":1286,"text":403},{"id":443,"depth":1286,"text":444},{"id":479,"depth":1286,"text":480,"children":1292},[1293,1295],{"id":490,"depth":1294,"text":491},3,{"id":526,"depth":1294,"text":527},{"id":792,"depth":1286,"text":793},{"id":849,"depth":1286,"text":850},{"id":933,"depth":1286,"text":934},{"id":1005,"depth":1286,"text":185,"children":1300},[1301],{"id":1112,"depth":1294,"text":1113},"Guide on how to update the production environment for the Capability Exchange","md",null,{},true,{"title":56,"description":1302},"NzGcJfiP7aS21m0ro4HbduvLLzTuo8oNpFdOsZYfV_8",[1310,1312],{"title":152,"path":153,"stem":154,"children":-1,"description":1311},"A comprehensive overview of the deployment process for new ESProfiler tenants",{"title":160,"path":161,"stem":162,"description":1313,"children":-1},"Complete step-by-step guide for deploying and configuring Langfuse on AWS ECS using our latest task definitions, EFS for ClickHouse, S3, ALB target groups, and Cloudflare.",1789726612345]