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