[{"data":1,"prerenderedAt":2358},["ShallowReactive",2],{"navigation":3,"/docs/advanced/adding-other-services":285,"/docs/advanced/adding-other-services-surround":2353},[4],{"title":5,"path":6,"stem":7,"children":8},"Introduction","/docs","docs/1.index",[9,10,36,53,70,83,100,121,138,155,176],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"children":14,"page":35},"Installation","/docs/installation","docs/1.installation",[15,19,23,27,31],{"title":16,"path":17,"stem":18},"Install to macOS","/docs/installation/install-macos","docs/1.installation/1.install-macos",{"title":20,"path":21,"stem":22},"Install to Windows","/docs/installation/install-windows","docs/1.installation/2.install-windows",{"title":24,"path":25,"stem":26},"Install to Linux","/docs/installation/install-linux","docs/1.installation/3.install-linux",{"title":28,"path":29,"stem":30},"Install via Composer","/docs/installation/install-composer","docs/1.installation/4.install-composer",{"title":32,"path":33,"stem":34},"Install via NPM/Yarn","/docs/installation/install-npm-yarn","docs/1.installation/5.install-npm-yarn",false,{"title":37,"path":38,"stem":39,"children":40,"page":35},"Community","/docs/community","docs/11.community",[41,45,49],{"title":42,"path":43,"stem":44},"Get Help","/docs/community/get-help","docs/11.community/1.get-help",{"title":46,"path":47,"stem":48},"Testing New Releases","/docs/community/testing","docs/11.community/2.testing",{"title":50,"path":51,"stem":52},"Contributing","/docs/community/contributing","docs/11.community/3.contributing",{"title":54,"path":55,"stem":56,"children":57,"page":35},"Getting Started","/docs/getting-started","docs/2.getting-started",[58,62,66],{"title":59,"path":60,"stem":61},"How Spin Works","/docs/getting-started/how-spin-works","docs/2.getting-started/1.how-spin-works",{"title":63,"path":64,"stem":65},"Create a New Project with Spin","/docs/getting-started/create-a-new-project-with-spin","docs/2.getting-started/2.create-a-new-project-with-spin",{"title":67,"path":68,"stem":69},"Add Spin to an Existing Project","/docs/getting-started/add-spin-to-an-existing-project","docs/2.getting-started/3.add-spin-to-an-existing-project",{"title":71,"path":72,"stem":73,"children":74,"page":35},"Development Environment","/docs/development-environment","docs/3.development-environment",[75,79],{"title":76,"path":77,"stem":78},"Starting Up Your Development Environment","/docs/development-environment/starting-up-your-development-environment","docs/3.development-environment/1.starting-up-your-development-environment",{"title":80,"path":81,"stem":82},"Running Commands in Development","/docs/development-environment/running-commands-in-development","docs/3.development-environment/2.running-commands-in-development",{"title":84,"path":85,"stem":86,"children":87,"page":35},"Server Configuration","/docs/server-configuration","docs/4.server-configuration",[88,92,96],{"title":89,"path":90,"stem":91},"Server Requirements","/docs/server-configuration/server-requirements","docs/4.server-configuration/1.server-requirements",{"title":93,"path":94,"stem":95},"Server Configuration Basics","/docs/server-configuration/server-configuration-basics","docs/4.server-configuration/2.server-configuration-basics",{"title":97,"path":98,"stem":99},".spin.yml Usage","/docs/server-configuration/spin-yml-usage","docs/4.server-configuration/3.spin-yml-usage",{"title":101,"path":102,"stem":103,"children":104,"page":35},"Providers","/docs/providers","docs/5.providers",[105,109,113,117],{"title":106,"path":107,"stem":108},"DigitalOcean","/docs/providers/digitalocean","docs/5.providers/0.digitalocean",{"title":110,"path":111,"stem":112},"Hetzner","/docs/providers/hetzner","docs/5.providers/0.hetzner",{"title":114,"path":115,"stem":116},"Vultr","/docs/providers/vultr","docs/5.providers/0.vultr",{"title":118,"path":119,"stem":120},"Use Any Host","/docs/providers/use-any-host","docs/5.providers/99.use-any-host",{"title":122,"path":123,"stem":124,"children":125,"page":35},"Deployment","/docs/deployment","docs/6.deployment",[126,130,134],{"title":127,"path":128,"stem":129},"Choosing a Deployment Strategy","/docs/deployment/choosing-a-deployment-strategy","docs/6.deployment/1.choosing-a-deployment-strategy",{"title":131,"path":132,"stem":133},"Automated Deployments with GitHub Actions","/docs/deployment/automated-deployments-with-github-actions","docs/6.deployment/2.automated-deployments-with-github-actions",{"title":135,"path":136,"stem":137},"Using \"spin deploy\"","/docs/deployment/using-spin-deploy","docs/6.deployment/3.using-spin-deploy",{"title":139,"path":140,"stem":141,"children":142,"page":35},"Server Access","/docs/server-access","docs/7.server-access",[143,147,151],{"title":144,"path":145,"stem":146},"Connecting to Your Server","/docs/server-access/connecting-to-your-server","docs/7.server-access/1.connecting-to-your-server",{"title":148,"path":149,"stem":150},"Troubleshooting Your Application","/docs/server-access/troubleshooting-your-application","docs/7.server-access/2.troubleshooting-your-application",{"title":152,"path":153,"stem":154},"Updating Your Server","/docs/server-access/updating-your-server","docs/7.server-access/3.updating-your-server",{"title":156,"path":157,"stem":158,"children":159,"page":35},"Advanced","/docs/advanced","docs/8.advanced",[160,164,168,172],{"title":161,"path":162,"stem":163},"Generating a Secure SSH Key","/docs/advanced/generating-a-secure-ssh-key","docs/8.advanced/2.generating-a-secure-ssh-key",{"title":165,"path":166,"stem":167},"Adding Other Services","/docs/advanced/adding-other-services","docs/8.advanced/3.adding-other-services",{"title":169,"path":170,"stem":171},"Create your own Spin Template","/docs/advanced/create-your-own-template","docs/8.advanced/99.create-your-own-template",{"title":173,"path":174,"stem":175},"Migrating from Spin v2 to v3","/docs/advanced/migrating-from-spin-v2-to-v3","docs/8.advanced/migrating-from-spin-v2-to-v3",{"title":177,"path":178,"stem":179,"children":180,"page":35},"Command Reference","/docs/command-reference","docs/9.command-reference",[181,185,189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257,261,265,269,273,277,281],{"title":182,"path":183,"stem":184},"base64","/docs/command-reference/base64","docs/9.command-reference/base64",{"title":186,"path":187,"stem":188},"build","/docs/command-reference/build","docs/9.command-reference/build",{"title":190,"path":191,"stem":192},"configure","/docs/command-reference/configure","docs/9.command-reference/configure",{"title":194,"path":195,"stem":196},"debug","/docs/command-reference/debug","docs/9.command-reference/debug",{"title":198,"path":199,"stem":200},"deploy","/docs/command-reference/deploy","docs/9.command-reference/deploy",{"title":202,"path":203,"stem":204},"down","/docs/command-reference/down","docs/9.command-reference/down",{"title":206,"path":207,"stem":208},"exec","/docs/command-reference/exec","docs/9.command-reference/exec",{"title":210,"path":211,"stem":212},"gh","/docs/command-reference/gh","docs/9.command-reference/gh",{"title":214,"path":215,"stem":216},"help","/docs/command-reference/help","docs/9.command-reference/help",{"title":218,"path":219,"stem":220},"init","/docs/command-reference/init","docs/9.command-reference/init",{"title":222,"path":223,"stem":224},"kill","/docs/command-reference/kill","docs/9.command-reference/kill",{"title":226,"path":227,"stem":228},"latest","/docs/command-reference/latest","docs/9.command-reference/latest",{"title":230,"path":231,"stem":232},"logs","/docs/command-reference/logs","docs/9.command-reference/logs",{"title":234,"path":235,"stem":236},"maintain","/docs/command-reference/maintain","docs/9.command-reference/maintain",{"title":238,"path":239,"stem":240},"mkpasswd","/docs/command-reference/mkpasswd","docs/9.command-reference/mkpasswd",{"title":242,"path":243,"stem":244},"new","/docs/command-reference/new","docs/9.command-reference/new",{"title":246,"path":247,"stem":248},"provision","/docs/command-reference/provision","docs/9.command-reference/provision",{"title":250,"path":251,"stem":252},"prune","/docs/command-reference/prune","docs/9.command-reference/prune",{"title":254,"path":255,"stem":256},"ps","/docs/command-reference/ps","docs/9.command-reference/ps",{"title":258,"path":259,"stem":260},"pull","/docs/command-reference/pull","docs/9.command-reference/pull",{"title":262,"path":263,"stem":264},"run","/docs/command-reference/run","docs/9.command-reference/run",{"title":266,"path":267,"stem":268},"stop","/docs/command-reference/stop","docs/9.command-reference/stop",{"title":270,"path":271,"stem":272},"up","/docs/command-reference/up","docs/9.command-reference/up",{"title":274,"path":275,"stem":276},"update","/docs/command-reference/update","docs/9.command-reference/update",{"title":278,"path":279,"stem":280},"vault","/docs/command-reference/vault","docs/9.command-reference/vault",{"title":282,"path":283,"stem":284},"version","/docs/command-reference/version","docs/9.command-reference/version",{"id":286,"title":165,"body":287,"canonical":2344,"description":2345,"extension":2346,"layout":2347,"meta":2348,"navigation":529,"path":166,"seo":2351,"stem":167,"__hash__":2352},"docs/docs/8.advanced/3.adding-other-services.md",{"type":288,"value":289,"toc":2333},"minimark",[290,297,302,305,308,331,335,383,547,551,598,680,684,713,841,845,882,973,978,984,988,991,1070,1077,1081,1093,1106,1155,1294,1405,1408,1411,1477,1481,1508,1596,1600,1609,1636,1742,1745,1747,1823,1827,1830,1857,1963,2208,2305,2309,2329],[291,292,293],"lead-p",{},[294,295,296],"p",{},"Since Spin is based off of Docker Compose and Docker Swarm Mode, the possibilities are endless when it comes to expanding your infrastructure with Spin.",[298,299,301],"h2",{"id":300},"important-notes","Important Notes",[294,303,304],{},"Every infrastructure configuration is unique and you should always prioritize security when applying configurations. Be sure to encrypt secrets where possible, but for demonstration purposes we will show you examples in plain text.",[294,306,307],{},"We make a few assumptions in our examples below:",[309,310,311,320],"ul",{},[312,313,314,315,319],"li",{},"Your development network is called ",[316,317,318],"code",{},"development"," and properly created in your Docker Compose file",[312,321,322,323,326,327,330],{},"You have the proper configurations made available in your ",[316,324,325],{},".infrastructure"," folder with the ",[316,328,329],{},".gitignore"," properly configured",[298,332,334],{"id":333},"mariadb","MariaDB",[336,337,343],"pre",{"className":338,"code":339,"filename":340,"language":341,"meta":342,"style":342},"language-yml shiki shiki-themes material-theme-lighter github-dark github-dark","services:\n  mariadb: \n    image: mariadb:11.4\n","\"Example: docker-compose.yml\"","yml","",[316,344,345,358,371],{"__ignoreMap":342},[346,347,350,354],"span",{"class":348,"line":349},"line",1,[346,351,353],{"class":352},"sqIbZ","services",[346,355,357],{"class":356},"sG-J9",":\n",[346,359,361,364,367],{"class":348,"line":360},2,[346,362,363],{"class":352},"  mariadb",[346,365,366],{"class":356},":",[346,368,370],{"class":369},"sMo7A"," \n",[346,372,374,377,379],{"class":348,"line":373},3,[346,375,376],{"class":352},"    image",[346,378,366],{"class":356},[346,380,382],{"class":381},"s0vBq"," mariadb:11.4\n",[336,384,387],{"className":338,"code":385,"filename":386,"language":341,"meta":342,"style":342},"services:\n  mariadb:\n    networks:\n      - development\n    volumes:\n      - ./.infrastructure/volume_data/mariadb/database_data/:/var/lib/mysql\n    environment:\n        MYSQL_ROOT_PASSWORD: \"rootpassword\"\n        MYSQL_DATABASE: \"laravel\"\n        MYSQL_USER: \"mysqluser\"\n        MYSQL_PASSWORD: \"mysqlpassword\"\n    ports:\n      - \"3306:3306\"\n\nnetworks:\n  development:\n","\"Example: docker-compose.dev.yml\"",[316,388,389,395,401,408,417,425,433,441,459,474,489,504,512,524,531,539],{"__ignoreMap":342},[346,390,391,393],{"class":348,"line":349},[346,392,353],{"class":352},[346,394,357],{"class":356},[346,396,397,399],{"class":348,"line":360},[346,398,363],{"class":352},[346,400,357],{"class":356},[346,402,403,406],{"class":348,"line":373},[346,404,405],{"class":352},"    networks",[346,407,357],{"class":356},[346,409,411,414],{"class":348,"line":410},4,[346,412,413],{"class":356},"      -",[346,415,416],{"class":381}," development\n",[346,418,420,423],{"class":348,"line":419},5,[346,421,422],{"class":352},"    volumes",[346,424,357],{"class":356},[346,426,428,430],{"class":348,"line":427},6,[346,429,413],{"class":356},[346,431,432],{"class":381}," ./.infrastructure/volume_data/mariadb/database_data/:/var/lib/mysql\n",[346,434,436,439],{"class":348,"line":435},7,[346,437,438],{"class":352},"    environment",[346,440,357],{"class":356},[346,442,444,447,449,453,456],{"class":348,"line":443},8,[346,445,446],{"class":352},"        MYSQL_ROOT_PASSWORD",[346,448,366],{"class":356},[346,450,452],{"class":451},"sF_wb"," \"",[346,454,455],{"class":381},"rootpassword",[346,457,458],{"class":451},"\"\n",[346,460,462,465,467,469,472],{"class":348,"line":461},9,[346,463,464],{"class":352},"        MYSQL_DATABASE",[346,466,366],{"class":356},[346,468,452],{"class":451},[346,470,471],{"class":381},"laravel",[346,473,458],{"class":451},[346,475,477,480,482,484,487],{"class":348,"line":476},10,[346,478,479],{"class":352},"        MYSQL_USER",[346,481,366],{"class":356},[346,483,452],{"class":451},[346,485,486],{"class":381},"mysqluser",[346,488,458],{"class":451},[346,490,492,495,497,499,502],{"class":348,"line":491},11,[346,493,494],{"class":352},"        MYSQL_PASSWORD",[346,496,366],{"class":356},[346,498,452],{"class":451},[346,500,501],{"class":381},"mysqlpassword",[346,503,458],{"class":451},[346,505,507,510],{"class":348,"line":506},12,[346,508,509],{"class":352},"    ports",[346,511,357],{"class":356},[346,513,515,517,519,522],{"class":348,"line":514},13,[346,516,413],{"class":356},[346,518,452],{"class":451},[346,520,521],{"class":381},"3306:3306",[346,523,458],{"class":451},[346,525,527],{"class":348,"line":526},14,[346,528,530],{"emptyLinePlaceholder":529},true,"\n",[346,532,534,537],{"class":348,"line":533},15,[346,535,536],{"class":352},"networks",[346,538,357],{"class":356},[346,540,542,545],{"class":348,"line":541},16,[346,543,544],{"class":352},"  development",[346,546,357],{"class":356},[298,548,550],{"id":549},"meilisearch","MeiliSearch",[336,552,554],{"className":338,"code":553,"filename":340,"language":341,"meta":342,"style":342},"services:\n  meilisearch:\n    image: getmeili/meilisearch:v1.9\n    environment:\n      MEILI_NO_ANALYTICS: \"true\"\n",[316,555,556,562,569,578,584],{"__ignoreMap":342},[346,557,558,560],{"class":348,"line":349},[346,559,353],{"class":352},[346,561,357],{"class":356},[346,563,564,567],{"class":348,"line":360},[346,565,566],{"class":352},"  meilisearch",[346,568,357],{"class":356},[346,570,571,573,575],{"class":348,"line":373},[346,572,376],{"class":352},[346,574,366],{"class":356},[346,576,577],{"class":381}," getmeili/meilisearch:v1.9\n",[346,579,580,582],{"class":348,"line":410},[346,581,438],{"class":352},[346,583,357],{"class":356},[346,585,586,589,591,593,596],{"class":348,"line":419},[346,587,588],{"class":352},"      MEILI_NO_ANALYTICS",[346,590,366],{"class":356},[346,592,452],{"class":451},[346,594,595],{"class":381},"true",[346,597,458],{"class":451},[336,599,601],{"className":338,"code":600,"filename":386,"language":341,"meta":342,"style":342},"services:\n  meilisearch:\n    environment: \n      MEILI_MASTER_KEY: \"masterKey\"\n    volumes: \n      - ./.infrastructure/volume_data/meilisearch/meilisearch_data:/meili_data:cached\n    networks:\n      - development\n\nnetworks:\n  development:\n",[316,602,603,609,615,623,637,645,652,658,664,668,674],{"__ignoreMap":342},[346,604,605,607],{"class":348,"line":349},[346,606,353],{"class":352},[346,608,357],{"class":356},[346,610,611,613],{"class":348,"line":360},[346,612,566],{"class":352},[346,614,357],{"class":356},[346,616,617,619,621],{"class":348,"line":373},[346,618,438],{"class":352},[346,620,366],{"class":356},[346,622,370],{"class":369},[346,624,625,628,630,632,635],{"class":348,"line":410},[346,626,627],{"class":352},"      MEILI_MASTER_KEY",[346,629,366],{"class":356},[346,631,452],{"class":451},[346,633,634],{"class":381},"masterKey",[346,636,458],{"class":451},[346,638,639,641,643],{"class":348,"line":419},[346,640,422],{"class":352},[346,642,366],{"class":356},[346,644,370],{"class":369},[346,646,647,649],{"class":348,"line":427},[346,648,413],{"class":356},[346,650,651],{"class":381}," ./.infrastructure/volume_data/meilisearch/meilisearch_data:/meili_data:cached\n",[346,653,654,656],{"class":348,"line":435},[346,655,405],{"class":352},[346,657,357],{"class":356},[346,659,660,662],{"class":348,"line":443},[346,661,413],{"class":356},[346,663,416],{"class":381},[346,665,666],{"class":348,"line":461},[346,667,530],{"emptyLinePlaceholder":529},[346,669,670,672],{"class":348,"line":476},[346,671,536],{"class":352},[346,673,357],{"class":356},[346,675,676,678],{"class":348,"line":491},[346,677,544],{"class":352},[346,679,357],{"class":356},[298,681,683],{"id":682},"mysql","MySQL",[336,685,687],{"className":338,"code":686,"filename":340,"language":341,"meta":342,"style":342},"services:\n  mysql: \n    image: mysql:8.4\n",[316,688,689,695,704],{"__ignoreMap":342},[346,690,691,693],{"class":348,"line":349},[346,692,353],{"class":352},[346,694,357],{"class":356},[346,696,697,700,702],{"class":348,"line":360},[346,698,699],{"class":352},"  mysql",[346,701,366],{"class":356},[346,703,370],{"class":369},[346,705,706,708,710],{"class":348,"line":373},[346,707,376],{"class":352},[346,709,366],{"class":356},[346,711,712],{"class":381}," mysql:8.4\n",[336,714,716],{"className":338,"code":715,"filename":386,"language":341,"meta":342,"style":342},"services:\n  mysql:\n    networks:\n      - development\n    volumes:\n      - ./.infrastructure/volume_data/mysql/database_data/:/var/lib/mysql\n    environment:\n        MYSQL_ROOT_PASSWORD: \"rootpassword\"\n        MYSQL_DATABASE: \"laravel\"\n        MYSQL_USER: \"mysqluser\"\n        MYSQL_PASSWORD: \"mysqlpassword\"\n    ports:\n      - \"3306:3306\"\n\nnetworks:\n  development:\n",[316,717,718,724,730,736,742,748,755,761,773,785,797,809,815,825,829,835],{"__ignoreMap":342},[346,719,720,722],{"class":348,"line":349},[346,721,353],{"class":352},[346,723,357],{"class":356},[346,725,726,728],{"class":348,"line":360},[346,727,699],{"class":352},[346,729,357],{"class":356},[346,731,732,734],{"class":348,"line":373},[346,733,405],{"class":352},[346,735,357],{"class":356},[346,737,738,740],{"class":348,"line":410},[346,739,413],{"class":356},[346,741,416],{"class":381},[346,743,744,746],{"class":348,"line":419},[346,745,422],{"class":352},[346,747,357],{"class":356},[346,749,750,752],{"class":348,"line":427},[346,751,413],{"class":356},[346,753,754],{"class":381}," ./.infrastructure/volume_data/mysql/database_data/:/var/lib/mysql\n",[346,756,757,759],{"class":348,"line":435},[346,758,438],{"class":352},[346,760,357],{"class":356},[346,762,763,765,767,769,771],{"class":348,"line":443},[346,764,446],{"class":352},[346,766,366],{"class":356},[346,768,452],{"class":451},[346,770,455],{"class":381},[346,772,458],{"class":451},[346,774,775,777,779,781,783],{"class":348,"line":461},[346,776,464],{"class":352},[346,778,366],{"class":356},[346,780,452],{"class":451},[346,782,471],{"class":381},[346,784,458],{"class":451},[346,786,787,789,791,793,795],{"class":348,"line":476},[346,788,479],{"class":352},[346,790,366],{"class":356},[346,792,452],{"class":451},[346,794,486],{"class":381},[346,796,458],{"class":451},[346,798,799,801,803,805,807],{"class":348,"line":491},[346,800,494],{"class":352},[346,802,366],{"class":356},[346,804,452],{"class":451},[346,806,501],{"class":381},[346,808,458],{"class":451},[346,810,811,813],{"class":348,"line":506},[346,812,509],{"class":352},[346,814,357],{"class":356},[346,816,817,819,821,823],{"class":348,"line":514},[346,818,413],{"class":356},[346,820,452],{"class":451},[346,822,521],{"class":381},[346,824,458],{"class":451},[346,826,827],{"class":348,"line":526},[346,828,530],{"emptyLinePlaceholder":529},[346,830,831,833],{"class":348,"line":533},[346,832,536],{"class":352},[346,834,357],{"class":356},[346,836,837,839],{"class":348,"line":541},[346,838,544],{"class":352},[346,840,357],{"class":356},[298,842,844],{"id":843},"node","Node",[336,846,848],{"className":338,"code":847,"filename":340,"language":341,"meta":342,"style":342},"services:\n  node:\n    image: node:20\n    working_dir: /usr/src/app\n\n",[316,849,850,856,863,872],{"__ignoreMap":342},[346,851,852,854],{"class":348,"line":349},[346,853,353],{"class":352},[346,855,357],{"class":356},[346,857,858,861],{"class":348,"line":360},[346,859,860],{"class":352},"  node",[346,862,357],{"class":356},[346,864,865,867,869],{"class":348,"line":373},[346,866,376],{"class":352},[346,868,366],{"class":356},[346,870,871],{"class":381}," node:20\n",[346,873,874,877,879],{"class":348,"line":410},[346,875,876],{"class":352},"    working_dir",[346,878,366],{"class":356},[346,880,881],{"class":381}," /usr/src/app\n",[336,883,885],{"className":338,"code":884,"filename":386,"language":341,"meta":342,"style":342},"services:\n  node:\n    command: \"yarn dev\"\n    volumes:\n      - .:/usr/src/app:cached\n    networks: \n      - development\n    ports:\n      - 3000:3000 # Remove the ports if you are using something like Trafeik or Caddy (recommended)\n\nnetworks:\n  development:\n",[316,886,887,893,899,913,919,926,934,940,946,957,961,967],{"__ignoreMap":342},[346,888,889,891],{"class":348,"line":349},[346,890,353],{"class":352},[346,892,357],{"class":356},[346,894,895,897],{"class":348,"line":360},[346,896,860],{"class":352},[346,898,357],{"class":356},[346,900,901,904,906,908,911],{"class":348,"line":373},[346,902,903],{"class":352},"    command",[346,905,366],{"class":356},[346,907,452],{"class":451},[346,909,910],{"class":381},"yarn dev",[346,912,458],{"class":451},[346,914,915,917],{"class":348,"line":410},[346,916,422],{"class":352},[346,918,357],{"class":356},[346,920,921,923],{"class":348,"line":419},[346,922,413],{"class":356},[346,924,925],{"class":381}," .:/usr/src/app:cached\n",[346,927,928,930,932],{"class":348,"line":427},[346,929,405],{"class":352},[346,931,366],{"class":356},[346,933,370],{"class":369},[346,935,936,938],{"class":348,"line":435},[346,937,413],{"class":356},[346,939,416],{"class":381},[346,941,942,944],{"class":348,"line":443},[346,943,509],{"class":352},[346,945,357],{"class":356},[346,947,948,950,953],{"class":348,"line":461},[346,949,413],{"class":356},[346,951,952],{"class":381}," 3000:3000",[346,954,956],{"class":955},"sutJx"," # Remove the ports if you are using something like Trafeik or Caddy (recommended)\n",[346,958,959],{"class":348,"line":476},[346,960,530],{"emptyLinePlaceholder":529},[346,962,963,965],{"class":348,"line":491},[346,964,536],{"class":352},[346,966,357],{"class":356},[346,968,969,971],{"class":348,"line":506},[346,970,544],{"class":352},[346,972,357],{"class":356},[974,975,977],"h4",{"id":976},"commands","Commands",[294,979,980,981,983],{},"You can see the \"command:\" calls to run ",[316,982,910],{},". This may need to be changed, depending on your project (and if you are using npm or yarn). Feel free to remove this command if you prefer to run the commands manually.",[974,985,987],{"id":986},"using-with-traefik","Using with Traefik",[294,989,990],{},"The example above directly exposes the Node server on port 3000. You'll likely never do that in production. If you use something like Traefik, you would replace the ports with labels, like this:",[336,992,995],{"className":338,"code":993,"filename":994,"language":341,"meta":342,"style":342},"    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.mynodeapp.rule=Host(`mynodeapp.dev.test`)\"\n      - \"traefik.http.routers.mynodeapp.entrypoints=websecure\"\n      - \"traefik.http.routers.mynodeapp.tls=true\"\n      - \"traefik.http.services.mynodeapp.loadbalancer.server.port=3000\"\n      - \"traefik.http.services.mynodeapp.loadbalancer.server.scheme=http\"\n","\"Node Traefik Labels Example\"",[316,996,997,1004,1015,1026,1037,1048,1059],{"__ignoreMap":342},[346,998,999,1002],{"class":348,"line":349},[346,1000,1001],{"class":352},"    labels",[346,1003,357],{"class":356},[346,1005,1006,1008,1010,1013],{"class":348,"line":360},[346,1007,413],{"class":356},[346,1009,452],{"class":451},[346,1011,1012],{"class":381},"traefik.enable=true",[346,1014,458],{"class":451},[346,1016,1017,1019,1021,1024],{"class":348,"line":373},[346,1018,413],{"class":356},[346,1020,452],{"class":451},[346,1022,1023],{"class":381},"traefik.http.routers.mynodeapp.rule=Host(`mynodeapp.dev.test`)",[346,1025,458],{"class":451},[346,1027,1028,1030,1032,1035],{"class":348,"line":410},[346,1029,413],{"class":356},[346,1031,452],{"class":451},[346,1033,1034],{"class":381},"traefik.http.routers.mynodeapp.entrypoints=websecure",[346,1036,458],{"class":451},[346,1038,1039,1041,1043,1046],{"class":348,"line":419},[346,1040,413],{"class":356},[346,1042,452],{"class":451},[346,1044,1045],{"class":381},"traefik.http.routers.mynodeapp.tls=true",[346,1047,458],{"class":451},[346,1049,1050,1052,1054,1057],{"class":348,"line":427},[346,1051,413],{"class":356},[346,1053,452],{"class":451},[346,1055,1056],{"class":381},"traefik.http.services.mynodeapp.loadbalancer.server.port=3000",[346,1058,458],{"class":451},[346,1060,1061,1063,1065,1068],{"class":348,"line":435},[346,1062,413],{"class":356},[346,1064,452],{"class":451},[346,1066,1067],{"class":381},"traefik.http.services.mynodeapp.loadbalancer.server.scheme=http",[346,1069,458],{"class":451},[294,1071,1072,1073,1076],{},"The ",[316,1074,1075],{},"label"," adds certain metadata to your container, telling Traefik to route \"mynodeapp.dev.test\" to port 3000 on your node container. All web traffic will enter through Traefik first, then to your Node container -- which is a more realistic scenario to what you can run in production.",[298,1078,1080],{"id":1079},"php","PHP",[294,1082,1083,1084,1092],{},"We use our open source PHP Docker Images, which are based on the official PHP images, but production-ready by default and optimized for Laravel out of the box. Read our guide on ",[1085,1086,1091],"a",{"href":1087,"rel":1088,"target":1090},"https://serversideup.net/open-source/docker-php/docs/guide/choosing-the-right-image",[1089],"nofollow","_blank","selecting the right image variation"," for your project.",[1094,1095,1096],"note",{},[294,1097,1098,1099,1101,1102,1105],{},"Notice how this project is using ",[316,1100,186],{}," instead of just calling an image directly. See the ",[316,1103,1104],{},"Dockerfile"," example why we do this.",[336,1107,1109],{"className":338,"code":1108,"filename":340,"language":341,"meta":342,"style":342},"services:\n  php:\n    build:\n      context: . # Look for Dockerfile in the project root\n      target: base\n",[316,1110,1111,1117,1124,1131,1145],{"__ignoreMap":342},[346,1112,1113,1115],{"class":348,"line":349},[346,1114,353],{"class":352},[346,1116,357],{"class":356},[346,1118,1119,1122],{"class":348,"line":360},[346,1120,1121],{"class":352},"  php",[346,1123,357],{"class":356},[346,1125,1126,1129],{"class":348,"line":373},[346,1127,1128],{"class":352},"    build",[346,1130,357],{"class":356},[346,1132,1133,1136,1138,1142],{"class":348,"line":410},[346,1134,1135],{"class":352},"      context",[346,1137,366],{"class":356},[346,1139,1141],{"class":1140},"s_k96"," .",[346,1143,1144],{"class":955}," # Look for Dockerfile in the project root\n",[346,1146,1147,1150,1152],{"class":348,"line":419},[346,1148,1149],{"class":352},"      target",[346,1151,366],{"class":356},[346,1153,1154],{"class":381}," base\n",[336,1156,1158],{"className":338,"code":1157,"filename":386,"language":341,"meta":342,"style":342},"services:\n  php:\n    build:\n      # Notice how our build calls the \"development\" target.\n      # See the Dockerfile for more details\n      target: development\n      args:\n        # Spin loads the UID and GID to match the host in development\n        # This is how we fix permission errors in development\n        USER_ID: ${SPIN_USER_ID}\n        GROUP_ID: ${SPIN_GROUP_ID}\n    volumes:\n      - .:/var/www/html/\n    ports:\n      - 80:80 # Remove the \"ports\" section if using Traefik or Caddy (recommended)\n    networks:\n      - development\n\nnetworks:\n  development:\n",[316,1159,1160,1166,1172,1178,1183,1188,1196,1203,1208,1213,1223,1233,1239,1246,1252,1262,1268,1275,1280,1287],{"__ignoreMap":342},[346,1161,1162,1164],{"class":348,"line":349},[346,1163,353],{"class":352},[346,1165,357],{"class":356},[346,1167,1168,1170],{"class":348,"line":360},[346,1169,1121],{"class":352},[346,1171,357],{"class":356},[346,1173,1174,1176],{"class":348,"line":373},[346,1175,1128],{"class":352},[346,1177,357],{"class":356},[346,1179,1180],{"class":348,"line":410},[346,1181,1182],{"class":955},"      # Notice how our build calls the \"development\" target.\n",[346,1184,1185],{"class":348,"line":419},[346,1186,1187],{"class":955},"      # See the Dockerfile for more details\n",[346,1189,1190,1192,1194],{"class":348,"line":427},[346,1191,1149],{"class":352},[346,1193,366],{"class":356},[346,1195,416],{"class":381},[346,1197,1198,1201],{"class":348,"line":435},[346,1199,1200],{"class":352},"      args",[346,1202,357],{"class":356},[346,1204,1205],{"class":348,"line":443},[346,1206,1207],{"class":955},"        # Spin loads the UID and GID to match the host in development\n",[346,1209,1210],{"class":348,"line":461},[346,1211,1212],{"class":955},"        # This is how we fix permission errors in development\n",[346,1214,1215,1218,1220],{"class":348,"line":476},[346,1216,1217],{"class":352},"        USER_ID",[346,1219,366],{"class":356},[346,1221,1222],{"class":381}," ${SPIN_USER_ID}\n",[346,1224,1225,1228,1230],{"class":348,"line":491},[346,1226,1227],{"class":352},"        GROUP_ID",[346,1229,366],{"class":356},[346,1231,1232],{"class":381}," ${SPIN_GROUP_ID}\n",[346,1234,1235,1237],{"class":348,"line":506},[346,1236,422],{"class":352},[346,1238,357],{"class":356},[346,1240,1241,1243],{"class":348,"line":514},[346,1242,413],{"class":356},[346,1244,1245],{"class":381}," .:/var/www/html/\n",[346,1247,1248,1250],{"class":348,"line":526},[346,1249,509],{"class":352},[346,1251,357],{"class":356},[346,1253,1254,1256,1259],{"class":348,"line":533},[346,1255,413],{"class":356},[346,1257,1258],{"class":381}," 80:80",[346,1260,1261],{"class":955}," # Remove the \"ports\" section if using Traefik or Caddy (recommended)\n",[346,1263,1264,1266],{"class":348,"line":541},[346,1265,405],{"class":352},[346,1267,357],{"class":356},[346,1269,1271,1273],{"class":348,"line":1270},17,[346,1272,413],{"class":356},[346,1274,416],{"class":381},[346,1276,1278],{"class":348,"line":1277},18,[346,1279,530],{"emptyLinePlaceholder":529},[346,1281,1283,1285],{"class":348,"line":1282},19,[346,1284,536],{"class":352},[346,1286,357],{"class":356},[346,1288,1290,1292],{"class":348,"line":1289},20,[346,1291,544],{"class":352},[346,1293,357],{"class":356},[336,1295,1300],{"className":1296,"code":1297,"filename":1298,"language":1299,"meta":342,"style":342},"language-dockerfile shiki shiki-themes material-theme-lighter github-dark github-dark","# Learn more about the Server Side Up PHP Docker Images at:\n# https://serversideup.net/open-source/docker-php/\n\nFROM serversideup/php:8.3-fpm-nginx AS base\n\nFROM base AS development\n\n# Fix permission issues in development by setting the \"www-data\"\n# user to the same user and group that is running docker.\nARG USER_ID\nARG GROUP_ID\nRUN docker-php-serversideup-set-id www-data ${USER_ID} ${GROUP_ID}\n\nFROM base AS deploy\nCOPY --chown=www-data:www-data . /var/www/html\n","\"Example: Dockerfile\"","dockerfile",[316,1301,1302,1307,1312,1316,1330,1334,1345,1349,1354,1359,1367,1374,1382,1386,1397],{"__ignoreMap":342},[346,1303,1304],{"class":348,"line":349},[346,1305,1306],{"class":955},"# Learn more about the Server Side Up PHP Docker Images at:\n",[346,1308,1309],{"class":348,"line":360},[346,1310,1311],{"class":955},"# https://serversideup.net/open-source/docker-php/\n",[346,1313,1314],{"class":348,"line":373},[346,1315,530],{"emptyLinePlaceholder":529},[346,1317,1318,1322,1325,1328],{"class":348,"line":410},[346,1319,1321],{"class":1320},"s1Wpa","FROM",[346,1323,1324],{"class":369}," serversideup/php:8.3-fpm-nginx ",[346,1326,1327],{"class":1320},"AS",[346,1329,1154],{"class":369},[346,1331,1332],{"class":348,"line":419},[346,1333,530],{"emptyLinePlaceholder":529},[346,1335,1336,1338,1341,1343],{"class":348,"line":427},[346,1337,1321],{"class":1320},[346,1339,1340],{"class":369}," base ",[346,1342,1327],{"class":1320},[346,1344,416],{"class":369},[346,1346,1347],{"class":348,"line":435},[346,1348,530],{"emptyLinePlaceholder":529},[346,1350,1351],{"class":348,"line":443},[346,1352,1353],{"class":955},"# Fix permission issues in development by setting the \"www-data\"\n",[346,1355,1356],{"class":348,"line":461},[346,1357,1358],{"class":955},"# user to the same user and group that is running docker.\n",[346,1360,1361,1364],{"class":348,"line":476},[346,1362,1363],{"class":1320},"ARG",[346,1365,1366],{"class":369}," USER_ID\n",[346,1368,1369,1371],{"class":348,"line":491},[346,1370,1363],{"class":1320},[346,1372,1373],{"class":369}," GROUP_ID\n",[346,1375,1376,1379],{"class":348,"line":506},[346,1377,1378],{"class":1320},"RUN",[346,1380,1381],{"class":369}," docker-php-serversideup-set-id www-data ${USER_ID} ${GROUP_ID}\n",[346,1383,1384],{"class":348,"line":514},[346,1385,530],{"emptyLinePlaceholder":529},[346,1387,1388,1390,1392,1394],{"class":348,"line":526},[346,1389,1321],{"class":1320},[346,1391,1340],{"class":369},[346,1393,1327],{"class":1320},[346,1395,1396],{"class":369}," deploy\n",[346,1398,1399,1402],{"class":348,"line":533},[346,1400,1401],{"class":1320},"COPY",[346,1403,1404],{"class":369}," --chown=www-data:www-data . /var/www/html\n",[974,1406,987],{"id":1407},"using-with-traefik-1",[294,1409,1410],{},"The docker-compose.yml examples above exposes the HTTP server on port 80. If you use something like Traefik, you would replace the ports with labels, like this:",[336,1412,1415],{"className":338,"code":1413,"filename":1414,"language":341,"meta":342,"style":342},"    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.laravel.rule=HostRegexp(`laravel.dev.test`)\"\n      - \"traefik.http.routers.laravel.entrypoints=web\"\n      - \"traefik.http.services.laravel.loadbalancer.server.port=80\"\n      - \"traefik.http.services.laravel.loadbalancer.server.scheme=http\"\n","\"Laravel Traefik Labels Example\"",[316,1416,1417,1423,1433,1444,1455,1466],{"__ignoreMap":342},[346,1418,1419,1421],{"class":348,"line":349},[346,1420,1001],{"class":352},[346,1422,357],{"class":356},[346,1424,1425,1427,1429,1431],{"class":348,"line":360},[346,1426,413],{"class":356},[346,1428,452],{"class":451},[346,1430,1012],{"class":381},[346,1432,458],{"class":451},[346,1434,1435,1437,1439,1442],{"class":348,"line":373},[346,1436,413],{"class":356},[346,1438,452],{"class":451},[346,1440,1441],{"class":381},"traefik.http.routers.laravel.rule=HostRegexp(`laravel.dev.test`)",[346,1443,458],{"class":451},[346,1445,1446,1448,1450,1453],{"class":348,"line":410},[346,1447,413],{"class":356},[346,1449,452],{"class":451},[346,1451,1452],{"class":381},"traefik.http.routers.laravel.entrypoints=web",[346,1454,458],{"class":451},[346,1456,1457,1459,1461,1464],{"class":348,"line":419},[346,1458,413],{"class":356},[346,1460,452],{"class":451},[346,1462,1463],{"class":381},"traefik.http.services.laravel.loadbalancer.server.port=80",[346,1465,458],{"class":451},[346,1467,1468,1470,1472,1475],{"class":348,"line":427},[346,1469,413],{"class":356},[346,1471,452],{"class":451},[346,1473,1474],{"class":381},"traefik.http.services.laravel.loadbalancer.server.scheme=http",[346,1476,458],{"class":451},[298,1478,1480],{"id":1479},"redis","Redis",[336,1482,1484],{"className":338,"code":1483,"filename":340,"language":341,"meta":342,"style":342},"services:\n  redis:\n    image: redis:7.2\n",[316,1485,1486,1492,1499],{"__ignoreMap":342},[346,1487,1488,1490],{"class":348,"line":349},[346,1489,353],{"class":352},[346,1491,357],{"class":356},[346,1493,1494,1497],{"class":348,"line":360},[346,1495,1496],{"class":352},"  redis",[346,1498,357],{"class":356},[346,1500,1501,1503,1505],{"class":348,"line":373},[346,1502,376],{"class":352},[346,1504,366],{"class":356},[346,1506,1507],{"class":381}," redis:7.2\n",[336,1509,1511],{"className":338,"code":1510,"filename":386,"language":341,"meta":342,"style":342},"services:\n  redis:\n    command: \"redis-server --appendonly yes --requirepass mysupersecretredispassword\"\n    volumes:\n      - ./.infrastructure/volume_data/redis/data:/data\n    ports:\n      - \"6379:6379\"\n    networks:\n      - development\n\nnetworks:\n  development:\n",[316,1512,1513,1519,1525,1538,1544,1551,1557,1568,1574,1580,1584,1590],{"__ignoreMap":342},[346,1514,1515,1517],{"class":348,"line":349},[346,1516,353],{"class":352},[346,1518,357],{"class":356},[346,1520,1521,1523],{"class":348,"line":360},[346,1522,1496],{"class":352},[346,1524,357],{"class":356},[346,1526,1527,1529,1531,1533,1536],{"class":348,"line":373},[346,1528,903],{"class":352},[346,1530,366],{"class":356},[346,1532,452],{"class":451},[346,1534,1535],{"class":381},"redis-server --appendonly yes --requirepass mysupersecretredispassword",[346,1537,458],{"class":451},[346,1539,1540,1542],{"class":348,"line":410},[346,1541,422],{"class":352},[346,1543,357],{"class":356},[346,1545,1546,1548],{"class":348,"line":419},[346,1547,413],{"class":356},[346,1549,1550],{"class":381}," ./.infrastructure/volume_data/redis/data:/data\n",[346,1552,1553,1555],{"class":348,"line":427},[346,1554,509],{"class":352},[346,1556,357],{"class":356},[346,1558,1559,1561,1563,1566],{"class":348,"line":435},[346,1560,413],{"class":356},[346,1562,452],{"class":451},[346,1564,1565],{"class":381},"6379:6379",[346,1567,458],{"class":451},[346,1569,1570,1572],{"class":348,"line":443},[346,1571,405],{"class":352},[346,1573,357],{"class":356},[346,1575,1576,1578],{"class":348,"line":461},[346,1577,413],{"class":356},[346,1579,416],{"class":381},[346,1581,1582],{"class":348,"line":476},[346,1583,530],{"emptyLinePlaceholder":529},[346,1585,1586,1588],{"class":348,"line":491},[346,1587,536],{"class":352},[346,1589,357],{"class":356},[346,1591,1592,1594],{"class":348,"line":506},[346,1593,544],{"class":352},[346,1595,357],{"class":356},[298,1597,1599],{"id":1598},"soketi","Soketi",[294,1601,1602,1603,1608],{},"See the ",[1085,1604,1607],{"href":1605,"rel":1606,"target":1090},"https://docs.soketi.app/getting-started/installation/docker",[1089],"Soketi documentation"," for selecting the correct version.",[336,1610,1612],{"className":338,"code":1611,"filename":340,"language":341,"meta":342,"style":342},"services:\n  socket:\n    image: quay.io/soketi/soketi:1.6-16\n",[316,1613,1614,1620,1627],{"__ignoreMap":342},[346,1615,1616,1618],{"class":348,"line":349},[346,1617,353],{"class":352},[346,1619,357],{"class":356},[346,1621,1622,1625],{"class":348,"line":360},[346,1623,1624],{"class":352},"  socket",[346,1626,357],{"class":356},[346,1628,1629,1631,1633],{"class":348,"line":373},[346,1630,376],{"class":352},[346,1632,366],{"class":356},[346,1634,1635],{"class":381}," quay.io/soketi/soketi:1.6-16\n",[336,1637,1639],{"className":338,"code":1638,"filename":386,"language":341,"meta":342,"style":342},"services:\n  socket:\n    environment:\n      DEBUG: '1'\n      DB_REDIS_HOST: \"redis\"\n      DB_REDIS_PASSWORD: \"redispassword\"\n      DB_REDIS_KEY_PREFIX: \"socketi\"\n    networks: \n      - development\nnetworks:\n  development:\n",[316,1640,1641,1647,1653,1659,1675,1688,1702,1716,1724,1730,1736],{"__ignoreMap":342},[346,1642,1643,1645],{"class":348,"line":349},[346,1644,353],{"class":352},[346,1646,357],{"class":356},[346,1648,1649,1651],{"class":348,"line":360},[346,1650,1624],{"class":352},[346,1652,357],{"class":356},[346,1654,1655,1657],{"class":348,"line":373},[346,1656,438],{"class":352},[346,1658,357],{"class":356},[346,1660,1661,1664,1666,1669,1672],{"class":348,"line":410},[346,1662,1663],{"class":352},"      DEBUG",[346,1665,366],{"class":356},[346,1667,1668],{"class":451}," '",[346,1670,1671],{"class":381},"1",[346,1673,1674],{"class":451},"'\n",[346,1676,1677,1680,1682,1684,1686],{"class":348,"line":419},[346,1678,1679],{"class":352},"      DB_REDIS_HOST",[346,1681,366],{"class":356},[346,1683,452],{"class":451},[346,1685,1479],{"class":381},[346,1687,458],{"class":451},[346,1689,1690,1693,1695,1697,1700],{"class":348,"line":427},[346,1691,1692],{"class":352},"      DB_REDIS_PASSWORD",[346,1694,366],{"class":356},[346,1696,452],{"class":451},[346,1698,1699],{"class":381},"redispassword",[346,1701,458],{"class":451},[346,1703,1704,1707,1709,1711,1714],{"class":348,"line":435},[346,1705,1706],{"class":352},"      DB_REDIS_KEY_PREFIX",[346,1708,366],{"class":356},[346,1710,452],{"class":451},[346,1712,1713],{"class":381},"socketi",[346,1715,458],{"class":451},[346,1717,1718,1720,1722],{"class":348,"line":443},[346,1719,405],{"class":352},[346,1721,366],{"class":356},[346,1723,370],{"class":369},[346,1725,1726,1728],{"class":348,"line":461},[346,1727,413],{"class":356},[346,1729,416],{"class":381},[346,1731,1732,1734],{"class":348,"line":476},[346,1733,536],{"class":352},[346,1735,357],{"class":356},[346,1737,1738,1740],{"class":348,"line":491},[346,1739,544],{"class":352},[346,1741,357],{"class":356},[974,1743,987],{"id":1744},"using-with-traefik-2",[294,1746,1410],{},[336,1748,1750],{"className":338,"code":1749,"filename":1414,"language":341,"meta":342,"style":342},"    labels:\n      - \"traefik.enable=true\"\n      - \"traefik.http.routers.soketi.rule=HostRegexp(`soketi.dev.test`)\"\n      - \"traefik.http.routers.soketi.entrypoints=websecure\"\n      - \"traefik.http.routers.soketi.tls=true\"\n      - \"traefik.http.services.soketi.loadbalancer.server.port=6001\"\n      - \"traefik.http.services.soketi.loadbalancer.server.scheme=http\"\n",[316,1751,1752,1758,1768,1779,1790,1801,1812],{"__ignoreMap":342},[346,1753,1754,1756],{"class":348,"line":349},[346,1755,1001],{"class":352},[346,1757,357],{"class":356},[346,1759,1760,1762,1764,1766],{"class":348,"line":360},[346,1761,413],{"class":356},[346,1763,452],{"class":451},[346,1765,1012],{"class":381},[346,1767,458],{"class":451},[346,1769,1770,1772,1774,1777],{"class":348,"line":373},[346,1771,413],{"class":356},[346,1773,452],{"class":451},[346,1775,1776],{"class":381},"traefik.http.routers.soketi.rule=HostRegexp(`soketi.dev.test`)",[346,1778,458],{"class":451},[346,1780,1781,1783,1785,1788],{"class":348,"line":410},[346,1782,413],{"class":356},[346,1784,452],{"class":451},[346,1786,1787],{"class":381},"traefik.http.routers.soketi.entrypoints=websecure",[346,1789,458],{"class":451},[346,1791,1792,1794,1796,1799],{"class":348,"line":419},[346,1793,413],{"class":356},[346,1795,452],{"class":451},[346,1797,1798],{"class":381},"traefik.http.routers.soketi.tls=true",[346,1800,458],{"class":451},[346,1802,1803,1805,1807,1810],{"class":348,"line":427},[346,1804,413],{"class":356},[346,1806,452],{"class":451},[346,1808,1809],{"class":381},"traefik.http.services.soketi.loadbalancer.server.port=6001",[346,1811,458],{"class":451},[346,1813,1814,1816,1818,1821],{"class":348,"line":435},[346,1815,413],{"class":356},[346,1817,452],{"class":451},[346,1819,1820],{"class":381},"traefik.http.services.soketi.loadbalancer.server.scheme=http",[346,1822,458],{"class":451},[298,1824,1826],{"id":1825},"traefik","Traefik",[294,1828,1829],{},"Traefik is a reverse proxy and is great for terminating SSL for any service that supports HTTP/HTTPS. Since Traefik is such an important service, there can be a little more configuration in order to get it to function well.",[336,1831,1833],{"className":338,"code":1832,"filename":340,"language":341,"meta":342,"style":342},"services:\n  traefik:\n    image: traefik:v3.1\n",[316,1834,1835,1841,1848],{"__ignoreMap":342},[346,1836,1837,1839],{"class":348,"line":349},[346,1838,353],{"class":352},[346,1840,357],{"class":356},[346,1842,1843,1846],{"class":348,"line":360},[346,1844,1845],{"class":352},"  traefik",[346,1847,357],{"class":356},[346,1849,1850,1852,1854],{"class":348,"line":373},[346,1851,376],{"class":352},[346,1853,366],{"class":356},[346,1855,1856],{"class":381}," traefik:v3.1\n",[336,1858,1860],{"className":338,"code":1859,"filename":386,"language":341,"meta":342,"style":342},"  traefik:\n    networks:\n      development:\n        aliases:\n          - myapp.dev.test\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      # Add Docker as a mounted volume, so that Traefik can read the labels of other services\n      - /var/run/docker.sock:/var/run/docker.sock:ro\n      - ./.infrastructure/conf/traefik/dev/traefik.yml:/traefik.yml:ro\n      - ./.infrastructure/conf/traefik/dev/traefik-certs.yml:/traefik-certs.yml\n      - ./.infrastructure/conf/traefik/dev/certificates/:/certificates\n",[316,1861,1862,1868,1874,1881,1888,1896,1902,1913,1924,1930,1935,1942,1949,1956],{"__ignoreMap":342},[346,1863,1864,1866],{"class":348,"line":349},[346,1865,1845],{"class":352},[346,1867,357],{"class":356},[346,1869,1870,1872],{"class":348,"line":360},[346,1871,405],{"class":352},[346,1873,357],{"class":356},[346,1875,1876,1879],{"class":348,"line":373},[346,1877,1878],{"class":352},"      development",[346,1880,357],{"class":356},[346,1882,1883,1886],{"class":348,"line":410},[346,1884,1885],{"class":352},"        aliases",[346,1887,357],{"class":356},[346,1889,1890,1893],{"class":348,"line":419},[346,1891,1892],{"class":356},"          -",[346,1894,1895],{"class":381}," myapp.dev.test\n",[346,1897,1898,1900],{"class":348,"line":427},[346,1899,509],{"class":352},[346,1901,357],{"class":356},[346,1903,1904,1906,1908,1911],{"class":348,"line":435},[346,1905,413],{"class":356},[346,1907,452],{"class":451},[346,1909,1910],{"class":381},"80:80",[346,1912,458],{"class":451},[346,1914,1915,1917,1919,1922],{"class":348,"line":443},[346,1916,413],{"class":356},[346,1918,452],{"class":451},[346,1920,1921],{"class":381},"443:443",[346,1923,458],{"class":451},[346,1925,1926,1928],{"class":348,"line":461},[346,1927,422],{"class":352},[346,1929,357],{"class":356},[346,1931,1932],{"class":348,"line":476},[346,1933,1934],{"class":955},"      # Add Docker as a mounted volume, so that Traefik can read the labels of other services\n",[346,1936,1937,1939],{"class":348,"line":491},[346,1938,413],{"class":356},[346,1940,1941],{"class":381}," /var/run/docker.sock:/var/run/docker.sock:ro\n",[346,1943,1944,1946],{"class":348,"line":506},[346,1945,413],{"class":356},[346,1947,1948],{"class":381}," ./.infrastructure/conf/traefik/dev/traefik.yml:/traefik.yml:ro\n",[346,1950,1951,1953],{"class":348,"line":514},[346,1952,413],{"class":356},[346,1954,1955],{"class":381}," ./.infrastructure/conf/traefik/dev/traefik-certs.yml:/traefik-certs.yml\n",[346,1957,1958,1960],{"class":348,"line":526},[346,1959,413],{"class":356},[346,1961,1962],{"class":381}," ./.infrastructure/conf/traefik/dev/certificates/:/certificates\n",[336,1964,1967],{"className":338,"code":1965,"filename":1966,"language":341,"meta":342,"style":342},"# Allow self-signed certificates\nserversTransport:\n  insecureSkipVerify: true\n\nproviders:\n  docker:\n    exposedByDefault: false\n  file:\n      filename: /traefik-certs.yml\n      watch: true\nentryPoints:\n  web:\n    address: \":80\"\n    http:\n      redirections:\n        entrypoint:\n          to: websecure\n          scheme: https\n\n  websecure:\n    address: \":443\"\n\naccessLog: {}\nlog:\n  level: ERROR\n\napi:\n  dashboard: true\n  insecure: true\n","Example: Development configuration at \"./.infrastructure/conf/traefik/dev/traefik.yml\"",[316,1968,1969,1974,1981,1992,1996,2003,2010,2020,2027,2037,2046,2053,2060,2074,2081,2088,2095,2105,2115,2119,2126,2140,2145,2156,2164,2175,2180,2188,2198],{"__ignoreMap":342},[346,1970,1971],{"class":348,"line":349},[346,1972,1973],{"class":955},"# Allow self-signed certificates\n",[346,1975,1976,1979],{"class":348,"line":360},[346,1977,1978],{"class":352},"serversTransport",[346,1980,357],{"class":356},[346,1982,1983,1986,1988],{"class":348,"line":373},[346,1984,1985],{"class":352},"  insecureSkipVerify",[346,1987,366],{"class":356},[346,1989,1991],{"class":1990},"sMrrN"," true\n",[346,1993,1994],{"class":348,"line":410},[346,1995,530],{"emptyLinePlaceholder":529},[346,1997,1998,2001],{"class":348,"line":419},[346,1999,2000],{"class":352},"providers",[346,2002,357],{"class":356},[346,2004,2005,2008],{"class":348,"line":427},[346,2006,2007],{"class":352},"  docker",[346,2009,357],{"class":356},[346,2011,2012,2015,2017],{"class":348,"line":435},[346,2013,2014],{"class":352},"    exposedByDefault",[346,2016,366],{"class":356},[346,2018,2019],{"class":1990}," false\n",[346,2021,2022,2025],{"class":348,"line":443},[346,2023,2024],{"class":352},"  file",[346,2026,357],{"class":356},[346,2028,2029,2032,2034],{"class":348,"line":461},[346,2030,2031],{"class":352},"      filename",[346,2033,366],{"class":356},[346,2035,2036],{"class":381}," /traefik-certs.yml\n",[346,2038,2039,2042,2044],{"class":348,"line":476},[346,2040,2041],{"class":352},"      watch",[346,2043,366],{"class":356},[346,2045,1991],{"class":1990},[346,2047,2048,2051],{"class":348,"line":491},[346,2049,2050],{"class":352},"entryPoints",[346,2052,357],{"class":356},[346,2054,2055,2058],{"class":348,"line":506},[346,2056,2057],{"class":352},"  web",[346,2059,357],{"class":356},[346,2061,2062,2065,2067,2069,2072],{"class":348,"line":514},[346,2063,2064],{"class":352},"    address",[346,2066,366],{"class":356},[346,2068,452],{"class":451},[346,2070,2071],{"class":381},":80",[346,2073,458],{"class":451},[346,2075,2076,2079],{"class":348,"line":526},[346,2077,2078],{"class":352},"    http",[346,2080,357],{"class":356},[346,2082,2083,2086],{"class":348,"line":533},[346,2084,2085],{"class":352},"      redirections",[346,2087,357],{"class":356},[346,2089,2090,2093],{"class":348,"line":541},[346,2091,2092],{"class":352},"        entrypoint",[346,2094,357],{"class":356},[346,2096,2097,2100,2102],{"class":348,"line":1270},[346,2098,2099],{"class":352},"          to",[346,2101,366],{"class":356},[346,2103,2104],{"class":381}," websecure\n",[346,2106,2107,2110,2112],{"class":348,"line":1277},[346,2108,2109],{"class":352},"          scheme",[346,2111,366],{"class":356},[346,2113,2114],{"class":381}," https\n",[346,2116,2117],{"class":348,"line":1282},[346,2118,530],{"emptyLinePlaceholder":529},[346,2120,2121,2124],{"class":348,"line":1289},[346,2122,2123],{"class":352},"  websecure",[346,2125,357],{"class":356},[346,2127,2129,2131,2133,2135,2138],{"class":348,"line":2128},21,[346,2130,2064],{"class":352},[346,2132,366],{"class":356},[346,2134,452],{"class":451},[346,2136,2137],{"class":381},":443",[346,2139,458],{"class":451},[346,2141,2143],{"class":348,"line":2142},22,[346,2144,530],{"emptyLinePlaceholder":529},[346,2146,2148,2151,2153],{"class":348,"line":2147},23,[346,2149,2150],{"class":352},"accessLog",[346,2152,366],{"class":356},[346,2154,2155],{"class":356}," {}\n",[346,2157,2159,2162],{"class":348,"line":2158},24,[346,2160,2161],{"class":352},"log",[346,2163,357],{"class":356},[346,2165,2167,2170,2172],{"class":348,"line":2166},25,[346,2168,2169],{"class":352},"  level",[346,2171,366],{"class":356},[346,2173,2174],{"class":381}," ERROR\n",[346,2176,2178],{"class":348,"line":2177},26,[346,2179,530],{"emptyLinePlaceholder":529},[346,2181,2183,2186],{"class":348,"line":2182},27,[346,2184,2185],{"class":352},"api",[346,2187,357],{"class":356},[346,2189,2191,2194,2196],{"class":348,"line":2190},28,[346,2192,2193],{"class":352},"  dashboard",[346,2195,366],{"class":356},[346,2197,1991],{"class":1990},[346,2199,2201,2204,2206],{"class":348,"line":2200},29,[346,2202,2203],{"class":352},"  insecure",[346,2205,366],{"class":356},[346,2207,1991],{"class":1990},[336,2209,2212],{"className":338,"code":2210,"filename":2211,"language":341,"meta":342,"style":342},"tls:\n  stores:\n    default:\n      defaultCertificate:\n        certFile: /certificates/local-dev.pem\n        keyFile: /certificates/local-dev-key.pem\n  certificates:\n    - certFile: /certificates/local-dev.pem\n      keyFile: /certificates/local-dev-key.pem\n      stores:\n        - default\n","Example: Development configuration at \"./.infrastructure/conf/traefik/dev/traefik-certs.yml\"",[316,2213,2214,2221,2228,2235,2242,2252,2262,2269,2281,2290,2297],{"__ignoreMap":342},[346,2215,2216,2219],{"class":348,"line":349},[346,2217,2218],{"class":352},"tls",[346,2220,357],{"class":356},[346,2222,2223,2226],{"class":348,"line":360},[346,2224,2225],{"class":352},"  stores",[346,2227,357],{"class":356},[346,2229,2230,2233],{"class":348,"line":373},[346,2231,2232],{"class":352},"    default",[346,2234,357],{"class":356},[346,2236,2237,2240],{"class":348,"line":410},[346,2238,2239],{"class":352},"      defaultCertificate",[346,2241,357],{"class":356},[346,2243,2244,2247,2249],{"class":348,"line":419},[346,2245,2246],{"class":352},"        certFile",[346,2248,366],{"class":356},[346,2250,2251],{"class":381}," /certificates/local-dev.pem\n",[346,2253,2254,2257,2259],{"class":348,"line":427},[346,2255,2256],{"class":352},"        keyFile",[346,2258,366],{"class":356},[346,2260,2261],{"class":381}," /certificates/local-dev-key.pem\n",[346,2263,2264,2267],{"class":348,"line":435},[346,2265,2266],{"class":352},"  certificates",[346,2268,357],{"class":356},[346,2270,2271,2274,2277,2279],{"class":348,"line":443},[346,2272,2273],{"class":356},"    -",[346,2275,2276],{"class":352}," certFile",[346,2278,366],{"class":356},[346,2280,2251],{"class":381},[346,2282,2283,2286,2288],{"class":348,"line":461},[346,2284,2285],{"class":352},"      keyFile",[346,2287,366],{"class":356},[346,2289,2261],{"class":381},[346,2291,2292,2295],{"class":348,"line":476},[346,2293,2294],{"class":352},"      stores",[346,2296,357],{"class":356},[346,2298,2299,2302],{"class":348,"line":491},[346,2300,2301],{"class":356},"        -",[346,2303,2304],{"class":381}," default\n",[974,2306,2308],{"id":2307},"trusting-self-signed-certificates","Trusting self-signed certificates",[294,2310,2311,2312,2315,2316,2319,2320,2323,2324,2328],{},"If you use ",[316,2313,2314],{},"spin init"," or ",[316,2317,2318],{},"spin new"," to create your project, we ship a ",[316,2321,2322],{},"local-dev"," keypair. This is signed by the Server Side Up Certificate Authority. If you'd like to trust this CA, you need to install the CA Root on your machine (only do this if you trust our process): ",[1085,2325,2326],{"href":2326,"rel":2327,"target":1090},"https://serversideup.net/ca/",[1089],".",[2330,2331,2332],"style",{},"html pre.shiki code .sqIbZ, html code.shiki .sqIbZ{--shiki-light:#E53935;--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .sG-J9, html code.shiki .sG-J9{--shiki-light:#39ADB5;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sMo7A, html code.shiki .sMo7A{--shiki-light:#90A4AE;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s0vBq, html code.shiki .s0vBq{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}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 .sF_wb, html code.shiki .sF_wb{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .s_k96, html code.shiki .s_k96{--shiki-light:#F76D47;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sMrrN, html code.shiki .sMrrN{--shiki-light:#FF5370;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .s1Wpa, html code.shiki .s1Wpa{--shiki-light:#F76D47;--shiki-default:#F97583;--shiki-dark:#F97583}",{"title":342,"searchDepth":360,"depth":360,"links":2334},[2335,2336,2337,2338,2339,2340,2341,2342,2343],{"id":300,"depth":360,"text":301},{"id":333,"depth":360,"text":334},{"id":549,"depth":360,"text":550},{"id":682,"depth":360,"text":683},{"id":843,"depth":360,"text":844},{"id":1079,"depth":360,"text":1080},{"id":1479,"depth":360,"text":1480},{"id":1598,"depth":360,"text":1599},{"id":1825,"depth":360,"text":1826},null,"Look at common templates on how to add services to your project.","md","docs",{"head":2349},{"title":2350},"Adding Other Services - Spin by Server Side Up",{"title":165,"description":2345},"z997Rym6UQ4HlW6R-4PFpL1HL0CfZPiX9sXbEW7SfJA",[2354,2356],{"title":161,"path":162,"stem":163,"description":2355,"children":-1},"Learn how to generate a secure SSH key.",{"title":169,"path":170,"stem":171,"description":2357,"children":-1},"Learn how to create your own Spin template.",1769465039677]