Ruby: Išplėstiniai naudojimo būdai

Toliau su jūsų Ruby diegimais

👋 Sveiki atvykę į Stackhero dokumentaciją!

Stackhero siūlo paruoštą naudoti Ruby cloud sprendimą, kuris suteikia daugybę privalumų, įskaitant:

  • Įdiekite savo programą per kelias sekundes su paprastu git push.
  • Naudokite savo domeno vardą ir pasinaudokite automatiniu HTTPS sertifikatų konfigūravimu, kad padidintumėte saugumą.
  • Mėgaukitės ramybe su automatinėmis atsarginėmis kopijomis, vieno paspaudimo atnaujinimais ir paprasta, skaidria bei prognozuojama kainodara.
  • Gaukite optimalią veikimo ir tvirtą saugumą dėka privačios ir dedikuotos VM.

Taupykite laiką ir supaprastinkite savo gyvenimą: išbandyti Stackhero Ruby cloud hosting sprendimą užtrunka tik 5 minutes!

Iki šiol mes diegėme savo Ruby programą stumdami main šaką naudodami:

git push stackhero main

Jei norite diegti kitą šaką, galite naudoti šią komandą. Pakeiskite <BRANCH> į šakos pavadinimą, kurį norite diegti:

git push stackhero <BRANCH>:main

Pavyzdžiui, norėdami diegti šaką pavadinimu production, vykdykite:

git push stackhero production:main

Kai kuriais atvejais galite norėti diegti žymę, o ne šaką. Norėdami tai padaryti, vykdykite šią komandą. Pakeiskite <TAG> į žymę, kurią norite diegti:

git push stackhero '<TAG>^{}:main'

Pavyzdžiui, norėdami diegti žymę v1.0.0, vykdykite:

git push stackhero 'v1.0.0^{}:main'

^{} sintaksė naudojama nurodyti commit'ą, į kurį žymė nukreipia.

Be šakų ar žymių, galite diegti konkretų commit'ą. Pakeiskite <COMMIT_HASH> komandoje žemiau į norimo commit'o hash'ą:

git push -f stackhero <COMMIT_HASH>:main

Pavyzdžiui, norėdami diegti commit'ą su hash'u abcde, vykdykite:

git push -f stackhero abcde:main

Jei jūsų gamybos diegimas neveikia kaip tikėtasi, galite grįžti atgal diegdami senesnį commit'ą. Pirmiausia naudokite žemiau esančią komandą, kad peržiūrėtumėte savo commit'ų istoriją:

git log

Ši komanda rodo datą, commit'o hash'ą ir aprašymą kiekvienam commit'ui jūsų saugykloje. Pavyzdžiui, galite matyti tokią išvestį:

commit cccc8b3ebdccb9abc1926ef49ee589dae5c5fe06 (HEAD -> main, stackhero/main)
Author: Developer
Date:   Fri Apr 28 09:36:18 +0000

    Break the code

commit bbbb622301772072c3d82f3cc0d91e29e6e84901
Author: Developer
Date:   Wed Apr 26 12:49:28 +0000

    Update the code

commit aaaa1d8b06535b413e0df8298ccf52339dfef3ff
Author: Developer
Date:   Wed Apr 26 12:44:50 +0000

    Improve the code

Jei commit'as su pranešimu "Break the code" (hash cccc...) veikia gamyboje, ir nusprendžiate grįžti prie ankstesnio commit'o "Update the code" (hash bbbb...), vykdykite:

git push -f stackhero bbbb622301772072c3d82f3cc0d91e29e6e84901:main

Norint išvengti klaidingo kodo diegimo ir padidinti gamybos stabilumą, labai rekomenduojama turėti "staging" aplinką.

Esanti tarp "development" ir "production" aplinkų, "staging" aplinka suteikia beveik tikslią gamybos aplinkos kopiją. Tai leidžia jums išbandyti savo kodą ir užtikrinti jo kokybę prieš diegiant į gamybą.

