feat: add Woodpecker CI to replace Gitea Actions
Security Audit / Infrastructure Scan (IaC) (push) Successful in 24s
Security Audit / Docker Image Scan (docker.io/apache/tika:latest) (push) Failing after 1m52s
Security Audit / Docker Image Scan (docker.io/gotenberg/gotenberg:8) (push) Failing after 2m20s
Security Audit / Docker Image Scan (docker.io/library/postgres:15) (push) Failing after 29s
Security Audit / Docker Image Scan (docker.io/library/redis:7) (push) Failing after 19s
Security Audit / Docker Image Scan (ghcr.io/icereed/paperless-gpt:latest) (push) Failing after 25s
Security Audit / Docker Image Scan (ghcr.io/paperless-ngx/paperless-ngx:latest) (push) Failing after 2m25s
Security Audit / Docker Image Scan (shenxn/protonmail-bridge:latest) (push) Successful in 19s
Deploy Infrastructure / plan (push) Successful in 16m2s
Deploy Infrastructure / apply (push) Failing after 55s
Deploy Infrastructure / integration-tests (push) Has been skipped

Deploy Woodpecker CI server (LXC 231) and 2 agents (LXC 910-911):

OpenTofu:
- lxc_231_woodpecker.tf: Server on jupiter, 1GB RAM, ci.renner.uno
- woodpecker_agents.tf: 2 agents with Docker, 2GB RAM each
- locals.tf: Add woodpecker_agents spec list
- variables.tf: Add woodpecker_agent_count variable

Ansible:
- woodpecker-server role: Docker Compose, SQLite, Gitea OAuth
- woodpecker-agent role: Docker Compose, GRPC to server
- Playbooks for server and agent install
- Inventory entries and group_vars with vault secrets
- Caddy reverse proxy entry for ci.renner.uno

Woodpecker pipelines (.woodpecker/):
- build-caddy.yml: Custom Caddy binary build
- deploy-infrastructure.yml: OpenTofu plan + apply
- security-scan.yml: Trivy IaC and Docker image scans

