name: deploy-server
description: Use this skill to provision or update a Welley server on a supported cloud (currently DigitalOcean) when the user asks to deploy a new instance or run a server update. Covers single-instance deployments and SSH-based updates, including interactive collection of missing credentials, SSH keys, domain, region, and sizing.
Palvelimen käyttöönotto
Yleiskuva
Tämä skill luo yhden instanssin Welley-pinon DigitalOceanissa ja osaa ajaa päivitykset SSH:n kautta. Se ohjaa agenttia keräämään puuttuvat tiedot, hakemaan saatavilla olevat instanssimallit määritellystä lähteestä, luomaan virtuaalikoneen, määrittämään isännän, ottamaan Welleyn käyttöön komennolla wlycli deployment create ja tarkistamaan lopputuloksen.
Komentojen nimien on vastattava CLI:tä:
wlycli deployment createwlycli deployment updatewlycli deployment delete
Oletukset (DigitalOcean)
- Alue:
nyc3 - Levykuva:
latest LTS available via API(haetaan osoitteestaimages?type=distribution) - Dropletin nimi: arvotaan muodossa
wlsly-<adjective>-<surname>(esim.wlsly-bright-hopper). Käytä nimigeneraattorin koodia tiedostostareferences/digitalocean.md. Jos hallinnoitu tietokanta luodaan, käytä sille samaa nimeä. - Tilaustyyppi: Basic / Regular (Shared CPU)
- Koko: 2 vCPU / 4 GB RAM / 80 GB SSD / 4 TB siirtoa (noin 24 $/kk)
Oletusten muuttamisen sääntö
Jos käyttäjä määrittää jonkin oletuksen toisin (alue, levykuva, dropletin nimi, projekti, koko), agentin on:
- Toistettava muutos käyttäjälle sanatarkasti.
- Pyydettävä vahvistus ennen jatkamista.
Vuorovaikutteisten kysymysten malli
Kysy vain se, mikä puuttuu. Käytä näitä täsmällisiä kysymyksiä, jotta väärinymmärryksiä syntyy vähemmän. Kysy vaiheittain. Kierros 1: enintään 2 kysymystä kerrallaan. Kierroksella 2 voi tarjota yhteisen vaihtoehdon ”hyväksy kaikki oletukset”. Jos ajoympäristö tukee valintoja, tarjoa jokaiseen kysymykseen 2 tai 3 vaihtoehtoa (A/B/C). Vältä vapaamuotoisia vastauksia, ellei se ole tarpeen.
Kierroksen 1 kysymykset (tunnistetiedot ja pääsy):
- ”Onko sinulla DigitalOcean API -tunnus käytettäväksi, vai odotanko, että annat sellaisen?”
- ”Mitä verkkotunnusta tämän palvelimen pitäisi käyttää (esim.
super-puper.example.com)? Hallitsetko sen DNS-asetuksia?” - ”Onko sinulla jo julkinen SSH-avain käytettäväksi, vai luonko ja lataanko sellaisen?”
- ”Haluatko liittää tämän dropletin olemassa olevaan DigitalOcean-projektiin? Jos haluat, kerro projektin nimi tai tunnus.”
- ”DNS-vaatimus: sinun täytyy luoda A/AAAA-tietueet osoitteille
<domain>jastorage.<domain>(jos CDN:ää ei ole). Pystytkö tekemään sen ennen kuin certbot ajetaan?” - ”Sähköpostin DNS-vaatimus:
--smtp-from-verkkotunnukselle tarvitaan SPF-, DMARC- ja DKIM-tietueet, muuten kutsu- ja vahvistussähköpostit uusille vastaanottajille voivat hävitä huomaamatta. Ovatko ne kunnossa, vai listaanko tietueet, joita SMTP-palveluntarjoajasi tarvitsee?” - Jos käyttäjä kysyy, mistä DO-tunnuksen saa, anna tämä linkki:
https://cloud.digitalocean.com/account/api/tokens
Kierroksen 2 kysymykset (koko, sijainti ja käyttöönoton asetukset):
- ”Haluatko oletusalueen
nyc3vai jonkin muun alueen?” - ”Haluatko oletuskoon (2 vCPU / 2 GB) vai jonkin muun CPU- ja RAM-tavoitteen?”
- ”Käytänkö uusinta APIn kautta saatavilla olevaa Ubuntu LTS -versiota vai tiettyä Ubuntu-versiota?”
- ”Mitä SSH-käyttäjää käytetään alustuksen jälkeen (oletus:
wlsly)? Voit pitää oletuksen.” - ”Haluatko hallinnoidun Postgres-tietokannan vai paketin mukana tulevan Postgres-kontin?”
- Jos hallinnoitu Postgres valitaan: ”Mitä tietokannan aluetta ja kokoa käytän? Oletuksena voin käyttää aluetta
nyc3ja kokoa 1 vCPU / 2 GB.” - Jos hallinnoitu Postgres valitaan: ”Saanko jatkaa luomiseen palveluntarjoajan ilmoittamalla kuukausihinnalla?”
- ”Anna tarvittavat SMTP-asetukset (host, user, password, from). OTEL on valinnainen: anna se vain, jos tarvitset sitä.”
- ”Ylläpitäjän sähköpostiosoite vaaditaan luomiseen. Anna se nyt (lippu:
--email/-e). Jos et anna sitä, pyydän sinua kirjoittamaan sen kahdesti varmistukseksi.”
Tarjoa kierroksella 2 vaihtoehtoa ”hyväksy kaikki oletukset”, jotta tietojen kerääminen sujuu nopeammin.
Jos jokin vastaus puuttuu, esitä tarkentava jatkokysymys (yksi tai kaksi kysymystä).
Työnkulku (DigitalOcean, yksi instanssi)
- Kerää tarvittavat tiedot (kysy, jos puuttuvat).
- DigitalOcean API -tunnus
- Projektin nimi tai tunnus (valinnainen; jos puuttuu tai ei löydy, käytä oletusprojektia)
- Alue
- Instanssin kokotavoite (esim. 4 vCPU / 16 GB RAM)
- Verkkotunnus
- Julkinen SSH-avain (tai vahvistus siitä, että avain luodaan ja rekisteröidään)
- Ylläpitäjän sähköpostiosoite ensimmäistä kirjautumista ja salasanan palautusta varten (vaaditaan luomiseen;
--email/-e). Jos puuttuu, pyydä se kahdesti ja varmista, että ne täsmäävät. - Valinnainen: omat TLS-varmenteet vai certbot
- Vahvistus DNS-pääsystä (A/AAAA-tietueiden luominen osoitteille
<domain>ja tarvittaessastorage.<domain>täytyy onnistua)
- Hae instanssityypit ja valitse koko.
- Käytä koodia tiedostosta
references/digitalocean.md, jolla listaat koot ja suodatat ne CPU:n ja RAMin mukaan. - Jos vaihtoehtoja on useita, vahvista valinta käyttäjältä.
2b. Selvitä Ubuntu-levykuvan slug.
- Kutsu
GET /v2/images?type=distribution&per_page=200ja suodata Ubuntu-kuvat. - Jos käyttäjä pyysi tiettyä versiota, tarkista että sen slug on olemassa, ja vahvista valinta.
- Muussa tapauksessa valitse listan uusin LTS-slug ja vahvista valinta käyttäjältä ennen luomista.
- Luo droplet.
- Käytä DigitalOceanin APIa suoraan (doctl on valinnainen).
- Levykuva: käytä ensisijaisesti käyttäjän määrittämää, muuten valitse APIn listan uusin LTS.
- Liitä SSH-avaimen sormenjälki tai luo ja lataa avain.
- Ota seuranta käyttöön.
- Jos projektin nimi tai tunnus annettiin mutta sitä ei löytynyt, luo droplet ilman projektia (oletusprojektiin).
- Huomio: hallinnoidun tietokannan voi luoda samaan aikaan dropletin kanssa.
Töiden rinnakkaistaminen
Agentin pitäisi ajaa toisistaan riippumattomia tehtäviä limittäin, jotta kokonaisaika lyhenee:
- Kun keräät tietoja käyttäjältä (kierros 2), aloita dropletin luominen, jos tunnus, alue, koko, levykuva ja SSH-avain on jo vahvistettu.
- Kun droplet on luomisvaiheessa, aloita hallinnoidun Postgresin luominen (jos sitä pyydettiin).
- Kun droplet käynnistyy, jatka jäljellä olevien tietojen keräämistä (SMTP, OTEL, ylläpitäjän sähköposti).
- Jos jostakin vaiheesta puuttuu kriittinen tieto, keskeytä se vaihe ja jatka muita rinnakkain tehtäviä.
- Jos DNS on DigitalOceanissa, luo tai päivitä A/AAAA-tietueet heti, kun dropletin IP-osoite on saatavilla (älä odota koko käyttöönottovaiheen valmistumista).
- DNS ja verkkotunnus.
- Kysy, luodaanko tai päivitetäänkö DNS DigitalOceanissa vai jätetäänkö ulkopuolinen DNS ennalleen.
- Jos käytät DigitalOceanin DNS:ää, luo A/AAAA-tietueet dropletin IP-osoitteeseen.
- Määritä isäntä SSH:n kautta.
- Luo käyttäjä ilman root-oikeuksia (esim.
wlsly), anna sille sudo-oikeudet ja kopioi SSH:n authorized keys -tiedot. - Poistu rootista ja kirjaudu uudelleen sisään tavallisena käyttäjänä ennen kuin jatkat.
- Asenna Docker ja docker compose.
- Hae Welley CLI -ohjelma AppStoresta ja tee siitä suoritettava:
- Perusosoite:
https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?develop=stable&platform=<os>/<arch> - Valitse oikea
platform-arvo käyttöjärjestelmän ja arkkitehtuurin mukaan:- Linux x86_64:
linux/amd64 - Linux arm64:
linux/arm64 - macOS x86_64:
darwin/amd64 - macOS arm64:
darwin/arm64 - Windows x86_64:
windows/amd64
- Linux x86_64:
- Esimerkki (Linux x86_64):
curl -fL 'https://appstore.allroads.social/v1/social.wellesley.wlycli/latest?develop=stable&platform=linux/amd64' -o wlycli chmod +x wlycli - Odotettujen vastausotsikoiden joukossa on:
x-artifact-display-name: Welley CLIx-artifact-full-name: social.wellesley.wlyclix-artifact-kind: clix-artifact-platform: <os>/<arch>, esimerkiksilinux/amd64x-artifact-sha256: <sha256>x-artifact-version: <version>x-channel: develop
- Ennen asennusta tarkista otsikot mieluiten HEAD-pyynnöllä ja varmista, että artefaktin nimi, tyyppi, alusta ja kanava vastaavat pyydettyä ohjelmaa.
- Perusosoite:
- Tarkista CLI-ohjelma: aja
wlycli -vjawlycli deployment --helpvarmistaaksesi, että koontitiedot ovat odotetut.
- Ota Welley käyttöön.
- Aja
wlycli deployment createtarvittavilla asetuksilla. - Käytä yhden instanssin oletuksia (ei ulkoista Postgresia, ellei käyttäjä pyydä sitä).
- Jos hallinnoitua Postgresia pyydetään, luo se ensin (DigitalOceanin tietokanta) ja käytä sitten palautettuja host-, port-, db-, user- ja password-arvoja
--postgres-*-lipuissa. - Jos tietokantakäyttäjän salasanaa ei palauteta APIsta tai käyttöliittymästä, nollaa tietokantakäyttäjän tunnistautuminen saadaksesi uudet tunnukset ennen kuin ajat
wlycli-komennon. - Ei-vuorovaikutteisissa ajoissa täytyy antaa
--email/-e, muuten komento epäonnistuu. --base-dirosoittaa ylähakemistoon. CLI luo projektin alihakemiston automaattisesti.- CLI ei suostu ajamaan, jos projektihakemisto tai kontit ovat jo olemassa. Ne on siivottava ennen uutta yritystä.
- Varmenteet (pakollinen).
- Oletus: käytä Certbotin standalone-tilaa (ei-vuorovaikutteinen).
- Käyttäjän täytyy ohjata verkkotunnuksen (ja tarvittaessa
storage.<domain>) A/AAAA-tietueet dropletin IP-osoitteeseen ennen kuin certbot ajetaan. - CLI tukee lippuja
--public-ip(ohittaa havaitun IP-osoitteen) ja--skip-dns-preflight, jos tarkistus on pakko ohittaa. - Älä koskaan oleta, että DNS on määritetty. Kysy ja odota selkeää vahvistusta.
- Älä koskaan käytä lippua
--skip-dns-preflight, ellei käyttäjä erikseen pyydä sitä. - Jos CDN:ää ei ole määritetty, certbotin varmennepyyntöön on sisällytettävä
storage.<domain>. - Käytä itse allekirjoitettuja varmenteita vain, jos käyttäjä erikseen pyytää, ja anna silloin
--self-signed-certs(luo itse allekirjoitetut varmenteet Go:lla). - Anna käyttäjälle DNS-asetusten ohjeet ja odota vahvistusta:
- ”Luo A/AAAA-tietueet niin, että
<domain>osoittaa dropletin IP-osoitteeseen.” - ”Jos käytät osoitetta
storage.<domain>, luo sille myös A/AAAA-tietue.” - ”Kun DNS-muutokset ovat levinneet, kerro minulle, niin jatkan. En näe leviämistä, ellet pyydä minua tarkistamaan nimenselvitystä.”
- Agentti voi tarkistaa DNS:n leviämisen itse komennolla
ping -c 1 <domain>ja vertaamalla IP-osoitetta dropletin osoitteeseen. Jos ne täsmäävät, jatka.
7b. Sähköpostin DNS (SPF / DMARC / DKIM).
- Jos verkkotunnuksella ei ole SPF- ja DMARC-tietueita, Gmail ja Outlook pudottavat sen viestit usein, kun vastaanottaja saa niitä ensimmäistä kertaa, vaikka SMTP-palveluntarjoaja ilmoittaa viestin toimitetuksi.
deployment createtulostaaWarning:-varoituksen, kun--smtp-from-verkkotunnuksella ei ole SPF-tietuetta tai kohdassa_dmarc.<domain>tai ylätason verkkotunnuksella ei ole DMARC-tietuetta. Varoitus ei estä käyttöönottoa. Älä koskaan ohita varoitusta: näytä se käyttäjälle ja anna lisättävät tietueet:<mail-domain>TXTv=spf1 include:<provider> ~all(tarkka include-arvo tulee SMTP-palveluntarjoajalta; yhdistä se olemassa olevaan SPF-tietueeseen, älä koskaan lisää toista)_dmarc.<mail-domain>TXTv=DMARC1; p=none; rua=mailto:dmarc@<mail-domain>- DKIM:
<selector>._domainkey.<mail-domain>-tietueet, jotka SMTP-palveluntarjoaja luo, kun verkkotunnus vahvistetaan
- Tarkista komennoilla
dig +short TXT <mail-domain>jadig +short TXT _dmarc.<mail-domain>. - CLI ei voi tarkistaa DKIM:ää (selector riippuu palveluntarjoajasta). Pyydä aina käyttäjää vahvistamaan, että DKIM on vahvistettu SMTP-palveluntarjoajalla, vaikka
createei olisi tulostanut varoitusta. Amazon SES:n ja vastaavien palveluntarjoajien kanssa SPF tarkistetaan palveluntarjoajan oman envelope-verkkotunnuksen osalta, joten vain DKIM voi saada DMARC-tarkistuksen läpi. SES:ssä kohdan Verified identities alla olevan<mail-domain>-tunnisteen DKIM-tilan on oltava Successful.
- Tarkista ja raportoi.
- Tarkista
docker psja palveluiden terveystarkistuspisteet. - Anna lopulliset yhteystiedot ja seuraavat vaiheet.
Päivitys SSH:n kautta
Kun käyttäjä pyytää ”päivitä palvelin”:
- Kysy kohdeisäntä tai IP-osoite sekä SSH-käyttäjä ja avain.
- Aja
wlycli deployment update --domain <domain> [--force-restart]. - Tarkista konttien ja Nginxin tila.
Lähteet
- DigitalOcean API -koodiesimerkit:
references/digitalocean.md.
Salaiset tiedot ja liput
Käytä salaisille tiedoille näitä lippujen nimiä:
- SMTP host:
--smtp-host - SMTP user:
--smtp-user - SMTP password:
--smtp-password - SMTP from:
--smtp-from - OTEL endpoint:
--otel-endpoint - OTEL headers:
--otel-headers
Pienin mahdollinen create-komento
Pakolliset liput:
--domain--email--smtp-host--smtp-user--smtp-password--smtp-from
Pienin esimerkki:
wlycli deployment create \
--domain example.com \
--email admin@example.com \
--smtp-host smtp.example.com \
--smtp-user user \
--smtp-password pass \
--smtp-from noreply@example.com
Hallinnoidun Postgresin oletukset (DigitalOcean ja CLI)
Kun käytät DigitalOceanin hallinnoitua Postgresia, älä luota CLI:n oletuksiin. Aseta kaikki --postgres-*-liput erikseen:
- DO:n tyypilliset oletukset:
- Portti:
25060 - Tietokanta:
defaultdb - Käyttäjä:
doadmin
- Portti:
- CLI:n oletukset (jos jätät liput pois):
- Portti:
5432 - Tietokanta:
wlsly - Käyttäjä:
wlsly
- Portti:
CLI:n käyttöohjeita
- Version tarkistus:
wlycli -vtaiwlycli --version(lippu).version-alikomentoa ei ole. - Käytä
--base-dir-lippua vain, jos haluat muun kuin oletussijainnin (oletus on~/.welley). CLI luo hakemiston, jos sillä on siihen oikeus. - Ei-vuorovaikutteisissa SSH-ajoissa tulee antaa
--emailja kaikki tarvittavat liput, jotta kysymyksiltä vältytään. - Jos käyttäjä on tuonut CLI-ohjelman palvelimelle (esim.
~/wcli), käytä sitä suoraan. Älä siirrä sitä muualle, ellei sitä pyydetä. - Kopioi koodinpätkät sellaisenaan tiedostosta
references/digitalocean.mdkaikkiin DO API -kutsuihin. Älä kirjoita Python-jäsennystä uudelleen, muokkaa sitä tai improvisoi sitä: pienetkin muutokset (esim. escapointi, lainausmerkit) voivat rikkoa sen eri shelleissä. - SSH-etäskriptit: Käytä aina muotoa
ssh host 'bash -s' << 'EOF'(lainausmerkeillä suojattu heredoc). Älä koskaan käytä muotoassh host "..."kaksoislainausmerkeillä: zsh laajentaa$(...)ja[...]paikallisesti ennen kuin komento lähetetään etäisännälle.
Virheistä toipuminen
Jos deployment create epäonnistuu ja sinun täytyy yrittää uudelleen:
- Siivoa komennolla
wlycli deployment delete --domain <domain> --yes-please-delete-all-the-data. - Delete-komento yrittää siivota rootin omistamat tiedostot konttien avulla. Jos se epäonnistuu silti, poista projektihakemisto kohdasta
--base-dirkorotetuilla oikeuksilla ja aja komento uudelleen.
Portin 80 esitarkistus (valinnainen)
Jos certbot epäonnistuu, testaa portin 80 tavoitettavuus ennen uutta ajoa:
docker run --rm -d -p 80:80 --name test-http nginx:alpine
curl -s http://<domain>:80
docker rm -f test-http