Naudodami staging aplinką, galite būti labiau užtikrinti savo kodo funkcionalumu ir našumu, užtikrinant patikimesnį ir tvirtesnį gamybos diegimą.

Šio tipo aplinka bus aptarta vėliau dokumentacijoje.

Staging aplinka yra geriausia praktika naudoti kartu su jūsų development ir production aplinkomis. Ji atkartoja jūsų gamybos aplinką, kad galėtumėte išbandyti atnaujinimus ir pakeitimus prieš juos paleidžiant.

Staging aplinka turi glaudžiai atitikti gamybos aplinką.

Tačiau įsitikinkite, kad staging aplinka naudoja gamybos duomenų bazės kloną, o ne pačią gamybos duomenų bazę.

Jei jūsų Ruby paslauga yra susieta su duomenų baze ar kitomis paslaugomis, atkurkite jas naujame <Project> - Staging stack'e.

Norėdami nustatyti staging aplinką Stackhero, atlikite šiuos veiksmus:

  1. Stackhero prietaisų skydelyje pervadinkite esamą stack'ą iš <Project> į <Project> - Production. Pavyzdžiui, jei jūsų projektas vadinasi Chat Bot, pervadinkite stack'ą į Chat Bot - Production.
  2. Sukurkite naują stack'ą pavadinimu <Project> - Staging. Naudojant ankstesnį pavyzdį, tai būtų Chat Bot - Staging.
  3. Pradėkite Ruby paslaugą staging stack'e.
  4. Gaukite git remote komandos vertę ir sekite instrukcijas skyriuje Deploying to staging environment.

Atlikę šiuos veiksmus, turėsite tinkamai sukonfigūruotą staging aplinką, kad galėtumėte išbandyti ir patikrinti atnaujinimus prieš juos pasiekiant gamybą.

Labai rekomenduojama valdyti atskiras aplinkas, tokias kaip staging ir production. Kaip paaiškinta Staging aplinkos nustatymas, galite diegti į kiekvieną aplinką su skirtingais Git nuotoliniais serveriais.

Pradėkite pervadindami dabartinį nuotolinį saugyklą. Pavyzdžiui, pervadinkite nuotolinį "stackhero" į "stackhero-production" su šia komanda:

git remote rename stackhero stackhero-production

Tada sukurkite naują Ruby paslaugą staging aplinkai. Naudokite pateiktą "git remote add" komandą ir modifikuokite ją taip (pakeiskite <XXXXXX> į jūsų paslaugos domeną):

  • Originali komanda:

    git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
    
  • Modifikuota komanda:

    git remote add stackhero-staging ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
    

Dabar galite diegti į staging naudodami:

git push stackhero-staging main

Arba diegti į gamybą su:

git push stackhero-production main

Norėdami dar labiau supaprastinti diegimo procesą, apsvarstykite galimybę naudoti patobulintą Makefile versiją.

Su šiuo patobulintu Makefile, diegimas į gamybą ar staging gali būti atliktas lengvai naudojant make deploy-production arba make deploy-staging.

Žemiau pateikiamas patobulintas Makefile, kuris apima kelias taisykles bendroms užduotims:

  • make dev (arba tiesiog make): Paleidžia programą vystymo režimu.
  • make deploy: Diegia programą į nuotolinį pavadinimu stackhero (idealu, kai turite vieną Stackhero instanciją).
  • make deploy-production: Diegia programą į nuotolinį pavadinimu stackhero-production.
  • make deploy-staging: Diegia programą į nuotolinį pavadinimu stackhero-staging.

Šis Makefile yra sukurtas tvarkyti atvejus, kai kodas jau buvo diegtas, išvengiant "Everything up-to-date" klaidos.

Nukopijuokite ir įklijuokite šį turinį į savo naują Makefile:

# Taisyklė, kuri vykdoma pagal nutylėjimą, kai "make" kviečiamas be argumento
.DEFAULT_GOAL := dev


