diff --git a/inventory/group_vars/all/main.yml b/inventory/group_vars/all/main.yml index e576449..4f6e858 100644 --- a/inventory/group_vars/all/main.yml +++ b/inventory/group_vars/all/main.yml @@ -10,6 +10,7 @@ domain_sync: "sync.{{ domain_base }}" domain_traefik: "traefik.{{ domain_base }}" domain_dashboard: "dashboard.{{ domain_base }}" domain_auth: "auth.{{ domain_base }}" +domain_status: "status.{{ domain_base }}" # Service paths services_root: /opt/services @@ -34,6 +35,8 @@ authelia_session_secret: "{{ vault_authelia_session_secret }}" authelia_storage_key: "{{ vault_authelia_storage_key }}" authelia_admin_password_hash: "{{ vault_authelia_admin_password_hash }}" crowdsec_bouncer_key: "{{ vault_crowdsec_bouncer_key }}" +s3_access_key: "{{ vault_s3_access_key }}" +s3_secret_key: "{{ vault_s3_secret_key }}" # CI/CD deploy key (public key — not a secret) ci_deploy_pubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHdr9mRSSUqt7Ym4wA5RpVyz76wEXSOtVfh2/yCSMIbg ci-deploy@forgejo-runner" diff --git a/inventory/group_vars/all/vault.yml b/inventory/group_vars/all/vault.yml index 90b46bf..b05d75c 100644 --- a/inventory/group_vars/all/vault.yml +++ b/inventory/group_vars/all/vault.yml @@ -1,76 +1,81 @@ $ANSIBLE_VAULT;1.1;AES256 -61316166393964386231353533353731353730326134323862666166373430346531383435396264 -3339363034336365363263643165656264333030323036640a313937396562326539633430643931 -61626330343235646637653065666237626564376130376662366238336135373836613362643963 -6335393437333362390a393930373132366161333762643535373232613136306664346662366231 -33643832306638306130653937323863643237346231363432623462313534386162373866663362 -34313665323632393766626535656239333231396438383833663835623963323530323663323539 -38373639623235396133373632613337353538666666303538333637333537363162323238376366 -65393233366162643835316439613262326531373961646336626232626334643331643438663834 -66386332316561333435313535666161323661663038343464383130663131363130303238626632 -62383934643539623434333566376463653930353833333433633364383764393732633734633636 -37646139656634666666613161396631353164363831353366393365643336376330613565353966 -32363431666534316165366636376164353165333738326230326232386137666366353636633865 -66623264623730653866663030646431386238633662336162623665356536613832346131316230 -34353664373930636361383961646334633838366636343335313438663836623761666235383431 -33373534653930623666323433326636633133336538633166333362353663356264323936623763 -37396338623962626638346538363565316262646232336266393936323839613533666465663439 -63343635346333636539373335323831366630356536336262353534643035323765653366656363 -63393534396135393061653234646362303066386133333736643739373164623034396361363539 -37326532643064656666363735333535643765643433633131356334393434333939623239343761 -32383966646435363936346464616233313865303264333331613437396635373336383664326665 -30366436303264633762336234356431666238353535396234383133353362366465363834643666 -33653732646264343636646266653138313634346239623764656136303462316364656234623833 -35313561323464346435656565633036383264373436313164363262643164616436663564643032 -30646637653036663533663430386134663237333030336430373936323738653030353564313464 -39393562383735313237366433646431356364363039353539366133333237303532653965666364 -35393830336533373133366666653765366562336539646131636633326434393164343530633737 -34626263636163626333373438376137636139643263646336643735316462313361663834613031 -37396233633831393536313838313964343762383363356238393761646230393334303836633735 -65666366393932346636396237333166323936613732333036323333343637393931393534323166 -61626334613035353137303365373365373837616336343838643365616538623538653238363664 -30356539663763633337393162623764376265646435663064303930643364396439626661666532 -38306364356463643866336530303430633766336236616135326462353163343637336438373534 -37616536386131366634633663633566313238366133376131353666663464306463313232626436 -61306236663332373764303566643332343530366362376134653437356630613937346663323131 -65376563666434653132383032643830386465363965653530323036623034313764306136366239 -34666538623232646266666537353033386661333861386564316662386233636265366536386135 -35653735383231616664366338623264326663353730623461613766613432396233383061383464 -35376461323233633938646532373663396233396463323565633539353630653934616231636166 -39633037333963653061386362316662613235646236326666633164336661373963386339633932 -64616436333637373930373062333463336562303439623937643136323735616231303762373161 -62666438613038363833626664316435316331373030343738356438323563313565613039326639 -65386533306132663964386330396566623063633433653439383235373761363037633138376461 -65323465663137363135336662643432616437323466656666313437333366626234623765643033 -30633132636235383561373566366465393664663464643965363634323466303433623361613061 -66623861336537333339636161636564356239636562363166326635646166653933376634626234 -61643738346263646664356134313138373331343731366532383264613931353030313061636135 -30343430383630633966393933396238366463373934653130656433633437323137326666633964 -32626639396165323334393263393961663666623137643834373065383966353835613335636362 -31646635356233323730393039366162613331393465633139616432353462363165333530373364 -32343935643933326136383835633232356263343264373437383630313537343138383135613832 -32383738353435323437336137626231343535633364666663633133353662383139383364373837 -37386133383135326662383661346639393134313931383637613631343836646663663834336632 -64383734373362316666343031393764393161613035373863323839383237643863326664656465 -34306637316466366332666237313064366534323961373166663339333439303365633137386236 -64313338383037613439626462323737393034303732303537636565353033386365653239326131 -32326162663766626264653965323134366664386238393564386163613165383661303832633565 -31306335393439323635653731363931663364613438373130623437376638386364333266643838 -35303436383839653434316632616163623264326531616439643437663538376333366432666165 -38363635653864383662346235353561316233656332383031643938613735396635363436313735 -66396535383030353437626165626432646634613434643830303434643530636566333063323366 -30663738326562343732376662366566636330346435373838363165643666393764343832656638 -65666134616265633138376133386438666465666661323631373539666330616638306439636533 -34346365333462623438333930376133383233373064366336343937616638376163303435313163 -34303537306532396230383236393731663230393135386133316638343735373666306337376235 -34616639326432386266373361306537343637356335613136346261316433613464323263646134 -31326232323738313830353535313363663363393037653631353932613834346133616535666361 -62353539646331656665323763396662313137366261336139356231646663646564646536373433 -62646234393737666635626536656636316535343661626364376536633461383530633135396137 -32343163373265623138333162653231636336373661316530633331346463393365353462336136 -66336236313765616436646532336164363261656262646135653734376331646665353139613037 -65323338316139353837623661353134656164613362313632656163643737353435366432666564 -36303631643331373965616239353762663862636232326234643663383664613666303538316465 -36323232663263653238393066663839653539343536316461333964316132353531333936663461 -37326337653930306637333163343431626663633139303263646639313862313365326665376264 -373039623038653731373939343537376634 +63316565343636313366333436653062386233326239633136353033363861393962376563373538 +6537376663323364316532303237666231373665613036370a653633333035336334333937313839 +34396166613565646561373237636331363039336539656136363031353466643437626535626235 +3835373662616135660a316533373034626239393465366331633237336238366163633136376561 +39353333323932366464653363653063643037323861343163386331306337643266353762626665 +64396366626333356135373161636239653434353939636365336235646533613336343438373939 +37633037333035346134356664326135646531616266376439303965313432316638336138666161 +64636234373839356362326363383437616265653934656665386231383662316136363164363631 +38393163656639343561636334326133646336383733633966316536323933356236616336333465 +38633365636363363237323232303064353232313030653132393439616462653736346665376165 +64663139396664363561386536643862653766343066363565336261646338323935663564376261 +35373833343563373731623136326666636165346564663133363763396231306665393536656566 +37393431626565396632353931373161326139646537643865336333353462326438666131633636 +38373463666539346230323437616135353166356331643962633537386364623265616239666235 +62336337643562363738323133353339326435333262623563383939626463636434346435343862 +35353366646635383738313561623366363736656465373665663663313632313132316665626635 +35613134313738653165323536326330336539323964316463636630386637353565366464373861 +33376364626633653937386137623936626663326638366235313637363561316265346632353633 +66616334656665663032646663306364303461343163653966633335633039643332343365343630 +32353837643930306534366233366234656436613730356632393466623636623263353139666664 +39623835613935666665393235353234343962623531316633343865313331363337326630383932 +66393263313031346634646335373032633762336462663037656139616531363265666535616135 +36326234303434663036656638393361656365353837386536363834623134353366316135353864 +33346338326534323335366331636338623931333561316466343733656333366632326131303536 +31623662626265323133363635326235363334356537646263643737373661373265306632656538 +38343061623235336537346463653634333837613162303930376532643539386132326539303336 +39333166643864633065653834653365666230393633303866653535376339613533313236396537 +62343136386637623439353061323531646365393733633339353364666633346634363264353166 +62643432653165373663663561653339643066393361333265376236663132653134373465366364 +38616364636337383438663737316630346632353635303430356463343066363766363662333632 +33363633343165663631373064353661666430343266373032373238663466313438313539343139 +34386131393337346364656632653831626561623763333063366166636439313030316664333861 +63643033666639393963626234666334663062346530313237333361303161363564346438306263 +66666365373061306464643836626635323439386565386437646238373064383861353038643335 +65366165353130613762633231393934346562643739666666353865386537376431336333623936 +39363563656432333961303033643365663963663239396330306333376634323139383762373736 +32643630623731356664616336616634353630303731643037313039666339633864323231646530 +61663735653034656137346635323331616130333761623830393137376665356639363963656465 +61303434303466626465656432613230396631363434393839366631306466353030306436663139 +31383461393733666465393733343231313737303833636231636136316530613538623535396230 +36323463306233393138643333663161636461343436646463346165323333323135666131326435 +34656161303664626135616134396266376234343139366561303765323530366632393736353762 +66666639376362366435353639353439663835613463613739643861376666383036326339396537 +35303161363763326439613834633564646161666135613935383739383838346563643961323864 +34633031306664643266623262363065303965336337386332613262646464653933343836336230 +63333934643763383566653762666638643565386264653132313333663130616537346366656463 +63653730613238663365613132303136353965653433386563393836393737646132666237656333 +34663330323437653761663235653565363632393332313630316433313436343539663366343638 +65346534623063343739326166613530633165383266623637653238623133663637626634306337 +36653937393234353136383933323661306263346466613362363739653733373938633332303132 +37383562643630323362303733316664386339653166626338316332353131653531646136626362 +61646263663162313964343939643834363931346462313862633339313866363562613330666163 +66383835323461663133343333303833333662643331633265343364663238393331383634326338 +36646337366638346537653533353038633031653134393831323766306261393232343532653139 +61323139616363356639613664626439613463633564346163636361393339343636353031343165 +37643264663366633034376534626430393431303133373563623132656239333139363764623430 +61303161653930363862373265336432656162623437393239613562633363343337393161646333 +39306338333566646565326631346534613863346236386363313063616462373831646430663738 +30363865356161313931393130363361313663393238663935373834353564346131373866326237 +39313939336435613234646230663835393166636463303030336262303337313339653164633436 +61613931383632623065626161663531336263633263636131393334333337653464323836393266 +38353437643334303434396463313063663564303431666336653636313338616334373836313161 +65383061363736663134316432376136633966616533336365616566396635383666666464636564 +37626465393466623666326565343265346662313938646639613737326534643664386132666336 +31616561663063663739323862333366313130653239326163616631336464323936383638623464 +36623963323837393662306436336261323934313664333634326538336334306133346666613139 +36323735623861316337333666366336626639623933663038666134636136303264356136383231 +64363262353434663263616536333662383331626130353931323034643336303931383166306139 +39336662643162363034653737626564653935336561386439653765326631336636663238653934 +38376162353533343964366232373066326432383362373834303331626161656234326663616135 +62306661346135343665386535356537383362356232613337666433326537363937383530656261 +64393662646639356161343439343035376161366632353136616136643230616135346561353932 +38376462633035666437306636323832623765326366326166323966656635313332313366343832 +38356666313164356437396638393530326136363465313966326430626662383032376337333438 +38656536623966656261386139363734393437623531313935323236643733303661393232666463 +36373933643736393765366131383666336338643465393162376538666663316365366636393532 +34666234313364656536643530396662663832643437616136376439656562326135366530343833 +35613066393034616235393462323038663966356130626666653735663938643332336236316238 +30366536353566393063336137626162303461333332656237646235666533313361626633373931 +39663862343635333162 diff --git a/roles/backup/defaults/main.yml b/roles/backup/defaults/main.yml index 4fa179d..65e4b0b 100644 --- a/roles/backup/defaults/main.yml +++ b/roles/backup/defaults/main.yml @@ -2,3 +2,7 @@ backup_dir: /opt/backups backup_retention_days: 7 backup_user: deploy + +# Timeweb S3 offsite backups +s3_endpoint: "https://s3.timeweb.cloud" +s3_bucket: "visual-backup" diff --git a/roles/backup/tasks/main.yml b/roles/backup/tasks/main.yml index 2e4ed90..4ced10d 100644 --- a/roles/backup/tasks/main.yml +++ b/roles/backup/tasks/main.yml @@ -1,4 +1,9 @@ --- +- name: Install awscli for S3 uploads + ansible.builtin.apt: + name: awscli + state: present + - name: Create backup directory ansible.builtin.file: path: "{{ backup_dir }}" diff --git a/roles/backup/templates/backup.sh.j2 b/roles/backup/templates/backup.sh.j2 index 80bcae6..82933f2 100644 --- a/roles/backup/templates/backup.sh.j2 +++ b/roles/backup/templates/backup.sh.j2 @@ -42,9 +42,41 @@ docker run --rm \ tar czf "/backup/forgejo-data_${DATE}.tar.gz" /data log " → ${BACKUP_DIR}/forgejo-data_${DATE}.tar.gz ($(du -sh "${BACKUP_DIR}/forgejo-data_${DATE}.tar.gz" | cut -f1))" +# ── Upload to Timeweb S3 ──────────────────────────────────────────────────── +log "Uploading backups to S3 ({{ s3_bucket }})..." +AWS_ACCESS_KEY_ID="{{ s3_access_key }}" \ +AWS_SECRET_ACCESS_KEY="{{ s3_secret_key }}" \ + aws s3 sync "${BACKUP_DIR}/" "s3://{{ s3_bucket }}/" \ + --endpoint-url "{{ s3_endpoint }}" \ + --exclude "*" --include "*.gz" \ + --storage-class STANDARD \ + --no-progress \ + && log " → S3 upload complete" \ + || log " ⚠ S3 upload failed (local backups still intact)" + # ── Cleanup old backups ───────────────────────────────────────────────────── log "Removing backups older than ${KEEP_DAYS} days..." find "${BACKUP_DIR}" -name "*.gz" -mtime +${KEEP_DAYS} -delete + +# Remove S3 objects older than KEEP_DAYS as well +log "Pruning S3 objects older than ${KEEP_DAYS} days..." +CUTOFF=$(date -d "-${KEEP_DAYS} days" +%Y-%m-%dT%H:%M:%S 2>/dev/null || date -v-${KEEP_DAYS}d +%Y-%m-%dT%H:%M:%S) +AWS_ACCESS_KEY_ID="{{ s3_access_key }}" \ +AWS_SECRET_ACCESS_KEY="{{ s3_secret_key }}" \ + aws s3 ls "s3://{{ s3_bucket }}/" \ + --endpoint-url "{{ s3_endpoint }}" \ + | awk '{print $4}' \ + | while read -r obj; do + obj_date=$(echo "$obj" | grep -oP '^\d{4}-\d{2}-\d{2}' || true) + if [[ -n "$obj_date" && "$obj_date" < "${CUTOFF:0:10}" ]]; then + AWS_ACCESS_KEY_ID="{{ s3_access_key }}" \ + AWS_SECRET_ACCESS_KEY="{{ s3_secret_key }}" \ + aws s3 rm "s3://{{ s3_bucket }}/$obj" \ + --endpoint-url "{{ s3_endpoint }}" \ + && log " → Deleted old S3 object: $obj" + fi + done + log " → Done. Current backups:" du -sh "${BACKUP_DIR}"/*.gz 2>/dev/null | sort -k2 || true