[{"data":1,"prerenderedAt":2314},["ShallowReactive",2],{"navigation":3,"/docs/advanced/migrating-from-spin-v2-to-v3":285,"/docs/advanced/migrating-from-spin-v2-to-v3-surround":2309},[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":173,"body":287,"canonical":2300,"description":2301,"extension":2302,"layout":2303,"meta":2304,"navigation":365,"path":174,"seo":2307,"stem":175,"__hash__":2308},"docs/docs/8.advanced/migrating-from-spin-v2-to-v3.md",{"type":288,"value":289,"toc":2275},"minimark",[290,297,307,312,324,330,1207,1211,1214,1258,1262,1265,1270,1273,1291,1295,1301,1310,1318,1325,1329,1332,1367,1371,1374,1403,1407,1410,1414,1420,1430,1434,1437,1455,1459,1465,1603,1613,1619,1732,1736,1748,1753,1964,1968,1971,1991,1995,2004,2013,2030,2036,2040,2048,2056,2071,2075,2081,2147,2166,2173,2179,2207,2211,2214,2245,2261,2265,2268,2271],[291,292,293],"lead-p",{},[294,295,296],"p",{},"Although Spin v3 doesn't ship with any breaking changes, there is a new structure for managing your configurations with Spin that you may want to upgrade to take advantage of.",[298,299,300],"note",{},[294,301,302,306],{},[303,304,305],"strong",{},"Spin v3 ships with zero breaking changes for Spin v2 configurations."," This means these steps are completely optional and is only required if you want to take advantage of the new features with Spin (like using native providers to provision servers on DigitalOcean, Vultr, and Hetzner)",[308,309,311],"h2",{"id":310},"the-new-spinyml-file","The new \".spin.yml\" file",[294,313,314,315,319,320,323],{},"In Spin v3, we introduced a new way to manage your server inventory. Previously, we had the configurations separated across multiple files (",[316,317,318],"code",{},".spin-inventory.ini"," and ",[316,321,322],{},".spin.yml",").",[294,325,326,327,329],{},"Everything has been merged into a single ",[316,328,322],{}," file. This new format gives you the ability to provision servers right from the command line with providers like DigitalOcean, Vultr, and Hetzner.",[331,332,338],"pre",{"className":333,"code":334,"filename":335,"language":336,"meta":337,"style":337},"language-yaml shiki shiki-themes material-theme-lighter github-dark github-dark","##############################################################\n# 👇 Users - You must set at least one user\n##############################################################\n\nusers:\n  # - username: alice\n  #   name: Alice Smith\n  #   groups: ['sudo']\n  #   authorized_keys:\n  #     - public_key: \"ssh-ed25519 AAAAC3NzaC1lmyfakeublickeyMVIzwQXBzxxD9b8Erd1FKVvu alice\"\n\n  # - username: bob\n  #   name: Bob Smith\n  #   state: present\n  #   password: \"$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1\"\n  #   groups: ['sudo']\n  #   shell: \"/bin/bash\"\n  #   authorized_keys:\n  #     - public_key: \"ssh-ed25519 AAAAC3NzaC1anotherfakekeyIMVIzwQXBzxxD9b8Erd1FKVvu bob\"\n\n##############################################################\n# 👇 Providers - You must set at least one provider\n##############################################################\n\nproviders:\n#   - name: digitalocean\n#     api_token: Set token here OR delete this line and set environment variable DO_API_TOKEN\n\n#   - name: hetzner\n#     api_token: Set token here OR delete this line and set environment variable HCLOUD_TOKEN\n\n#   - name: vultr\n#     api_token: Set token here OR delete this line and set environment variable VULTR_API_KEY\n\n##############################################################\n# 👇 Servers - You must set at least one server\n##############################################################\n\nservers:\n  # - server_name: ubuntu-2gb-ash-1\n  #   environment: production\n  #   hardware_profile: hetzner_2c_2gb_ubuntu2404\n\n  # - server_name: ubuntu-1gb-ord-2\n  #   environment: staging\n  #   hardware_profile: vultr_1c_1gb_ubuntu2404\n\n##############################################################\n# 🤖 Hardware Profiles\n##############################################################\n\nhardware_profiles:\n  # Hetzner\n  - name: hetzner_2c_2gb_ubuntu2404\n    provider: hetzner\n    profile_config:\n      location: ash\n      server_type: cpx11\n      image: ubuntu-24.04\n      backups: true\n\n  # Vultr\n  - name: vultr_1c_1gb_ubuntu2404\n    provider: vultr\n    profile_config:\n      region: ord\n      plan: vc2-1c-1gb\n      os: \"Ubuntu 24.04 LTS x64\"\n      backups: true\n  \n  # DigitalOcean\n  - name: digitalocean_1c_1gb_ubuntu2404\n    provider: digitalocean\n    profile_config:\n      region: nyc3\n      size: s-1vcpu-1gb\n      image: ubuntu-24-04-x64\n      backups: true\n\n##############################################################\n# 🌎 Environments\n##############################################################\nenvironments:\n  - name: production\n  - name: staging\n  - name: development\n\n##############################################################\n# 🤓 Advanced Server Configuration\n##############################################################\n\n# Timezone and contact settings\nserver_timezone: \"Etc/UTC\"\nserver_contact: changeme@example.com\n\n# If you the SSH port below, you may need to run `spin provision -p \u003Cyour-default-ssh-port>`\n# to get a connection on your first provision. Otherwise, SSH will try connecting \n# to your new port before the SSH server configuration is updated.\nssh_port: \"22\"\n\n## You can set this to false to require a password for sudo.\n## If you disable passwordless sudo, you must set a password for all sudo users.\n## generate an encrypted hash with `spin mkpasswd`. Learn more:\n## https://serversideup.net/open-source/spin/docs/command-reference/mkpasswd\nuse_passwordless_sudo: true\n\n## Email Notifications\npostfix_hostname: \"{{ inventory_hostname }}\"\n\n## Set variables below to enable external SMTP relay\n# postfix_relayhost: \"smtp.example.com\"\n# postfix_relayhost_port: \"587\"\n# postfix_relayhost_username: \"myusername\"\n# postfix_relayhost_password: \"mysupersecretpassword\"\n\n## Deploy user customization - You can customize the deploy user below if you'd like\n# docker_user:\n#   username: deploy\n#   authorized_ssh_keys: \n#     - \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKNJGtd7a4DBHsQi7HGrC5xz0eAEFHZ3Ogh3FEFI2345 fake@key\"\n#     - \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFRfXxUZ8q9vHRcQZ6tLb0KwGHu8xjQHfYopZKLmnopQ anotherfake@key\"\n","Example .spin.yml with v3","yaml","",[316,339,340,349,355,360,367,378,384,390,396,402,408,413,419,425,431,437,442,448,453,459,464,469,475,480,485,493,499,505,510,516,522,527,533,539,544,549,555,560,565,573,579,585,591,596,602,608,614,619,624,630,635,640,648,654,670,681,689,700,711,722,734,739,745,757,767,774,785,796,814,823,830,836,848,858,865,875,886,896,905,910,915,921,926,934,946,958,970,975,980,986,991,996,1002,1017,1028,1033,1039,1045,1051,1066,1071,1077,1083,1089,1095,1105,1110,1116,1131,1136,1142,1148,1154,1160,1166,1171,1177,1183,1189,1195,1201],{"__ignoreMap":337},[341,342,345],"span",{"class":343,"line":344},"line",1,[341,346,348],{"class":347},"sutJx","##############################################################\n",[341,350,352],{"class":343,"line":351},2,[341,353,354],{"class":347},"# 👇 Users - You must set at least one user\n",[341,356,358],{"class":343,"line":357},3,[341,359,348],{"class":347},[341,361,363],{"class":343,"line":362},4,[341,364,366],{"emptyLinePlaceholder":365},true,"\n",[341,368,370,374],{"class":343,"line":369},5,[341,371,373],{"class":372},"sqIbZ","users",[341,375,377],{"class":376},"sG-J9",":\n",[341,379,381],{"class":343,"line":380},6,[341,382,383],{"class":347},"  # - username: alice\n",[341,385,387],{"class":343,"line":386},7,[341,388,389],{"class":347},"  #   name: Alice Smith\n",[341,391,393],{"class":343,"line":392},8,[341,394,395],{"class":347},"  #   groups: ['sudo']\n",[341,397,399],{"class":343,"line":398},9,[341,400,401],{"class":347},"  #   authorized_keys:\n",[341,403,405],{"class":343,"line":404},10,[341,406,407],{"class":347},"  #     - public_key: \"ssh-ed25519 AAAAC3NzaC1lmyfakeublickeyMVIzwQXBzxxD9b8Erd1FKVvu alice\"\n",[341,409,411],{"class":343,"line":410},11,[341,412,366],{"emptyLinePlaceholder":365},[341,414,416],{"class":343,"line":415},12,[341,417,418],{"class":347},"  # - username: bob\n",[341,420,422],{"class":343,"line":421},13,[341,423,424],{"class":347},"  #   name: Bob Smith\n",[341,426,428],{"class":343,"line":427},14,[341,429,430],{"class":347},"  #   state: present\n",[341,432,434],{"class":343,"line":433},15,[341,435,436],{"class":347},"  #   password: \"$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1\"\n",[341,438,440],{"class":343,"line":439},16,[341,441,395],{"class":347},[341,443,445],{"class":343,"line":444},17,[341,446,447],{"class":347},"  #   shell: \"/bin/bash\"\n",[341,449,451],{"class":343,"line":450},18,[341,452,401],{"class":347},[341,454,456],{"class":343,"line":455},19,[341,457,458],{"class":347},"  #     - public_key: \"ssh-ed25519 AAAAC3NzaC1anotherfakekeyIMVIzwQXBzxxD9b8Erd1FKVvu bob\"\n",[341,460,462],{"class":343,"line":461},20,[341,463,366],{"emptyLinePlaceholder":365},[341,465,467],{"class":343,"line":466},21,[341,468,348],{"class":347},[341,470,472],{"class":343,"line":471},22,[341,473,474],{"class":347},"# 👇 Providers - You must set at least one provider\n",[341,476,478],{"class":343,"line":477},23,[341,479,348],{"class":347},[341,481,483],{"class":343,"line":482},24,[341,484,366],{"emptyLinePlaceholder":365},[341,486,488,491],{"class":343,"line":487},25,[341,489,490],{"class":372},"providers",[341,492,377],{"class":376},[341,494,496],{"class":343,"line":495},26,[341,497,498],{"class":347},"#   - name: digitalocean\n",[341,500,502],{"class":343,"line":501},27,[341,503,504],{"class":347},"#     api_token: Set token here OR delete this line and set environment variable DO_API_TOKEN\n",[341,506,508],{"class":343,"line":507},28,[341,509,366],{"emptyLinePlaceholder":365},[341,511,513],{"class":343,"line":512},29,[341,514,515],{"class":347},"#   - name: hetzner\n",[341,517,519],{"class":343,"line":518},30,[341,520,521],{"class":347},"#     api_token: Set token here OR delete this line and set environment variable HCLOUD_TOKEN\n",[341,523,525],{"class":343,"line":524},31,[341,526,366],{"emptyLinePlaceholder":365},[341,528,530],{"class":343,"line":529},32,[341,531,532],{"class":347},"#   - name: vultr\n",[341,534,536],{"class":343,"line":535},33,[341,537,538],{"class":347},"#     api_token: Set token here OR delete this line and set environment variable VULTR_API_KEY\n",[341,540,542],{"class":343,"line":541},34,[341,543,366],{"emptyLinePlaceholder":365},[341,545,547],{"class":343,"line":546},35,[341,548,348],{"class":347},[341,550,552],{"class":343,"line":551},36,[341,553,554],{"class":347},"# 👇 Servers - You must set at least one server\n",[341,556,558],{"class":343,"line":557},37,[341,559,348],{"class":347},[341,561,563],{"class":343,"line":562},38,[341,564,366],{"emptyLinePlaceholder":365},[341,566,568,571],{"class":343,"line":567},39,[341,569,570],{"class":372},"servers",[341,572,377],{"class":376},[341,574,576],{"class":343,"line":575},40,[341,577,578],{"class":347},"  # - server_name: ubuntu-2gb-ash-1\n",[341,580,582],{"class":343,"line":581},41,[341,583,584],{"class":347},"  #   environment: production\n",[341,586,588],{"class":343,"line":587},42,[341,589,590],{"class":347},"  #   hardware_profile: hetzner_2c_2gb_ubuntu2404\n",[341,592,594],{"class":343,"line":593},43,[341,595,366],{"emptyLinePlaceholder":365},[341,597,599],{"class":343,"line":598},44,[341,600,601],{"class":347},"  # - server_name: ubuntu-1gb-ord-2\n",[341,603,605],{"class":343,"line":604},45,[341,606,607],{"class":347},"  #   environment: staging\n",[341,609,611],{"class":343,"line":610},46,[341,612,613],{"class":347},"  #   hardware_profile: vultr_1c_1gb_ubuntu2404\n",[341,615,617],{"class":343,"line":616},47,[341,618,366],{"emptyLinePlaceholder":365},[341,620,622],{"class":343,"line":621},48,[341,623,348],{"class":347},[341,625,627],{"class":343,"line":626},49,[341,628,629],{"class":347},"# 🤖 Hardware Profiles\n",[341,631,633],{"class":343,"line":632},50,[341,634,348],{"class":347},[341,636,638],{"class":343,"line":637},51,[341,639,366],{"emptyLinePlaceholder":365},[341,641,643,646],{"class":343,"line":642},52,[341,644,645],{"class":372},"hardware_profiles",[341,647,377],{"class":376},[341,649,651],{"class":343,"line":650},53,[341,652,653],{"class":347},"  # Hetzner\n",[341,655,657,660,663,666],{"class":343,"line":656},54,[341,658,659],{"class":376},"  -",[341,661,662],{"class":372}," name",[341,664,665],{"class":376},":",[341,667,669],{"class":668},"s0vBq"," hetzner_2c_2gb_ubuntu2404\n",[341,671,673,676,678],{"class":343,"line":672},55,[341,674,675],{"class":372},"    provider",[341,677,665],{"class":376},[341,679,680],{"class":668}," hetzner\n",[341,682,684,687],{"class":343,"line":683},56,[341,685,686],{"class":372},"    profile_config",[341,688,377],{"class":376},[341,690,692,695,697],{"class":343,"line":691},57,[341,693,694],{"class":372},"      location",[341,696,665],{"class":376},[341,698,699],{"class":668}," ash\n",[341,701,703,706,708],{"class":343,"line":702},58,[341,704,705],{"class":372},"      server_type",[341,707,665],{"class":376},[341,709,710],{"class":668}," cpx11\n",[341,712,714,717,719],{"class":343,"line":713},59,[341,715,716],{"class":372},"      image",[341,718,665],{"class":376},[341,720,721],{"class":668}," ubuntu-24.04\n",[341,723,725,728,730],{"class":343,"line":724},60,[341,726,727],{"class":372},"      backups",[341,729,665],{"class":376},[341,731,733],{"class":732},"sMrrN"," true\n",[341,735,737],{"class":343,"line":736},61,[341,738,366],{"emptyLinePlaceholder":365},[341,740,742],{"class":343,"line":741},62,[341,743,744],{"class":347},"  # Vultr\n",[341,746,748,750,752,754],{"class":343,"line":747},63,[341,749,659],{"class":376},[341,751,662],{"class":372},[341,753,665],{"class":376},[341,755,756],{"class":668}," vultr_1c_1gb_ubuntu2404\n",[341,758,760,762,764],{"class":343,"line":759},64,[341,761,675],{"class":372},[341,763,665],{"class":376},[341,765,766],{"class":668}," vultr\n",[341,768,770,772],{"class":343,"line":769},65,[341,771,686],{"class":372},[341,773,377],{"class":376},[341,775,777,780,782],{"class":343,"line":776},66,[341,778,779],{"class":372},"      region",[341,781,665],{"class":376},[341,783,784],{"class":668}," ord\n",[341,786,788,791,793],{"class":343,"line":787},67,[341,789,790],{"class":372},"      plan",[341,792,665],{"class":376},[341,794,795],{"class":668}," vc2-1c-1gb\n",[341,797,799,802,804,808,811],{"class":343,"line":798},68,[341,800,801],{"class":372},"      os",[341,803,665],{"class":376},[341,805,807],{"class":806},"sF_wb"," \"",[341,809,810],{"class":668},"Ubuntu 24.04 LTS x64",[341,812,813],{"class":806},"\"\n",[341,815,817,819,821],{"class":343,"line":816},69,[341,818,727],{"class":372},[341,820,665],{"class":376},[341,822,733],{"class":732},[341,824,826],{"class":343,"line":825},70,[341,827,829],{"class":828},"sMo7A","  \n",[341,831,833],{"class":343,"line":832},71,[341,834,835],{"class":347},"  # DigitalOcean\n",[341,837,839,841,843,845],{"class":343,"line":838},72,[341,840,659],{"class":376},[341,842,662],{"class":372},[341,844,665],{"class":376},[341,846,847],{"class":668}," digitalocean_1c_1gb_ubuntu2404\n",[341,849,851,853,855],{"class":343,"line":850},73,[341,852,675],{"class":372},[341,854,665],{"class":376},[341,856,857],{"class":668}," digitalocean\n",[341,859,861,863],{"class":343,"line":860},74,[341,862,686],{"class":372},[341,864,377],{"class":376},[341,866,868,870,872],{"class":343,"line":867},75,[341,869,779],{"class":372},[341,871,665],{"class":376},[341,873,874],{"class":668}," nyc3\n",[341,876,878,881,883],{"class":343,"line":877},76,[341,879,880],{"class":372},"      size",[341,882,665],{"class":376},[341,884,885],{"class":668}," s-1vcpu-1gb\n",[341,887,889,891,893],{"class":343,"line":888},77,[341,890,716],{"class":372},[341,892,665],{"class":376},[341,894,895],{"class":668}," ubuntu-24-04-x64\n",[341,897,899,901,903],{"class":343,"line":898},78,[341,900,727],{"class":372},[341,902,665],{"class":376},[341,904,733],{"class":732},[341,906,908],{"class":343,"line":907},79,[341,909,366],{"emptyLinePlaceholder":365},[341,911,913],{"class":343,"line":912},80,[341,914,348],{"class":347},[341,916,918],{"class":343,"line":917},81,[341,919,920],{"class":347},"# 🌎 Environments\n",[341,922,924],{"class":343,"line":923},82,[341,925,348],{"class":347},[341,927,929,932],{"class":343,"line":928},83,[341,930,931],{"class":372},"environments",[341,933,377],{"class":376},[341,935,937,939,941,943],{"class":343,"line":936},84,[341,938,659],{"class":376},[341,940,662],{"class":372},[341,942,665],{"class":376},[341,944,945],{"class":668}," production\n",[341,947,949,951,953,955],{"class":343,"line":948},85,[341,950,659],{"class":376},[341,952,662],{"class":372},[341,954,665],{"class":376},[341,956,957],{"class":668}," staging\n",[341,959,961,963,965,967],{"class":343,"line":960},86,[341,962,659],{"class":376},[341,964,662],{"class":372},[341,966,665],{"class":376},[341,968,969],{"class":668}," development\n",[341,971,973],{"class":343,"line":972},87,[341,974,366],{"emptyLinePlaceholder":365},[341,976,978],{"class":343,"line":977},88,[341,979,348],{"class":347},[341,981,983],{"class":343,"line":982},89,[341,984,985],{"class":347},"# 🤓 Advanced Server Configuration\n",[341,987,989],{"class":343,"line":988},90,[341,990,348],{"class":347},[341,992,994],{"class":343,"line":993},91,[341,995,366],{"emptyLinePlaceholder":365},[341,997,999],{"class":343,"line":998},92,[341,1000,1001],{"class":347},"# Timezone and contact settings\n",[341,1003,1005,1008,1010,1012,1015],{"class":343,"line":1004},93,[341,1006,1007],{"class":372},"server_timezone",[341,1009,665],{"class":376},[341,1011,807],{"class":806},[341,1013,1014],{"class":668},"Etc/UTC",[341,1016,813],{"class":806},[341,1018,1020,1023,1025],{"class":343,"line":1019},94,[341,1021,1022],{"class":372},"server_contact",[341,1024,665],{"class":376},[341,1026,1027],{"class":668}," changeme@example.com\n",[341,1029,1031],{"class":343,"line":1030},95,[341,1032,366],{"emptyLinePlaceholder":365},[341,1034,1036],{"class":343,"line":1035},96,[341,1037,1038],{"class":347},"# If you the SSH port below, you may need to run `spin provision -p \u003Cyour-default-ssh-port>`\n",[341,1040,1042],{"class":343,"line":1041},97,[341,1043,1044],{"class":347},"# to get a connection on your first provision. Otherwise, SSH will try connecting \n",[341,1046,1048],{"class":343,"line":1047},98,[341,1049,1050],{"class":347},"# to your new port before the SSH server configuration is updated.\n",[341,1052,1054,1057,1059,1061,1064],{"class":343,"line":1053},99,[341,1055,1056],{"class":372},"ssh_port",[341,1058,665],{"class":376},[341,1060,807],{"class":806},[341,1062,1063],{"class":668},"22",[341,1065,813],{"class":806},[341,1067,1069],{"class":343,"line":1068},100,[341,1070,366],{"emptyLinePlaceholder":365},[341,1072,1074],{"class":343,"line":1073},101,[341,1075,1076],{"class":347},"## You can set this to false to require a password for sudo.\n",[341,1078,1080],{"class":343,"line":1079},102,[341,1081,1082],{"class":347},"## If you disable passwordless sudo, you must set a password for all sudo users.\n",[341,1084,1086],{"class":343,"line":1085},103,[341,1087,1088],{"class":347},"## generate an encrypted hash with `spin mkpasswd`. Learn more:\n",[341,1090,1092],{"class":343,"line":1091},104,[341,1093,1094],{"class":347},"## https://serversideup.net/open-source/spin/docs/command-reference/mkpasswd\n",[341,1096,1098,1101,1103],{"class":343,"line":1097},105,[341,1099,1100],{"class":372},"use_passwordless_sudo",[341,1102,665],{"class":376},[341,1104,733],{"class":732},[341,1106,1108],{"class":343,"line":1107},106,[341,1109,366],{"emptyLinePlaceholder":365},[341,1111,1113],{"class":343,"line":1112},107,[341,1114,1115],{"class":347},"## Email Notifications\n",[341,1117,1119,1122,1124,1126,1129],{"class":343,"line":1118},108,[341,1120,1121],{"class":372},"postfix_hostname",[341,1123,665],{"class":376},[341,1125,807],{"class":806},[341,1127,1128],{"class":668},"{{ inventory_hostname }}",[341,1130,813],{"class":806},[341,1132,1134],{"class":343,"line":1133},109,[341,1135,366],{"emptyLinePlaceholder":365},[341,1137,1139],{"class":343,"line":1138},110,[341,1140,1141],{"class":347},"## Set variables below to enable external SMTP relay\n",[341,1143,1145],{"class":343,"line":1144},111,[341,1146,1147],{"class":347},"# postfix_relayhost: \"smtp.example.com\"\n",[341,1149,1151],{"class":343,"line":1150},112,[341,1152,1153],{"class":347},"# postfix_relayhost_port: \"587\"\n",[341,1155,1157],{"class":343,"line":1156},113,[341,1158,1159],{"class":347},"# postfix_relayhost_username: \"myusername\"\n",[341,1161,1163],{"class":343,"line":1162},114,[341,1164,1165],{"class":347},"# postfix_relayhost_password: \"mysupersecretpassword\"\n",[341,1167,1169],{"class":343,"line":1168},115,[341,1170,366],{"emptyLinePlaceholder":365},[341,1172,1174],{"class":343,"line":1173},116,[341,1175,1176],{"class":347},"## Deploy user customization - You can customize the deploy user below if you'd like\n",[341,1178,1180],{"class":343,"line":1179},117,[341,1181,1182],{"class":347},"# docker_user:\n",[341,1184,1186],{"class":343,"line":1185},118,[341,1187,1188],{"class":347},"#   username: deploy\n",[341,1190,1192],{"class":343,"line":1191},119,[341,1193,1194],{"class":347},"#   authorized_ssh_keys: \n",[341,1196,1198],{"class":343,"line":1197},120,[341,1199,1200],{"class":347},"#     - \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKNJGtd7a4DBHsQi7HGrC5xz0eAEFHZ3Ogh3FEFI2345 fake@key\"\n",[341,1202,1204],{"class":343,"line":1203},121,[341,1205,1206],{"class":347},"#     - \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFRfXxUZ8q9vHRcQZ6tLb0KwGHu8xjQHfYopZKLmnopQ anotherfake@key\"\n",[308,1208,1210],{"id":1209},"whats-changed","What's changed",[294,1212,1213],{},"We changed a few things regarding this new set up:",[1215,1216,1217,1224,1229,1239,1245],"ul",{},[1218,1219,1220,1221,1223],"li",{},"The ",[316,1222,318],{}," is no longer configured on new projects",[1218,1225,1220,1226,1228],{},[316,1227,322],{}," file now manages both server settings and inventory (instead of just settings before)",[1218,1230,1231,1232,1234,1235,1238],{},"On project creation, the ",[316,1233,322],{}," file is no longer included in the repository by default (it acts like an ",[316,1236,1237],{},".env"," file)",[1218,1240,1241,1242,1244],{},"On project creation, you are no longer prompted to encrypt your ",[316,1243,322],{}," file (you can still do this manually)",[1218,1246,1247,1249,1250,1253,1254,1257],{},[316,1248,1100],{}," is now set to ",[316,1251,1252],{},"true"," by default, allowing sudo users to become root without a password, but they are still authenticated by their SSH key. Keep this value to ",[316,1255,1256],{},"false"," if you'd like to require a password for sudo.",[308,1259,1261],{"id":1260},"how-to-migrate-a-project-to-the-new-structure","How to migrate a project to the new structure",[294,1263,1264],{},"You can continue to use your existing set up if you'd like, but if you want the new features, here is how you can take a Spin v2 project and set it up like a brand new Spin v3 project.",[1266,1267,1269],"h3",{"id":1268},"make-a-backup","Make a backup",[294,1271,1272],{},"This is always a good idea when you're making big changes like this. It's better to have one than not 😃. Here's where you should make backups:",[1215,1274,1275,1278,1281,1284],{},[1218,1276,1277],{},"Make a copy of your local project directory",[1218,1279,1280],{},"Take a snapshot/backup of your production and staging servers",[1218,1282,1283],{},"Make sure you're on a clean branch within your project",[1218,1285,1286,1287,1290],{},"Plan and communicate to your users that there may be a brief interruption during the upgrade (running ",[316,1288,1289],{},"spin provision"," might update packages and cause 1-2 minutes of downtime)",[1266,1292,1294],{"id":1293},"ensure-your-gitignore-is-up-to-date","Ensure your .gitignore is up to date",[294,1296,1297,1298,1300],{},"Essentially what we want to do, is remove ",[316,1299,322],{}," from the Git repository (unless if you find a certain use case to keep it in there -- as long as it's encrypted with a secure password).",[331,1302,1308],{"className":1303,"code":1305,"filename":1306,"language":1307,"meta":337},[1304],"language-text",".spin*\n.vault-password\n","Ensure these exist in your .gitignore","text",[316,1309,1305],{"__ignoreMap":337},[1266,1311,1313,1314],{"id":1312},"ensure-your-env-files-are-up-to-date","Ensure your \".env.",[1315,1316,1317],"environment",{},"\" files are up to date",[294,1319,1320,1321,1324],{},"Depending how you deploy, we may be re-uploading your ",[316,1322,1323],{},".env.\u003Cenvironment>"," files to GitHub Actions. Make sure these files are the latest and have every value accurate to what is currently running in your environments.",[1266,1326,1328],{"id":1327},"remove-the-spin-inventoryini-file-and-spinyml-file-from-the-repository","Remove the \".spin-inventory.ini\" file and \".spin.yml\" file from the repository",[294,1330,1331],{},"We know what to remove the files from being tracked by Git.",[331,1333,1338],{"className":1334,"code":1335,"filename":1336,"language":1337,"meta":337,"style":337},"language-bash shiki shiki-themes material-theme-lighter github-dark github-dark","git rm --cached .spin-inventory.ini\ngit rm --cached .spin.yml\n","Stop tracking these files in Git","bash",[316,1339,1340,1356],{"__ignoreMap":337},[341,1341,1342,1346,1349,1353],{"class":343,"line":344},[341,1343,1345],{"class":1344},"soiBB","git",[341,1347,1348],{"class":668}," rm",[341,1350,1352],{"class":1351},"sSJ72"," --cached",[341,1354,1355],{"class":668}," .spin-inventory.ini\n",[341,1357,1358,1360,1362,1364],{"class":343,"line":351},[341,1359,1345],{"class":1344},[341,1361,1348],{"class":668},[341,1363,1352],{"class":1351},[341,1365,1366],{"class":668}," .spin.yml\n",[1266,1368,1370],{"id":1369},"decrypt-your-files-so-you-can-edit-them","Decrypt your files so you can edit them",[294,1372,1373],{},"To make it easy for you, it's probably easiest to decrypt your files so you can easily edit them.",[331,1375,1378],{"className":1334,"code":1376,"filename":1377,"language":1337,"meta":337,"style":337},"spin vault decrypt .spin-inventory.ini\nspin vault decrypt .spin.yml\n","Decrypt your files",[316,1379,1380,1393],{"__ignoreMap":337},[341,1381,1382,1385,1388,1391],{"class":343,"line":344},[341,1383,1384],{"class":1344},"spin",[341,1386,1387],{"class":668}," vault",[341,1389,1390],{"class":668}," decrypt",[341,1392,1355],{"class":668},[341,1394,1395,1397,1399,1401],{"class":343,"line":351},[341,1396,1384],{"class":1344},[341,1398,1387],{"class":668},[341,1400,1390],{"class":668},[341,1402,1366],{"class":668},[1266,1404,1406],{"id":1405},"rename-your-spinyml-file-to-spinoriginalyml","Rename your \".spin.yml\" file to \".spin.original.yml\"",[294,1408,1409],{},"We just need to temporarily rename the file so we can reference it.",[1266,1411,1413],{"id":1412},"download-the-new-spinyml-file","Download the new \".spin.yml\" file",[294,1415,1416,1417,1419],{},"You can copy the contents of our example file from GitHub and paste into our new ",[316,1418,322],{}," file.",[294,1421,1422],{},[1423,1424,1429],"a",{"href":1425,"rel":1426,"target":1428},"https://github.com/serversideup/ansible-collection-spin/blob/main/.spin.example.yml",[1427],"nofollow","_blank","View latest .spin.yml file on GitHub →",[1266,1431,1433],{"id":1432},"migrate-contents-from-your-spinoriginalyml-file","Migrate contents from your \".spin.original.yml\" file",[294,1435,1436],{},"Move any setting you'd like, but especially do not forget about these:",[1215,1438,1439,1443,1447,1451],{},[1218,1440,1441],{},[316,1442,1007],{},[1218,1444,1445],{},[316,1446,373],{},[1218,1448,1449],{},[316,1450,1022],{},[1218,1452,1453],{},[316,1454,1100],{},[1266,1456,1458],{"id":1457},"migrate-the-contents-of-your-spin-inventoryini-file","Migrate the contents of your \".spin-inventory.ini\" file",[294,1460,1461,1462,1464],{},"The other important thing is to move over our inventory from our ",[316,1463,318],{}," file. To do this, let's say we have this example:",[331,1466,1471],{"className":1467,"code":1468,"filename":1469,"language":1470,"meta":337,"style":337},"language-ini shiki shiki-themes material-theme-lighter github-dark github-dark","###########################################\n# 👇 Basic Server Configuration - Set your server DNS or IP address\n###########################################\n\n[production_manager_servers]\nserver01.example.com\n\n[staging_manager_servers]\nserver02.example.com\n\n###########################################\n# 🤓 Advanced Environment Settings\n###########################################\n# Swarm Configuration\n[swarm_managers:children]\nproduction_manager_servers\nstaging_manager_servers\n\n# Environment\n[production:children]\nproduction_manager_servers\n\n[staging:children]\nstaging_manager_servers\n\n[all_servers:children]\nproduction\nstaging\n","Example .spin-inventory.ini","ini",[316,1472,1473,1478,1483,1487,1491,1497,1502,1506,1511,1516,1520,1524,1529,1533,1538,1543,1548,1553,1557,1562,1567,1571,1575,1580,1584,1588,1593,1598],{"__ignoreMap":337},[341,1474,1475],{"class":343,"line":344},[341,1476,1477],{"class":347},"###########################################\n",[341,1479,1480],{"class":343,"line":351},[341,1481,1482],{"class":347},"# 👇 Basic Server Configuration - Set your server DNS or IP address\n",[341,1484,1485],{"class":343,"line":357},[341,1486,1477],{"class":347},[341,1488,1489],{"class":343,"line":362},[341,1490,366],{"emptyLinePlaceholder":365},[341,1492,1493],{"class":343,"line":369},[341,1494,1496],{"class":1495},"sG0xr","[production_manager_servers]\n",[341,1498,1499],{"class":343,"line":380},[341,1500,1501],{"class":828},"server01.example.com\n",[341,1503,1504],{"class":343,"line":386},[341,1505,366],{"emptyLinePlaceholder":365},[341,1507,1508],{"class":343,"line":392},[341,1509,1510],{"class":1495},"[staging_manager_servers]\n",[341,1512,1513],{"class":343,"line":398},[341,1514,1515],{"class":828},"server02.example.com\n",[341,1517,1518],{"class":343,"line":404},[341,1519,366],{"emptyLinePlaceholder":365},[341,1521,1522],{"class":343,"line":410},[341,1523,1477],{"class":347},[341,1525,1526],{"class":343,"line":415},[341,1527,1528],{"class":347},"# 🤓 Advanced Environment Settings\n",[341,1530,1531],{"class":343,"line":421},[341,1532,1477],{"class":347},[341,1534,1535],{"class":343,"line":427},[341,1536,1537],{"class":347},"# Swarm Configuration\n",[341,1539,1540],{"class":343,"line":433},[341,1541,1542],{"class":1495},"[swarm_managers:children]\n",[341,1544,1545],{"class":343,"line":439},[341,1546,1547],{"class":828},"production_manager_servers\n",[341,1549,1550],{"class":343,"line":444},[341,1551,1552],{"class":828},"staging_manager_servers\n",[341,1554,1555],{"class":343,"line":450},[341,1556,366],{"emptyLinePlaceholder":365},[341,1558,1559],{"class":343,"line":455},[341,1560,1561],{"class":347},"# Environment\n",[341,1563,1564],{"class":343,"line":461},[341,1565,1566],{"class":1495},"[production:children]\n",[341,1568,1569],{"class":343,"line":466},[341,1570,1547],{"class":828},[341,1572,1573],{"class":343,"line":471},[341,1574,366],{"emptyLinePlaceholder":365},[341,1576,1577],{"class":343,"line":477},[341,1578,1579],{"class":1495},"[staging:children]\n",[341,1581,1582],{"class":343,"line":482},[341,1583,1552],{"class":828},[341,1585,1586],{"class":343,"line":487},[341,1587,366],{"emptyLinePlaceholder":365},[341,1589,1590],{"class":343,"line":495},[341,1591,1592],{"class":1495},"[all_servers:children]\n",[341,1594,1595],{"class":343,"line":501},[341,1596,1597],{"class":828},"production\n",[341,1599,1600],{"class":343,"line":507},[341,1601,1602],{"class":828},"staging\n",[294,1604,1605,1606,319,1609,1612],{},"The most important thing in the file is our \"Basic Server Configuration\" section. You can see this file has two servers, ",[316,1607,1608],{},"server01.example.com",[316,1610,1611],{},"server02.example.com",".",[294,1614,1615,1616,1618],{},"We want to move them into our ",[316,1617,322],{}," file, so it looks like this:",[331,1620,1623],{"className":333,"code":1621,"filename":1622,"language":336,"meta":337,"style":337},"##############################################################\n# 👇 Servers - You must set at least one server\n##############################################################\n\nservers:\n  - server_name: server01.example.com # ✅ You can set this to anything you want. It's just a label.\n    environment: production\n    # 👇 You MUST set this. Make sure it matches from your \".spin-inventory.ini\" file\n    address: server01.example.com\n    # ❌ You can delete the line below if you're not using our native providers\n    # hardware_profile: hetzner_2c_2gb_ubuntu2404\n\n  # 👇 Here is a full example of \"server02.example.com\" without comments\n  - server_name: server02.example.com\n    environment: staging\n    address: server02.example.com\n","Example .spin.yml with migrated inventory",[316,1624,1625,1629,1633,1637,1641,1647,1662,1671,1676,1686,1691,1696,1700,1705,1716,1724],{"__ignoreMap":337},[341,1626,1627],{"class":343,"line":344},[341,1628,348],{"class":347},[341,1630,1631],{"class":343,"line":351},[341,1632,554],{"class":347},[341,1634,1635],{"class":343,"line":357},[341,1636,348],{"class":347},[341,1638,1639],{"class":343,"line":362},[341,1640,366],{"emptyLinePlaceholder":365},[341,1642,1643,1645],{"class":343,"line":369},[341,1644,570],{"class":372},[341,1646,377],{"class":376},[341,1648,1649,1651,1654,1656,1659],{"class":343,"line":380},[341,1650,659],{"class":376},[341,1652,1653],{"class":372}," server_name",[341,1655,665],{"class":376},[341,1657,1658],{"class":668}," server01.example.com",[341,1660,1661],{"class":347}," # ✅ You can set this to anything you want. It's just a label.\n",[341,1663,1664,1667,1669],{"class":343,"line":386},[341,1665,1666],{"class":372},"    environment",[341,1668,665],{"class":376},[341,1670,945],{"class":668},[341,1672,1673],{"class":343,"line":392},[341,1674,1675],{"class":347},"    # 👇 You MUST set this. Make sure it matches from your \".spin-inventory.ini\" file\n",[341,1677,1678,1681,1683],{"class":343,"line":398},[341,1679,1680],{"class":372},"    address",[341,1682,665],{"class":376},[341,1684,1685],{"class":668}," server01.example.com\n",[341,1687,1688],{"class":343,"line":404},[341,1689,1690],{"class":347},"    # ❌ You can delete the line below if you're not using our native providers\n",[341,1692,1693],{"class":343,"line":410},[341,1694,1695],{"class":347},"    # hardware_profile: hetzner_2c_2gb_ubuntu2404\n",[341,1697,1698],{"class":343,"line":415},[341,1699,366],{"emptyLinePlaceholder":365},[341,1701,1702],{"class":343,"line":421},[341,1703,1704],{"class":347},"  # 👇 Here is a full example of \"server02.example.com\" without comments\n",[341,1706,1707,1709,1711,1713],{"class":343,"line":427},[341,1708,659],{"class":376},[341,1710,1653],{"class":372},[341,1712,665],{"class":376},[341,1714,1715],{"class":668}," server02.example.com\n",[341,1717,1718,1720,1722],{"class":343,"line":433},[341,1719,1666],{"class":372},[341,1721,665],{"class":376},[341,1723,957],{"class":668},[341,1725,1726,1728,1730],{"class":343,"line":439},[341,1727,1680],{"class":372},[341,1729,665],{"class":376},[341,1731,1715],{"class":668},[1266,1733,1735],{"id":1734},"remove-the-providers-and-hardware_profiles-sections-if-you-want","Remove the \"providers\" and \"hardware_profiles\" sections if you want",[294,1737,1738,1739,319,1741,1743,1744,1747],{},"If you do not want the native providers to be used, you can remove the ",[316,1740,490],{},[316,1742,645],{}," sections. As long as your server has an ",[316,1745,1746],{},"address"," set, Spin will use whatever host you'd like.",[298,1749,1750],{},[294,1751,1752],{},"Keep these sections if you want to use the native providers.",[331,1754,1757],{"className":333,"code":1755,"filename":1756,"language":336,"meta":337,"style":337},"# ##############################################################\n# # 👇 Providers - You must set at least one provider\n# ##############################################################\n\n# providers:\n#   - name: digitalocean\n#     api_token: Set token here OR delete this line and set environment variable DO_API_TOKEN\n\n#   - name: hetzner\n#     api_token: Set token here OR delete this line and set environment variable HCLOUD_TOKEN\n\n#   - name: vultr\n#     api_token: Set token here OR delete this line and set environment variable VULTR_API_KEY\n\n# ##############################################################\n# # 🤖 Hardware Profiles\n# ##############################################################\n\n# hardware_profiles:\n#   # Hetzner\n#   - name: hetzner_2c_2gb_ubuntu2404\n#     provider: hetzner\n#     profile_config:\n#       location: ash\n#       server_type: cpx11\n#       image: ubuntu-24.04\n#       backups: true\n\n#   # Vultr\n#   - name: vultr_1c_1gb_ubuntu2404\n#     provider: vultr\n#     profile_config:\n#       region: ord\n#       plan: vc2-1c-1gb\n#       os: \"Ubuntu 24.04 LTS x64\"\n#       backups: true\n  \n#   # DigitalOcean\n#   - name: digitalocean_1c_1gb_ubuntu2404\n#     provider: digitalocean\n#     profile_config:\n#       region: nyc3\n#       size: s-1vcpu-1gb\n#       image: ubuntu-24-04-x64\n#       backups: true\n","'❌ You can remove these lines if you want'",[316,1758,1759,1764,1769,1773,1777,1782,1786,1790,1794,1798,1802,1806,1810,1814,1818,1822,1827,1831,1835,1840,1845,1850,1855,1860,1865,1870,1875,1880,1884,1889,1894,1899,1903,1908,1913,1918,1922,1926,1931,1936,1941,1945,1950,1955,1960],{"__ignoreMap":337},[341,1760,1761],{"class":343,"line":344},[341,1762,1763],{"class":347},"# ##############################################################\n",[341,1765,1766],{"class":343,"line":351},[341,1767,1768],{"class":347},"# # 👇 Providers - You must set at least one provider\n",[341,1770,1771],{"class":343,"line":357},[341,1772,1763],{"class":347},[341,1774,1775],{"class":343,"line":362},[341,1776,366],{"emptyLinePlaceholder":365},[341,1778,1779],{"class":343,"line":369},[341,1780,1781],{"class":347},"# providers:\n",[341,1783,1784],{"class":343,"line":380},[341,1785,498],{"class":347},[341,1787,1788],{"class":343,"line":386},[341,1789,504],{"class":347},[341,1791,1792],{"class":343,"line":392},[341,1793,366],{"emptyLinePlaceholder":365},[341,1795,1796],{"class":343,"line":398},[341,1797,515],{"class":347},[341,1799,1800],{"class":343,"line":404},[341,1801,521],{"class":347},[341,1803,1804],{"class":343,"line":410},[341,1805,366],{"emptyLinePlaceholder":365},[341,1807,1808],{"class":343,"line":415},[341,1809,532],{"class":347},[341,1811,1812],{"class":343,"line":421},[341,1813,538],{"class":347},[341,1815,1816],{"class":343,"line":427},[341,1817,366],{"emptyLinePlaceholder":365},[341,1819,1820],{"class":343,"line":433},[341,1821,1763],{"class":347},[341,1823,1824],{"class":343,"line":439},[341,1825,1826],{"class":347},"# # 🤖 Hardware Profiles\n",[341,1828,1829],{"class":343,"line":444},[341,1830,1763],{"class":347},[341,1832,1833],{"class":343,"line":450},[341,1834,366],{"emptyLinePlaceholder":365},[341,1836,1837],{"class":343,"line":455},[341,1838,1839],{"class":347},"# hardware_profiles:\n",[341,1841,1842],{"class":343,"line":461},[341,1843,1844],{"class":347},"#   # Hetzner\n",[341,1846,1847],{"class":343,"line":466},[341,1848,1849],{"class":347},"#   - name: hetzner_2c_2gb_ubuntu2404\n",[341,1851,1852],{"class":343,"line":471},[341,1853,1854],{"class":347},"#     provider: hetzner\n",[341,1856,1857],{"class":343,"line":477},[341,1858,1859],{"class":347},"#     profile_config:\n",[341,1861,1862],{"class":343,"line":482},[341,1863,1864],{"class":347},"#       location: ash\n",[341,1866,1867],{"class":343,"line":487},[341,1868,1869],{"class":347},"#       server_type: cpx11\n",[341,1871,1872],{"class":343,"line":495},[341,1873,1874],{"class":347},"#       image: ubuntu-24.04\n",[341,1876,1877],{"class":343,"line":501},[341,1878,1879],{"class":347},"#       backups: true\n",[341,1881,1882],{"class":343,"line":507},[341,1883,366],{"emptyLinePlaceholder":365},[341,1885,1886],{"class":343,"line":512},[341,1887,1888],{"class":347},"#   # Vultr\n",[341,1890,1891],{"class":343,"line":518},[341,1892,1893],{"class":347},"#   - name: vultr_1c_1gb_ubuntu2404\n",[341,1895,1896],{"class":343,"line":524},[341,1897,1898],{"class":347},"#     provider: vultr\n",[341,1900,1901],{"class":343,"line":529},[341,1902,1859],{"class":347},[341,1904,1905],{"class":343,"line":535},[341,1906,1907],{"class":347},"#       region: ord\n",[341,1909,1910],{"class":343,"line":541},[341,1911,1912],{"class":347},"#       plan: vc2-1c-1gb\n",[341,1914,1915],{"class":343,"line":546},[341,1916,1917],{"class":347},"#       os: \"Ubuntu 24.04 LTS x64\"\n",[341,1919,1920],{"class":343,"line":551},[341,1921,1879],{"class":347},[341,1923,1924],{"class":343,"line":557},[341,1925,829],{"class":828},[341,1927,1928],{"class":343,"line":562},[341,1929,1930],{"class":347},"#   # DigitalOcean\n",[341,1932,1933],{"class":343,"line":567},[341,1934,1935],{"class":347},"#   - name: digitalocean_1c_1gb_ubuntu2404\n",[341,1937,1938],{"class":343,"line":575},[341,1939,1940],{"class":347},"#     provider: digitalocean\n",[341,1942,1943],{"class":343,"line":581},[341,1944,1859],{"class":347},[341,1946,1947],{"class":343,"line":587},[341,1948,1949],{"class":347},"#       region: nyc3\n",[341,1951,1952],{"class":343,"line":593},[341,1953,1954],{"class":347},"#       size: s-1vcpu-1gb\n",[341,1956,1957],{"class":343,"line":598},[341,1958,1959],{"class":347},"#       image: ubuntu-24-04-x64\n",[341,1961,1962],{"class":343,"line":604},[341,1963,1879],{"class":347},[1266,1965,1967],{"id":1966},"remove-the-v2-configuration-files","Remove the v2 configuration files",[294,1969,1970],{},"Make sure to delete the old v2 files from the project when you're confident you've migrated everything.",[331,1972,1975],{"className":1334,"code":1973,"filename":1974,"language":1337,"meta":337,"style":337},"rm .spin-inventory.ini\nrm .spin.original.yml\n","Remove the files from the project",[316,1976,1977,1984],{"__ignoreMap":337},[341,1978,1979,1982],{"class":343,"line":344},[341,1980,1981],{"class":1344},"rm",[341,1983,1355],{"class":668},[341,1985,1986,1988],{"class":343,"line":351},[341,1987,1981],{"class":1344},[341,1989,1990],{"class":668}," .spin.original.yml\n",[1266,1992,1994],{"id":1993},"re-encrypt-if-you-want","Re-encrypt (if you want)",[294,1996,1997,1998,2000,2001,2003],{},"With this new set up, the ",[316,1999,322],{}," file acts like an ",[316,2002,1237],{}," file. If you'd like the extra security, you can re-encrypt the file.",[298,2005,2006],{},[294,2007,2008,2009,2012],{},"If you choose TO NOT encrypt the file, be sure to delete the ",[316,2010,2011],{},".vault-password"," file from your local machine.",[331,2014,2017],{"className":1334,"code":2015,"filename":2016,"language":1337,"meta":337,"style":337},"spin vault encrypt .spin.yml\n","Re-encrypt the file",[316,2018,2019],{"__ignoreMap":337},[341,2020,2021,2023,2025,2028],{"class":343,"line":344},[341,2022,1384],{"class":1344},[341,2024,1387],{"class":668},[341,2026,2027],{"class":668}," encrypt",[341,2029,1366],{"class":668},[294,2031,2032,2033,2035],{},"You will need a ",[316,2034,2011],{}," file on your local machine if you intend to use the encrypted file.",[1266,2037,2039],{"id":2038},"run-spin-provision","Run spin provision",[294,2041,2042,2043,2045,2046,1419],{},"If you'd like to test the new setup, you can run ",[316,2044,1289],{}," and it will use the new ",[316,2047,322],{},[298,2049,2050],{},[294,2051,2052,2053,2055],{},"⚠️ Running ",[316,2054,1289],{}," might cause a brief interruption in your services if there is an update for Docker.",[331,2057,2060],{"className":1334,"code":2058,"filename":2059,"language":1337,"meta":337,"style":337},"spin provision staging\n","Run spin provision on your staging servers",[316,2061,2062],{"__ignoreMap":337},[341,2063,2064,2066,2069],{"class":343,"line":344},[341,2065,1384],{"class":1344},[341,2067,2068],{"class":668}," provision",[341,2070,957],{"class":668},[1266,2072,2074],{"id":2073},"update-github-actions","Update GitHub Actions",[294,2076,2077,2078,1612],{},"If you're using GitHub Actions, we no longer need these environment variables. They will be reuploaded to GitHub Actions under new names when we run ",[316,2079,2080],{},"spin configure gha \u003Cenvironment>",[2082,2083,2084,2097],"table",{},[2085,2086,2087],"thead",{},[2088,2089,2090,2094],"tr",{},[2091,2092,2093],"th",{},"Environment Variable",[2091,2095,2096],{},"New Behavior",[2098,2099,2100,2117,2131],"tbody",{},[2088,2101,2102,2108],{},[2103,2104,2105],"td",{},[316,2106,2107],{},"ENV_FILE_BASE64",[2103,2109,2110,2111,2114,2115,1612],{},"This has been renamed to ",[316,2112,2113],{},"\u003CENVIRONMENT>_ENV_FILE_BASE64",". It will be recreated with ",[316,2116,2080],{},[2088,2118,2119,2124],{},[2103,2120,2121],{},[316,2122,2123],{},"SSH_REMOTE_HOSTNAME",[2103,2125,2110,2126,2114,2129,1612],{},[316,2127,2128],{},"\u003CENVIRONMENT>_SSH_REMOTE_HOSTNAME",[316,2130,2080],{},[2088,2132,2133,2138],{},[2103,2134,2135],{},[316,2136,2137],{},"SSH_DEPLOY_PRIVATE_KEY",[2103,2139,2140,2141,2144,2145,1612],{},"You can keep this if you want. But if you do let it, we automatically create a new deploy key for you, store it under ",[316,2142,2143],{},".infrastructure/ci/SSH_DEPLOY_PRIVATE_KEY"," and add it to GitHub Actions secrets. This process happens when you run ",[316,2146,2080],{},[298,2148,2149],{},[294,2150,2151,2152,2155,2156,2159,2160,2162,2163,2165],{},"If you added other variables such as ",[316,2153,2154],{},"DB_PASSWORD"," or ",[316,2157,2158],{},"REDIS_PASSWORD",", you can remove those from GitHub Actions if you're confident your ",[316,2161,1323],{}," files are accurate. Spin v3 will use the values from your ",[316,2164,1323],{}," files to configure these services.",[1266,2167,2169,2170],{"id":2168},"run-spin-configure-gha","Run \"spin configure gha ",[1315,2171,2172],{},"\"",[294,2174,2175,2176,2178],{},"For each environment, you will need to run ",[316,2177,2080],{}," to update the GitHub Actions environment variables.",[331,2180,2183],{"className":1334,"code":2181,"filename":2182,"language":1337,"meta":337,"style":337},"spin configure gha staging\nspin configure gha production\n","Run \"spin configure gha \u003Cenvironment>\"",[316,2184,2185,2197],{"__ignoreMap":337},[341,2186,2187,2189,2192,2195],{"class":343,"line":344},[341,2188,1384],{"class":1344},[341,2190,2191],{"class":668}," configure",[341,2193,2194],{"class":668}," gha",[341,2196,957],{"class":668},[341,2198,2199,2201,2203,2205],{"class":343,"line":351},[341,2200,1384],{"class":1344},[341,2202,2191],{"class":668},[341,2204,2194],{"class":668},[341,2206,945],{"class":668},[1266,2208,2210],{"id":2209},"get-latest-spin-template","Get latest Spin template",[294,2212,2213],{},"If you purchased Spin Pro, you can get the latest GitHub Actions template by reinitializing your project.",[298,2215,2216,2229],{},[294,2217,2218,2219,2222,2224,2227],{},"The command below will delete all Dockerfiles and Spin configurations then ask you to reinitialize your project. If you made a lot of customizations to the Dockerfiles and Spin templates, you way want to manually copy the GitHub Actions template over.",[2220,2221],"br",{},[2220,2223],{},[303,2225,2226],{},"The links below are only accessible to Spin Pro customers.",[2220,2228],{},[1215,2230,2231,2238],{},[1218,2232,2233],{},[1423,2234,2237],{"href":2235,"rel":2236,"target":1428},"https://github.com/serversideup/spin-template-laravel-pro/blob/main/blocks/github-actions/.github/workflows/action_deploy-production.yml",[1427],"action_deploy-production.yml",[1218,2239,2240],{},[1423,2241,2244],{"href":2242,"rel":2243,"target":1428},"https://github.com/serversideup/spin-template-laravel-pro/blob/main/blocks/github-actions/.github/workflows/service_docker-build-and-publish.yml",[1427],"service_docker-build-and-publish.yml",[331,2246,2249],{"className":1334,"code":2247,"filename":2248,"language":1337,"meta":337,"style":337},"spin init laravel-pro\n","Reinitialize your project",[316,2250,2251],{"__ignoreMap":337},[341,2252,2253,2255,2258],{"class":343,"line":344},[341,2254,1384],{"class":1344},[341,2256,2257],{"class":668}," init",[341,2259,2260],{"class":668}," laravel-pro\n",[308,2262,2264],{"id":2263},"review-your-pending-git-changes","Review your pending Git changes",[294,2266,2267],{},"Now is the time to review your pending Git changes. If you're confident everything looks good, you can go ahead and commit your changes and run your deployment.",[294,2269,2270],{},"Once the deployment is complete, you're ready for Spin v3 and all the exciting new features! 🎉",[2272,2273,2274],"style",{},"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 .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 .s0vBq, html code.shiki .s0vBq{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .sMrrN, html code.shiki .sMrrN{--shiki-light:#FF5370;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sF_wb, html code.shiki .sF_wb{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .sMo7A, html code.shiki .sMo7A{--shiki-light:#90A4AE;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}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 .soiBB, html code.shiki .soiBB{--shiki-light:#E2931D;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sSJ72, html code.shiki .sSJ72{--shiki-light:#91B859;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sG0xr, html code.shiki .sG0xr{--shiki-light:#39ADB5;--shiki-default:#B392F0;--shiki-dark:#B392F0}",{"title":337,"searchDepth":351,"depth":351,"links":2276},[2277,2278,2279,2299],{"id":310,"depth":351,"text":311},{"id":1209,"depth":351,"text":1210},{"id":1260,"depth":351,"text":1261,"children":2280},[2281,2282,2283,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2298],{"id":1268,"depth":357,"text":1269},{"id":1293,"depth":357,"text":1294},{"id":1312,"depth":357,"text":2284},"Ensure your \".env.\" files are up to date",{"id":1327,"depth":357,"text":1328},{"id":1369,"depth":357,"text":1370},{"id":1405,"depth":357,"text":1406},{"id":1412,"depth":357,"text":1413},{"id":1432,"depth":357,"text":1433},{"id":1457,"depth":357,"text":1458},{"id":1734,"depth":357,"text":1735},{"id":1966,"depth":357,"text":1967},{"id":1993,"depth":357,"text":1994},{"id":2038,"depth":357,"text":2039},{"id":2073,"depth":357,"text":2074},{"id":2168,"depth":357,"text":2297},"Run \"spin configure gha \"",{"id":2209,"depth":357,"text":2210},{"id":2263,"depth":351,"text":2264},"https://serversideup.net/open-source/spin/docs/advanced/migrating-from-spin-v2-to-v3","Learn how to migrate from Spin v2 to v3.","md","docs",{"head":2305},{"title":2306},"Migrating from Spin v2 to v3 - Spin by Server Side Up",{"title":173,"description":2301},"ct-rVhjPbXv1SrD0voVocSMhnVSEQ_qgmV59Baa5QD0",[2310,2312],{"title":169,"path":170,"stem":171,"description":2311,"children":-1},"Learn how to create your own Spin template.",{"title":182,"path":183,"stem":184,"description":2313,"children":-1},"Command reference for \"spin base64\"",1769465039693]