# Stackhero Ruby vykdys "run" taisyklę jūsų instancijoje.
# Tai komanda, kurią reikia vykdyti tiek gamybos, tiek staging platformose.
run:
  rake assets:precompile
  rake db:migrate RAILS_ENV=production
  RAILS_ENV=production bundle exec puma -C config/puma.rb


# Komanda, kurią reikia vykdyti vystymo aplinkoje
dev:
  RAILS_ENV=development rails server -b 0.0.0.0


# Taisyklė "deploy" diegia į instanciją "stackhero".
# Tinka, kai turite tik vieną instanciją.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# Taisyklė "deploy-*" diegia į instanciją "stackhero-*".
# Pavyzdžiui, vykdykite "make deploy-production" diegti į "stackhero-production",
# arba "make deploy-staging" diegti į "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Vidinė diegimo taisyklė. Nemodifikuoti.
deploy-script:
  @echo "Diegiama šaka \"${DEPLOY_BRANCH}\" į \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Negalima diegti, nes yra neįsipareigojusių pakeitimų:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Galite naudoti šią komandą įsipareigoti pakeitimus:"; \
    echo "git add -A . && git commit -m \"Jūsų pranešimas\""; \
    echo "\e[0m"; \
    exit 1; \
  fi

  @git push --dry-run ${DEPLOY_REMOTE} ${DEPLOY_BRANCH} 2>&1 | grep -q -F "Everything up-to-date"; \
  EXIT_CODE=$$?; \
  if [ $$EXIT_CODE -eq 0 ]; then \
    echo -n "Nieko naujo diegti... Priversti diegti (tai sukurs naują commit'ą)? (y/N) "; \
    read answer && \
    case $$answer in \
      y|Y|yes|YES) \
      git commit --allow-empty -m "Force update for deploy purpose to \"${DEPLOY_REMOTE}\"" ; \
      ;; \
      *) \
      echo "Nieko diegti!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}

Tam tikru momentu jums reikės tvarkyti slapčius, tokius kaip tokenai ar slaptažodžiai duomenų bazėms ir trečiųjų šalių paslaugoms. Labai svarbu saugiai saugoti šiuos slapčius. Venkite tiesiogiai įterpti slapčius į savo saugyklą ar kodą, nes tai kelia rimtą saugumo riziką.

Aplinkos kintamieji siūlo du reikšmingus privalumus:

  1. Jūsų slapčiai nebus saugomi jūsų Git saugykloje, sumažinant riziką, jei kas nors gautų prieigą prie jūsų šaltinio kodo.
  2. Galite naudoti skirtingus prisijungimo duomenis skirtingoms aplinkoms. Pavyzdžiui, prisijungti prie savo gamybos duomenų bazės gamyboje, o vystymo duomenų bazės vystymo metu.

Vystymui sukurkite .env failą savo projekto šaknyje. Šis failas bus išskirtas iš Git, kad jis niekada nebūtų įsipareigotas. Naudokite dotenv gem'ą, kad automatiškai įkeltumėte .env failą.

Pirmiausia pridėkite dotenv-rails gem'ą į savo Gemfile:

# Gemfile
gem 'dotenv-rails', groups: [:development, :test]

Tada įdiekite gem'ą:

bundle install

Tada sukurkite .env failą savo projekto šaknyje ir pridėkite savo kintamuosius:

RAILS_ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
# ...

Galiausiai, įsitikinkite, kad .env failas yra ignoruojamas Git:

echo '.env*' >> .gitignore

Staging ir gamybai .env failas nėra saugus ar praktiškas, nes jis negali būti saugomas Git saugykloje. Vietoj to, Stackhero suteikia saugų sprendimą tvarkyti aplinkos kintamuosius tiesiogiai jūsų Ruby paslaugos konfigūracijoje.

Galite nustatyti šiuos kintamuosius per Stackhero prietaisų skydelį, pasirinkdami savo Ruby paslaugą ir spustelėdami "Configure" mygtuką.

Ruby kalboje galite lengvai pasiekti aplinkos kintamuosius naudodami ENV. Pavyzdžiui, norėdami gauti DATABASE_PASSWORD, naudokite:

