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