[{"data":1,"prerenderedAt":1834},["ShallowReactive",2],{"navigation_docs":3,"-deployment-github-actions":204,"-deployment-github-actions-surround":1829},[4,40,69,82,91,116,129,146,167],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30,35],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":26,"path":27,"stem":28,"icon":29},"Project Structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"First Deployment","\u002Fgetting-started\u002Ffirst-deployment","1.getting-started\u002F5.first-deployment","i-lucide-upload-cloud",{"title":36,"path":37,"stem":38,"icon":39},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F6.troubleshooting","i-lucide-wrench",{"title":41,"children":42,"path":67,"stem":68,"page":6},"Platform",[43,47,51,55,59,63],{"title":44,"path":45,"stem":46},"Dashboard","\u002Fplatform\u002Fdashboard","2.platform\u002F1.dashboard",{"title":48,"path":49,"stem":50},"Marketplace","\u002Fplatform\u002Fmarketplace","2.platform\u002F2.marketplace",{"title":52,"path":53,"stem":54},"Monitoring & Metrics","\u002Fplatform\u002Fmonitoring","2.platform\u002F3.monitoring",{"title":56,"path":57,"stem":58},"Projects","\u002Fplatform\u002Fprojects","2.platform\u002F4.projects",{"title":60,"path":61,"stem":62},"Services","\u002Fplatform\u002Fservices","2.platform\u002F5.services",{"title":64,"path":65,"stem":66},"Logs","\u002Fplatform\u002Flogs","2.platform\u002F6.logs","\u002Fplatform","2.platform",{"title":70,"children":71,"path":80,"stem":81,"page":6},"CLI",[72,76],{"title":73,"path":74,"stem":75},"CLI Installation","\u002Fcli\u002Finstallation","3.cli\u002F1.installation",{"title":77,"path":78,"stem":79},"Commands Reference","\u002Fcli\u002Fcommands","3.cli\u002F2.commands","\u002Fcli","3.cli",{"title":83,"children":84,"path":89,"stem":90,"page":6},"TUI",[85],{"title":86,"path":87,"stem":88},"TUI Overview","\u002Ftui\u002Foverview","4.tui\u002F1.overview","\u002Ftui","4.tui",{"title":92,"children":93,"path":114,"stem":115,"page":6},"Docker",[94,98,102,106,110],{"title":95,"path":96,"stem":97},"Docker Containers","\u002Fdocker\u002Fcontainers","5.docker\u002F1.containers",{"title":99,"path":100,"stem":101},"Docker Images","\u002Fdocker\u002Fimages","5.docker\u002F2.images",{"title":103,"path":104,"stem":105},"Docker Compose","\u002Fdocker\u002Fcompose","5.docker\u002F3.compose",{"title":107,"path":108,"stem":109},"Docker Volumes","\u002Fdocker\u002Fvolumes","5.docker\u002F4.volumes",{"title":111,"path":112,"stem":113},"Docker Networks","\u002Fdocker\u002Fnetworks","5.docker\u002F5.networks","\u002Fdocker","5.docker",{"title":117,"children":118,"path":127,"stem":128,"page":6},"PM2",[119,123],{"title":120,"path":121,"stem":122},"Process Management","\u002Fpm2\u002Fprocess-management","6.pm2\u002F1.process-management",{"title":124,"path":125,"stem":126},"Zero-Downtime Deployments","\u002Fpm2\u002Fzero-downtime","6.pm2\u002F2.zero-downtime","\u002Fpm2","6.pm2",{"title":130,"children":131,"path":144,"stem":145,"page":6},"VPS",[132,136,140],{"title":133,"path":134,"stem":135},"VPS Management","\u002Fvps\u002Fssh-management","7.vps\u002F1.ssh-management",{"title":137,"path":138,"stem":139},"SSH Access","\u002Fvps\u002Fssh","7.vps\u002F2.ssh",{"title":141,"path":142,"stem":143},"Firewall","\u002Fvps\u002Ffirewall","7.vps\u002F3.firewall","\u002Fvps","7.vps",{"title":147,"children":148,"path":165,"stem":166,"page":6},"Deployment",[149,153,157,161],{"title":150,"path":151,"stem":152},"Production Setup","\u002Fdeployment\u002Fproduction-setup","8.deployment\u002F1.production-setup",{"title":154,"path":155,"stem":156},"Scaling","\u002Fdeployment\u002Fscaling","8.deployment\u002F2.scaling",{"title":158,"path":159,"stem":160},"GitHub Actions CI\u002FCD","\u002Fdeployment\u002Fgithub-actions","8.deployment\u002F3.github-actions",{"title":162,"path":163,"stem":164},"Security","\u002Fdeployment\u002Fsecurity","8.deployment\u002F4.security","\u002Fdeployment","8.deployment",{"title":168,"children":169,"path":202,"stem":203,"page":6},"Reference",[170,174,178,182,186,190,194,198],{"title":171,"path":172,"stem":173},"Architecture","\u002Freference\u002Farchitecture","9.reference\u002F1.architecture",{"title":175,"path":176,"stem":177},"CLI Reference","\u002Freference\u002Fcli-reference","9.reference\u002F2.cli-reference",{"title":179,"path":180,"stem":181},"Environment Variables","\u002Freference\u002Fenvironment-variables","9.reference\u002F3.environment-variables",{"title":183,"path":184,"stem":185},"API Reference","\u002Freference\u002Fapi-reference","9.reference\u002F4.api-reference",{"title":187,"path":188,"stem":189},"Webhooks","\u002Freference\u002Fwebhooks","9.reference\u002F5.webhooks",{"title":191,"path":192,"stem":193},"Authentication","\u002Freference\u002Fauthentication","9.reference\u002F6.authentication",{"title":195,"path":196,"stem":197},"Configuration","\u002Freference\u002Fconfiguration","9.reference\u002F7.configuration",{"title":199,"path":200,"stem":201},"API Overview","\u002Freference\u002Fapi","9.reference\u002F8.api","\u002Freference","9.reference",{"id":205,"title":158,"body":206,"description":1823,"extension":1824,"links":1825,"meta":1826,"navigation":306,"path":159,"seo":1827,"stem":160,"__hash__":1828},"docs\u002F8.deployment\u002F3.github-actions.md",{"type":207,"value":208,"toc":1811},"minimark",[209,213,217,222,235,239,242,265,269,276,535,539,859,863,1145,1149,1341,1345,1572,1576,1579,1612,1616,1619,1764,1768,1791,1794,1807],[210,211,158],"h1",{"id":212},"github-actions-cicd",[214,215,216],"p",{},"Automate your deployments to SkyPort using GitHub Actions.",[218,219,221],"h2",{"id":220},"prerequisites","Prerequisites",[223,224,225,229,232],"ul",{},[226,227,228],"li",{},"SkyPort instance with API access",[226,230,231],{},"GitHub repository",[226,233,234],{},"API token from SkyPort",[218,236,238],{"id":237},"generate-api-token","Generate API Token",[214,240,241],{},"In SkyPort dashboard:",[243,244,245,248,251,259],"ol",{},[226,246,247],{},"Go to Settings → API Tokens",[226,249,250],{},"Click \"Generate Token\"",[226,252,253,254,258],{},"Copy the token (starts with ",[255,256,257],"code",{},"sk_",")",[226,260,261,262],{},"Add to GitHub repository as secret ",[255,263,264],{},"SKYPORT_TOKEN",[218,266,268],{"id":267},"basic-workflow","Basic Workflow",[214,270,271,272,275],{},"Create ",[255,273,274],{},".github\u002Fworkflows\u002Fdeploy.yml",":",[277,278,283],"pre",{"className":279,"code":280,"language":281,"meta":282,"style":282},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Deploy to SkyPort\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout code\n        uses: actions\u002Fcheckout@v3\n      \n      - name: Build Docker image\n        run: |\n          docker build -t my-app:${{ github.sha }} .\n          docker tag my-app:${{ github.sha }} my-app:latest\n      \n      - name: Deploy to SkyPort\n        env:\n          SKYPORT_TOKEN: ${{ secrets.SKYPORT_TOKEN }}\n          SKYPORT_SERVER: https:\u002F\u002Fskyport.example.com\n        run: |\n          skyport docker run -d \\\n            --name my-app \\\n            -p 3000:3000 \\\n            my-app:${{ github.sha }}\n","yaml","",[255,284,285,301,308,318,326,334,343,348,356,364,375,382,390,403,414,420,432,444,450,456,461,472,480,491,502,511,517,523,529],{"__ignoreMap":282},[286,287,290,294,297],"span",{"class":288,"line":289},"line",1,[286,291,293],{"class":292},"swJcz","name",[286,295,275],{"class":296},"sMK4o",[286,298,300],{"class":299},"sfazB"," Deploy to SkyPort\n",[286,302,304],{"class":288,"line":303},2,[286,305,307],{"emptyLinePlaceholder":306},true,"\n",[286,309,311,315],{"class":288,"line":310},3,[286,312,314],{"class":313},"sfNiH","on",[286,316,317],{"class":296},":\n",[286,319,321,324],{"class":288,"line":320},4,[286,322,323],{"class":292},"  push",[286,325,317],{"class":296},[286,327,329,332],{"class":288,"line":328},5,[286,330,331],{"class":292},"    branches",[286,333,317],{"class":296},[286,335,337,340],{"class":288,"line":336},6,[286,338,339],{"class":296},"      -",[286,341,342],{"class":299}," main\n",[286,344,346],{"class":288,"line":345},7,[286,347,307],{"emptyLinePlaceholder":306},[286,349,351,354],{"class":288,"line":350},8,[286,352,353],{"class":292},"jobs",[286,355,317],{"class":296},[286,357,359,362],{"class":288,"line":358},9,[286,360,361],{"class":292},"  deploy",[286,363,317],{"class":296},[286,365,367,370,372],{"class":288,"line":366},10,[286,368,369],{"class":292},"    runs-on",[286,371,275],{"class":296},[286,373,374],{"class":299}," ubuntu-latest\n",[286,376,378],{"class":288,"line":377},11,[286,379,381],{"class":380},"sTEyZ","    \n",[286,383,385,388],{"class":288,"line":384},12,[286,386,387],{"class":292},"    steps",[286,389,317],{"class":296},[286,391,393,395,398,400],{"class":288,"line":392},13,[286,394,339],{"class":296},[286,396,397],{"class":292}," name",[286,399,275],{"class":296},[286,401,402],{"class":299}," Checkout code\n",[286,404,406,409,411],{"class":288,"line":405},14,[286,407,408],{"class":292},"        uses",[286,410,275],{"class":296},[286,412,413],{"class":299}," actions\u002Fcheckout@v3\n",[286,415,417],{"class":288,"line":416},15,[286,418,419],{"class":380},"      \n",[286,421,423,425,427,429],{"class":288,"line":422},16,[286,424,339],{"class":296},[286,426,397],{"class":292},[286,428,275],{"class":296},[286,430,431],{"class":299}," Build Docker image\n",[286,433,435,438,440],{"class":288,"line":434},17,[286,436,437],{"class":292},"        run",[286,439,275],{"class":296},[286,441,443],{"class":442},"s7zQu"," |\n",[286,445,447],{"class":288,"line":446},18,[286,448,449],{"class":299},"          docker build -t my-app:${{ github.sha }} .\n",[286,451,453],{"class":288,"line":452},19,[286,454,455],{"class":299},"          docker tag my-app:${{ github.sha }} my-app:latest\n",[286,457,459],{"class":288,"line":458},20,[286,460,419],{"class":299},[286,462,464,466,468,470],{"class":288,"line":463},21,[286,465,339],{"class":296},[286,467,397],{"class":292},[286,469,275],{"class":296},[286,471,300],{"class":299},[286,473,475,478],{"class":288,"line":474},22,[286,476,477],{"class":292},"        env",[286,479,317],{"class":296},[286,481,483,486,488],{"class":288,"line":482},23,[286,484,485],{"class":292},"          SKYPORT_TOKEN",[286,487,275],{"class":296},[286,489,490],{"class":299}," ${{ secrets.SKYPORT_TOKEN }}\n",[286,492,494,497,499],{"class":288,"line":493},24,[286,495,496],{"class":292},"          SKYPORT_SERVER",[286,498,275],{"class":296},[286,500,501],{"class":299}," https:\u002F\u002Fskyport.example.com\n",[286,503,505,507,509],{"class":288,"line":504},25,[286,506,437],{"class":292},[286,508,275],{"class":296},[286,510,443],{"class":442},[286,512,514],{"class":288,"line":513},26,[286,515,516],{"class":299},"          skyport docker run -d \\\n",[286,518,520],{"class":288,"line":519},27,[286,521,522],{"class":299},"            --name my-app \\\n",[286,524,526],{"class":288,"line":525},28,[286,527,528],{"class":299},"            -p 3000:3000 \\\n",[286,530,532],{"class":288,"line":531},29,[286,533,534],{"class":299},"            my-app:${{ github.sha }}\n",[218,536,538],{"id":537},"docker-build-and-push","Docker Build and Push",[277,540,542],{"className":279,"code":541,"language":281,"meta":282,"style":282},"name: Build and Deploy\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout code\n        uses: actions\u002Fcheckout@v3\n      \n      - name: Set up Docker Buildx\n        uses: docker\u002Fsetup-buildx-action@v2\n      \n      - name: Build and push to registry\n        uses: docker\u002Fbuild-push-action@v4\n        with:\n          context: .\n          push: true\n          tags: |\n            registry.example.com\u002Fmy-app:${{ github.sha }}\n            registry.example.com\u002Fmy-app:latest\n          registry: registry.example.com\n          username: ${{ secrets.REGISTRY_USERNAME }}\n          password: ${{ secrets.REGISTRY_PASSWORD }}\n      \n      - name: Deploy with SkyPort\n        env:\n          SKYPORT_TOKEN: ${{ secrets.SKYPORT_TOKEN }}\n          SKYPORT_SERVER: https:\u002F\u002Fskyport.example.com\n        run: |\n          # Stop old container\n          skyport docker stop my-app || true\n          skyport docker rm my-app || true\n          \n          # Run new container\n          skyport docker run -d \\\n            --name my-app \\\n            -p 3000:3000 \\\n            registry.example.com\u002Fmy-app:${{ github.sha }}\n",[255,543,544,553,557,563,569,575,581,585,591,597,605,609,615,625,633,637,648,657,661,672,681,688,699,709,718,723,728,738,748,758,763,775,782,791,800,809,815,821,827,833,839,844,849,854],{"__ignoreMap":282},[286,545,546,548,550],{"class":288,"line":289},[286,547,293],{"class":292},[286,549,275],{"class":296},[286,551,552],{"class":299}," Build and Deploy\n",[286,554,555],{"class":288,"line":303},[286,556,307],{"emptyLinePlaceholder":306},[286,558,559,561],{"class":288,"line":310},[286,560,314],{"class":313},[286,562,317],{"class":296},[286,564,565,567],{"class":288,"line":320},[286,566,323],{"class":292},[286,568,317],{"class":296},[286,570,571,573],{"class":288,"line":328},[286,572,331],{"class":292},[286,574,317],{"class":296},[286,576,577,579],{"class":288,"line":336},[286,578,339],{"class":296},[286,580,342],{"class":299},[286,582,583],{"class":288,"line":345},[286,584,307],{"emptyLinePlaceholder":306},[286,586,587,589],{"class":288,"line":350},[286,588,353],{"class":292},[286,590,317],{"class":296},[286,592,593,595],{"class":288,"line":358},[286,594,361],{"class":292},[286,596,317],{"class":296},[286,598,599,601,603],{"class":288,"line":366},[286,600,369],{"class":292},[286,602,275],{"class":296},[286,604,374],{"class":299},[286,606,607],{"class":288,"line":377},[286,608,381],{"class":380},[286,610,611,613],{"class":288,"line":384},[286,612,387],{"class":292},[286,614,317],{"class":296},[286,616,617,619,621,623],{"class":288,"line":392},[286,618,339],{"class":296},[286,620,397],{"class":292},[286,622,275],{"class":296},[286,624,402],{"class":299},[286,626,627,629,631],{"class":288,"line":405},[286,628,408],{"class":292},[286,630,275],{"class":296},[286,632,413],{"class":299},[286,634,635],{"class":288,"line":416},[286,636,419],{"class":380},[286,638,639,641,643,645],{"class":288,"line":422},[286,640,339],{"class":296},[286,642,397],{"class":292},[286,644,275],{"class":296},[286,646,647],{"class":299}," Set up Docker Buildx\n",[286,649,650,652,654],{"class":288,"line":434},[286,651,408],{"class":292},[286,653,275],{"class":296},[286,655,656],{"class":299}," docker\u002Fsetup-buildx-action@v2\n",[286,658,659],{"class":288,"line":446},[286,660,419],{"class":380},[286,662,663,665,667,669],{"class":288,"line":452},[286,664,339],{"class":296},[286,666,397],{"class":292},[286,668,275],{"class":296},[286,670,671],{"class":299}," Build and push to registry\n",[286,673,674,676,678],{"class":288,"line":458},[286,675,408],{"class":292},[286,677,275],{"class":296},[286,679,680],{"class":299}," docker\u002Fbuild-push-action@v4\n",[286,682,683,686],{"class":288,"line":463},[286,684,685],{"class":292},"        with",[286,687,317],{"class":296},[286,689,690,693,695],{"class":288,"line":474},[286,691,692],{"class":292},"          context",[286,694,275],{"class":296},[286,696,698],{"class":697},"sbssI"," .\n",[286,700,701,704,706],{"class":288,"line":482},[286,702,703],{"class":292},"          push",[286,705,275],{"class":296},[286,707,708],{"class":313}," true\n",[286,710,711,714,716],{"class":288,"line":493},[286,712,713],{"class":292},"          tags",[286,715,275],{"class":296},[286,717,443],{"class":442},[286,719,720],{"class":288,"line":504},[286,721,722],{"class":299},"            registry.example.com\u002Fmy-app:${{ github.sha }}\n",[286,724,725],{"class":288,"line":513},[286,726,727],{"class":299},"            registry.example.com\u002Fmy-app:latest\n",[286,729,730,733,735],{"class":288,"line":519},[286,731,732],{"class":292},"          registry",[286,734,275],{"class":296},[286,736,737],{"class":299}," registry.example.com\n",[286,739,740,743,745],{"class":288,"line":525},[286,741,742],{"class":292},"          username",[286,744,275],{"class":296},[286,746,747],{"class":299}," ${{ secrets.REGISTRY_USERNAME }}\n",[286,749,750,753,755],{"class":288,"line":531},[286,751,752],{"class":292},"          password",[286,754,275],{"class":296},[286,756,757],{"class":299}," ${{ secrets.REGISTRY_PASSWORD }}\n",[286,759,761],{"class":288,"line":760},30,[286,762,419],{"class":380},[286,764,766,768,770,772],{"class":288,"line":765},31,[286,767,339],{"class":296},[286,769,397],{"class":292},[286,771,275],{"class":296},[286,773,774],{"class":299}," Deploy with SkyPort\n",[286,776,778,780],{"class":288,"line":777},32,[286,779,477],{"class":292},[286,781,317],{"class":296},[286,783,785,787,789],{"class":288,"line":784},33,[286,786,485],{"class":292},[286,788,275],{"class":296},[286,790,490],{"class":299},[286,792,794,796,798],{"class":288,"line":793},34,[286,795,496],{"class":292},[286,797,275],{"class":296},[286,799,501],{"class":299},[286,801,803,805,807],{"class":288,"line":802},35,[286,804,437],{"class":292},[286,806,275],{"class":296},[286,808,443],{"class":442},[286,810,812],{"class":288,"line":811},36,[286,813,814],{"class":299},"          # Stop old container\n",[286,816,818],{"class":288,"line":817},37,[286,819,820],{"class":299},"          skyport docker stop my-app || true\n",[286,822,824],{"class":288,"line":823},38,[286,825,826],{"class":299},"          skyport docker rm my-app || true\n",[286,828,830],{"class":288,"line":829},39,[286,831,832],{"class":299},"          \n",[286,834,836],{"class":288,"line":835},40,[286,837,838],{"class":299},"          # Run new container\n",[286,840,842],{"class":288,"line":841},41,[286,843,516],{"class":299},[286,845,847],{"class":288,"line":846},42,[286,848,522],{"class":299},[286,850,852],{"class":288,"line":851},43,[286,853,528],{"class":299},[286,855,857],{"class":288,"line":856},44,[286,858,722],{"class":299},[218,860,862],{"id":861},"multi-environment-deployment","Multi-Environment Deployment",[277,864,866],{"className":279,"code":865,"language":281,"meta":282,"style":282},"name: Deploy to Multiple Environments\n\non:\n  push:\n    branches:\n      - main\n      - staging\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        environment:\n          - name: staging\n            server: https:\u002F\u002Fskyport-staging.example.com\n            token: SKYPORT_STAGING_TOKEN\n          - name: production\n            server: https:\u002F\u002Fskyport.example.com\n            token: SKYPORT_PROD_TOKEN\n    \n    steps:\n      - name: Checkout code\n        uses: actions\u002Fcheckout@v3\n      \n      - name: Build Docker image\n        run: docker build -t my-app:${{ github.sha }} .\n      \n      - name: Deploy to ${{ matrix.environment.name }}\n        env:\n          SKYPORT_TOKEN: ${{ secrets[matrix.environment.token] }}\n          SKYPORT_SERVER: ${{ matrix.environment.server }}\n        run: |\n          skyport docker stop my-app-${{ matrix.environment.name }} || true\n          skyport docker rm my-app-${{ matrix.environment.name }} || true\n          \n          skyport docker run -d \\\n            --name my-app-${{ matrix.environment.name }} \\\n            -p 3000:3000 \\\n            my-app:${{ github.sha }}\n",[255,867,868,877,881,887,893,899,905,912,916,922,928,936,943,950,957,968,978,988,999,1007,1016,1020,1026,1036,1044,1048,1058,1067,1071,1082,1088,1097,1106,1114,1119,1124,1128,1132,1137,1141],{"__ignoreMap":282},[286,869,870,872,874],{"class":288,"line":289},[286,871,293],{"class":292},[286,873,275],{"class":296},[286,875,876],{"class":299}," Deploy to Multiple Environments\n",[286,878,879],{"class":288,"line":303},[286,880,307],{"emptyLinePlaceholder":306},[286,882,883,885],{"class":288,"line":310},[286,884,314],{"class":313},[286,886,317],{"class":296},[286,888,889,891],{"class":288,"line":320},[286,890,323],{"class":292},[286,892,317],{"class":296},[286,894,895,897],{"class":288,"line":328},[286,896,331],{"class":292},[286,898,317],{"class":296},[286,900,901,903],{"class":288,"line":336},[286,902,339],{"class":296},[286,904,342],{"class":299},[286,906,907,909],{"class":288,"line":345},[286,908,339],{"class":296},[286,910,911],{"class":299}," staging\n",[286,913,914],{"class":288,"line":350},[286,915,307],{"emptyLinePlaceholder":306},[286,917,918,920],{"class":288,"line":358},[286,919,353],{"class":292},[286,921,317],{"class":296},[286,923,924,926],{"class":288,"line":366},[286,925,361],{"class":292},[286,927,317],{"class":296},[286,929,930,932,934],{"class":288,"line":377},[286,931,369],{"class":292},[286,933,275],{"class":296},[286,935,374],{"class":299},[286,937,938,941],{"class":288,"line":384},[286,939,940],{"class":292},"    strategy",[286,942,317],{"class":296},[286,944,945,948],{"class":288,"line":392},[286,946,947],{"class":292},"      matrix",[286,949,317],{"class":296},[286,951,952,955],{"class":288,"line":405},[286,953,954],{"class":292},"        environment",[286,956,317],{"class":296},[286,958,959,962,964,966],{"class":288,"line":416},[286,960,961],{"class":296},"          -",[286,963,397],{"class":292},[286,965,275],{"class":296},[286,967,911],{"class":299},[286,969,970,973,975],{"class":288,"line":422},[286,971,972],{"class":292},"            server",[286,974,275],{"class":296},[286,976,977],{"class":299}," https:\u002F\u002Fskyport-staging.example.com\n",[286,979,980,983,985],{"class":288,"line":434},[286,981,982],{"class":292},"            token",[286,984,275],{"class":296},[286,986,987],{"class":299}," SKYPORT_STAGING_TOKEN\n",[286,989,990,992,994,996],{"class":288,"line":446},[286,991,961],{"class":296},[286,993,397],{"class":292},[286,995,275],{"class":296},[286,997,998],{"class":299}," production\n",[286,1000,1001,1003,1005],{"class":288,"line":452},[286,1002,972],{"class":292},[286,1004,275],{"class":296},[286,1006,501],{"class":299},[286,1008,1009,1011,1013],{"class":288,"line":458},[286,1010,982],{"class":292},[286,1012,275],{"class":296},[286,1014,1015],{"class":299}," SKYPORT_PROD_TOKEN\n",[286,1017,1018],{"class":288,"line":463},[286,1019,381],{"class":380},[286,1021,1022,1024],{"class":288,"line":474},[286,1023,387],{"class":292},[286,1025,317],{"class":296},[286,1027,1028,1030,1032,1034],{"class":288,"line":482},[286,1029,339],{"class":296},[286,1031,397],{"class":292},[286,1033,275],{"class":296},[286,1035,402],{"class":299},[286,1037,1038,1040,1042],{"class":288,"line":493},[286,1039,408],{"class":292},[286,1041,275],{"class":296},[286,1043,413],{"class":299},[286,1045,1046],{"class":288,"line":504},[286,1047,419],{"class":380},[286,1049,1050,1052,1054,1056],{"class":288,"line":513},[286,1051,339],{"class":296},[286,1053,397],{"class":292},[286,1055,275],{"class":296},[286,1057,431],{"class":299},[286,1059,1060,1062,1064],{"class":288,"line":519},[286,1061,437],{"class":292},[286,1063,275],{"class":296},[286,1065,1066],{"class":299}," docker build -t my-app:${{ github.sha }} .\n",[286,1068,1069],{"class":288,"line":525},[286,1070,419],{"class":380},[286,1072,1073,1075,1077,1079],{"class":288,"line":531},[286,1074,339],{"class":296},[286,1076,397],{"class":292},[286,1078,275],{"class":296},[286,1080,1081],{"class":299}," Deploy to ${{ matrix.environment.name }}\n",[286,1083,1084,1086],{"class":288,"line":760},[286,1085,477],{"class":292},[286,1087,317],{"class":296},[286,1089,1090,1092,1094],{"class":288,"line":765},[286,1091,485],{"class":292},[286,1093,275],{"class":296},[286,1095,1096],{"class":299}," ${{ secrets[matrix.environment.token] }}\n",[286,1098,1099,1101,1103],{"class":288,"line":777},[286,1100,496],{"class":292},[286,1102,275],{"class":296},[286,1104,1105],{"class":299}," ${{ matrix.environment.server }}\n",[286,1107,1108,1110,1112],{"class":288,"line":784},[286,1109,437],{"class":292},[286,1111,275],{"class":296},[286,1113,443],{"class":442},[286,1115,1116],{"class":288,"line":793},[286,1117,1118],{"class":299},"          skyport docker stop my-app-${{ matrix.environment.name }} || true\n",[286,1120,1121],{"class":288,"line":802},[286,1122,1123],{"class":299},"          skyport docker rm my-app-${{ matrix.environment.name }} || true\n",[286,1125,1126],{"class":288,"line":811},[286,1127,832],{"class":299},[286,1129,1130],{"class":288,"line":817},[286,1131,516],{"class":299},[286,1133,1134],{"class":288,"line":823},[286,1135,1136],{"class":299},"            --name my-app-${{ matrix.environment.name }} \\\n",[286,1138,1139],{"class":288,"line":829},[286,1140,528],{"class":299},[286,1142,1143],{"class":288,"line":835},[286,1144,534],{"class":299},[218,1146,1148],{"id":1147},"conditional-deployment","Conditional Deployment",[277,1150,1152],{"className":279,"code":1151,"language":281,"meta":282,"style":282},"name: Deploy on Release\n\non:\n  release:\n    types: [published]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout code\n        uses: actions\u002Fcheckout@v3\n        with:\n          ref: ${{ github.ref }}\n      \n      - name: Build and deploy\n        env:\n          SKYPORT_TOKEN: ${{ secrets.SKYPORT_TOKEN }}\n          SKYPORT_SERVER: https:\u002F\u002Fskyport.example.com\n        run: |\n          VERSION=${{ github.event.release.tag_name }}\n          docker build -t my-app:$VERSION .\n          \n          skyport docker run -d \\\n            --name my-app-$VERSION \\\n            -p 3000:3000 \\\n            my-app:$VERSION\n",[255,1153,1154,1163,1167,1173,1180,1196,1200,1206,1212,1220,1224,1230,1240,1248,1254,1264,1268,1279,1285,1293,1301,1309,1314,1319,1323,1327,1332,1336],{"__ignoreMap":282},[286,1155,1156,1158,1160],{"class":288,"line":289},[286,1157,293],{"class":292},[286,1159,275],{"class":296},[286,1161,1162],{"class":299}," Deploy on Release\n",[286,1164,1165],{"class":288,"line":303},[286,1166,307],{"emptyLinePlaceholder":306},[286,1168,1169,1171],{"class":288,"line":310},[286,1170,314],{"class":313},[286,1172,317],{"class":296},[286,1174,1175,1178],{"class":288,"line":320},[286,1176,1177],{"class":292},"  release",[286,1179,317],{"class":296},[286,1181,1182,1185,1187,1190,1193],{"class":288,"line":328},[286,1183,1184],{"class":292},"    types",[286,1186,275],{"class":296},[286,1188,1189],{"class":296}," [",[286,1191,1192],{"class":299},"published",[286,1194,1195],{"class":296},"]\n",[286,1197,1198],{"class":288,"line":336},[286,1199,307],{"emptyLinePlaceholder":306},[286,1201,1202,1204],{"class":288,"line":345},[286,1203,353],{"class":292},[286,1205,317],{"class":296},[286,1207,1208,1210],{"class":288,"line":350},[286,1209,361],{"class":292},[286,1211,317],{"class":296},[286,1213,1214,1216,1218],{"class":288,"line":358},[286,1215,369],{"class":292},[286,1217,275],{"class":296},[286,1219,374],{"class":299},[286,1221,1222],{"class":288,"line":366},[286,1223,381],{"class":380},[286,1225,1226,1228],{"class":288,"line":377},[286,1227,387],{"class":292},[286,1229,317],{"class":296},[286,1231,1232,1234,1236,1238],{"class":288,"line":384},[286,1233,339],{"class":296},[286,1235,397],{"class":292},[286,1237,275],{"class":296},[286,1239,402],{"class":299},[286,1241,1242,1244,1246],{"class":288,"line":392},[286,1243,408],{"class":292},[286,1245,275],{"class":296},[286,1247,413],{"class":299},[286,1249,1250,1252],{"class":288,"line":405},[286,1251,685],{"class":292},[286,1253,317],{"class":296},[286,1255,1256,1259,1261],{"class":288,"line":416},[286,1257,1258],{"class":292},"          ref",[286,1260,275],{"class":296},[286,1262,1263],{"class":299}," ${{ github.ref }}\n",[286,1265,1266],{"class":288,"line":422},[286,1267,419],{"class":380},[286,1269,1270,1272,1274,1276],{"class":288,"line":434},[286,1271,339],{"class":296},[286,1273,397],{"class":292},[286,1275,275],{"class":296},[286,1277,1278],{"class":299}," Build and deploy\n",[286,1280,1281,1283],{"class":288,"line":446},[286,1282,477],{"class":292},[286,1284,317],{"class":296},[286,1286,1287,1289,1291],{"class":288,"line":452},[286,1288,485],{"class":292},[286,1290,275],{"class":296},[286,1292,490],{"class":299},[286,1294,1295,1297,1299],{"class":288,"line":458},[286,1296,496],{"class":292},[286,1298,275],{"class":296},[286,1300,501],{"class":299},[286,1302,1303,1305,1307],{"class":288,"line":463},[286,1304,437],{"class":292},[286,1306,275],{"class":296},[286,1308,443],{"class":442},[286,1310,1311],{"class":288,"line":474},[286,1312,1313],{"class":299},"          VERSION=${{ github.event.release.tag_name }}\n",[286,1315,1316],{"class":288,"line":482},[286,1317,1318],{"class":299},"          docker build -t my-app:$VERSION .\n",[286,1320,1321],{"class":288,"line":493},[286,1322,832],{"class":299},[286,1324,1325],{"class":288,"line":504},[286,1326,516],{"class":299},[286,1328,1329],{"class":288,"line":513},[286,1330,1331],{"class":299},"            --name my-app-$VERSION \\\n",[286,1333,1334],{"class":288,"line":519},[286,1335,528],{"class":299},[286,1337,1338],{"class":288,"line":525},[286,1339,1340],{"class":299},"            my-app:$VERSION\n",[218,1342,1344],{"id":1343},"pm2-deployment","PM2 Deployment",[277,1346,1348],{"className":279,"code":1347,"language":281,"meta":282,"style":282},"name: Deploy Node.js App\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout code\n        uses: actions\u002Fcheckout@v3\n      \n      - name: Set up Node.js\n        uses: actions\u002Fsetup-node@v3\n        with:\n          node-version: '18'\n      \n      - name: Install dependencies\n        run: npm ci\n      \n      - name: Deploy to SkyPort\n        env:\n          SKYPORT_TOKEN: ${{ secrets.SKYPORT_TOKEN }}\n          SKYPORT_SERVER: https:\u002F\u002Fskyport.example.com\n        run: |\n          skyport pm2 stop app || true\n          skyport pm2 delete app || true\n          \n          skyport pm2 start ecosystem.config.js --env production\n",[255,1349,1350,1359,1363,1369,1375,1381,1387,1391,1397,1403,1411,1415,1421,1431,1439,1443,1454,1463,1469,1485,1489,1500,1509,1513,1523,1529,1537,1545,1553,1558,1563,1567],{"__ignoreMap":282},[286,1351,1352,1354,1356],{"class":288,"line":289},[286,1353,293],{"class":292},[286,1355,275],{"class":296},[286,1357,1358],{"class":299}," Deploy Node.js App\n",[286,1360,1361],{"class":288,"line":303},[286,1362,307],{"emptyLinePlaceholder":306},[286,1364,1365,1367],{"class":288,"line":310},[286,1366,314],{"class":313},[286,1368,317],{"class":296},[286,1370,1371,1373],{"class":288,"line":320},[286,1372,323],{"class":292},[286,1374,317],{"class":296},[286,1376,1377,1379],{"class":288,"line":328},[286,1378,331],{"class":292},[286,1380,317],{"class":296},[286,1382,1383,1385],{"class":288,"line":336},[286,1384,339],{"class":296},[286,1386,342],{"class":299},[286,1388,1389],{"class":288,"line":345},[286,1390,307],{"emptyLinePlaceholder":306},[286,1392,1393,1395],{"class":288,"line":350},[286,1394,353],{"class":292},[286,1396,317],{"class":296},[286,1398,1399,1401],{"class":288,"line":358},[286,1400,361],{"class":292},[286,1402,317],{"class":296},[286,1404,1405,1407,1409],{"class":288,"line":366},[286,1406,369],{"class":292},[286,1408,275],{"class":296},[286,1410,374],{"class":299},[286,1412,1413],{"class":288,"line":377},[286,1414,381],{"class":380},[286,1416,1417,1419],{"class":288,"line":384},[286,1418,387],{"class":292},[286,1420,317],{"class":296},[286,1422,1423,1425,1427,1429],{"class":288,"line":392},[286,1424,339],{"class":296},[286,1426,397],{"class":292},[286,1428,275],{"class":296},[286,1430,402],{"class":299},[286,1432,1433,1435,1437],{"class":288,"line":405},[286,1434,408],{"class":292},[286,1436,275],{"class":296},[286,1438,413],{"class":299},[286,1440,1441],{"class":288,"line":416},[286,1442,419],{"class":380},[286,1444,1445,1447,1449,1451],{"class":288,"line":422},[286,1446,339],{"class":296},[286,1448,397],{"class":292},[286,1450,275],{"class":296},[286,1452,1453],{"class":299}," Set up Node.js\n",[286,1455,1456,1458,1460],{"class":288,"line":434},[286,1457,408],{"class":292},[286,1459,275],{"class":296},[286,1461,1462],{"class":299}," actions\u002Fsetup-node@v3\n",[286,1464,1465,1467],{"class":288,"line":446},[286,1466,685],{"class":292},[286,1468,317],{"class":296},[286,1470,1471,1474,1476,1479,1482],{"class":288,"line":452},[286,1472,1473],{"class":292},"          node-version",[286,1475,275],{"class":296},[286,1477,1478],{"class":296}," '",[286,1480,1481],{"class":299},"18",[286,1483,1484],{"class":296},"'\n",[286,1486,1487],{"class":288,"line":458},[286,1488,419],{"class":380},[286,1490,1491,1493,1495,1497],{"class":288,"line":463},[286,1492,339],{"class":296},[286,1494,397],{"class":292},[286,1496,275],{"class":296},[286,1498,1499],{"class":299}," Install dependencies\n",[286,1501,1502,1504,1506],{"class":288,"line":474},[286,1503,437],{"class":292},[286,1505,275],{"class":296},[286,1507,1508],{"class":299}," npm ci\n",[286,1510,1511],{"class":288,"line":482},[286,1512,419],{"class":380},[286,1514,1515,1517,1519,1521],{"class":288,"line":493},[286,1516,339],{"class":296},[286,1518,397],{"class":292},[286,1520,275],{"class":296},[286,1522,300],{"class":299},[286,1524,1525,1527],{"class":288,"line":504},[286,1526,477],{"class":292},[286,1528,317],{"class":296},[286,1530,1531,1533,1535],{"class":288,"line":513},[286,1532,485],{"class":292},[286,1534,275],{"class":296},[286,1536,490],{"class":299},[286,1538,1539,1541,1543],{"class":288,"line":519},[286,1540,496],{"class":292},[286,1542,275],{"class":296},[286,1544,501],{"class":299},[286,1546,1547,1549,1551],{"class":288,"line":525},[286,1548,437],{"class":292},[286,1550,275],{"class":296},[286,1552,443],{"class":442},[286,1554,1555],{"class":288,"line":531},[286,1556,1557],{"class":299},"          skyport pm2 stop app || true\n",[286,1559,1560],{"class":288,"line":760},[286,1561,1562],{"class":299},"          skyport pm2 delete app || true\n",[286,1564,1565],{"class":288,"line":765},[286,1566,832],{"class":299},[286,1568,1569],{"class":288,"line":777},[286,1570,1571],{"class":299},"          skyport pm2 start ecosystem.config.js --env production\n",[218,1573,1575],{"id":1574},"secrets-management","Secrets Management",[214,1577,1578],{},"Set up secrets in GitHub:",[243,1580,1581,1584,1587],{},[226,1582,1583],{},"Go to repository Settings → Secrets and variables → Actions",[226,1585,1586],{},"Click \"New repository secret\"",[226,1588,1589,1590],{},"Add secrets:\n",[223,1591,1592,1596,1601,1607],{},[226,1593,1594],{},[255,1595,264],{},[226,1597,1598],{},[255,1599,1600],{},"SKYPORT_SERVER",[226,1602,1603,1606],{},[255,1604,1605],{},"REGISTRY_USERNAME"," (if using registry)",[226,1608,1609,1606],{},[255,1610,1611],{},"REGISTRY_PASSWORD",[218,1613,1615],{"id":1614},"notifications","Notifications",[214,1617,1618],{},"Add Slack notifications:",[277,1620,1622],{"className":279,"code":1621,"language":281,"meta":282,"style":282},"- name: Notify Slack on success\n  if: success()\n  uses: 8398a7\u002Faction-slack@v3\n  with:\n    status: ${{ job.status }}\n    text: 'Deployment to ${{ matrix.environment.name }} succeeded'\n    webhook_url: ${{ secrets.SLACK_WEBHOOK }}\n\n- name: Notify Slack on failure\n  if: failure()\n  uses: 8398a7\u002Faction-slack@v3\n  with:\n    status: ${{ job.status }}\n    text: 'Deployment to ${{ matrix.environment.name }} failed'\n    webhook_url: ${{ secrets.SLACK_WEBHOOK }}\n",[255,1623,1624,1636,1646,1656,1663,1673,1687,1697,1701,1712,1721,1729,1735,1743,1756],{"__ignoreMap":282},[286,1625,1626,1629,1631,1633],{"class":288,"line":289},[286,1627,1628],{"class":296},"-",[286,1630,397],{"class":292},[286,1632,275],{"class":296},[286,1634,1635],{"class":299}," Notify Slack on success\n",[286,1637,1638,1641,1643],{"class":288,"line":303},[286,1639,1640],{"class":292},"  if",[286,1642,275],{"class":296},[286,1644,1645],{"class":299}," success()\n",[286,1647,1648,1651,1653],{"class":288,"line":310},[286,1649,1650],{"class":292},"  uses",[286,1652,275],{"class":296},[286,1654,1655],{"class":299}," 8398a7\u002Faction-slack@v3\n",[286,1657,1658,1661],{"class":288,"line":320},[286,1659,1660],{"class":292},"  with",[286,1662,317],{"class":296},[286,1664,1665,1668,1670],{"class":288,"line":328},[286,1666,1667],{"class":292},"    status",[286,1669,275],{"class":296},[286,1671,1672],{"class":299}," ${{ job.status }}\n",[286,1674,1675,1678,1680,1682,1685],{"class":288,"line":336},[286,1676,1677],{"class":292},"    text",[286,1679,275],{"class":296},[286,1681,1478],{"class":296},[286,1683,1684],{"class":299},"Deployment to ${{ matrix.environment.name }} succeeded",[286,1686,1484],{"class":296},[286,1688,1689,1692,1694],{"class":288,"line":345},[286,1690,1691],{"class":292},"    webhook_url",[286,1693,275],{"class":296},[286,1695,1696],{"class":299}," ${{ secrets.SLACK_WEBHOOK }}\n",[286,1698,1699],{"class":288,"line":350},[286,1700,307],{"emptyLinePlaceholder":306},[286,1702,1703,1705,1707,1709],{"class":288,"line":358},[286,1704,1628],{"class":296},[286,1706,397],{"class":292},[286,1708,275],{"class":296},[286,1710,1711],{"class":299}," Notify Slack on failure\n",[286,1713,1714,1716,1718],{"class":288,"line":366},[286,1715,1640],{"class":292},[286,1717,275],{"class":296},[286,1719,1720],{"class":299}," failure()\n",[286,1722,1723,1725,1727],{"class":288,"line":377},[286,1724,1650],{"class":292},[286,1726,275],{"class":296},[286,1728,1655],{"class":299},[286,1730,1731,1733],{"class":288,"line":384},[286,1732,1660],{"class":292},[286,1734,317],{"class":296},[286,1736,1737,1739,1741],{"class":288,"line":392},[286,1738,1667],{"class":292},[286,1740,275],{"class":296},[286,1742,1672],{"class":299},[286,1744,1745,1747,1749,1751,1754],{"class":288,"line":405},[286,1746,1677],{"class":292},[286,1748,275],{"class":296},[286,1750,1478],{"class":296},[286,1752,1753],{"class":299},"Deployment to ${{ matrix.environment.name }} failed",[286,1755,1484],{"class":296},[286,1757,1758,1760,1762],{"class":288,"line":416},[286,1759,1691],{"class":292},[286,1761,275],{"class":296},[286,1763,1696],{"class":299},[218,1765,1767],{"id":1766},"best-practices","Best Practices",[223,1769,1770,1773,1776,1779,1782,1785,1788],{},[226,1771,1772],{},"Use branch protection rules",[226,1774,1775],{},"Require PR reviews before deployment",[226,1777,1778],{},"Use environment secrets for production",[226,1780,1781],{},"Implement health checks after deploy",[226,1783,1784],{},"Set up rollback on failure",[226,1786,1787],{},"Log all deployments",[226,1789,1790],{},"Use semantic versioning",[1792,1793],"hr",{},[214,1795,1796,1800,1801,1804,1805],{},[1797,1798,1799],"strong",{},"Next",": ",[1802,1803,150],"a",{"href":151}," | ",[1802,1806,154],{"href":155},[1808,1809,1810],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}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);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":282,"searchDepth":303,"depth":303,"links":1812},[1813,1814,1815,1816,1817,1818,1819,1820,1821,1822],{"id":220,"depth":303,"text":221},{"id":237,"depth":303,"text":238},{"id":267,"depth":303,"text":268},{"id":537,"depth":303,"text":538},{"id":861,"depth":303,"text":862},{"id":1147,"depth":303,"text":1148},{"id":1343,"depth":303,"text":1344},{"id":1574,"depth":303,"text":1575},{"id":1614,"depth":303,"text":1615},{"id":1766,"depth":303,"text":1767},"Automate deployments with GitHub Actions and SkyPort","md",null,{},{"title":158,"description":1823},"cs1QANckGRyXAzKh0XHuCjF27tHwMW8JleIFIlCEdqk",[1830,1832],{"title":154,"path":155,"stem":156,"description":1831,"children":-1},"Scale applications horizontally and vertically",{"title":162,"path":163,"stem":164,"description":1833,"children":-1},"Security best practices for SkyPort deployments",1778858462169]