ENV['DATABASE_PASSWORD'] # => 'secretPassword'

Štai pavyzdys, kaip prisijungti prie RabbitMQ serverio naudojant aplinkos kintamuosius:

require 'bunny'

class RabbitMQClient
  def initialize
    @connection = Bunny.new(hostname: ENV['RABBITMQ_HOST'],
                            username: ENV['RABBITMQ_USERNAME'],
                            password: ENV['RABBITMQ_PASSWORD'])
    @connection.start
  end

  def publish(queue_name, message)
    channel = @connection.create_channel
    queue = channel.queue(queue_name)
    channel.default_exchange.publish(message, routing_key: queue.name)
  end

  def close
    @connection.close
  end
end

Vystymo platformoje jūsų .env failas gali apimti:

RABBITMQ_HOST='127.0.0.1'
RABBITMQ_USERNAME='developmentUser'
RABBITMQ_PASSWORD='developmentPassword'

Gamybai ir staging, nustatykite savo aplinkos kintamuosius Stackhero prietaisų skydelyje pagal Ruby paslaugos konfigūraciją, kaip parodyta žemiau:

RABBITMQ_HOST='<XXXXXX>.stackhero-network.com'
RABBITMQ_USERNAME='production'
RABBITMQ_PASSWORD='secretProductionPassword'

Ruby programos dažnai naudoja HTTP protokolą portuose 80 (HTTP) ir 443 (HTTPS). Jei jūsų programa reikalauja papildomų portų ar skirtingų protokolų (TCP ar UDP), sukonfigūruokite "Ports Redirections" nustatymus savo Ruby paslaugoje per Stackhero prietaisų skydelį.

Jums reikės nurodyti įėjimo portą (viešai atidarytą), paskirties portą (atidarytą jūsų Ruby paslaugoje) ir protokolą (TCP ar UDP).

Failams, tokiems kaip naudotojų nuotraukos ar dokumentai, saugoti labai rekomenduojama naudoti objektų saugojimo sprendimą. Objektų saugojimas leidžia dalintis failais tarp kelių paslaugų ir instancijų ir atskiria saugojimo sluoksnį nuo jūsų kodo. Tai laikoma geriausia praktika.

Rekomenduojame MinIO kaip paprastą, greitą ir galingą sprendimą, suderinamą su Amazon S3 protokolu.

Jei pasirinksite vietinį failų saugojimą, galite naudoti nuolatinį saugojimą, pateiktą su jūsų Ruby instancija. Šis vietinis saugojimas yra prieinamas kataloge /persistent/storage/.

Tačiau vietinis failų saugojimas paprastai nerekomenduojamas, nes jis gali būti ne geriausia praktika ilgalaikiam masteliavimui ir patikimumui.

ĮSPĖJIMAS: Niekada nesaugokite duomenų už /persistent/storage/ aplanko ribų!

Duomenų saugojimas bet kurioje vietoje, išskyrus nuolatinio saugojimo aplanką, gali sukelti duomenų praradimą, kai jūsų instancija yra paleidžiama iš naujo, atnaujinama arba kai stumiate naują kodą.

Jei naudojate macOS, galite rasti nepatogu įvesti savo SSH privačios rakto slaptažodį kiekvieną kartą, kai stumiate savo kodą. Nors saugumas yra svarbus, galite pagerinti patogumą saugiai saugodami savo slaptažodį Apple Keychain.

Gali būti viliojanti pašalinti slaptažodį iš savo SSH privačios rakto, tačiau tai nėra patartina.

Vietoj to, saugokite savo rakto slaptažodį Keychain naudodami šią komandą rakto pavadinimu id_ed25519:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Po šios komandos vykdymo, jums neturėtų būti prašoma įvesti savo rakto slaptažodžio dar kartą. Jei naudojate RSA raktą, pakeiskite id_ed25519 į id_rsa, kaip parodyta žemiau:

ssh-add --apple-use-keychain ~/.ssh/id_rsa