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!
Diegimas kitos šakos nei main
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
Diegimas žymių vietoj šakų
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.
Diegimas konkretaus commit'o
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
Grįžimas prie ankstesnės versijos
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 aplinkos nustatymas
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> - Stagingstack'e.
Norėdami nustatyti staging aplinką Stackhero, atlikite šiuos veiksmus:
- Stackhero prietaisų skydelyje pervadinkite esamą stack'ą iš
<Project>į<Project> - Production. Pavyzdžiui, jei jūsų projektas vadinasiChat Bot, pervadinkite stack'ą įChat Bot - Production. - Sukurkite naują stack'ą pavadinimu
<Project> - Staging. Naudojant ankstesnį pavyzdį, tai būtųChat Bot - Staging. - Pradėkite Ruby paslaugą staging stack'e.
- Gaukite
git remotekomandos 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ą.
Diegimas į staging aplinką
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 naudojantmake deploy-productionarbamake deploy-staging.
Patobulinta Makefile versija
Žemiau pateikiamas patobulintas Makefile, kuris apima kelias taisykles bendroms užduotims:
make dev(arba tiesiogmake): Paleidžia programą vystymo režimu.make deploy: Diegia programą į nuotolinį pavadinimustackhero(idealu, kai turite vieną Stackhero instanciją).make deploy-production: Diegia programą į nuotolinį pavadinimustackhero-production.make deploy-staging: Diegia programą į nuotolinį pavadinimustackhero-staging.
Šis
Makefileyra 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}
Slapčių (aplinkos kintamųjų) tvarkymas
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:
- Jūsų slapčiai nebus saugomi jūsų Git saugykloje, sumažinant riziką, jei kas nors gautų prieigą prie jūsų šaltinio kodo.
- Galite naudoti skirtingus prisijungimo duomenis skirtingoms aplinkoms. Pavyzdžiui, prisijungti prie savo gamybos duomenų bazės gamyboje, o vystymo duomenų bazės vystymo metu.
Aplinkos kintamųjų nustatymas vystymui
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
Aplinkos kintamųjų nustatymas staging ir gamybai
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ą.
Aplinkos kintamųjų pasiekimas
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'
UDP/TCP portų atidarymas
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).
Failų saugojimas
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ą.
Apple/macOS: išsaugokite savo SSH privačios rakto slaptažodį
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