Vault: Added GRPC secret and Gitea OAuth placeholder secrets.
This commit is contained in:
2026-03-16 21:23:27 +01:00
parent 1d59c5d9d3
commit f34108b252
26 changed files with 675 additions and 133 deletions
+31
View File
@@ -0,0 +1,31 @@
when:
- event: push
path: ".woodpecker/build-caddy.yml"
- event: manual
steps:
- name: build
image: golang:1.24
commands:
- go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
- xcaddy build v2.11.2
--with github.com/caddy-dns/cloudflare
--with github.com/ss098/certmagic-s3
--with github.com/hslatman/caddy-crowdsec-bouncer/http@v0.10.0
--with github.com/hslatman/caddy-crowdsec-bouncer/appsec@v0.10.0
--with github.com/mholt/caddy-l4
--output caddy
- ./caddy version
- ./caddy list-modules | grep -c layer4
- name: release
image: woodpeckerci/plugin-gitea-release
settings:
base_url: https://gitea.renner.uno
api_key:
from_secret: gitea_token
files:
- caddy
title: latest
tag: latest
prerelease: false
+85
View File
@@ -0,0 +1,85 @@
when:
- event: push
path:
- "opentofu/**"
- ".woodpecker/deploy-infrastructure.yml"
- event: manual
steps:
- name: validate-secrets
image: alpine:3.21
environment:
TF_VAR_proxmox_api_url:
from_secret: proxmox_api_url
AWS_ACCESS_KEY_ID:
from_secret: tf_rfs_access
commands:
- |
if [ -z "$TF_VAR_proxmox_api_url" ]; then echo "Missing proxmox_api_url secret"; exit 1; fi
if [ -z "$AWS_ACCESS_KEY_ID" ]; then echo "Missing tf_rfs_access secret"; exit 1; fi
echo "Secrets validated"
- name: plan
image: ghcr.io/opentofu/opentofu:1.11
directory: opentofu
environment:
TF_IN_AUTOMATION: "true"
TF_VAR_proxmox_api_url:
from_secret: proxmox_api_url
TF_VAR_proxmox_user:
from_secret: proxmox_user
TF_VAR_proxmox_token_id:
from_secret: proxmox_token_id
TF_VAR_proxmox_token_secret:
from_secret: proxmox_token_secret
AWS_ACCESS_KEY_ID:
from_secret: tf_rfs_access
AWS_SECRET_ACCESS_KEY:
from_secret: tf_rfs_secret
AWS_REGION: "us-east-1"
TF_VAR_unifi_username:
from_secret: unifi_username
TF_VAR_unifi_password:
from_secret: unifi_password
TF_VAR_unifi_api_url:
from_secret: unifi_api_url
commands:
- apk add --no-cache git
- tofu init -backend-config="access_key=$AWS_ACCESS_KEY_ID" -backend-config="secret_key=$AWS_SECRET_ACCESS_KEY"
- tofu plan -out=tfplan -no-color
- tofu show -no-color tfplan
- name: apply
image: ghcr.io/opentofu/opentofu:1.11
directory: opentofu
environment:
TF_IN_AUTOMATION: "true"
TF_VAR_proxmox_api_url:
from_secret: proxmox_api_url
TF_VAR_proxmox_user:
from_secret: proxmox_user
TF_VAR_proxmox_token_id:
from_secret: proxmox_token_id
TF_VAR_proxmox_token_secret:
from_secret: proxmox_token_secret
AWS_ACCESS_KEY_ID:
from_secret: tf_rfs_access
AWS_SECRET_ACCESS_KEY:
from_secret: tf_rfs_secret
AWS_REGION: "us-east-1"
TF_VAR_unifi_username:
from_secret: unifi_username
TF_VAR_unifi_password:
from_secret: unifi_password
TF_VAR_unifi_api_url:
from_secret: unifi_api_url
SSH_PRIVATE_KEY:
from_secret: ssh_private_key
commands:
- apk add --no-cache git openssh-client ansible
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_ed25519
- chmod 600 ~/.ssh/id_ed25519
- printf "Host *\n\tStrictHostKeyChecking no\n" > ~/.ssh/config
- tofu init -backend-config="access_key=$AWS_ACCESS_KEY_ID" -backend-config="secret_key=$AWS_SECRET_ACCESS_KEY"
- tofu apply -auto-approve tfplan
+44
View File
@@ -0,0 +1,44 @@
when:
- event: push
path:
- "ansible/roles/**"
- "opentofu/**"
- ".woodpecker/security-scan.yml"
- event: cron
- event: manual
steps:
- name: iac-scan
image: aquasec/trivy:latest
commands:
- trivy fs --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed .
- name: image-scan-redis
image: aquasec/trivy:latest
commands:
- trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed docker.io/library/redis:7
failure: ignore
- name: image-scan-postgres
image: aquasec/trivy:latest
commands:
- trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed docker.io/library/postgres:15
failure: ignore
- name: image-scan-paperless
image: aquasec/trivy:latest
commands:
- trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed ghcr.io/paperless-ngx/paperless-ngx:latest
failure: ignore
- name: image-scan-gotenberg
image: aquasec/trivy:latest
commands:
- trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed docker.io/gotenberg/gotenberg:8
failure: ignore
- name: image-scan-tika
image: aquasec/trivy:latest
commands:
- trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed docker.io/apache/tika:latest
failure: ignore
+145 -133
View File
@@ -1,134 +1,146 @@
$ANSIBLE_VAULT;1.1;AES256
64613561323132616332313332383530636162663732336662313633366633633863646466363566
6334363462306533316636313338313062323065353938370a363539366139376232373036306231
35636133313035623931353264336232663335323162653661333361333161326234306336633030
6262343662616230330a306663623537643135653930333965613037653065343732633430633337
35616636393763373736393562656262366564663664336264353164383434316163636230356537
35383364313966333335643664353438393564386133363463383565623465616663396535363563
32383663393434396631613934323335656230393532316436326262643731636132383234316238
38653030626638346365643966626666666138616631646335343561383062376566623638373235
38353264383238396233386636333532336536373237396636333232643066336361396334646437
61346361393465663365363766396164613562323034633130653134623165613966623430376232
65656266386439666266626231626136353635393566303866343233623365316562383463393830
64336230613963323639343530623236363439633866336433356438383433336137323065633332
37656237336663663431323832393465383633366137333833373865323037663436383831363663
39663363643631626535363365353966333936363133613662633965316361306363376138646330
30373530346136373233616539356435366434303865623532356132653937313664376461393433
34363536363537376239363466383966373764373161366135303263626239616239313566373831
30646638313936326165633337663339323338323461383534636439633238326236363938663865
37653962333037323561643566356566326533613636313031646235623562333139666535616135
35343134323931386163653331393232613963346261353863663061356630663737353834333532
32323266323164386165316139656134613537356265353063616434393031323330623430373365
61366238393666616235343465303731643662356132613732646533646464313439323932366336
62643637636330653062303761356662343339343266343865336532653237346466623235653763
61376137643238326562363566623165316565643165616366313138633534663136326337336366
64636365656361303063663135333839313631336437376262626363386565643465363938306362
62643833303434373761623738306563313534366166623035636233366537383061656333343562
37323764356261303563383135613632396462633735626334393139383539306262653637663434
66396363633761396463386539646336313334613966363466653736643161613430613037633636
65383035613263323264386639303034633435343966393033356638373465356430653238626638
37383035646162323834323931303534303935306163653935343130633439616531323334663162
65313635656333316363646563353864393335306234303237656134333739363431363737356531
33613534373233313363363463333261616135363131346161393635373533323531623037366664
33386537323231653764656338626566666634613531663466656163383935356431616565316262
65396238613630646533656632623339383735363136396366616136666262336461326333356636
64663839643134353239323236393763303165366535653566653163386239646634346564383463
38653739383864643537626637306530316238393061663663653862386562623365643133333433
66343438303033616438343462313430383738386161653966373233613161626566373337336237
36336535393837656631613864663632396236376663383437653766653735623230383365633639
38653531623364306433363535316465313165613333393830343466663837393062323662396238
66373632396461653332616438313039393764333835653530623766313637333632376338363865
33396435623836643834623739633035323934346134343936303261663534336439363035633334
37646232353934356630353932333737353361656362656366633164383365336134613333353566
35663339303366653963613335343531623434653131376362656636623438386330363663326466
39643531616131386333616231366533343531306364643334646664386438656565636664333835
39646537376136303832353630663538613633626261333031636134313835316330333563333731
32663839613237383730306634613833666639386538393361313330316338633465396134353238
61313534666366626466306133373832656233633638613333343262356236646639666562653163
31326131663061623831326663643737616566363139393365363464383130346161653932366437
61386664653832663265373765623861383662663466653337623136306366343236643137663830
62353539646335363632316663663465653764666533646131633361393731313461663939653338
30396232353138386566616635343236333636343637383531613662353263353665646234613563
65666662346361346332623037643732376537353832646637373066653366643162336263383236
30333861323539623263653730623632653134326239633661666463643839616466643936386336
31386162333731356361346133326461343361653330643533313736396535646365306635393739
39303139393339336635646462343134336134333662663431333265643665313566373533346530
31633430653236353932393863643635356539396138666535356434353666363530386562616636
32626535663136373537343862363564643035306139623163666533306161326138663534356637
31383162663837653538366163393762326631616134343133303636383265366430353765366263
61313535303566383436363833353063633632613633643364306266663662373736373865363136
64306162653765343463326465313935313261663866623639363830336565383632363763333438
66393732616330303338386161376638663764353063383463653730303130313731366239333033
64626561343863363565643932373161366331316131356561666531326637383566643137336637
61653931323637623433323862373664313139653536383538303638326461616333386539326564
34643634656662323832383666316436663335343136656364396134343961653738313730613162
36653134313336363263336238393163653837653933363434353264313038356632626164313233
35663366656535636663346239663332653161633765333534383662356139383237363830616430
31363635616235666661303161356436653432396263343261623562616462666264613435313238
64393039366130336337656362336264303538323735313136666132393563363633623066386237
63626537323638306265323433333939383735626633383162363262303239373936303038383638
30363331656137303435363862636365366538336337613437363236326339386230393232646239
38613763326436396637356361323862393630306632386266353532383861326337343332663163
35623938316330353731306136663565346265346535633530386131316662396434303034376666
63366563396234656363363738333663373737663333313937653233376533316638636465376631
61313964396264316137343335663365393638633230353332323231316132313666383338663033
35653762303961393933353964356662643864636139663265363963373163643763643964643362
35616235303830313564636431653031666334313063313862306233316562386235313363353735
66626334313838316462616232336464336131386335386263666434363966653739316431646366
61633330366232613237626133393365393733393162333864306239663066613330653739356563
61343630373665623562383431383165306632336236363065626161346534633663383938643061
65613565613934656366323065343537623932373435356563303535643038373563336462383438
66376466666635333261313661333564393865343034646139396535363131613938663836393035
65303863666666613733393437653561313661363738643562313464376430396530363530643836
35333964663738363734313438383730316435333834616139636133626230633037363566636663
62646633393237383631616664366361656234643438353530393738366662643931653665303837
37353061383765623065313730303036303737376132393262366566353831323931633434663039
37623466623432366261613561663365373138313432636263363239613364613139373530356531
39323238386335383235336334376137356635373665613436343134643361653733643633323938
32326163336335306262353938366335353164653239636233383665663761613835323938336337
32616432646437326632373633373863343333353331383435316137313133386166626135623366
66643833343164356434346666666532323339313365353731343364316634303561343230633639
39663861326561393830333432326438626233313239636234323839306631356466336635656337
32633263393565333834643736346537376333663363633266306332633130643936356330666231
31373531353935363364353730313764623535313466376363643630633434643539383133643134
33616531653063653436636231666234373466383031363866366130336134653066393930303263
39306462643065333439383266326139316463666430313230626339303739626137333130346430
34303339366462636565396634653664383363376462373731613135656563363762643563333864
65363436373936383332396362643635613433333832376563643264326166333831663262336236
65353631666162373162333533343439636265353038323761393738343861336231383365623061
62313936373466623632636135616339363735313462343435313230336237303461313336353139
62623139653063643536363066623338326662613266386531636166323965383038353333396131
35323330616437343036626462306261346633653038313033613763373931666461373166323365
35303231373332306238313066353565306632666433343861363063633563336233636339373661
64613633623431313734653931386261353733383764653865663534316465323034316334333832
35313461643365626465636138333433346434616138393933353138646366343938666463656633
64366365346663376430313336623730336563373066613434386266303232646164376538656361
64613932393666623534336463346164316664343065346330633966356633333661373433643333
30313931653464353363306263666137613531326461646638343335613237393662373836386366
34386264316566336464346636373435633638353639323934396534313635353233653163653963
63313730323866616663663931383534613563393065333634306130393035313137316361373333
66623137383238346666346663313165356232363930633334613134346466303462653563376335
38313039323664653939343865623837363231643862393130336230356464666165623763316632
63303561633535373866386364386162616665363130373563626439316333326438326565326565
31623364336533383666336137356134343364383934383932363839363637636636356633313531
66373437373238626461393866333662636136383732636534666133343232656466646636616562
66656131666139386130343763656664393435633638373839333233373863633631386632663238
37643430623337633536636461333137353437303930306337303564653635373230643364633361
66636366646133343535343633663135623964613230353965393265353364653739303032303038
37623230343864623235663436393562613538653362306561653032626262303733353062386633
38353462363536373930363639653665633164383333396561383962353335353638333164663336
32383365376434333639313365616631323232643136353135386639383166633366383763626234
30323236366630313964653465626262376131653261333133313565613564313162633039643034
37396561316465323465376230303939393936353064383132393236623865306336383563373531
63623565346332353266626232306366393331363338623133313731333531623738346263343933
63366534386363313535396466353431336263353631393133346363626661393163643666306563
32356233376662653364626338373462363861303434313663646231636237326236663133386234
61616430653666653933336438313062373636623466626534343361363437396535373839333331
62393061366138613765303831343066666435643632373931343062323335313938383338393866
64386636383634303039643161323139363536326536663439663365333530623262653734376662
66303864666430623135393036643834376565646134306537393134373263663139396361623530
33333365363964613361333137323939313630336535633562613734383763363464326431613463
30376235373761323362363263373137633030373833303837303535643330363134663030623733
37636330323337303439383035386465643235376162366166643563616163373230326263356333
64333438396563663662333636393162333836653464383739363434303762333161393135323039
62393963636238616339616563613366366230346434633234323732346637326537
38366462313335633039306562356331316263336261356238306362306637323263376564316365
6661626534313765326163343837633762383939666266610a306566386530613663663961626666
63323564383763393533303534353763306264313634663264376561666264613634353937396666
6239313263396637650a643232643165383232326630326230666637613565366637373639323361
33316433303832646562373164326264383230613332643237633065663437393731306531346632
62343237343038643337346365336261653862633466663138306639633739376234643362383833
64356163666165613065643434393630326262386332393865306238376131646133396633393366
33396663323137313231633864376639653330653131363933383236626536366539646131626165
63663565636661336238326330363865383033613663343133626362383032373065336133653665
64653231663534616330313536623465363036396539383130383065363234386362353662636533
63316236363437633339336634343137386437386433613666613464376463626363376565333630
37613761343933643831306333353231363234363734356331396335316434366561383834623838
32353362376636636533613533333230363233626364353739643164646137316632626132353363
37663136383661653030653039626336323631316161616235306230353335663665376265373064
38663663373963313932383439313262373266303933383336343035623933613135333739333635
37336334363761646666386636373331646462386430643732333139383762333237366133326538
61393332663163653066316264303165616431343463643432646637383832613535306635636263
63643132333762636137663130636636636239626633636333613032373635626530663633383036
39643366336365623736366162646632633662636364353330313162333730666333303231646461
33336138313139643066363138303263313665346536326634346565666536306530313539356166
64363933613530633463646534376136386161346233346362313835666234336539343733346239
33373636656263363566373761303662353037303132313039363036323739653231636364386263
61613336306238363366616136643735343264646266366361663834643235376331373562323934
63653735613038306433643836383734336333383361653661396633373332376334656661393365
31623262353362376335396238616563326537363462346534373663326464303338663061353430
31636638346136323662626539613430306561633235626465613236633937613032383861633962
38343030356661636463353435363132666662643362376635656535373265306630306334643563
61323766646135626337333365363237666134666636353233613838633138613663613565613762
30326265343535613463383936386630373634396536636535356232373233336531323465306230
61383633636663623139393834623435353833346261663737303066313866313464636138613433
34326437353235363635646261663636313363356461653061663135356262653938393837323333
63353466366565366435313039666534653633313133336532393838363335666332666335333538
32336663363631396265383831643031313030303436306532333062356365333338653236356239
38373261336638613464623039343535396562313231323865643130333263643536353865623434
36353535646663616665353139653963393139396365633464323938336130303662633136303039
34623338633235396138363863336539323765666539663839373363313538383235306537666632
61386163386161376236333666336562613536363336643436633164326631653730383535326261
38343062306334356462613833323765376239333335656331643663613665363465383866393161
63393864323863643666663533306239353832326266623335393536343465306463356363646366
64643434656434633132663635643634656232613734343032623634636439653563663130346332
30376630393534306262376433383963373735303330656231353566666533393536373165366230
35303137376631333634633230643633353234613134646162313031376466643433303165663138
63373138393430643736653765626133316632396339353764663462306532386138326138616566
33646538366538633937313234623963336564313663353030633361633130633035383166306664
38313563353065643661373135336136363639363363626131643766616333313439643533336631
61653461343639303137656136363733306365343462626339633636306163643532346435393839
64653166343535663236353164346337623333343565643931633635306262373466383163636264
33343362303432636535643863666632386365356334613264313333653366376230656663366635
62323030323531323333343039646262373366353464366533323234666364383736663035346364
63656166373337663636633532353331306561626433363131363865316261633733383039363339
61623737363866373035663061313038623936313034613662616139623837393833333039313461
38353434373731316137636133626462643335616632353762396539666363366532356637653964
38613863336262346465323630626434643035376335323233393361633839353333643532623135
35646336313166633332663438373032313532643333626466636130386435623063643866383434
33386666613638353966333034616363316234633533303133623233346538313139333037646336
30643862383436303333656663313336306163303266396132333036316437633239653731626539
35613739316665616237616161343964646366303336613738643433353631373965333261336630
63623235323734663939356432323733636532373066316263373863306561633330646663613436
66623037316439653666353364386537316636666239663561626137343737306263313634336139
61636430633964636233303362333636346563313866626133326461613836323739643466326465
37386362303338323261353462333434326231303066666461643833306261653539646438336638
33336631666436303236643963633234336261373331316231306630313538616439393138383363
31646233626239653965323762333038653138366238306135383661306561383831333837633439
35636138643961323332393131633438333137336438356334623135643766663630623165653036
62626261373036623430633263633330316665353835633864633862373266346333616366613661
33356233623638343939646465316431396534616439336632336138383566636338376266366539
39336235653937633866393030623162393636323433636364616662356263336262623766646663
39626235623262653264663935313066333964653838303666386665616463333566646139643865
65643361366465303732306231363532313231313865623236616639643333356662366166383533
38303337353261386134303936663637306139303066623332336162623364643830653866323931
30626363653366383661363931366137343030316639333531306261373338623062373133306162
33613836363865653330303032653461646163653264376138353061386563363966313236636363
35306130333638663932636137666262316663353535313131616235326437353036643763663739
63646437306265333636393136346261616464653635376538653262663131336161373766343132
35663637333961383537663231373532363761626465336563386435646135306532643364653961
61336462653933633833396666386331363331396437363633346366616336636431336336633734
35373062386235303637346565306533353936633065633839303735643938393938393635356535
35623061373833396663633362323731333563366331373031326230383965643561346563623562
62313737366634643731633064316532353832386235633736623562623434653432356566616330
31386561656636643163353931313964633935376530666334333937663434383835633763663265
61336362613635663139356666343732383937306465613332656661323232613436343530643937
34626338343436323735313530666537656638313964376134366338653861663434336339383534
65303037626362616631353966633636393732306165313265306663633737316631346465333361
62613835313832353731363038326137633064623432613765613938336432653333373130323130
63373538633461343237323235393631663861643961636134656438346162643937336462623965
33613037363861613635316431346332366366356436656438616532666435613536643237343834
36646633306362646263666135653730643562373639316339393330636362336262343231303438
35626134656330386438313738613462383930646132653639373839333030363630663363333263
35336136353539306464623761616631316131646231643838396432363337313466396333366439
38653538376665343863383438323837343235323064363032316662663866333139376364346562
32326334323562626532643863303833656661356231353963306232386364363463343437356237
37623366313632396639306239636263346261356635626537383537623366366233396235366435
66643834353931353062643162353965646336316161353937346561646166323535353535386564
61316131356662333831613137643837633937313932363565303533376464376464643565363262
61666336643430656162643037653762636666373965393532326635633732343739373664633063
66353231323562343939363436326664343666653930343931356464626364626231313935656138
62306634303831653862633663653637663539366364313063333965396136623366653961643430
38346266656263323836613836653139346339333066356234366165373434363633323661663631
35653733323838383230656631326465643330636231383734633132653833333833373262626338
65363431373266386332323138396261343931316435666232636232356431363861326535366337
63346435656263373133366431376162366331383038383531653165323464636631336631373063
33333431363835313861616565633531356634643037356663333233666134316533633362633364
31366564626339646265613334326663353233663937306236313466626461383862356334326130
62616533663636373331663839313533313631373931353331383661653264653735383063343638
38643931343339333636393931323162353233323963323032666434376561313030366530626362
32383432626434306237376539333338303336613138663135383332663038353265616664323638
63333330653565636465393561656137633630663534313331626537303064643438616163666130
37336633383162363364383636643662373263393062636536656534653936306365313736343834
37386564626632363766613964383131316234643762333162363539323436653336346233386562
33306565656433313138333966323837343761373566623839383234643461653433373665393164
30633931356533383961623734623439636262356365386133616430326131353934383933643566
66636465373236356530313131633238633236393362313964373230373738316165646235333862
66373963356335343139646263366639623931643662373439616533666534326531653863363631
30643736346430656534666238643161323539346463353430386436316532343832303234653234
35366266376464323933316230326538626433373532626639346662646664396261306531366634
33623230633133646238373736666430323062626265393261623362333333366632366537343033
66656534393135343261656366656539373131353830313838376235336531643731396436633862
34353061663234646336613363333565633464616235623236623831666436643933616361616130
63666535363539353039356130653937623931643166626265386333633536356663643262623638
61393462663466613462313665363235663534373039653634636664363633383336636463633663
34333732613839663263313438626665323935633965613664656466373033393231373837633439
32653432383838616236356337356563306237313939376365663965623635613439303337613230
30353235306263346561623763616662376362626366313631396539616135336336666561663564
61366136356565653832303038646365653034353765383237363336373763346434653932616432
39626136633332616330646638386134613764373237633239366164643261313863616435316136
63316234643737613638643738613837366237633139353136656565363661326366353338663334
31333930363965623463666663643165343031333833313338653033666535623961623664653333
64656632626633363833316164376161333631666131653736353038643735376437376534373133
34333935366235656132303766653335373130396439653663656338306365353161333761656530
37386637316532333838316537336461303830666235346633653831363438316664306531313834
36656636393932646435666362323465646237373239303635306365323866656435633837646339
31393738633534383431666263666561653031646634366337616439653932643439323438376232
33353030356437313030316261346436626337346464663130323832643832383330643036306630
65623364396464653062373736366262326538636336363437376464386137626166346439303866
31306638396435323662303865633665646433373537613035303534346563323363636331643931
30653435626237336235356338653838373839643238313961626563346439353164653031383561
32613066336462326164346632363530323831343032343462623338363062633432613666373139
34396664663832333739336466333761343464313062343433303330326366386633383039666361
62303038343937393666363939643330616361623933343032666232623562623761323231623231
62343264316432653564343363613963633135386332343834343338316435636361316431353137
62396265386436306661643038326237356136623233353535343835343337626262626334386436
62353062333639353831653838666531363836316131303835336539633833316439626338326534
30303061393533646635373639333239366165626131373539383639643864303735303765623165
64666163383735613335633239303735356365393935396664376466333765383764653731663764
31626631363661633865313537306335303231636361626665336338653939373638
@@ -0,0 +1,2 @@
---
woodpecker_grpc_secret: "{{ vault_woodpecker_grpc_secret }}"
@@ -0,0 +1,4 @@
---
woodpecker_grpc_secret: "{{ vault_woodpecker_grpc_secret }}"
woodpecker_gitea_client: "{{ vault_woodpecker_gitea_client }}"
woodpecker_gitea_secret: "{{ vault_woodpecker_gitea_secret }}"
+7
View File
@@ -34,3 +34,10 @@ nas-1.renner.uno ansible_user=ladmin ansible_python_interpreter=/usr/bin/python3
[grafana]
grafana.srv.renner.uno ansible_user=ladmin
[woodpecker_server]
woodpecker.srv.renner.uno ansible_user=root
[woodpecker_agents]
wp-agent-1.srv.renner.uno ansible_user=root
wp-agent-2.srv.renner.uno ansible_user=root
@@ -0,0 +1,8 @@
---
- name: Install and Configure Woodpecker CI Agents
hosts: woodpecker_agents
become: true
roles:
- role: common
- role: docker-install
- role: woodpecker-agent
@@ -0,0 +1,8 @@
---
- name: Install and Configure Woodpecker CI Server
hosts: woodpecker_server
become: true
roles:
- role: common
- role: docker-install
- role: woodpecker-server
@@ -358,3 +358,11 @@ n8n.renner.uno {
# END ANSIBLE MANAGED BLOCK N8N
# BEGIN ANSIBLE MANAGED BLOCK WOODPECKER
ci.renner.uno {
import cloudflare
import custom_error
reverse_proxy http://woodpecker.srv.renner.uno:8000
}
# END ANSIBLE MANAGED BLOCK WOODPECKER
@@ -0,0 +1,14 @@
---
woodpecker_version: "3.13.0"
# Server gRPC address (agent connects here)
woodpecker_server: "woodpecker.srv.renner.uno:9000"
# Shared secret — must match server's WOODPECKER_AGENT_SECRET
# woodpecker_grpc_secret: ""
# Max parallel workflows per agent
woodpecker_max_workflows: 2
# Docker Compose project directory
woodpecker_agent_compose_dir: "/opt/woodpecker-agent"
@@ -0,0 +1,6 @@
---
- name: Restart woodpecker-agent
systemd:
name: woodpecker-agent
state: restarted
daemon_reload: yes
@@ -0,0 +1,34 @@
---
- name: Create Woodpecker agent directory
file:
path: "{{ woodpecker_agent_compose_dir }}"
state: directory
mode: "0755"
- name: Deploy Docker Compose file
template:
src: docker-compose.yml.j2
dest: "{{ woodpecker_agent_compose_dir }}/docker-compose.yml"
mode: "0600"
notify: Restart woodpecker-agent
- name: Deploy environment file
template:
src: agent.env.j2
dest: "{{ woodpecker_agent_compose_dir }}/.env"
mode: "0600"
notify: Restart woodpecker-agent
- name: Create systemd service for Woodpecker agent
template:
src: woodpecker-agent.service.j2
dest: /etc/systemd/system/woodpecker-agent.service
mode: "0644"
notify: Restart woodpecker-agent
- name: Enable and start Woodpecker agent
systemd:
name: woodpecker-agent
state: started
enabled: yes
daemon_reload: yes
@@ -0,0 +1,5 @@
WOODPECKER_SERVER={{ woodpecker_server }}
WOODPECKER_AGENT_SECRET={{ woodpecker_grpc_secret }}
WOODPECKER_MAX_WORKFLOWS={{ woodpecker_max_workflows }}
WOODPECKER_BACKEND=docker
WOODPECKER_HOSTNAME={{ inventory_hostname }}
@@ -0,0 +1,13 @@
services:
woodpecker-agent:
image: woodpeckerci/woodpecker-agent:v{{ woodpecker_version }}
container_name: woodpecker-agent
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- woodpecker-agent-config:/etc/woodpecker
env_file:
- .env
volumes:
woodpecker-agent-config:
@@ -0,0 +1,17 @@
[Unit]
Description=Woodpecker CI Agent
Documentation=https://woodpecker-ci.org/
After=docker.service network.target
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory={{ woodpecker_agent_compose_dir }}
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
ExecReload=/usr/bin/docker compose restart
TimeoutStartSec=120
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,38 @@
---
woodpecker_version: "3.13.0"
# Server configuration
woodpecker_host: "https://ci.renner.uno"
woodpecker_server_addr: ":8000"
woodpecker_grpc_addr: ":9000"
# Gitea forge
woodpecker_gitea: true
woodpecker_gitea_url: "https://gitea.renner.uno"
# OAuth client ID and secret — set from vault
# woodpecker_gitea_client: ""
# woodpecker_gitea_secret: ""
# Agent shared secret — set from vault
# woodpecker_grpc_secret: ""
# Admin users (Gitea usernames)
woodpecker_admin: "gitea_admin,k.renner"
# Allow open registration (any Gitea user can log in)
woodpecker_open: true
# Database
woodpecker_database_driver: "sqlite3"
# Data directory (mounted volume)
woodpecker_data_dir: "/var/lib/woodpecker"
# Docker Compose project directory
woodpecker_compose_dir: "/opt/woodpecker"
# Prometheus metrics
woodpecker_prometheus_auth_token: ""
# Webhook config for Gitea (must allow local connections)
woodpecker_expert_webhook_host: ""
@@ -0,0 +1,6 @@
---
- name: Restart woodpecker-server
systemd:
name: woodpecker-server
state: restarted
daemon_reload: yes
@@ -0,0 +1,37 @@
---
- name: Create Woodpecker directories
file:
path: "{{ item }}"
state: directory
mode: "0755"
loop:
- "{{ woodpecker_compose_dir }}"
- "{{ woodpecker_data_dir }}"
- name: Deploy Docker Compose file
template:
src: docker-compose.yml.j2
dest: "{{ woodpecker_compose_dir }}/docker-compose.yml"
mode: "0600"
notify: Restart woodpecker-server
- name: Deploy environment file
template:
src: woodpecker.env.j2
dest: "{{ woodpecker_compose_dir }}/.env"
mode: "0600"
notify: Restart woodpecker-server
- name: Create systemd service for Woodpecker
template:
src: woodpecker-server.service.j2
dest: /etc/systemd/system/woodpecker-server.service
mode: "0644"
notify: Restart woodpecker-server
- name: Enable and start Woodpecker server
systemd:
name: woodpecker-server
state: started
enabled: yes
daemon_reload: yes
@@ -0,0 +1,12 @@
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:v{{ woodpecker_version }}
container_name: woodpecker-server
restart: unless-stopped
ports:
- "8000:8000"
- "9000:9000"
volumes:
- {{ woodpecker_data_dir }}:/var/lib/woodpecker/
env_file:
- .env
@@ -0,0 +1,17 @@
[Unit]
Description=Woodpecker CI Server
Documentation=https://woodpecker-ci.org/
After=docker.service network.target
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory={{ woodpecker_compose_dir }}
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
ExecReload=/usr/bin/docker compose restart
TimeoutStartSec=120
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,26 @@
WOODPECKER_HOST={{ woodpecker_host }}
WOODPECKER_SERVER_ADDR={{ woodpecker_server_addr }}
WOODPECKER_GRPC_ADDR={{ woodpecker_grpc_addr }}
WOODPECKER_OPEN={{ woodpecker_open | lower }}
WOODPECKER_ADMIN={{ woodpecker_admin }}
# Gitea forge
WOODPECKER_GITEA={{ woodpecker_gitea | lower }}
WOODPECKER_GITEA_URL={{ woodpecker_gitea_url }}
WOODPECKER_GITEA_CLIENT={{ woodpecker_gitea_client }}
WOODPECKER_GITEA_SECRET={{ woodpecker_gitea_secret }}
# Agent authentication
WOODPECKER_AGENT_SECRET={{ woodpecker_grpc_secret }}
# Database
WOODPECKER_DATABASE_DRIVER={{ woodpecker_database_driver }}
{% if woodpecker_prometheus_auth_token | default('') | length > 0 %}
# Prometheus metrics
WOODPECKER_PROMETHEUS_AUTH_TOKEN={{ woodpecker_prometheus_auth_token }}
{% endif %}
{% if woodpecker_expert_webhook_host | default('') | length > 0 %}
WOODPECKER_EXPERT_WEBHOOK_HOST={{ woodpecker_expert_webhook_host }}
{% endif %}
+19
View File
@@ -4,6 +4,7 @@ locals {
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGfe3HJqFR+jIGrboweseAO7XjIVE24sje/b1HybgU9C ansible-runner@ci-new"
])
# Legacy Gitea runners — kept for state management during migration
gitea_runners = [
for i in range(var.gitea_runner_count) : {
vmid = 905 + i
@@ -23,6 +24,24 @@ locals {
}
]
woodpecker_agents = [
for i in range(var.woodpecker_agent_count) : {
vmid = 910 + i
name = "wp-agent-${i + 1}.srv.renner.uno"
node = "jupiter"
memory = 2048
cores = 2
type = "lxc"
state = "started"
tags = "woodpecker;ci;docker"
bridge = "v40srv"
disk_size = "30G"
storage = ""
nesting = true
ostemplate = "local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst"
}
]
rustfs_instances = [
for i in range(var.rustfs_count) : {
vmid = 800 + i
+50
View File
@@ -0,0 +1,50 @@
# Woodpecker CI Server
# Lightweight CI/CD engine with Gitea integration
# Replaces Gitea Actions for better UI and worker management
module "woodpecker_srv_renner_uno" {
source = "./modules/proxmox_lxc"
hostname = "woodpecker.srv.renner.uno"
vmid = 231
target_node = "jupiter"
memory = 1024
cores = 2
unprivileged = true
network_bridge = "v40srv"
storage = "local-zfs"
disk_size = "10G"
ostemplate = "local:vztmpl/debian-12-standard_12.12-1_amd64.tar.zst"
ssh_public_keys = local.common_ssh_keys
tags = "ci;docker;woodpecker"
onboot = true
start = true
features = {
nesting = true
fuse = false
keyctl = false
mknod = false
}
ingress_cnames = ["ci.renner.uno"]
cnames = []
description = <<-EOT
Woodpecker CI Server
https://woodpecker-ci.org/
Deployed via Ansible role: woodpecker-server
Web UI: https://ci.renner.uno (port 8000)
gRPC: port 9000 (agent communication)
Auth: Gitea OAuth2
Database: SQLite
EOT
}
+6
View File
@@ -40,6 +40,12 @@ variable "rustfs_count" {
default = 3
}
variable "woodpecker_agent_count" {
description = "Number of Woodpecker CI agents to deploy"
type = number
default = 2
}
variable "ssh_public_key" {
description = "Public SSH key to inject into containers"
type = string
+33
View File
@@ -0,0 +1,33 @@
# Woodpecker CI Agents
# Docker-based build agents connecting to woodpecker.srv.renner.uno via gRPC
module "woodpecker_agents" {
source = "./modules/proxmox_lxc"
for_each = {
for lxc in local.woodpecker_agents : lxc.vmid => lxc
}
hostname = each.value.name
target_node = each.value.node
vmid = each.value.vmid
memory = each.value.memory
cores = each.value.cores
unprivileged = true
tags = join(",", compact([each.value.tags, "transient"]))
ostemplate = each.value.ostemplate
storage = lookup(each.value, "storage", "local-zfs")
disk_size = each.value.disk_size
ssh_public_keys = local.common_ssh_keys
start = each.value.state == "started" ? true : false
network_bridge = each.value.bridge
features = {
nesting = each.value.nesting
fuse = false
keyctl = false
mknod = false
}
}