diff --git a/ansible/group_vars/all/vault.yml b/ansible/group_vars/all/vault.yml index 6ac207c..a0e560a 100644 --- a/ansible/group_vars/all/vault.yml +++ b/ansible/group_vars/all/vault.yml @@ -1,174 +1,178 @@ $ANSIBLE_VAULT;1.1;AES256 -38656563383931366464306463373265623631353331376532333134313463303635656162373437 -3735623062343764316262613966353338326535313161360a323831623936373966633535396632 -63303961636566646338373464336637323830663932653039306362653832306163313938396135 -3633663532373362390a333233366636666437626365373732633361653833363264623138386661 -35636665666230326164343339633834616134666531343839623134343163333864333834303862 -37313864303335326133343666333733363333663336356234633332323262616530356661316363 -62306338303966306632303531613161386135346439333137393062343938303134656436656539 -64326134363664353165616436353635633265643161383335393633383563656231336139346138 -38366238653236623664313662626566373631633136613864373032316539646332363035343865 -32666664363737373962396162313438303030613264366232373030316335366534666531646239 -62306630316432346131383738373764313263363039376435653062313136356531383534343831 -37336536313564323336613639386138303562666437376238376630623665373230653232396261 -34333433343361643065643032366433643137396231343331326362626434643365356131613766 -34613039306130653535653330623333333631653538643536616530373538386332346132363739 -65653135306663336163336263376332326230616238666365653663663462306238366466663366 -31633833333465653534613863643465323631336661393366356363386462623434636631623738 -30376265663739333336393664626539353531653637303464316562613436373739353039653430 -36353034643839323131353033643866303333306435653532656239653061656235393536306463 -31626162393462356238323737313933633465623566646161363964393164393762626531326138 -61343336373065313232343064646463346638613661393263326265366539623861623537643164 -32663365313161316464333137383337656662323137356635636637326163343562323965666166 -30396531326364656461613232653361313061623835663663643861306334386539626530386666 -63306331313466623163366332326564353639383961656362633435363065313830613764306237 -37303530643266646464653263306432313766633835343739636261623464366536346665636135 -31333638306237623535623439613636363937333430633831306162333466323137323932663432 -35616135363134306231323933303635336332376163303131656131376131393465353434353330 -38623339313964313730663263373963306337373938393863323062366534613131623764386638 -65616463376633663864653363643135623663316439346336376366346166303962633366636565 -65373335623962613131336364396133623738613364383639356533316138383333353464616639 -62316161656633666431356462313634383239363464613031313232393131643936333237616364 -36646530646239626662386231313239396238323139383037653337376134316535373464613235 -35346439646234623462623262336461326434346632373966626464313633343266616463643764 -37633830653230666631383134313738326265343738386631346261343439356163353262626161 -37343134663764396439633535616537386638633731643164383064333266643830356563383066 -34356161623361623366363435653739383438396363643338353736323139313661373031396132 -61373834303439663939376339633832313639643332383239313337666433623435613161306139 -62633162346338663335663661643938316539316139356165346461326433646366306134356338 -35613934623666386463356536303362626466663062643236346163323337616232323535396265 -36636165656366396136666533626433363562353537343430333361643635313335336435626265 -36663233383265636530313332336562623833373930626136316265393634653466333732666563 -36383037336566373566313661363062346431343534396533656135326534646161346639383336 -35306633303836346365383533316661613630326533393836353036636132636663653530656336 -35656364613130633761666632333633333137656637353362353337626266616238336266306636 -61393932343736306465666338626365613531386362376565383738366230333465663137343363 -64336661343563643136626362303937653632316230356531323231653063306538616633616265 -64306332396639323461653136356662376236363861643466633466666265646538653833373138 -38623130633037333666623862636165666333366335643765613834383533343436626638356536 -32333939326532396339666637386237303730363332643861316236613634353230353565316239 -30356135323237633963343461376233656333633636303662333365333735383930656538356238 -31373862613534386464333865653361363663373664663234346636316262356137613037353135 -37656534383164363131613834633062656437373066646336666533313033643130636361383038 -61336366343230303036336563663537623230643061383732623865383134366535353365346363 -33373331323831396462633031353665363033346536306334366237646363636633353732626166 -66363938663861616461613562646530656366333166303264363030306139343161313938613361 -66376263326131626132646530643439633634303539613863623965373432363863326130616536 -64626336633238613034353166353664363230393732366465346363303537336161623834333265 -61346365393964393365656565323331303265616630613766656239656438316539636632373038 -62313139386233633732643765383039646534326236333134613531313437346161343638376432 -66336432363739633231303138383338313164313930373866366431316638353761323531333930 -31353136326630363038626135383939393639306466383832373630623565383766663736363937 -38656132303738333863623262656131396366313663666461666231626364646433613137333062 -32336661373236666235306534616535323061663634383763386339353732646636306563323632 -34313433653137613930363631373666613330363761333639373630306537343633643561366231 -38363833363139666631333431646262656239316138373339326533623437383336353139646431 -31313833363733653534333133633636616636343635393039666233383661666363373263313631 -34363064353135383261633666316462356231616163373634383730386536613462346535383331 -61336632643363306435323866346665626464366163343735616130613335663235376132396663 -35363635663664626638663331366131646333623533613065323731643366656562353138363335 -34653863323337653331306232306133323666356464323932323562376632333439303537306534 -66346462363535353961383061323762343237393535626638633365396566616636616236396462 -38353433393631393338646338383830663331663538336465366161653333373736623063666437 -34633365383736653230316631636666386664643731323434613761613139666432636236653137 -30393666663261616332323466353161636632643534386131306632313236653063633531356564 -66353964393634336530396162393862653837376436623738663135303632383166613333336165 -62333434613432626264653865353035643563663435316233376465383961303534646339373632 -31343530353636343238623565653566663936633763323861383231366533303164316339653637 -36393364616365666335386539653439653735323162396131643931333866613862633437333438 -34663233356461383537343738343134626532323361653666633733353939333065363131316133 -63616632336130653962636236336264363565303839653531326264386331316264623038326266 -62336233303332333638613461366231343935323036366536383639373837616638616362643331 -35663331653133343661346635613036643065303637613964666237353166386666313439383936 -31663730356636333061326535316638366531656430353633383663336535663830323063356666 -62333762393865333132653161346361313832643163356265616133373663363836303662613935 -63623662313830623434303530303833663063336164363836643531323239653966366233373266 -35373037323132653833646432356435333834346138636133633339613165303362336265303065 -31343931386136323362376431336164343931343934643031336435303738393764613332393561 -31363333623165643363646638336435633539626635656536323030646130323734643134336562 -62353233366533363131313462656239366337343532336332323563343931376237306231656532 -63326439303930326563323238613538386435393735356438316536373064643465306362346135 -63646532343334323538343838653764303332386139313239376332656664316361343536663766 -61363065343862373165366563366363376362303862633037373763663132663631346562313161 -62636635303738393763373232643862386135386537333637636631626638363232323036316366 -38383235366333363264653163313937333566633066356663383466393535333535313939326266 -30626531386333626334366533613366353433396438313838346339396433666436663961643438 -62633336633066616163626232326334633265356532663535323264373166316133386466653131 -66623261333964623235386433346236353338363961323230356633613864303735386530303165 -30646265346566626562643330333233636164386432613436383034623337323531613735656133 -64653232343839653661303662336435653439663732303638323732333064646333313732356339 -31303934613938326365656161383262363633373265616466616562313237363763613265376664 -38636534646237616332653531323036313430643862393362383630653339343931376164373735 -39323136653730316462643964643939396662333462653934623136643839373864613335303463 -61643765656431363734616435343564393663346535636134383637653538646336666164336339 -31353230656364633936643338613563306639316464653864396230626263306338323639323238 -35396334613039343734303232363962653164636561633164303132366234376632653339376538 -37366638376666353733633132636131653462613732656364316530306333313431316164663839 -34646366393835353338373763333666646535363634633864306433316135376663343833613435 -37356636346234623735663361336366363264646535336566363933653832613039663161663762 -65663234666437363834646163643733356136396464633830336533366337303438313665336166 -33376331373032316464353037383433623334643965656434636134333166323238666438653337 -32306234636661656639306464653238326536376661363036626561386630326239616137376565 -32666438356161336437646562373534326632306165666439666130313036373262633164376362 -66646639663663323134626636313130343362343966653564306265623630326664336534333037 -65626562666337653436373130613230656535386264303132373634353861376238386435366636 -38316637613036333836356536306132626631326562363535613835313432353133373138613264 -62396261303239396364613039346135623437336565663034313264643535366336653363336330 -31623539396435643132383363353861323064336430653936623438303933356562613335643861 -39663437333836383331663830626433386431383338373261353266386531373931383632306135 -36316339366539333730656638386635333733363764613364303563323665396336613930346233 -34333433323030643262373636663838343131303637613237376463386662303235623338393063 -66313166343730383961363765663463303266383938653638393830613662643362386361626132 -66306533313461663131613565343534303735366232383164333837363330626534643363626164 -33326134376263333530663631383930623066313035373135616665323564323033323639623235 -35383538356434663035306137366437613537373531316436336366646165346330383538386331 -64666232343961343261393339356531363636303165393532313632613363316665633233316330 -35623939613463333164643736313531666531626232386361663435653938343536363236616431 -61343430363861626339336166316135663234366132313762616230393239663931656536306663 -31343366663063396139336237373361333030353333623064336262313465316538623438313265 -62656232613435643437373233396566623537353038316262643239653432373863626530323334 -35633132353463356634633237386134346532353930343339303337643637373932666665313561 -39346531383663663131623863383832346237356231386263656566653631363836323132333135 -37316135613730386362666564643037653366373464323431303332306364373432646338333031 -31613533633664343038376533306235393030646236346232386236653138636234666561646263 -31386633343265663335323236346435653261363763366234346263626663643964393962343766 -63656237326563653633383461333364396165626138343461353963656131663265313835326465 -65643164316537333531363139623732376364346363613363663066663733616665346233633662 -35343065316437373136656235323466343732613335393761313061353432623664363462383562 -38333139636336366462326565383631633864633165613332343833396237336561346164656664 -63316463323233383434663061633564666264313261353632316164643035306234393732333435 -66623663316334373431633734323232313436366364623037303965366663386237343439613433 -65383763393061633431303736656238396364343765363463333433313836386666613964623634 -30643065626437653966393237326433373936653861306536363834623363613830343036363766 -64386234653331363564373065343139623965646562373933333162386264353832303164336362 -33613036666139396533333862316366396464646465346263623730313336663935356139663762 -65623466323239383732636165333564356534333939316539663366363065623631303933663863 -31393637643761303731646638323133636464623366363032656335643435373064666463366365 -65653831666262616165306537623534653763636633633137653733323234346266363630306434 -64616633326266636134343536363365393033663934663965323537633136356535353436316634 -61643636303237363033313637396533303761303536373836343332636466396339353065386539 -38366530623332316439393633356235386665636364313739643432623032303363613666656264 -31353063633862366638363838663932386131366434646462313130366633643430373230313338 -33383362313230373137393934323561343064623065353063653535366266373237656530303335 -38616263613232353632333361383030626133323261323033396638666231396638353537383338 -33393466663938356363623438366265336330313039313666343462356331626265383565623364 -66323835303365366333623733343664626431343663623465326235363430356661616166346630 -30336266383830336461663130616363663637653964366634663930393066633134626530653766 -34393439363332383831383865393464656165643331333661643138663133643133626236333363 -34643438353037346334316233653034313737616134653762353239636234383233336338633031 -32386332656530313361393532623661393538633463393861636539393666626362653031636566 -34616265353736633539313032346334313339313934323962313463376664373336666236346633 -31306563633966653134343937323839316137356164373338343965643934636631646666386361 -62363165663838626538363966396161363366303162356664313437613034636531356638333237 -35613833366462653834363261653365356336643635363831383930323566623262353865653233 -63333138633466653165666236356430666532353639326261613462636161636634613235353165 -38316566306533373138336334643465616339383739653639303632303661656135313039303632 -66613966633036653461396330663630396663623732346261653265343233393730306537363032 -66653737306431343435316433646164303338353865653336303731636663303863363662333863 -33323334656631326137646563616236393035336539646563643064663564383736343961656435 -36306136353037616634383866303636383531616136633230346538336563656366393466613262 -32663266323333393764616561316636356664346265353433653262313239326264306434383030 -34356263323331313364653966623630326433343863643839313165313063626261646339323837 -64613838353334613661346662346636313432393837386139386136613366353038343962366639 -32626265313764613733313334353432346434323439326637383462313863383165303963353665 -34313635623766313361633030616439343433353735326433383563656435393563 +35333539613236336636383331373761643732663835346539653531336662636432346132636539 +3738343939626363303936646239613531306461646431630a656362666266356534303466323962 +64626235663062393436356165323364333735396530343435373730613765346466386336653030 +6234333131383036330a663039613363656536353164323265383130333463646638396437356332 +65653330383235386563623231646535343461613833333765333336366338376264666139303635 +65666139643363356264353234343736623731656534636662616466313764633763303035343432 +32623965326532353733656533356566393834343338303833356334346533383531393435363461 +64306561663434353935386165393361613330643163323564383835386438346664323663663564 +35623032646362346262366333626461343364356136373231313635353665643838666336313766 +62663730653030326534393838343139313239656530316662323638396230323436396431306135 +64386263616633323061373331376536343261313330653061333662373034353564623934376235 +65363432316630636132613935663466366365613265326163383832613631303631616464633161 +64373661313034653338646537343164623630643039353533376537636264653261393464633765 +38376436366262373663303137343861383932356330356239326464666233303064666634623135 +66373430383061643463386265646666333962366366336534646635633365356334343238303930 +65316432386134353838333033386164643165366662393365623839616265646538333235343237 +63373236623963393937613333623630363032643365613561653638323030373435353639366433 +34326334643330336564323439656630313331623762373038343133613763643838643039656338 +61323933643764306339383733623939346466303636616339396534643434633936393563373934 +66646632336133386163613135363963363338373338323732333563643164313662633639633130 +32383263396666333639626366316630346333643039666431323164356364346566343237316166 +62343464373564303533653864653164626239383737303235353638346636356538383661643931 +38646538323431383638653532303163313032396164353139333461363066393566303237386239 +37613236376636316136346266613530363732353232313037383830313461393136306233363931 +35663963613630616530383865633330636434626230333563313362623265633637333261653632 +63303130323737633365646265393736613136383536383133663538663466643631626139663865 +34333938363430393763653937653561376362353633303962643637666162666538316366343132 +31646163626465643463326333303365313138626366363861663530343362366663323161656362 +31623361323033353238623462333031356265343239613834353864333365626636316531313238 +66343633393865316535316262376338346234633737366132313938356438383066356465303239 +64326261333935343337363331373366636438623966373439653432663030376236643664643865 +34393738343865336263666133613765353162353839393633346439356665613936643863323464 +64633462366565373532333336376666336263396362303639393061346438363035613534356334 +37376166363030393237373464356139343336333939346662336332336639396432346665373137 +63306539383830656363383539303366643335356133353738373266646463346265333733613030 +63383036343663623366653763636135326561663739303631333936313161396335373962643662 +31386331623466666262396132636265323831646333353038386131303033626435316634666662 +36353539383961623535333730653537633932613366653563323339333738643131393338313931 +33373964366638323239386130306666316333613233666337623966303830323637306534653430 +62383634303736636166376563626537346161663432616265336364336264373638306364336331 +35373862653133333637636164343030623664333536656433366563376330356431343962656162 +31646536626631666636383033336130373565376430386639313135373765383437336538313266 +65383038616139663436323833613232626531326531303937613931373566646263643634343461 +63393365333839663231623532373634643136383333373166356635356666353837383331383334 +36636465316536313765326562336539663539613036373638616633353936383866663231356262 +65313965643263666163313638626335363333623833656439633464343864333465313231326164 +30646530363161633834306633643132306562363065323032383066316533373963383763333466 +33613230643633346566396165376665366361633733366261306637303964376231303365333165 +37366633643331393537633563626164613630396663326233383263343930333232656265326633 +62373539306331623332386637646333326435393933323632313166386365656561356536663738 +35363362663937363661636437336532646437623864643463346238636331643935333264663365 +35353063643662363939396638386531386265336566373835646435353736386666646531373361 +30646136386138323530306135666333386437356430643262363234616366376335633638303133 +62316562323463346263323934363937336631656666306237626438626133346566613662363831 +65623561373231663262313763623965663036376631663662616634353664663762386666353539 +63323237303362393762343832396463343534633432626532363534396261613132323633353938 +64613333316436313063313561656561326139623736373439363363393632353564343361396666 +32623938383737623836393536393838346131343762353463386339336361346266623663353262 +63316362363736376639333638326433383662663866303638376662616335653764663631616666 +66663738636162353262373034373334303562363236373232306364393335346139396663626634 +64373735643537383230616661323238333239386330313231333833663062393832396366373337 +66313966356261383039623630376138643261393062393030346131663839346437363766333732 +63303136303037643931663431363435353261343133386332666531383835663361376165383632 +38333963653732613462323435633936353637336538396531616437393131333631663335613931 +34343236386135316336353661636266396434386563656433633935336330366162363563313738 +39303561323739306362383765303131623265626332613265323264393333356165326238633031 +33366464626537313662333166343532373735303135306563393737663536363862336232613435 +32613031396562333939303566343834323164396165373165363932323065623839643035373539 +33363362316162643264623937353066303536623962373433333430373436643862616636613537 +66653864646463653435366531373039373663333964636163633965613438366339613437613731 +34353330616337313037353633626633633666346363663764316163653635363335343237616666 +34663461616539376463613635346536366334613536326564626363663661313038636562303031 +36653837393233333234613131633735313739333263663532623563623231323239343936333831 +64313661376164323738316136623261353538323565383865376339366466393033373065613835 +34393339323839653430653335623664373534356232386262666437393234616362353438386361 +65383362346239626438346135663064643031386335633533646433326631386439353731653663 +33326633653363313232356233373531633737383530396439643139316164626566326164333439 +33393163376162623938383264653337633361643633306666646163633337366264353939353236 +39383035653036613463643633633234623439626365633761643038656339373362333238373033 +36626563373563363139386336653764623661633766343965346634653135306137393361386539 +33656261333137656632353739346462326364386330333536636634666538643461373766316165 +31383238353730356339353934663037373865363238373339346238623364383631313537386231 +66643937316361333262643230343965616663393430303661623161323361643835623862313564 +30646631396564383932633437303464666166636434303330303934613038393130666561343837 +34376164323633336432333664366631326239383463303366363763383062643565643464633634 +66313264666562626339326133623630366131333232383333333961323234366633313231376134 +62653962303630366330303537383639306263316630313862646334393531363439346233313462 +34353937303230373931616339393861323138333237633861326165346631323931633234346630 +35656666623261616564343733343764383032373733306466383763376564663665663731303539 +37373863613135326634333039333932633461613165623938623338623565313332376136343436 +36303037653935383630376362326335653466343233613833666361633661626437663563303331 +32363331663334616338643239356133396662633231396436636630343934306333343539646132 +65366263646563386563643562316337343130643661633730663664663564316535613531353165 +32666436326530323961663736306162306633393366306532613266323633373330383634656535 +38626138633335393266656638613765666665313561363231636261643936333033383533373366 +61626365636635653834306539303530383330346630363766383734346332326638316561303763 +63646639386366616230333263313130346663343663623536376664303364623064373562326466 +38383163326637633937663161393538616339326263306463353530303630333937326138363239 +62633535356230353439623234316562653237613130383832343735643661623033316264653362 +37633065313135656637616137653963623331323863363364663761663364663565623535343366 +65313164643461383436623038316466396632626661373438643533336234323132613866393134 +32366363613338646131663738643236613562663262333936656461323336303139616434333334 +38653133633232343164313661623466643061383161303564376638373138646431343634393962 +31306564396262383438643937353563353663353536373032353263636430363235313736653333 +39303336316438616365613961653737633234323131356339623265373463336662366336396364 +38333962373164383630363866343361376262316462333936616230316536396363316163653463 +37306461346136323431323265383030643232633062386433336261316333323030663234663063 +65623434613662306137396361616330333233386630313935653861333761323565646237343430 +38613139663035373563313530366632303232643030643466346531373333363337643831663736 +62636538343035643464396461326363646537393138613166323762346539333033633661383531 +62653634636666343661353565363266303430623131643733633232626230623466376337366137 +65653565626366373337626632346338396533343138393431346333346161353838386434643863 +33383935636132343764656232393335316431633937323533313338366461376438653136363231 +34643363356664373765376465333534653137383961386262633165636666353464323261396465 +37353064353530393037303930303430376530623364633832636434313264393135383536306438 +35316436616536396335393863363863653763303666653161383630336437653663636434366635 +38633633396132623663323137643338303038393061633961353064383765353735393432313766 +61343735363538316134626434326264383932393964646136306537313932316238326362646337 +66363234363334373737623361616235383231303834636536393836373466323265653339326239 +39333135396464346232386362376335333234383231343533393264346335376133313434393633 +34623039373134633032613838616532303130353833323330646165396631313864643831333763 +35633831626465316533346431616362366331633937393037666538633936343964643735363733 +32393939303931393362656332386234323634376534653435343137353063333037633033616639 +62643037376335316662613064396339393639386336616362623963373265383231613063356335 +63633432623061366237636134663834336165306234643537373064633561613561363963323031 +36653439396163333439366534653764616361313633343763323938636638656461616261343536 +37653866346161333533323436323063626534313539363666636232653639343366663663633162 +37343539386163666464643466326562363566316630633530363235663732316463346232366362 +31303037316265333862656137646631616163623330616565303933623731393530333230616533 +33356638303132313864343938313336626265656362613633623639653537366664383265636235 +36303633343439643339653833646536323161323638613139613734396433656365613862303932 +31353764303836653434653637653732363464373238376637393766323661333735363336336662 +65623030633433333339306335626334396162626161373637646337313535666431386432396162 +63333761363462643335633136316139626665633838613533366633656461623064393963346366 +31656637653436653631306230323630333531613465663134393339363930623263373031363839 +35393931313234393761303364386161623065326661323566653535343735346165643961303662 +63323436663930663031366131333361316339356463333634383937633535616663313333313037 +63363363643764633735323331373931396534646131323166626537646638333230346362656262 +64303962653265316530663531613235323165306565613866373966633038353237323933316336 +34313566383234326233313435336665633239666531656536326230373536666565636336653964 +37666533613165666262656637376662656339636538643639356435356332323964643731353462 +30653463326462373734313535643436336432623965616637643537666432356264666338333364 +39353134633761633461346665353161656436303764343661343530333532343739623830393762 +64653831366263366664323534646163663761633335396363653739386431303265643865373830 +35663930396333303430333831666433616366383366333032383232366431616338356138393533 +64613863383631333231373833616230343930393531646535303333376232633162333136646431 +34333639663032656562646561653061313132383832386266613431343630386530636362636330 +62626537383961666664656363343830376662306137336433663162323233616466386438653361 +34343138396237633138326633383335393330653231336238666365353530393232323332333837 +63666462613637313738653136333131623436653033396562373462373665653266366237653932 +35353939316438626233323561336230333330336632323062363436666239613137316563613062 +62393138373036636461393364663934633439623837366536386132663933323139396435393932 +66333662343965323338623531633562666631343963653233333637646565343634373337643636 +64303566643537383633663736393037353635303335393436643634393337396434393430656131 +61643830323039633363326565636139663534326434666161666231623434373963396161326566 +65626636353537343465343062336239313537376462316161343039373032373237313462663032 +35666335626337343334356530616236303639383035333362323035353862303863656331643630 +64663864653066623938323162356631626537663463616464663134613836633033626364313732 +66393065393365343339376637313362343130396464626363346330383164356538363833373430 +62363030663639343934613233366232363637323165363434373262356336663037306163663636 +64346534663833643932373733316331323032373738313637646464363563653932363735316639 +39386433336435316331373330343065396433323637613566613835356436333631323833313866 +33373332323632393239633363356232346634303233373663646536666635663233396335353733 +33336364646233626564663938643230373532613133343439636363323033373461386463643763 +36656234386563666662373737633537656262396234326232396636306139393532623531313431 +65663338663639663462323932653661623436306431323464663430613363303463343236326165 +30626635366639373331663239623763373966323934623365316563383039383737383262353130 +31616463353364353036313863316165656231613664373237373933626331316638373566383139 +66626634313234306137376166613939383664653536386532643636336466623132646639363564 +38373963653337393539326162383535373535376334386439316330386136366337393139336264 +64656337383235383963346335306632653837383166653737343661323237383065656137393232 +66626261396261383466336361343730616336626435363536613730313635323761353335633936 +63626164316462666461343038636633366136353864323135346335383034306464373437333062 +35626464333537313639356662316366613833343365663132303266333538346562326562323434 +65323230653334336239616163643036653537643264656239303666343430333765316631643337 +65356333346534623466343439333932656332306564613065656537386232636662373665306465 +6563 diff --git a/ansible/infra_secrets.yml b/ansible/infra_secrets.yml index 6bec8f7..8d15ec0 100644 --- a/ansible/infra_secrets.yml +++ b/ansible/infra_secrets.yml @@ -1,174 +1,178 @@ $ANSIBLE_VAULT;1.1;AES256 -30383238343938316437303961393961633538303835356661366465306161353738616335343563 -6135613063376562303539613535633463616433383239380a323163346131633838393836383539 -38623766303739623131613935363037323462353664386563356661393665306136323863656363 -3433313638363731630a336165343563653930663435333037653330386364336530373830346336 -34396361653637626137343033343432303438383761393765313164393631666230616537366636 -33313234636535306535336132373830383438636235636466623861363734636238393234316137 -36643439643130363462643765353061623436376463386139616435323136376366653932323766 -34393161353062386666626633393639623434653864383439343339363665636134636139326538 -36323966373230363938623434336161396235316532663739353837623238343862633032613264 -32626565313637306131393466653739383935646134346330333835393932396634323565313861 -38613864656139646261343835316562323863363836376266653139336638366161323035373265 -39366566333136646134353065653065333337303832363237653361353234386335643165376331 -35316339396130366163313130633561643062316164376262353131323237303861666263643536 -32333062316330313532343832336434653664656565616634643436656466373533376535396533 -35626636393135626539633365326364353462633462656364316361303732643632356230643333 -30396233616633326438393836383237623636383464333830343464343837383231653139386336 -65313337366665343936366430623162643032626430336466643230313530343832383730303263 -65386235633832643931656562303561666131646362303533323430336235643436653866366161 -64636365633731613365663833663264343233313037326537616164656231656332663461653635 -31323237656361666630323930336630626437393836313431353839636435363466376535633962 -63323462626662616139653665346132343736636361643930333366666237303438356364656464 -36663363386131646361316535653463366234663062323539646562633962653537383465366439 -36343635313934353063373734386137653239343538663037646362376434383234363361623165 -66663734313133343062363137323931643338326365346234313835303431613632623461366339 -64656138303166356136313962646133306536333465316239383532353362333932326639393363 -63393430373133316532633562386432663332623934376636306438623061353238333562313737 -63393338333534646265643462666163356365653937643634316266303730346333346465313662 -33326638643639326361386461663931613766373937656266313964336461633939333535646231 -35316331333537303830653336373530353364616161346232323130336137373737616534373435 -35383466666262333834323332393737613763303562643232616432316636386635383934373633 -34316462393064656633373562333039646135373332373063653539313230646466326233313536 -38346238623162353338656437336536663534643062376138643030363935336461333638363134 -30653738383233636531333165386131383061363466313736336632303136616261623137313065 -30323766393862663965623337303638366239663130643638383765383930353533323635316232 -34646339366162653663323964363863623962643166646130633236353563313061353434376334 -66313862313265653238633034616530343164303432666539363733666662653733666462303662 -65663638653534643132353361313130323763636338303836346430623664303732356636636232 -62396135343236646537386334373166303663353661323236336365336533613139373430333364 -65363863323335353663396366616530633836363837653963656636333264323434323365396135 -62613862386361616633333636663263376465613465633362333733326665326639663961313631 -32653735353563366236363936343438623665363834633436393232653737623436303237376530 -34353032633433363865303866643761343130303431326236353332356464396433323430613830 -38373035306137363562376539633863343737616339346463636236393537346163323731333733 -63656161306437343862643836633539326661653062383361613739366237623162653939366335 -30613466643665313830353332393365623933376638326534336664616561363461643237386533 -64376532306663373934356361663832323337393266356138343236663964666637343431663237 -62303531353266633164336363356336616332663730663933353730356365393866313662363730 -63346434663162313333663738393461386638343864616634323938323437363232356466303637 -32663630633466623839306537366465653164616631373564366132636165346231303065653036 -66333134336132376232393639616163393366343365336661633330316436656163396434343963 -30356331393432613561636562343138643062613738613764666232656639393532623433343138 -37623963303237663337626661656638636364323931643730343535303737656461663831336336 -65653031656633386562663837386130613635306438313764653830663966663232646663356132 -61613338663331666265393566613661653462323530623930373034363363363238663465303162 -39303465613435343934636365336262376431616136383538353862323235643835373638663832 -38303336306665616666353963653532313162336536336137613337653363323138626338333861 -36663364656463623337663362643936393664363937306135353464363061393837346161333435 -63343030333830626438653565623065383264616264303035613432313266643739333063653066 -39623863373632363337663065653865343433393333386633626237393162383338343038646165 -30396331643033386331333039663066356432613733336235353266356336326138323864396132 -38313164393833343339663363366438313931393232613935343063306233323061363066616366 -62303564643930643262666364346130363530363630306331393032623736643630376563636533 -62656338343734343739383565396339323138666265626235376235613963666566333862656533 -63626566343737636532363535656238316332363831303862313265383936613339616430376231 -32663363613135626463373166623063336135303437313031353337323939633732396139623731 -36653061313233363837396636643234666439663261316361346263343934393237626134656230 -66326135396661383432323939666662376163376233323339303939336363336531653163633464 -33346266346533346631393666316239343463366636613336313833663730323734613135343930 -62613130613933656237366262363433353434303763326564333965383662336661313037616430 -32643061313638373931646464383465626234323866386336313861336531383638363736633438 -38643662376364333564383963613339623964396666313263653336393666623932393738656665 -63653234316265316535303531646230326530616639653036653731373934316238313563313338 -62373162346333666634346362333232373234613430386237656337353661643839663465663265 -36303738636137633636646537613336386230316334613739383362656661643163373936663130 -37393361323837323032376464323961306335623835616134633735626164306539383936613064 -36653133666230336262616438343539346561363863653364343662356233633239623765383165 -30336635393763646432396437613838383733626565353737336165626333643339376432393366 -31386334326130346164633534366532363037316334373133326362303965346633633939333539 -35613435626232653733303266666431666133366430633538623931623231353235383364303765 -64376133653562336631326630363036623033303039363561643236653531663861336262393865 -37346633626334313736303831633236313562393363313133613836326137303435356435613337 -31613335336562376435393237326439613863383264316537353165373437333866666364316366 -36326332336335396430663332326562613235623338633930633437663162643433663065323234 -36613663356534366433383431386666643736323936383030396139326464623961666666323462 -35613335633666313330636161613836343861313861666530323935343961316631666566653565 -61363033306338323966376631343232343038393564616262323532626131643265303865396539 -62363433353666626666393331636537363535306534383634333262326438366463363138666230 -32386366303462323930343863333463383638653532386362323338306266393337326535363663 -36346366393631396163343930626537643161353038383934313331363834323431653364303939 -37326532643864343338626430363065353833353862353262336235336637663865653263663339 -62363366663838366236653364363064356137346463383933626533343461356162363062653932 -37663966373031363133326534623763643030356335386139363565613135353835343233636330 -66393532396530643532626336303737306134323537373135663435376632343331323663333737 -66316638396563626663313636386566363036383663656230336530376234376138303462323030 -61613931336364383265366234393933653432313562666238666639326430376238623365373838 -38363339616365623065376438323738306633666561326432303935393938373638613736303332 -35353833663431313462333362313732353534383630343030393564626139353139623530633332 -34653639386263313738613430323664383264646632633062643031303437636262623966313630 -30663533623334633164353964643536623566623132666166373039303361346534346337396430 -66633632633162316462636662363938656263663135326237303361386234623661333938616262 -62343731623838646133333135306438623538626639663863313337313862626535303937346138 -64623338336333323239643565336533323234353436616230373063663539613839646238643735 -32613163343637656337653139346463383734363636633635316261646133343731653133613238 -35613265633538323039663665353664333434373834393264653830343766343136653632363532 -65356331633262643635343861393535353532383137346534633661613963333531626463346562 -63323638376536626534353062646561373566396235386634646663616230633635386661333334 -34643833653065633033333839633736656161396236363364393838613038326532353130353063 -62373635356665643133353561633861643436613035636239373630373164386531343736643564 -32656536633631353931666137663234343861633865303436323434303636376634366665313234 -33336163396330383263346333323065616437383564303839636235313964343633626166623833 -62316436326532386338356563643038663737616338363636383032623665373862643631643331 -62336364366537366531663762393964633531333166303662356334383562383466303334663261 -63663638633736353934663530343934613837623963366232323637626466343138613165626634 -38663338386465353463633438356434353839303334343165386430623733393934343466333134 -35373137653635653966383865333637623930666562323236323434653063613464353362396164 -31353632353637326330316239393665653833393438663436376562326638336239396337633134 -39343031323931303061663837353931396263333637633264643966343633363966626135356333 -30643564666336636535663264396632636532616234316130313761333731626639333665393430 -37653765336533346564306139333436623466626664393735363865663733306161393634323161 -38653262303363313562363233643634623364396237316636623431656366393538633131366139 -64383833313537653137363961306538353230656164626663613462323962363631643336356561 -61343539393239623861373633386338663534616438333538613632356265376132356539653964 -61643234373639643933653963323631336433633863326263303938643166356330396339626637 -30353337626231333730386465326533346233626561373564376234343763616431313031656531 -65396363396436383337373133333231393139303734643533623233613136363031616430653530 -31383231333763646437646430346564623739376365656661363539386164346365633730623738 -65373334613138336263623262653833363566633638646139656433326165353637363131316230 -31653436353336636333656430656564356233626535333263616136626136363430353237366230 -37346533316562653764396262646661623232346335633966303833356332346133653535356638 -61386338363139343561636564396232643361333936656637363130323165666536613066663137 -64356233376662666432366364626639373534663865343865323363333239636461326665306537 -35666533643834373839326139623564316533303562306235386238313764666438656139393362 -61353337303761666538636533613839336237646331663231353831303663323739623362326363 -66646136383765356431306639383336623237346534623535613435346238353866316164333763 -62646665396233646632633535633332313934653964396562656464376635306434613932623664 -66303131616137616439353939663731306438383662393039333036663862336537356335306266 -66646538316432346132633764626361353561663937323039383138636331326232643932633932 -34353061396461646664633364303536353833646130303032656238313637363736643663356237 -34356161313463626361393031643332656464326166636333616162383431396662383261383033 -31303537326532323238363539613439626365613538643364646366326236353934376539383865 -32373731323133383335343639626133353232613033306331373237646364643830613532306237 -37663034613363363164363935633332633732653761623439366636646137326163306632316264 -35356164343462633938333331323836313539303961316532613032396632666138646265636337 -38313539633430646166313435376532323630343232393735346335363731363666663363663138 -38373465396461306665303331383266663836666434626137636632653266393239656631353833 -32626531363763303439356565666434333334383737316431353032333638366338383430313436 -62326331353834303261663730303066623062336638323433353565656638336235663734323530 -66396666306534393139656138666430373537653862343232386233313730313831643734353539 -35636361643230316665306563633836656261353338663538336666383462343132666361356233 -32623732646564316461373537373331363138653332393638656437643635376663303430373933 -31383837643033323334326562663135613537373661396166656130613963383265303961323230 -63376662656232393833373731653234316462333834356534303738323430336633646437323332 -34376263396662373931333938623330626438663336323066326239636535323562623936636335 -39373335363663643238316230356534643033393363383436613865336361653566626336666630 -37313739646337653436663665386666393063316263653833633239396632313734616262616166 -38303363646661373139343039353532363736336261356462366238343135313637636166643431 -38633236386535346166386434616234326164346661386534663834646464303038313561613034 -33656265653739383932323632613766333335363633393666396663306337333231316639633731 -35383062613633363065616535666638326138306431366130336238343263356362333535346435 -35643866386430333730663461353136313630323961633764616134333835643234656633303232 -35363333656436653563353336393066306139633937623037643566633166646264313864646364 -36636663613465656339613534613634633733616662346530356361383934633466616138383865 -66313930613030386163346363333836633139376637323337396434613761636434666164393534 -37346437356431313930333932303465326138393262643665643139646134386161613465666363 -32376464653737363130303761303838663061626636643534326235333062643735653837633938 -35336161306435323665653035313930646666366631353464626235313761386135303665636137 -62646466313662613630616234373933376138383037363933626437306466633832343238633964 -30346265653865623537323833393763343632323839353237363466336663396131333266396533 -65626561646233626366353862396564373463623563343961646662633133613333646435303030 -31323332626534383732643839353739653835333934373835653331663762376337393930363833 -36313033633239383830363861623538396463396163333138613437303535396265336664313639 -31653837623938393137643137306566386666653564373838373265306462303062623436653261 -31333138396664613962303965613536373239643166353831623565643662323564 +35383939623164356565323465316566346532343163646633323634396364376462313461366439 +3637616136336262303234323464343434643234383132300a333665333836653636393166376330 +36666466393762346333363930386334333863616265363661383639333561393061313938373366 +6562316232653761340a313631633931353736383636326339656432333065663032323033326334 +39646438633330323662643834383438656134376363653938356639356338633635663831323938 +62653533613861383536346230613161393834326637623636356265633237323331323565323339 +61306565663831613635656661373535396564376561653035616362623333386338666432346634 +33373033333737626534366164306436363932653231346134616163633634633131646165316330 +65393031613461623762383066626566373733666639333766643131396433306637653063356361 +35343231356534626661623331653365643230646566323666633031323734663933643864336264 +61616333353139626462623933343234386238393437623833363461323834306233653061363535 +64326339356435626265363235313965346165353434613962396465346265346539343764663733 +31343234356331333536663239336334653864393132666264383263333365663464663931626562 +36343430656262313962633965326539633834306263363036343562663132393537343863313961 +35356161386234326361626165343234393837643364616339666131343364386132333763623737 +39373035626332613566396532343535646235636661663263353338633763666363666363633465 +61353566646261376534323662363062623962643062386164666136623966363535356132656562 +65653465373366636533336539333035346537346261633933626334356631393461373361623537 +34326463373766393965653639313063383764313736626366653063663466646161313365306532 +63353566636433346237393834386537396232383961613932666537373565653338363435383938 +32333438623332626163336631663664396430643566376363366262656432666261383039326431 +63633036393634646237393665353666666239653533393532646464643934373535666137373764 +62646535613563363939313666636466623762636439323237623236383165666630363938393666 +34336439316665326265623335383434323837326661343163643833663330663834376432333134 +32333737643364373035626430393963373934316663626666333837666161616138633032393663 +37323432636435383462383061346332373862376336323363303031666336646161633539643033 +37633962356130613138343235633564393330373463613861313638303633326639626436613763 +61383236643439616232613331366535356130373365643064366533613330383661623833303231 +64353532646337643630373361303564386166306639623137643534376631393731393831383261 +36373934623337646234353165316563303336373437626464356463383733303338643936376164 +63303638313766333832323764666431313937633930623865353331616536653930653336343266 +30333931336165393634633231376266373933646661306138386631663539336139333265663631 +36333562396239623236336333343935663866363063353036663337646431356537373434666331 +39356635306263323365333263386331656636356436373862616434356462376134363034663532 +64333633663662623931343363393233306331303066303664323034373333656132386437366162 +37633830626362326637623139396631663834623436646364363439356361666661396236353739 +39333766396132616333323566393936363137333235643739333639646234313266303062323536 +38633964373238646534626566366438633364636461343861303437356562313966626235326537 +63316438373461313936343634373835306539333436393337656535323662663936656638353838 +38316234663432656539636239363861396139376264303336356630396163353234656562633362 +39613032653163313362643733393232316530613533343535376339636139393936616263346561 +30356134313831316364643439373135393836303330303737636137323035386432343963393165 +66366333306262353763383838376662633766636532643064373962366665313761646336303033 +32643633616162316537376435386536316431343136346264643163373033336463393130383562 +39623635316333383036336538626636363130353733336531396132623466363933333230616364 +30633364393334643866393332346239646235373766346562653061633732326537343634363065 +66646662336661386432306231313362636535316466656435366639383030376365313364666564 +65666535663532383662383833633261343934383535313163643133646663396135613761336337 +64653433366164373461643038353830626139306566643438393933396339616361623062346536 +31353039633437383862343865343133336665633436366137663033643834303835336633616361 +30363863626463333437626165333338366332653838663464633964363961373338336462376332 +63303738636539396635613938366336303462326564663937656231346639326438326561333430 +38646538353362303062376138636362333166373931663036646438663937326438316338653861 +62356365633966623638626138653064663835656431613262393532623731656132343864663966 +31373936333031646131663436323036366637326134336132373565316330663066366237336439 +62656562346639336339363363643933633566646363356565366336633863636230316634663936 +38626662653131623064373639383837366538633339313864346631633032356362373035303665 +61376332313532353665373131613335653732343839366365346330363638366265656139373838 +38633737653565366165306562353333353637326530636535616566323061386362333266383636 +61636365386232306338663962633235613435613466643032323363646232306431646164633639 +36383139313363613630616662613734636465646130363933376438633839363163343866323032 +35356531376663386331666238656537613164633634633934616462383331326633333235626337 +33393330303532626132393239633735623963363562656163383564306461353330376532396334 +30666361353862356636636632383234323565376235343862343564383830326533373861303437 +63613731643964613530343234323661636133643838316564356338366566303261336330616432 +32613535633630303132313933393833636433373539346261613661626135356363303930636138 +39323837383863306264633838636530393632363936633938626465656334336333333961666331 +66653463343333326563356337373732643333333065353436393736613038346636643535383466 +31656535633765386339633938666639396438326638303961303365323032333564636562343361 +65303662343633343364366265646432376230356362373465356539623632653663373631633633 +38666138363837356331343061373237303337656432326633646565353337393238363362396238 +66633966383237653064343333396661653932386536383536366632326234303161353166633836 +37313438393263366436613066386235343034366433343432346266343137346336646238613462 +33336339363037343533616166616565333330333531643364393437393637386330626437346135 +64396334656664336535373764666535373732353639326433646561616338323633623138373832 +30616363303834643532623362306362326230323737653563393838653234373861373933316538 +64376430376161316666396336373662393237383531353361393435386236636631613336386566 +31643637623333623364323734323961643863623532613432386662363361316134626533666339 +34656130633462616337323938626439626235306533336264343138356439633065313434616132 +63646664343962373365663738356233663135653965326534353665316531393964636132393932 +36633638636236326135323335646535396266666433396462623963656664336539386662373233 +64363566363863376466316338316562393461623262393130303762646334336463623632393238 +65656138396536373132363633313636643864353266356266626266643737393366326538353237 +31333961376236653263613930613432666531366131623834633632646332316133666530646139 +65616466646564646437333730383836656566643465303931326665343764396137643338373631 +62333266326265356562656430666538376134356239666635393430343234363231323938393331 +31613463613936656138623535303731333535323130303835366465383665353632636138653338 +35663132386634313538326130343435313131303934393434393736353531336261306265303264 +39376537636566333563393032336534333635346432663235623530666264323930646361313463 +39343437313932323064666632386137353834313930343636356561346535613730363865613433 +63316133663935373238373566326363343130376666613331666361326262353266653535343866 +64383931303037386165663439643232656139653832303239383235383637336664313864663935 +63366631303536336530366438333762393839656435366161353838303732386466356238333632 +34646463646535376139663136613562316166356138343939633935303532326536313033643639 +35653765326234333832366165363962376263383465313633313664336636616430313138313365 +31376535613130666562336533396636646161633932633030363437616337643761343439616338 +62333332376465306264663137613265363432343538643430333764326562613065663062613665 +63643030383163343231353964353264626434383762346639366335346465336365366131646131 +38633962316232663530376133383034303465313331393561393636386663623861373161376366 +37306533636463356232326430346538346136653264343839356662643435633337313232616561 +33633331346166303038656135303532643531383466346334383665613662333431336362333334 +66383336626463653136353861613832366338623631353930353432323338663834316436373230 +37393135303037663035303633643439653238663038626135623436303435303361393064353034 +35663230656434356434386462363834313137353865313831343261623466633861303336366334 +33626164313334306362393461313633376464343037646534666339386462666634363563386661 +37373138643432373834356335623864313561376131633161613035386166623836613339333563 +31613934363331633537663261653230306539616238313837393762323932363365326238353131 +31666564303666373163306237353136636430313639313931303339346335653539643265613230 +62643836353432316165336665373964353762376432373263323666393333393564323932333638 +33643763613739323134666139653862396436393836383232303564636261393161656163653830 +66653237313262616464656437343465623961633562376638626432663530356434396463663465 +39386261343933366666356664313339373231326566633165306632353535363436313864303936 +38613636326666303061616337666436383263363931323339646432373965363565333763343631 +37343566323732303830353537393565306434363130323335633837663762333431376539633765 +61363939626234386564306539636637333137626133363139353235366238326633623062303833 +64303832643830646430333061646333633039663634336263396563393437326135613932386634 +35393639373631323435373864306433373638613836396664633537323636653531616534316465 +63626661313733333431333665663165646234343438356134366131353234366466373133623639 +34656436306433363136666633616464373937633435616534376536393233313236356634323161 +63633632303562346566646166636664376431396162663765386532613832326339666130666536 +36663865633963613536623637303061626336343835646639633031366333393132663033396533 +38383862646631333262366237323234396465356531323363653464643361326362366231653739 +62643738303734643033323362656230616466353161663136623864313136386366376634653664 +31363930373530346333396536623037303162313934333634373033326432373566373032643964 +30663962353664353062303935356262363333366437383338373961616237663361326631353565 +37313936373033323131303161343139653565663466323830663536346665666232643163613562 +30643061653363663864383663326563306261663061326366383731366463356238373539383935 +65626464346366613638623730383631393066393233353130396636393438373565383266636439 +66633837626461623335316438393432303839633234323065396533343466373962633566643032 +35353939323038333434316232326138326266343662636130363565343463636364613263383438 +35653736333339353831383733393161356533343138336161383435333261613262306135393565 +66333134326265376433376538373531353966396138656265666266353737343936366132623633 +66663339616263623139666236373563363666356236383538316363326635396332373161373932 +31313430313065353762646538383361316563326262363833316434343965383032633139663634 +38383430336432373031636635366539663337666330663361303964653331376430303263613461 +39303832306463356465366237373338356636663637353835663336656331366638656433623462 +34623761366365366634353635333632373162643330633435303466326437626138663834323531 +61663433656537366662386134393761396162326265393465363131393333623731393534656338 +35356132323062336235326630353464393434633633343932613432623536343365626165626432 +31633732316364616463656430623763323039623835343164326536316334353666616237623535 +32303036653936363933353932323666636662393231306138306239653065623338336662613633 +34376631386235653161323331313661656366386635343264353535623439383734393363666239 +64303466393539353862626436643366306564336638346432373661336537353033613036393630 +35383962663363366665393938666266326464383936653539363838623338366466626439663438 +35333737356234363731396162353730643665666630366133633839303836313064306330373233 +62613363316238653534313739633033336134386264666362393061653434356637643736633863 +37333766646666626531323738633161366537306539303961373037656461323265353032666338 +30383834386333656334376361643338333662353461303932373132356133643934656466373864 +31306466396231363132636463333633383939376462386230363661656164666331323333363435 +33383262343238383265653232653538643964346236643031386164616364393732336637636239 +39663333646137313933313562626265663365633633653465396234396563656539646630346634 +63643461666365643961623936623364373334663162366537303163393665303633303562336361 +38323431346334623835396165653232663361383836663633386361616630633437623332383732 +33656139323339613164653433623237623939633230663735613063623131623632393535353066 +31633234613563616566396262343334313262366434306662613965316135323965643732356130 +31643437396264303831653762393930383431323062303032333666653761623866653762333663 +32633862383763633663313166313365333963636233386430366165643635633938306533663164 +35326561393265393830376434393235613265653764636538663165326363636538343630323763 +32396531613238313736393462313736393535613662353365636165373831626466386535623433 +63366338616637386336613435316262393561393139336331323132613835663065623637333833 +62663262653536313334623736343535323766643235303865653864613862663664386664643934 +37363832653530626339313336363639633863656633623838653564666135646333306264313765 +39613331313432636330383066653431383333323265623233633434343066323764633765663832 +34653434323631313261653234353437353762616466633463383835313034336234326666303864 +35333034376131323436613735383433393266613966363432646663366636303564666532646163 +38333963306665306438333034313933303337363331376663633333643161636236343662383361 +33333933346665613061346634666530323830653732356231306365613436323263316462373734 +65366462646532366638366235646533383235346463613164393630306636346232626264323932 +37343631656361633235333338613933396565376636343932306363623635373237366639633236 +62653537313134613239353365613239666466616630653336653738393032646263336561623861 +31333434646532393963346238613662343737323831393136383736636631393065306664616333 +32643666393261623262326562356631353432353231383161613964383566643466323962313238 +33393531363135636362326434383962633463633039333664353865383231353634633535333738 +62636432646461376431396638333231643164306432333132356131316538303366343333396564 +35373732323633666263663064356262323432653462333834636433613231356637626265653866 +61346366353165363639633466336463313462653137613035373430313334336262626439393539 +3663 diff --git a/ansible/roles/bitcoin_knots/README.md b/ansible/roles/bitcoin_knots/README.md new file mode 100644 index 0000000..8e35900 --- /dev/null +++ b/ansible/roles/bitcoin_knots/README.md @@ -0,0 +1,85 @@ +# `bitcoin_knots` + +Builds Bitcoin Knots from source with PGP + SHA256 verification of the release +tarball, runs it as a full node on `knots-box`, and keeps a health check on a +systemd timer. The second play in the calling playbook publishes the P2P port +from the edge host via `socket_proxy`. + +Converted from `deploy_bitcoin_knots_playbook.yml` (892 lines) under Plan 6. The +playbook is now 40 lines. + +## The build is guarded; the chain is never touched + +`build.yml` is 32 tasks, every one carrying +`when: not bitcoind_binary_exists.stat.exists`. On a host that already has the +binary the whole download / verify / 30-60 minute compile skips — **including the +two `state: absent` deletions**, which target `/opt/bitcoin-knots/source` and the +extracted build directory. + +The chain lives elsewhere and nothing here touches it: + +| | | +|---|---| +| `bitcoin_knots_dir` | `/opt/bitcoin-knots` — build tree, safe to delete | +| `bitcoin_data_dir` | `/var/lib/bitcoin` — config, logs, wallets | +| `bitcoin_large_data_dir` | `/mnt/knots_data` — **~875 GB of blockchain** | + +The signature-verification tasks are the security control of this role. They are +copied verbatim; do not "simplify" them. + +## ⚠ This node is half of the mining setup + +`bitcoin.conf` carries a DATUM Gateway section that was hand-added on the node +and was **missing from the playbook's template**: + +```ini +blockmaxsize=3985000 +blockmaxweight=3985000 +blocknotify=killall -USR1 datum_gateway +maxmempool=1000 +blockreconstructionextratxn=1000000 +``` + +`blocknotify` is how `datum_gateway` learns a new block landed. Running the old +playbook would have deleted all of it, and solo mining would have carried on +grinding against a stale template — a silent failure that costs money rather +than raising an error. The template now carries it behind +`bitcoin_datum_gateway_enabled`. + +**bitcoin-knots and datum-gateway are one system, not two services.** Changing +either config means thinking about both. + +## The restart handler, and why exactness matters now + +The hand-written `Restart bitcoind` handler carried +`when: uptime_kuma_enabled | default(false)`, so it had been inert since the +decommissioning: `bitcoin.conf` and the systemd unit both notify it and neither +could restart anything. A config change applied to disk, reported success, and +never took effect. + +It is ungated here — which raises the bar for the template. **Any** residual +difference between the template and the live file, down to a trailing newline, +means the task reports `changed` and restarts a Bitcoin node on every run. It +took four rounds of `--check --diff` to reach `changed=0`: the DATUM section, an +explanatory comment that was rendering into the deployed file (now a `{# #}` +Jinja comment), a `# Pruning (optional)` comment the live file had, and one +trailing blank line. + +## `dbcache` + +Computed as 90% of RAM unless `bitcoin_dbcache_mb_override` is set. The live node +was hand-tuned to **200 MB**; the calculation produces 3528. As with fulcrum, +`set_fact` outranks role defaults, so the *calculation* honours the override — a +value pinned only in `defaults/` is silently ignored. + +## Monitoring: one variable, no product knowledge + +The check tests bitcoind's RPC and records the answer in its exit code, which +systemd keeps: `systemctl is-failed bitcoin-knots-healthcheck.service`. Set +`healthcheck_push_url` to report anywhere that accepts an HTTP ping. + +The timer had last fired **2026-08-09** while still reporting `active` and +`enabled` — the same `OnBootSec` + `OnUnitActiveSec` dead chain as fulcrum, where +nothing re-arms it if the service does not run in a given boot. The role runs the +check once after enabling, which both smoke-tests it and supplies the reference +the timer schedules from. diff --git a/ansible/roles/bitcoin_knots/defaults/main.yml b/ansible/roles/bitcoin_knots/defaults/main.yml new file mode 100644 index 0000000..29d5aa0 --- /dev/null +++ b/ansible/roles/bitcoin_knots/defaults/main.yml @@ -0,0 +1,71 @@ +# Bitcoin Knots Configuration Variables + +# Version - REQUIRED: Specify exact version/tag to build +bitcoin_knots_version: "v29.2.knots20251110" # Must specify exact version/tag +bitcoin_knots_version_short: "29.2.knots20251110" # Version without 'v' prefix (for tarball URLs) + +# Directories +bitcoin_knots_dir: /opt/bitcoin-knots +bitcoin_knots_source_dir: "{{ bitcoin_knots_dir }}/source" +bitcoin_data_dir: /var/lib/bitcoin # Standard location for config, logs, wallets +bitcoin_large_data_dir: /mnt/knots_data # Custom location for blockchain data (blocks, chainstate) +bitcoin_conf_dir: /etc/bitcoin + +# Network +bitcoin_rpc_port: 8332 +# Shared with the socket-proxy play on the edge host, so it lives in +# services_config.yml rather than only here. +bitcoin_p2p_port: "{{ service_settings.bitcoin.p2p_port }}" +bitcoin_rpc_bind: "0.0.0.0" + +# Build options +bitcoin_build_jobs: 4 # Parallel build jobs (-j flag), adjust based on CPU cores +bitcoin_build_prefix: /usr/local + +# Configuration options +bitcoin_enable_txindex: true # Set to true if transaction index needed (REQUIRED for Electrum servers like Electrs/ElectrumX) +bitcoin_max_connections: 125 +# dbcache will be calculated as 90% of host RAM automatically in playbook + +# ZMQ Configuration +bitcoin_zmq_enabled: true +bitcoin_zmq_bind: "tcp://0.0.0.0" +bitcoin_zmq_port_rawblock: 28332 +bitcoin_zmq_port_rawtx: 28333 +bitcoin_zmq_port_hashblock: 28334 +bitcoin_zmq_port_hashtx: 28335 + +# Service user +bitcoin_user: bitcoin +bitcoin_group: bitcoin + +# --- Health check ---------------------------------------------------------- +# Checks bitcoind RPC and records the answer in its exit code, which systemd +# keeps: `systemctl is-failed bitcoin-knots-healthcheck.service`. +# +# WHERE TO REPORT HEALTH — the one place to plug in monitoring. Empty means +# check, exit honestly, report nowhere. Any endpoint accepting an HTTP ping +# works; nothing here is specific to a monitoring product. +healthcheck_push_url: "" + +# --- Logging ---------------------------------------------------------------- +# The live node logs to a file. Set to "" to use printtoconsole=1 (journald). +bitcoin_logfile: "{{ bitcoin_data_dir }}/debug.log" + +# --- dbcache ---------------------------------------------------------------- +# Computed as 90% of RAM unless this is set. The live node was hand-tuned to +# 200 MB; the calculation would have produced 3528. As with fulcrum, note that +# set_fact outranks role defaults, so the CALCULATION has to honour this - a +# value pinned only in defaults/ is silently ignored. +bitcoin_dbcache_mb_override: 200 + +# --- DATUM Gateway ---------------------------------------------------------- +# This node feeds block templates to datum_gateway on knots-box. These settings +# were hand-added to bitcoin.conf and were missing from the template, so a +# playbook run would have removed them and broken the mining setup. +bitcoin_datum_gateway_enabled: true +bitcoin_blockmaxsize: 3985000 +bitcoin_blockmaxweight: 3985000 +bitcoin_blocknotify: "killall -USR1 datum_gateway" +bitcoin_maxmempool: 1000 +bitcoin_blockreconstructionextratxn: 1000000 diff --git a/ansible/roles/bitcoin_knots/handlers/main.yml b/ansible/roles/bitcoin_knots/handlers/main.yml new file mode 100644 index 0000000..49ac219 --- /dev/null +++ b/ansible/roles/bitcoin_knots/handlers/main.yml @@ -0,0 +1,14 @@ +--- +# Ungated on purpose. The hand-written handler carried +# when: uptime_kuma_enabled | default(false) +# so it has been inert since the decommissioning. Two tasks notify it — +# bitcoin.conf and the systemd unit — and neither could actually restart +# bitcoind. A configuration change to a Bitcoin node therefore applied to disk, +# reported success, and silently never took effect. +# +# Restarting bitcoind re-opens the chainstate; it does not reindex. +- name: Restart bitcoind + systemd: + name: bitcoind + state: restarted + daemon_reload: yes diff --git a/ansible/roles/bitcoin_knots/tasks/build.yml b/ansible/roles/bitcoin_knots/tasks/build.yml new file mode 100644 index 0000000..5a1b900 --- /dev/null +++ b/ansible/roles/bitcoin_knots/tasks/build.yml @@ -0,0 +1,222 @@ +--- +# Every task here is guarded by `when: not bitcoind_binary_exists.stat.exists`, +# so on a host that already has the binary the whole download / verify / build +# sequence skips — including the two `state: absent` deletions, which target +# /opt/bitcoin-knots/{source,bitcoin-} and never the chain data in +# /mnt/knots_data. +- name: Check if bitcoind binary already exists + stat: + path: "{{ bitcoin_build_prefix }}/bin/bitcoind" + register: bitcoind_binary_exists + changed_when: false + +- name: Install gnupg for signature verification + apt: + name: gnupg + state: present + when: not bitcoind_binary_exists.stat.exists + +- name: Import Luke Dashjr's Bitcoin Knots signing key + command: gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 90C8019E36C2E964 + register: key_import + changed_when: "'already in secret keyring' not in key_import.stdout and 'already in public keyring' not in key_import.stdout" + when: not bitcoind_binary_exists.stat.exists + failed_when: key_import.rc != 0 + +- name: Display imported key fingerprint + command: gpg --fingerprint 90C8019E36C2E964 + register: key_fingerprint + changed_when: false + when: not bitcoind_binary_exists.stat.exists + +- name: Download SHA256SUMS file + get_url: + url: "https://bitcoinknots.org/files/{{ bitcoin_version_major }}.x/{{ bitcoin_knots_version_short }}/SHA256SUMS" + dest: "/tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS" + mode: '0644' + when: not bitcoind_binary_exists.stat.exists + +- name: Download SHA256SUMS.asc signature file + get_url: + url: "https://bitcoinknots.org/files/{{ bitcoin_version_major }}.x/{{ bitcoin_knots_version_short }}/SHA256SUMS.asc" + dest: "/tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS.asc" + mode: '0644' + when: not bitcoind_binary_exists.stat.exists + +- name: Verify PGP signature on SHA256SUMS file + command: gpg --verify /tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS.asc /tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS + register: sha256sums_verification + changed_when: false + failed_when: false # Don't fail here - check for 'Good signature' in next task + when: not bitcoind_binary_exists.stat.exists + + +- name: Display SHA256SUMS verification result + debug: + msg: "{{ sha256sums_verification.stdout_lines + sha256sums_verification.stderr_lines }}" + when: not bitcoind_binary_exists.stat.exists + +- name: Fail if SHA256SUMS signature verification failed + fail: + msg: "SHA256SUMS signature verification failed. Aborting build." + when: not bitcoind_binary_exists.stat.exists and ('Good signature' not in sha256sums_verification.stdout and 'Good signature' not in sha256sums_verification.stderr) + +- name: Remove any existing tarball to force fresh download + file: + path: /tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz + state: absent + when: not bitcoind_binary_exists.stat.exists + +- name: Download Bitcoin Knots source tarball + get_url: + url: "{{ bitcoin_source_tarball_url }}" + dest: "/tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz" + mode: '0644' + validate_certs: yes + force: yes + when: not bitcoind_binary_exists.stat.exists + +- name: Calculate SHA256 checksum of downloaded tarball + command: sha256sum /tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz + register: tarball_checksum + changed_when: false + when: not bitcoind_binary_exists.stat.exists + +- name: Extract expected checksum from SHA256SUMS file + shell: grep "bitcoin-{{ bitcoin_knots_version_short }}.tar.gz" /tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS | awk '{print $1}' + register: expected_checksum + changed_when: false + when: not bitcoind_binary_exists.stat.exists + failed_when: expected_checksum.stdout == "" + +- name: Display checksum comparison + debug: + msg: + - "Expected: {{ expected_checksum.stdout | trim }}" + - "Actual: {{ tarball_checksum.stdout.split()[0] }}" + when: not bitcoind_binary_exists.stat.exists + +- name: Verify tarball checksum matches SHA256SUMS + fail: + msg: "Tarball checksum mismatch! Expected {{ expected_checksum.stdout | trim }}, got {{ tarball_checksum.stdout.split()[0] }}" + when: not bitcoind_binary_exists.stat.exists and expected_checksum.stdout | trim != tarball_checksum.stdout.split()[0] + +- name: Remove existing source directory if it exists (to force fresh extraction) + file: + path: "{{ bitcoin_knots_source_dir }}" + state: absent + when: not bitcoind_binary_exists.stat.exists + +- name: Remove extracted directory if it exists (from previous runs) + file: + path: "{{ bitcoin_knots_dir }}/bitcoin-{{ bitcoin_knots_version_short }}" + state: absent + when: not bitcoind_binary_exists.stat.exists + +- name: Extract verified source tarball + unarchive: + src: /tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz + dest: "{{ bitcoin_knots_dir }}" + remote_src: yes + when: not bitcoind_binary_exists.stat.exists + +- name: Check if extracted directory exists + stat: + path: "{{ bitcoin_knots_dir }}/bitcoin-{{ bitcoin_knots_version_short }}" + register: extracted_dir_stat + changed_when: false + when: not bitcoind_binary_exists.stat.exists + +- name: Rename extracted directory to expected name + command: mv "{{ bitcoin_knots_dir }}/bitcoin-{{ bitcoin_knots_version_short }}" "{{ bitcoin_knots_source_dir }}" + when: not bitcoind_binary_exists.stat.exists and extracted_dir_stat.stat.exists + +- name: Check if CMakeLists.txt exists + stat: + path: "{{ bitcoin_knots_source_dir }}/CMakeLists.txt" + register: cmake_exists + changed_when: false + when: not bitcoind_binary_exists.stat.exists + +- name: Create CMake build directory + file: + path: "{{ bitcoin_knots_source_dir }}/build" + state: directory + mode: '0755' + when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) + +- name: Configure Bitcoin Knots build with CMake + command: > + cmake + -DCMAKE_INSTALL_PREFIX={{ bitcoin_build_prefix }} + -DBUILD_BITCOIN_WALLET=OFF + -DCMAKE_BUILD_TYPE=Release + -DWITH_ZMQ=ON + .. + args: + chdir: "{{ bitcoin_knots_source_dir }}/build" + when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) + register: configure_result + changed_when: true + +- name: Verify CMake enabled ZMQ + shell: | + set -e + cd "{{ bitcoin_knots_source_dir }}/build" + cmake -LAH .. | grep -iE 'ZMQ|WITH_ZMQ|ENABLE_ZMQ|USE_ZMQ' + when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) + register: zmq_check + changed_when: false + +- name: Fail if CMakeLists.txt not found + fail: + msg: "CMakeLists.txt not found in {{ bitcoin_knots_source_dir }}. Cannot build Bitcoin Knots." + when: not bitcoind_binary_exists.stat.exists and not (cmake_exists.stat.exists | default(false)) + +- name: Build Bitcoin Knots with CMake (this may take 30-60+ minutes) + command: cmake --build . -j{{ bitcoin_build_jobs }} + args: + chdir: "{{ bitcoin_knots_source_dir }}/build" + when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) + async: 3600 + poll: 0 + register: build_result + changed_when: true + +- name: Check build status + async_status: + jid: "{{ build_result.ansible_job_id }}" + register: build_job_result + until: build_job_result.finished + retries: 120 + delay: 60 + when: not bitcoind_binary_exists.stat.exists and build_result.ansible_job_id is defined + +- name: Fail if build failed + fail: + msg: "Bitcoin Knots build failed: {{ build_job_result.msg }}" + when: not bitcoind_binary_exists.stat.exists and build_result.ansible_job_id is defined and build_job_result.failed | default(false) + +- name: Install Bitcoin Knots binaries + command: cmake --install . + args: + chdir: "{{ bitcoin_knots_source_dir }}/build" + when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) + changed_when: true + +- name: Verify bitcoind binary exists + stat: + path: "{{ bitcoin_build_prefix }}/bin/bitcoind" + register: bitcoind_installed + changed_when: false + +- name: Verify bitcoin-cli binary exists + stat: + path: "{{ bitcoin_build_prefix }}/bin/bitcoin-cli" + register: bitcoin_cli_installed + changed_when: false + +- name: Fail if binaries not found + fail: + msg: "Bitcoin Knots binaries not found after installation" + when: not bitcoind_installed.stat.exists or not bitcoin_cli_installed.stat.exists diff --git a/ansible/roles/bitcoin_knots/tasks/configure.yml b/ansible/roles/bitcoin_knots/tasks/configure.yml new file mode 100644 index 0000000..52fd3fd --- /dev/null +++ b/ansible/roles/bitcoin_knots/tasks/configure.yml @@ -0,0 +1,20 @@ +--- +# Ownership copied verbatim from the playbook this replaces; verified +# mechanically against `git show HEAD:` rather than retyped from memory. +- name: Create bitcoin.conf configuration file + ansible.builtin.template: + src: bitcoin.conf.j2 + dest: "{{ bitcoin_conf_dir }}/bitcoin.conf" + owner: "{{ bitcoin_user }}" + group: "{{ bitcoin_group }}" + mode: '0640' + notify: Restart bitcoind + +- name: Create systemd service file for bitcoind + ansible.builtin.template: + src: bitcoind.service.j2 + dest: /etc/systemd/system/bitcoind.service + owner: root + group: root + mode: '0644' + notify: Restart bitcoind diff --git a/ansible/roles/bitcoin_knots/tasks/healthcheck.yml b/ansible/roles/bitcoin_knots/tasks/healthcheck.yml new file mode 100644 index 0000000..34b5529 --- /dev/null +++ b/ansible/roles/bitcoin_knots/tasks/healthcheck.yml @@ -0,0 +1,56 @@ +--- +# Everything here answers "is bitcoind healthy" and records the answer. The +# Uptime Kuma specifics that used to follow — an embedded Python script creating +# monitors over the API, a /tmp credentials file, push-URL extraction and a +# systemd Environment= rewrite — are gone. Where it reports is now one variable, +# healthcheck_push_url. See the role README. +- name: Install curl for health check script + apt: + name: curl + state: present + +- name: Create Bitcoin Knots health check script + ansible.builtin.template: + src: healthcheck.sh.j2 + dest: /usr/local/bin/bitcoin-knots-healthcheck-push.sh + owner: root + group: root + mode: '0755' + validate: "bash -n %s" + +- name: Create systemd service for Bitcoin Knots health check + ansible.builtin.template: + src: healthcheck.service.j2 + dest: /etc/systemd/system/bitcoin-knots-healthcheck.service + owner: root + group: root + mode: '0644' + +- name: Create systemd timer for Bitcoin Knots health check + ansible.builtin.template: + src: healthcheck.timer.j2 + dest: /etc/systemd/system/bitcoin-knots-healthcheck.timer + owner: root + group: root + mode: '0644' + +- name: Reload systemd daemon for health check + systemd: + daemon_reload: yes + +- name: Enable and restart the Bitcoin Knots health check timer + systemd: + name: bitcoin-knots-healthcheck.timer + enabled: yes + state: restarted + daemon_reload: yes + +# Runs the check once, which is both a smoke test and the thing that actually +# arms the timer. This timer is OnBootSec + OnUnitActiveSec with no OnCalendar: +# OnBootSec elapses once, and OnUnitActiveSec needs the SERVICE to have run this +# boot to have anything to schedule from. Restarting the timer does not supply +# that reference; running the service does. The live timer had last fired on +# 2026-08-09 while still reporting `active` and `enabled`. +- name: Run the Bitcoin Knots health check once to arm the timer + command: systemctl start bitcoin-knots-healthcheck.service + changed_when: false diff --git a/ansible/roles/bitcoin_knots/tasks/install.yml b/ansible/roles/bitcoin_knots/tasks/install.yml new file mode 100644 index 0000000..3003b6e --- /dev/null +++ b/ansible/roles/bitcoin_knots/tasks/install.yml @@ -0,0 +1,104 @@ +--- +- name: Calculate dbcache as a share of system RAM + set_fact: + bitcoin_dbcache_mb: "{{ (ansible_memtotal_mb | float * 0.9) | int }}" + when: bitcoin_dbcache_mb_override | string | length == 0 + +- name: Use the explicit dbcache override + set_fact: + bitcoin_dbcache_mb: "{{ bitcoin_dbcache_mb_override }}" + when: bitcoin_dbcache_mb_override | string | length > 0 + changed_when: false + +- name: Display calculated dbcache value + debug: + msg: "Setting dbcache to {{ bitcoin_dbcache_mb }} MB (90% of {{ ansible_memtotal_mb }} MB total RAM)" + + +- name: Install build dependencies + apt: + name: + - build-essential + - libtool + - autotools-dev + - automake + - pkg-config + - bsdmainutils + - python3 + - python3-pip + - libevent-dev + - libboost-system-dev + - libboost-filesystem-dev + - libboost-test-dev + - libboost-thread-dev + - libboost-chrono-dev + - libboost-program-options-dev + - libboost-dev + - libssl-dev + - libdb-dev + - libminiupnpc-dev + - libzmq3-dev + - libnatpmp-dev + - libsqlite3-dev + - git + - curl + - wget + - cmake + state: present + update_cache: yes + +- name: Create bitcoin group + group: + name: "{{ bitcoin_group }}" + system: yes + state: present + +- name: Create bitcoin user + user: + name: "{{ bitcoin_user }}" + group: "{{ bitcoin_group }}" + system: yes + shell: /usr/sbin/nologin + home: "{{ bitcoin_data_dir }}" + create_home: yes + state: present + +- name: Create bitcoin-knots directory + file: + path: "{{ bitcoin_knots_dir }}" + state: directory + owner: root + group: root + mode: '0755' + +- name: Create bitcoin-knots source directory + file: + path: "{{ bitcoin_knots_source_dir }}" + state: directory + owner: root + group: root + mode: '0755' + +- name: Create bitcoin data directory (for config, logs, wallets) + file: + path: "{{ bitcoin_data_dir }}" + state: directory + owner: "{{ bitcoin_user }}" + group: "{{ bitcoin_group }}" + mode: '0750' + +- name: Create bitcoin large data directory (for blockchain) + file: + path: "{{ bitcoin_large_data_dir }}" + state: directory + owner: "{{ bitcoin_user }}" + group: "{{ bitcoin_group }}" + mode: '0750' + +- name: Create bitcoin config directory + file: + path: "{{ bitcoin_conf_dir }}" + state: directory + owner: root + group: root + mode: '0755' diff --git a/ansible/roles/bitcoin_knots/tasks/main.yml b/ansible/roles/bitcoin_knots/tasks/main.yml new file mode 100644 index 0000000..ab869a7 --- /dev/null +++ b/ansible/roles/bitcoin_knots/tasks/main.yml @@ -0,0 +1,8 @@ +--- +# import_tasks, not include_tasks: static imports stay visible to --list-tasks, +# which is how this conversion was verified against the playbook it replaced. +- ansible.builtin.import_tasks: install.yml +- ansible.builtin.import_tasks: build.yml +- ansible.builtin.import_tasks: configure.yml +- ansible.builtin.import_tasks: service.yml +- ansible.builtin.import_tasks: healthcheck.yml diff --git a/ansible/roles/bitcoin_knots/tasks/service.yml b/ansible/roles/bitcoin_knots/tasks/service.yml new file mode 100644 index 0000000..6f6149e --- /dev/null +++ b/ansible/roles/bitcoin_knots/tasks/service.yml @@ -0,0 +1,37 @@ +--- +- name: Reload systemd daemon + systemd: + daemon_reload: yes + +- name: Enable and start bitcoind service + systemd: + name: bitcoind + enabled: yes + state: started + +- name: Wait for bitcoind RPC to be available + uri: + url: "http://{{ bitcoin_rpc_bind }}:{{ bitcoin_rpc_port }}" + method: POST + body_format: json + body: + jsonrpc: "1.0" + id: "healthcheck" + method: "getblockchaininfo" + params: [] + user: "{{ bitcoin_rpc_user }}" + password: "{{ bitcoin_rpc_password }}" + status_code: 200 + timeout: 10 + register: rpc_check + until: rpc_check.status == 200 + retries: 30 + delay: 5 + ignore_errors: yes + +- name: Display RPC connection status + debug: + msg: "Bitcoin Knots RPC is {{ 'available' if rpc_check.status == 200 else 'not yet available' }}" + +# ═════════════════════════════════════════════════════════════════════════ +# DEPRECATED — Uptime Kuma was decommissioned on 2026-09-11. diff --git a/ansible/roles/bitcoin_knots/templates/bitcoin.conf.j2 b/ansible/roles/bitcoin_knots/templates/bitcoin.conf.j2 new file mode 100644 index 0000000..5277a3c --- /dev/null +++ b/ansible/roles/bitcoin_knots/templates/bitcoin.conf.j2 @@ -0,0 +1,67 @@ +# Bitcoin Knots Configuration +# Generated by Ansible + +# Data directory (blockchain storage) +datadir={{ bitcoin_large_data_dir }} + +# RPC Configuration +server=1 +rpcuser={{ bitcoin_rpc_user }} +rpcpassword={{ bitcoin_rpc_password }} +rpcbind={{ bitcoin_rpc_bind }} +rpcport={{ bitcoin_rpc_port }} +rpcallowip=0.0.0.0/0 + +# Network Configuration +listen=1 +port={{ bitcoin_p2p_port }} +maxconnections={{ bitcoin_max_connections }} + +# Performance +dbcache={{ bitcoin_dbcache_mb }} + +# Transaction Index (optional) +{% if bitcoin_enable_txindex %} +txindex=1 +{% endif %} + +{# The live node carries this comment and the template never produced it, so a + run would have silently deleted it. Harmless in itself, but matching it keeps + this task at `ok` - which means any future `changed` here is a real signal + rather than known noise. #} +# Pruning (optional) + +# Logging +logtimestamps=1 +{% if bitcoin_logfile %} +logfile={{ bitcoin_logfile }} +{% else %} +printtoconsole=1 +{% endif %} + +# ZMQ Configuration +{% if bitcoin_zmq_enabled | default(false) %} +zmqpubrawblock={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_rawblock }} +zmqpubrawtx={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_rawtx }} +zmqpubhashblock={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_hashblock }} +zmqpubhashtx={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_hashtx }} +{% endif %} + +# Security +disablewallet=1 +{% if bitcoin_datum_gateway_enabled %} + +{# These were hand-added on the node and were NOT in this template, so running + the playbook would have stripped them. blocknotify is how datum_gateway + learns a new block landed; without it solo mining keeps grinding on a stale + template - a silent failure that costs money rather than raising an error. + Kept as a Jinja comment so the explanation stays in the repo and out of the + deployed config. #} +# Specific for DATUM gateway +blockmaxsize={{ bitcoin_blockmaxsize }} +blockmaxweight={{ bitcoin_blockmaxweight }} +blocknotify={{ bitcoin_blocknotify }} +maxmempool={{ bitcoin_maxmempool }} +blockreconstructionextratxn={{ bitcoin_blockreconstructionextratxn }} + +{% endif %} diff --git a/ansible/roles/bitcoin_knots/templates/bitcoind.service.j2 b/ansible/roles/bitcoin_knots/templates/bitcoind.service.j2 new file mode 100644 index 0000000..ac1140f --- /dev/null +++ b/ansible/roles/bitcoin_knots/templates/bitcoind.service.j2 @@ -0,0 +1,17 @@ +[Unit] +Description=Bitcoin Knots daemon +After=network.target + +[Service] +Type=simple +User={{ bitcoin_user }} +Group={{ bitcoin_group }} +ExecStart={{ bitcoin_build_prefix }}/bin/bitcoind -conf={{ bitcoin_conf_dir }}/bitcoin.conf +Restart=always +RestartSec=10 +TimeoutStopSec=600 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target diff --git a/ansible/roles/bitcoin_knots/templates/healthcheck.service.j2 b/ansible/roles/bitcoin_knots/templates/healthcheck.service.j2 new file mode 100644 index 0000000..a2ba83d --- /dev/null +++ b/ansible/roles/bitcoin_knots/templates/healthcheck.service.j2 @@ -0,0 +1,14 @@ +[Unit] +Description=Bitcoin Knots Health Check +After=network.target bitcoind.service + +[Service] +Type=oneshot +User=root +ExecStart=/usr/local/bin/bitcoin-knots-healthcheck-push.sh +Environment=HEALTHCHECK_PUSH_URL={{ healthcheck_push_url }} +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target diff --git a/ansible/roles/bitcoin_knots/templates/healthcheck.sh.j2 b/ansible/roles/bitcoin_knots/templates/healthcheck.sh.j2 new file mode 100644 index 0000000..4e6ea9d --- /dev/null +++ b/ansible/roles/bitcoin_knots/templates/healthcheck.sh.j2 @@ -0,0 +1,62 @@ +#!/bin/bash +# Bitcoin Knots health check — managed by Ansible (roles/bitcoin_knots) +# +# The exit code is the answer and systemd keeps it: +# systemctl is-failed bitcoin-knots-healthcheck.service +# Reporting anywhere else is optional and generic. +# +# + +RPC_HOST="{{ bitcoin_rpc_bind }}" +RPC_PORT={{ bitcoin_rpc_port }} +RPC_USER="{{ bitcoin_rpc_user }}" +RPC_PASSWORD="{{ bitcoin_rpc_password }}" +PUSH_URL="${HEALTHCHECK_PUSH_URL:-}" + +# Check if bitcoind RPC is responding +check_bitcoind() { + local response + response=$(curl -s --max-time 30 \ + --user "${RPC_USER}:${RPC_PASSWORD}" \ + --data-binary '{"jsonrpc":"1.0","id":"healthcheck","method":"getblockchaininfo","params":[]}' \ + --header 'Content-Type: application/json' \ + "http://${RPC_HOST}:${RPC_PORT}" 2>&1) + + if [ $? -eq 0 ]; then + # Check if response contains a non-null error + # Successful responses have "error": null, failures have "error": {...} + if echo "$response" | grep -q '"error":null\|"error": null'; then + return 0 + else + return 1 + fi + else + return 1 + fi +} + +report() { + local status=$1 + local msg=$2 + + # No push URL is normal, not an error: the exit code below is still a + # complete answer for anything reading unit state. + [ -n "$PUSH_URL" ] || return 0 + + # URL encode spaces in message + local encoded_msg="${msg// /%20}" + + if ! curl -s --max-time 10 --retry 2 -o /dev/null \ + "${PUSH_URL}?status=${status}&msg=${encoded_msg}&ping="; then + return 1 + fi +} + +# Main health check +if check_bitcoind; then + report "up" "OK" + exit 0 +else + report "down" "bitcoind RPC not responding" + exit 1 +fi diff --git a/ansible/roles/bitcoin_knots/templates/healthcheck.timer.j2 b/ansible/roles/bitcoin_knots/templates/healthcheck.timer.j2 new file mode 100644 index 0000000..d5857ab --- /dev/null +++ b/ansible/roles/bitcoin_knots/templates/healthcheck.timer.j2 @@ -0,0 +1,11 @@ +[Unit] +Description=Bitcoin Knots Health Check Timer +Requires=bitcoind.service + +[Timer] +OnBootSec=1min +OnUnitActiveSec=1min +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/ansible/services/bitcoin-knots/bitcoin_knots_vars.yml b/ansible/services/bitcoin-knots/bitcoin_knots_vars.yml deleted file mode 100644 index c9bd7ca..0000000 --- a/ansible/services/bitcoin-knots/bitcoin_knots_vars.yml +++ /dev/null @@ -1,38 +0,0 @@ -# Bitcoin Knots Configuration Variables - -# Version - REQUIRED: Specify exact version/tag to build -bitcoin_knots_version: "v29.2.knots20251110" # Must specify exact version/tag -bitcoin_knots_version_short: "29.2.knots20251110" # Version without 'v' prefix (for tarball URLs) - -# Directories -bitcoin_knots_dir: /opt/bitcoin-knots -bitcoin_knots_source_dir: "{{ bitcoin_knots_dir }}/source" -bitcoin_data_dir: /var/lib/bitcoin # Standard location for config, logs, wallets -bitcoin_large_data_dir: /mnt/knots_data # Custom location for blockchain data (blocks, chainstate) -bitcoin_conf_dir: /etc/bitcoin - -# Network -bitcoin_rpc_port: 8332 -bitcoin_p2p_port: 8333 -bitcoin_rpc_bind: "0.0.0.0" - -# Build options -bitcoin_build_jobs: 4 # Parallel build jobs (-j flag), adjust based on CPU cores -bitcoin_build_prefix: /usr/local - -# Configuration options -bitcoin_enable_txindex: true # Set to true if transaction index needed (REQUIRED for Electrum servers like Electrs/ElectrumX) -bitcoin_max_connections: 125 -# dbcache will be calculated as 90% of host RAM automatically in playbook - -# ZMQ Configuration -bitcoin_zmq_enabled: true -bitcoin_zmq_bind: "tcp://0.0.0.0" -bitcoin_zmq_port_rawblock: 28332 -bitcoin_zmq_port_rawtx: 28333 -bitcoin_zmq_port_hashblock: 28334 -bitcoin_zmq_port_hashtx: 28335 - -# Service user -bitcoin_user: bitcoin -bitcoin_group: bitcoin diff --git a/ansible/services/bitcoin-knots/deploy_bitcoin_knots_playbook.yml b/ansible/services/bitcoin-knots/deploy_bitcoin_knots_playbook.yml index 1ae5823..bc073bd 100644 --- a/ansible/services/bitcoin-knots/deploy_bitcoin_knots_playbook.yml +++ b/ansible/services/bitcoin-knots/deploy_bitcoin_knots_playbook.yml @@ -1,3 +1,11 @@ +--- +# Bitcoin Knots: full node built from source, with PGP signature and SHA256 +# verification of the release tarball. The build is guarded by a binary-exists +# check, so a converged host skips the whole 30-60 minute compile. +# +# The chain lives in bitcoin_large_data_dir (/mnt/knots_data, ~875 GB). Nothing +# here touches it; the only `state: absent` tasks target the build tree under +# /opt/bitcoin-knots and run only when the binary is missing. - name: Build and Deploy Bitcoin Knots from Source hosts: bitcoin become: yes @@ -5,740 +13,12 @@ - ../../infra_vars.yml - ../../services_config.yml - ../../infra_secrets.yml - - ./bitcoin_knots_vars.yml vars: - bitcoin_repo_url: "https://github.com/bitcoinknots/bitcoin.git" - bitcoin_sigs_base_url: "https://raw.githubusercontent.com/bitcoinknots/guix.sigs/knots" - bitcoin_version_major: "{{ bitcoin_knots_version_short | regex_replace('^(\\d+)\\..*', '\\1') }}" - bitcoin_source_tarball_url: "https://bitcoinknots.org/files/{{ bitcoin_version_major }}.x/{{ bitcoin_knots_version_short }}/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz" - uptime_kuma_api_url: "https://{{ subdomains.uptime_kuma }}.{{ root_domain }}" - - tasks: - - name: Calculate 90% of system RAM for dbcache - set_fact: - bitcoin_dbcache_mb: "{{ (ansible_memtotal_mb | float * 0.9) | int }}" - changed_when: false - - - name: Display calculated dbcache value - debug: - msg: "Setting dbcache to {{ bitcoin_dbcache_mb }} MB (90% of {{ ansible_memtotal_mb }} MB total RAM)" - - - - name: Install build dependencies - apt: - name: - - build-essential - - libtool - - autotools-dev - - automake - - pkg-config - - bsdmainutils - - python3 - - python3-pip - - libevent-dev - - libboost-system-dev - - libboost-filesystem-dev - - libboost-test-dev - - libboost-thread-dev - - libboost-chrono-dev - - libboost-program-options-dev - - libboost-dev - - libssl-dev - - libdb-dev - - libminiupnpc-dev - - libzmq3-dev - - libnatpmp-dev - - libsqlite3-dev - - git - - curl - - wget - - cmake - state: present - update_cache: yes - - - name: Create bitcoin group - group: - name: "{{ bitcoin_group }}" - system: yes - state: present - - - name: Create bitcoin user - user: - name: "{{ bitcoin_user }}" - group: "{{ bitcoin_group }}" - system: yes - shell: /usr/sbin/nologin - home: "{{ bitcoin_data_dir }}" - create_home: yes - state: present - - - name: Create bitcoin-knots directory - file: - path: "{{ bitcoin_knots_dir }}" - state: directory - owner: root - group: root - mode: '0755' - - - name: Create bitcoin-knots source directory - file: - path: "{{ bitcoin_knots_source_dir }}" - state: directory - owner: root - group: root - mode: '0755' - - - name: Create bitcoin data directory (for config, logs, wallets) - file: - path: "{{ bitcoin_data_dir }}" - state: directory - owner: "{{ bitcoin_user }}" - group: "{{ bitcoin_group }}" - mode: '0750' - - - name: Create bitcoin large data directory (for blockchain) - file: - path: "{{ bitcoin_large_data_dir }}" - state: directory - owner: "{{ bitcoin_user }}" - group: "{{ bitcoin_group }}" - mode: '0750' - - - name: Create bitcoin config directory - file: - path: "{{ bitcoin_conf_dir }}" - state: directory - owner: root - group: root - mode: '0755' - - - name: Check if bitcoind binary already exists - stat: - path: "{{ bitcoin_build_prefix }}/bin/bitcoind" - register: bitcoind_binary_exists - changed_when: false - - - name: Install gnupg for signature verification - apt: - name: gnupg - state: present - when: not bitcoind_binary_exists.stat.exists - - - name: Import Luke Dashjr's Bitcoin Knots signing key - command: gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 90C8019E36C2E964 - register: key_import - changed_when: "'already in secret keyring' not in key_import.stdout and 'already in public keyring' not in key_import.stdout" - when: not bitcoind_binary_exists.stat.exists - failed_when: key_import.rc != 0 - - - name: Display imported key fingerprint - command: gpg --fingerprint 90C8019E36C2E964 - register: key_fingerprint - changed_when: false - when: not bitcoind_binary_exists.stat.exists - - - name: Download SHA256SUMS file - get_url: - url: "https://bitcoinknots.org/files/{{ bitcoin_version_major }}.x/{{ bitcoin_knots_version_short }}/SHA256SUMS" - dest: "/tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS" - mode: '0644' - when: not bitcoind_binary_exists.stat.exists - - - name: Download SHA256SUMS.asc signature file - get_url: - url: "https://bitcoinknots.org/files/{{ bitcoin_version_major }}.x/{{ bitcoin_knots_version_short }}/SHA256SUMS.asc" - dest: "/tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS.asc" - mode: '0644' - when: not bitcoind_binary_exists.stat.exists - - - name: Verify PGP signature on SHA256SUMS file - command: gpg --verify /tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS.asc /tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS - register: sha256sums_verification - changed_when: false - failed_when: false # Don't fail here - check for 'Good signature' in next task - when: not bitcoind_binary_exists.stat.exists - - - - name: Display SHA256SUMS verification result - debug: - msg: "{{ sha256sums_verification.stdout_lines + sha256sums_verification.stderr_lines }}" - when: not bitcoind_binary_exists.stat.exists - - - name: Fail if SHA256SUMS signature verification failed - fail: - msg: "SHA256SUMS signature verification failed. Aborting build." - when: not bitcoind_binary_exists.stat.exists and ('Good signature' not in sha256sums_verification.stdout and 'Good signature' not in sha256sums_verification.stderr) - - - name: Remove any existing tarball to force fresh download - file: - path: /tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz - state: absent - when: not bitcoind_binary_exists.stat.exists - - - name: Download Bitcoin Knots source tarball - get_url: - url: "{{ bitcoin_source_tarball_url }}" - dest: "/tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz" - mode: '0644' - validate_certs: yes - force: yes - when: not bitcoind_binary_exists.stat.exists - - - name: Calculate SHA256 checksum of downloaded tarball - command: sha256sum /tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz - register: tarball_checksum - changed_when: false - when: not bitcoind_binary_exists.stat.exists - - - name: Extract expected checksum from SHA256SUMS file - shell: grep "bitcoin-{{ bitcoin_knots_version_short }}.tar.gz" /tmp/bitcoin-knots-{{ bitcoin_knots_version_short }}-SHA256SUMS | awk '{print $1}' - register: expected_checksum - changed_when: false - when: not bitcoind_binary_exists.stat.exists - failed_when: expected_checksum.stdout == "" - - - name: Display checksum comparison - debug: - msg: - - "Expected: {{ expected_checksum.stdout | trim }}" - - "Actual: {{ tarball_checksum.stdout.split()[0] }}" - when: not bitcoind_binary_exists.stat.exists - - - name: Verify tarball checksum matches SHA256SUMS - fail: - msg: "Tarball checksum mismatch! Expected {{ expected_checksum.stdout | trim }}, got {{ tarball_checksum.stdout.split()[0] }}" - when: not bitcoind_binary_exists.stat.exists and expected_checksum.stdout | trim != tarball_checksum.stdout.split()[0] - - - name: Remove existing source directory if it exists (to force fresh extraction) - file: - path: "{{ bitcoin_knots_source_dir }}" - state: absent - when: not bitcoind_binary_exists.stat.exists - - - name: Remove extracted directory if it exists (from previous runs) - file: - path: "{{ bitcoin_knots_dir }}/bitcoin-{{ bitcoin_knots_version_short }}" - state: absent - when: not bitcoind_binary_exists.stat.exists - - - name: Extract verified source tarball - unarchive: - src: /tmp/bitcoin-{{ bitcoin_knots_version_short }}.tar.gz - dest: "{{ bitcoin_knots_dir }}" - remote_src: yes - when: not bitcoind_binary_exists.stat.exists - - - name: Check if extracted directory exists - stat: - path: "{{ bitcoin_knots_dir }}/bitcoin-{{ bitcoin_knots_version_short }}" - register: extracted_dir_stat - changed_when: false - when: not bitcoind_binary_exists.stat.exists - - - name: Rename extracted directory to expected name - command: mv "{{ bitcoin_knots_dir }}/bitcoin-{{ bitcoin_knots_version_short }}" "{{ bitcoin_knots_source_dir }}" - when: not bitcoind_binary_exists.stat.exists and extracted_dir_stat.stat.exists - - - name: Check if CMakeLists.txt exists - stat: - path: "{{ bitcoin_knots_source_dir }}/CMakeLists.txt" - register: cmake_exists - changed_when: false - when: not bitcoind_binary_exists.stat.exists - - - name: Create CMake build directory - file: - path: "{{ bitcoin_knots_source_dir }}/build" - state: directory - mode: '0755' - when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) - - - name: Configure Bitcoin Knots build with CMake - command: > - cmake - -DCMAKE_INSTALL_PREFIX={{ bitcoin_build_prefix }} - -DBUILD_BITCOIN_WALLET=OFF - -DCMAKE_BUILD_TYPE=Release - -DWITH_ZMQ=ON - .. - args: - chdir: "{{ bitcoin_knots_source_dir }}/build" - when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) - register: configure_result - changed_when: true - - - name: Verify CMake enabled ZMQ - shell: | - set -e - cd "{{ bitcoin_knots_source_dir }}/build" - cmake -LAH .. | grep -iE 'ZMQ|WITH_ZMQ|ENABLE_ZMQ|USE_ZMQ' - when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) - register: zmq_check - changed_when: false - - - name: Fail if CMakeLists.txt not found - fail: - msg: "CMakeLists.txt not found in {{ bitcoin_knots_source_dir }}. Cannot build Bitcoin Knots." - when: not bitcoind_binary_exists.stat.exists and not (cmake_exists.stat.exists | default(false)) - - - name: Build Bitcoin Knots with CMake (this may take 30-60+ minutes) - command: cmake --build . -j{{ bitcoin_build_jobs }} - args: - chdir: "{{ bitcoin_knots_source_dir }}/build" - when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) - async: 3600 - poll: 0 - register: build_result - changed_when: true - - - name: Check build status - async_status: - jid: "{{ build_result.ansible_job_id }}" - register: build_job_result - until: build_job_result.finished - retries: 120 - delay: 60 - when: not bitcoind_binary_exists.stat.exists and build_result.ansible_job_id is defined - - - name: Fail if build failed - fail: - msg: "Bitcoin Knots build failed: {{ build_job_result.msg }}" - when: not bitcoind_binary_exists.stat.exists and build_result.ansible_job_id is defined and build_job_result.failed | default(false) - - - name: Install Bitcoin Knots binaries - command: cmake --install . - args: - chdir: "{{ bitcoin_knots_source_dir }}/build" - when: not bitcoind_binary_exists.stat.exists and cmake_exists.stat.exists | default(false) - changed_when: true - - - name: Verify bitcoind binary exists - stat: - path: "{{ bitcoin_build_prefix }}/bin/bitcoind" - register: bitcoind_installed - changed_when: false - - - name: Verify bitcoin-cli binary exists - stat: - path: "{{ bitcoin_build_prefix }}/bin/bitcoin-cli" - register: bitcoin_cli_installed - changed_when: false - - - name: Fail if binaries not found - fail: - msg: "Bitcoin Knots binaries not found after installation" - when: not bitcoind_installed.stat.exists or not bitcoin_cli_installed.stat.exists - - - name: Create bitcoin.conf configuration file - copy: - dest: "{{ bitcoin_conf_dir }}/bitcoin.conf" - content: | - # Bitcoin Knots Configuration - # Generated by Ansible - - # Data directory (blockchain storage) - datadir={{ bitcoin_large_data_dir }} - - # RPC Configuration - server=1 - rpcuser={{ bitcoin_rpc_user }} - rpcpassword={{ bitcoin_rpc_password }} - rpcbind={{ bitcoin_rpc_bind }} - rpcport={{ bitcoin_rpc_port }} - rpcallowip=0.0.0.0/0 - - # Network Configuration - listen=1 - port={{ bitcoin_p2p_port }} - maxconnections={{ bitcoin_max_connections }} - - # Performance - dbcache={{ bitcoin_dbcache_mb }} - - # Transaction Index (optional) - {% if bitcoin_enable_txindex %} - txindex=1 - {% endif %} - - # Logging (to journald via systemd) - logtimestamps=1 - printtoconsole=1 - - # ZMQ Configuration - {% if bitcoin_zmq_enabled | default(false) %} - zmqpubrawblock={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_rawblock }} - zmqpubrawtx={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_rawtx }} - zmqpubhashblock={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_hashblock }} - zmqpubhashtx={{ bitcoin_zmq_bind }}:{{ bitcoin_zmq_port_hashtx }} - {% endif %} - - # Security - disablewallet=1 - owner: "{{ bitcoin_user }}" - group: "{{ bitcoin_group }}" - mode: '0640' - notify: Restart bitcoind - - - name: Create systemd service file for bitcoind - copy: - dest: /etc/systemd/system/bitcoind.service - content: | - [Unit] - Description=Bitcoin Knots daemon - After=network.target - - [Service] - Type=simple - User={{ bitcoin_user }} - Group={{ bitcoin_group }} - ExecStart={{ bitcoin_build_prefix }}/bin/bitcoind -conf={{ bitcoin_conf_dir }}/bitcoin.conf - Restart=always - RestartSec=10 - TimeoutStopSec=600 - StandardOutput=journal - StandardError=journal - - [Install] - WantedBy=multi-user.target - owner: root - group: root - mode: '0644' - notify: Restart bitcoind - - - name: Reload systemd daemon - systemd: - daemon_reload: yes - - - name: Enable and start bitcoind service - systemd: - name: bitcoind - enabled: yes - state: started - - - name: Wait for bitcoind RPC to be available - uri: - url: "http://{{ bitcoin_rpc_bind }}:{{ bitcoin_rpc_port }}" - method: POST - body_format: json - body: - jsonrpc: "1.0" - id: "healthcheck" - method: "getblockchaininfo" - params: [] - user: "{{ bitcoin_rpc_user }}" - password: "{{ bitcoin_rpc_password }}" - status_code: 200 - timeout: 10 - register: rpc_check - until: rpc_check.status == 200 - retries: 30 - delay: 5 - ignore_errors: yes - - - name: Display RPC connection status - debug: - msg: "Bitcoin Knots RPC is {{ 'available' if rpc_check.status == 200 else 'not yet available' }}" - - # ═════════════════════════════════════════════════════════════════════════ - # DEPRECATED — Uptime Kuma was decommissioned on 2026-09-11. - # - # Every task below is inert: uptime_kuma_enabled is false in - # group_vars/all/main.yml, so they all skip and the deployment above still - # runs normally. Kept because the health-check logic is the durable part — - # when a replacement exists, rewire the push transport and flip the flag. - # - # What was being monitored: archive/uptime_kuma/MONITORS.md - # ═════════════════════════════════════════════════════════════════════════ - - name: Create Bitcoin Knots health check and push script - when: uptime_kuma_enabled | default(false) - copy: - dest: /usr/local/bin/bitcoin-knots-healthcheck-push.sh - content: | - #!/bin/bash - # - # Bitcoin Knots Health Check and Push to Uptime Kuma - # Checks if bitcoind RPC is responding and pushes status to Uptime Kuma - # - - RPC_HOST="{{ bitcoin_rpc_bind }}" - RPC_PORT={{ bitcoin_rpc_port }} - RPC_USER="{{ bitcoin_rpc_user }}" - RPC_PASSWORD="{{ bitcoin_rpc_password }}" - UPTIME_KUMA_PUSH_URL="${UPTIME_KUMA_PUSH_URL}" - - # Check if bitcoind RPC is responding - check_bitcoind() { - local response - response=$(curl -s --max-time 30 \ - --user "${RPC_USER}:${RPC_PASSWORD}" \ - --data-binary '{"jsonrpc":"1.0","id":"healthcheck","method":"getblockchaininfo","params":[]}' \ - --header 'Content-Type: application/json' \ - "http://${RPC_HOST}:${RPC_PORT}" 2>&1) - - if [ $? -eq 0 ]; then - # Check if response contains a non-null error - # Successful responses have "error": null, failures have "error": {...} - if echo "$response" | grep -q '"error":null\|"error": null'; then - return 0 - else - return 1 - fi - else - return 1 - fi - } - - # Push status to Uptime Kuma - push_to_uptime_kuma() { - local status=$1 - local msg=$2 - - if [ -z "$UPTIME_KUMA_PUSH_URL" ]; then - echo "ERROR: UPTIME_KUMA_PUSH_URL not set" - return 1 - fi - - # URL encode spaces in message - local encoded_msg="${msg// /%20}" - - if ! curl -s --max-time 10 --retry 2 -o /dev/null \ - "${UPTIME_KUMA_PUSH_URL}?status=${status}&msg=${encoded_msg}&ping="; then - echo "ERROR: Failed to push to Uptime Kuma" - return 1 - fi - } - - # Main health check - if check_bitcoind; then - push_to_uptime_kuma "up" "OK" - exit 0 - else - push_to_uptime_kuma "down" "bitcoind RPC not responding" - exit 1 - fi - owner: root - group: root - mode: '0755' - - - name: Install curl for health check script - apt: - name: curl - state: present - - - name: Create systemd timer for Bitcoin Knots health check - copy: - dest: /etc/systemd/system/bitcoin-knots-healthcheck.timer - content: | - [Unit] - Description=Bitcoin Knots Health Check Timer - Requires=bitcoind.service - - [Timer] - OnBootSec=1min - OnUnitActiveSec=1min - Persistent=true - - [Install] - WantedBy=timers.target - owner: root - group: root - mode: '0644' - - - name: Create systemd service for Bitcoin Knots health check - when: uptime_kuma_enabled | default(false) - copy: - dest: /etc/systemd/system/bitcoin-knots-healthcheck.service - content: | - [Unit] - Description=Bitcoin Knots Health Check and Push to Uptime Kuma - After=network.target bitcoind.service - - [Service] - Type=oneshot - User=root - ExecStart=/usr/local/bin/bitcoin-knots-healthcheck-push.sh - Environment=UPTIME_KUMA_PUSH_URL= - StandardOutput=journal - StandardError=journal - - [Install] - WantedBy=multi-user.target - owner: root - group: root - mode: '0644' - - - name: Reload systemd daemon for health check - systemd: - daemon_reload: yes - - - name: Enable and start Bitcoin Knots health check timer - systemd: - name: bitcoin-knots-healthcheck.timer - enabled: yes - state: started - - - name: Create Uptime Kuma push monitor setup script for Bitcoin Knots - when: uptime_kuma_enabled | default(false) - delegate_to: localhost - become: no - copy: - dest: /tmp/setup_bitcoin_knots_monitor.py - content: | - #!/usr/bin/env python3 - import sys - import traceback - import yaml - from uptime_kuma_api import UptimeKumaApi, MonitorType - - try: - # Load configs - with open('/tmp/ansible_config.yml', 'r') as f: - config = yaml.safe_load(f) - - url = config['uptime_kuma_url'] - username = config['username'] - password = config['password'] - monitor_name = config['monitor_name'] - - # Connect to Uptime Kuma - api = UptimeKumaApi(url, timeout=30) - api.login(username, password) - - # Get all monitors - monitors = api.get_monitors() - - # Find or create "services" group - group = next((m for m in monitors if m.get('name') == 'services' and m.get('type') == 'group'), None) - if not group: - group_result = api.add_monitor(type='group', name='services') - # Refresh to get the group with id - monitors = api.get_monitors() - group = next((m for m in monitors if m.get('name') == 'services' and m.get('type') == 'group'), None) - - # Check if monitor already exists - existing_monitor = None - for monitor in monitors: - if monitor.get('name') == monitor_name: - existing_monitor = monitor - break - - # Get ntfy notification ID - notifications = api.get_notifications() - ntfy_notification_id = None - for notif in notifications: - if notif.get('type') == 'ntfy': - ntfy_notification_id = notif.get('id') - break - - if existing_monitor: - print(f"Monitor '{monitor_name}' already exists (ID: {existing_monitor['id']})") - push_token = existing_monitor.get('pushToken') or existing_monitor.get('push_token') - if not push_token: - raise ValueError("Could not find push token for monitor") - push_url = f"{url}/api/push/{push_token}" - print(f"Push URL: {push_url}") - else: - print(f"Creating push monitor '{monitor_name}'...") - api.add_monitor( - type=MonitorType.PUSH, - name=monitor_name, - parent=group['id'], - interval=60, - maxretries=3, - retryInterval=60, - notificationIDList={ntfy_notification_id: True} if ntfy_notification_id else {} - ) - monitors = api.get_monitors() - new_monitor = next((m for m in monitors if m.get('name') == monitor_name), None) - if new_monitor: - push_token = new_monitor.get('pushToken') or new_monitor.get('push_token') - if not push_token: - raise ValueError("Could not find push token for new monitor") - push_url = f"{url}/api/push/{push_token}" - print(f"Push URL: {push_url}") - - api.disconnect() - print("SUCCESS") - - except Exception as e: - error_msg = str(e) if str(e) else repr(e) - print(f"ERROR: {error_msg}", file=sys.stderr) - traceback.print_exc(file=sys.stderr) - sys.exit(1) - mode: '0755' - - - name: Create temporary config for monitor setup - when: uptime_kuma_enabled | default(false) - delegate_to: localhost - become: no - copy: - dest: /tmp/ansible_config.yml - content: | - uptime_kuma_url: "{{ uptime_kuma_api_url }}" - username: "{{ uptime_kuma_username }}" - password: "{{ uptime_kuma_password }}" - monitor_name: "Bitcoin Knots" - mode: '0644' - - - name: Run Uptime Kuma push monitor setup - when: uptime_kuma_enabled | default(false) - command: python3 /tmp/setup_bitcoin_knots_monitor.py - delegate_to: localhost - become: no - register: monitor_setup - changed_when: "'SUCCESS' in monitor_setup.stdout" - ignore_errors: yes - - - name: Extract push URL from monitor setup output - set_fact: - uptime_kuma_push_url: "{{ monitor_setup.stdout | regex_search('Push URL: (https?://[^\\s]+)', '\\1') | first | default('') }}" - delegate_to: localhost - become: no - when: monitor_setup.stdout is defined - - - name: Display extracted push URL - debug: - msg: "Uptime Kuma Push URL: {{ uptime_kuma_push_url }}" - when: uptime_kuma_push_url | default('') != '' - - - name: Set push URL in systemd service environment - lineinfile: - path: /etc/systemd/system/bitcoin-knots-healthcheck.service - regexp: '^Environment=UPTIME_KUMA_PUSH_URL=' - line: "Environment=UPTIME_KUMA_PUSH_URL={{ uptime_kuma_push_url }}" - state: present - insertafter: '^\[Service\]' - when: uptime_kuma_push_url | default('') != '' - - - name: Reload systemd daemon after push URL update - systemd: - daemon_reload: yes - when: uptime_kuma_push_url | default('') != '' - - - name: Restart health check timer to pick up new environment - systemd: - name: bitcoin-knots-healthcheck.timer - state: restarted - when: uptime_kuma_push_url | default('') != '' - - - name: Clean up temporary files - when: uptime_kuma_enabled | default(false) - delegate_to: localhost - become: no - file: - path: "{{ item }}" - state: absent - loop: - - /tmp/setup_bitcoin_knots_monitor.py - - /tmp/ansible_config.yml - - handlers: - - name: Restart bitcoind - when: uptime_kuma_enabled | default(false) - systemd: - name: bitcoind - state: restarted - + # Preserves the push URL this check has been reporting to. The role knows + # nothing about Uptime Kuma — this is just "a URL that accepts a ping". + healthcheck_push_url: "{{ healthcheck_push_urls.bitcoin_knots | default('') }}" + roles: + - bitcoin_knots - name: Setup public Bitcoin P2P forwarding on the edge host hosts: edge @@ -746,12 +26,6 @@ vars_files: - ../../infra_vars.yml - ../../services_config.yml - - ../../infra_secrets.yml - - ./bitcoin_knots_vars.yml - vars: - bitcoin_tailscale_hostname: "knots-box" - uptime_kuma_api_url: "https://{{ subdomains.uptime_kuma }}.{{ root_domain }}" - tasks: - name: Expose Bitcoin P2P through a socket proxy ansible.builtin.include_role: @@ -759,134 +33,9 @@ vars: socket_proxy_name: bitcoin-p2p socket_proxy_description: "Bitcoin P2P" - socket_proxy_listen_port: "{{ bitcoin_p2p_port }}" - socket_proxy_upstream_host: "{{ bitcoin_tailscale_hostname }}" - # These four were added by hand on vipy and were NOT in this playbook; - # writing the unit without them would have dropped FreeBind, which lets - # the socket bind before the address is up. + socket_proxy_listen_port: "{{ service_settings.bitcoin.p2p_port }}" + socket_proxy_upstream_host: "{{ service_settings.bitcoin.tailscale_hostname }}" socket_proxy_documentation: "https://github.com/bitcoin/bitcoin" socket_proxy_free_bind: true socket_proxy_timeout_stop_sec: 5 socket_proxy_log_to_journal: true - - - name: Display public endpoint - when: uptime_kuma_enabled | default(false) - debug: - msg: "Bitcoin P2P public endpoint: {{ ansible_host }}:{{ bitcoin_p2p_port }}" - - # =========================================== - # Uptime Kuma TCP Monitor for Public P2P - # =========================================== - - name: Create Uptime Kuma TCP monitor setup script for Bitcoin P2P - when: uptime_kuma_enabled | default(false) - delegate_to: localhost - become: no - copy: - dest: /tmp/setup_bitcoin_p2p_tcp_monitor.py - content: | - #!/usr/bin/env python3 - import sys - import traceback - import yaml - from uptime_kuma_api import UptimeKumaApi, MonitorType - - try: - with open('/tmp/ansible_bitcoin_p2p_config.yml', 'r') as f: - config = yaml.safe_load(f) - - url = config['uptime_kuma_url'] - username = config['username'] - password = config['password'] - monitor_host = config['monitor_host'] - monitor_port = config['monitor_port'] - monitor_name = config['monitor_name'] - - api = UptimeKumaApi(url, timeout=30) - api.login(username, password) - - monitors = api.get_monitors() - - # Find or create "services" group - group = next((m for m in monitors if m.get('name') == 'services' and m.get('type') == 'group'), None) - if not group: - api.add_monitor(type='group', name='services') - monitors = api.get_monitors() - group = next((m for m in monitors if m.get('name') == 'services' and m.get('type') == 'group'), None) - - # Check if monitor already exists - existing = next((m for m in monitors if m.get('name') == monitor_name), None) - - # Get ntfy notification ID - notifications = api.get_notifications() - ntfy_notification_id = None - for notif in notifications: - if notif.get('type') == 'ntfy': - ntfy_notification_id = notif.get('id') - break - - if existing: - print(f"Monitor '{monitor_name}' already exists (ID: {existing['id']})") - print("Skipping - monitor already configured") - else: - print(f"Creating TCP monitor '{monitor_name}'...") - api.add_monitor( - type=MonitorType.PORT, - name=monitor_name, - hostname=monitor_host, - port=monitor_port, - parent=group['id'], - interval=60, - maxretries=3, - retryInterval=60, - notificationIDList={ntfy_notification_id: True} if ntfy_notification_id else {} - ) - - api.disconnect() - print("SUCCESS") - - except Exception as e: - print(f"ERROR: {str(e)}", file=sys.stderr) - traceback.print_exc(file=sys.stderr) - sys.exit(1) - mode: '0755' - - - name: Create temporary config for TCP monitor setup - when: uptime_kuma_enabled | default(false) - delegate_to: localhost - become: no - copy: - dest: /tmp/ansible_bitcoin_p2p_config.yml - content: | - uptime_kuma_url: "{{ uptime_kuma_api_url }}" - username: "{{ uptime_kuma_username }}" - password: "{{ uptime_kuma_password }}" - monitor_host: "{{ ansible_host }}" - monitor_port: {{ bitcoin_p2p_port }} - monitor_name: "Bitcoin Knots P2P Public" - mode: '0644' - - - name: Run Uptime Kuma TCP monitor setup - when: uptime_kuma_enabled | default(false) - command: python3 /tmp/setup_bitcoin_p2p_tcp_monitor.py - delegate_to: localhost - become: no - register: tcp_monitor_setup - changed_when: "'SUCCESS' in tcp_monitor_setup.stdout" - ignore_errors: yes - - - name: Display TCP monitor setup output - debug: - msg: "{{ tcp_monitor_setup.stdout_lines }}" - when: tcp_monitor_setup.stdout is defined - - - name: Clean up TCP monitor temporary files - when: uptime_kuma_enabled | default(false) - delegate_to: localhost - become: no - file: - path: "{{ item }}" - state: absent - loop: - - /tmp/setup_bitcoin_p2p_tcp_monitor.py - - /tmp/ansible_bitcoin_p2p_config.yml - diff --git a/ansible/services_config.yml b/ansible/services_config.yml index d9a9c13..e342a79 100644 --- a/ansible/services_config.yml +++ b/ansible/services_config.yml @@ -46,6 +46,12 @@ service_settings: # from the edge host. A role default cannot serve the second play, so it # lives here rather than in roles/mempool/defaults. frontend_port: 8080 + bitcoin: + # The P2P port is needed on two hosts: the bitcoin_knots role deploys the + # node on knots-box, and the socket-proxy play publishes the port from the + # edge host. A role default cannot reach that second play. + p2p_port: 8333 + tailscale_hostname: knots-box fulcrum: # Same shape as mempool: the fulcrum role deploys on fulcrum-box, and the # socket-proxy play publishes the SSL port from the edge host. A role default