Author SHA1 Message Date
greg 24e4498f75 Merge pull request 'Add caching for Gitea Actions, improve performance' (#659) from feature/actions_caching into master
Reviewed-on: #659
Reviewed-by: Greg <greg@kosmos.org>
2026-08-08 19:50:35 +00:00
raucao 71a27eb3ca Add caching for Gitea Actions, improve performance 2026-08-08 10:11:28 -06:00
raucao 63d6b1eb9c Update nodes 2026-08-07 20:21:22 -06:00
raucao de2c4f27fe Merge pull request 'Upgrade BTCPay Server, NBXplorer, Node.js' (#658) from chore/upgrade_btcpay into master
Reviewed-on: #658
2026-08-08 02:20:06 +00:00
raucao 956a58a310 Upgrade Node.js to LTS 2026-08-07 20:12:01 -06:00
raucao f453a3004d Fix implicit conversion of integer to string 2026-08-07 20:11:32 -06:00
raucao da969e7709 Upgrade NBXplorer and BTCPay Server 2026-08-07 20:11:05 -06:00
greg 73ef2cb575 Merge pull request 'Upgrade strfry to 1.1.1, add metrics' (#657) from chore/upgrade_strfry into master
Reviewed-on: #657
Reviewed-by: Greg <greg@kosmos.org>
2026-08-07 15:28:26 +00:00
raucao 4fe2f34557 Update nodes 2026-08-07 08:27:56 -06:00
raucao 4b74dcdf07 Scrape strfry metrics 2026-08-07 08:26:51 -06:00
raucao 777efbca4c Disallow public access to strfry metrics endpoint 2026-08-07 08:26:31 -06:00
raucao a8294f25ab Upgrade strfry to 1.1.1
kosmos/strfry-cookbook#1
2026-08-07 08:26:08 -06:00
greg f5cd38c457 Merge pull request 'Rate limit requests from bots on Gitea' (#656) from chore/rate_limit_bot_on_gitea into master
Reviewed-on: #656
Reviewed-by: Râu Cao <raucao@kosmos.org>
2026-08-02 19:22:12 +00:00
greg c74d2f1025 Merge branch 'master' into chore/rate_limit_bot_on_gitea 2026-08-02 19:21:48 +00:00
greg bdb04e374f Merge pull request 'Update Gitea to 1.27.1' (#655) from chore/upgrade_gitea_to_1.27.1_fixed into master
Reviewed-on: #655
Reviewed-by: Râu Cao <raucao@kosmos.org>
2026-08-02 19:21:31 +00:00
greg 051c497054 Rate limit requests from bots on Gitea
For now this is 240 r/m (4r/s), for Claude, Sogou and Meta user agents.
The values are pretty conservative, I initially had tighter limits.
Let's see how it goes, this is running on Fornax and Draco and right now
we're not hitting the limits.
2026-08-01 16:33:35 +02:00
greg 64e1639c06 Update nodes git submodule 2026-08-01 13:35:08 +02:00
greg fae8f57298 Update Gitea to 1.27.1
The webhooks allowed list was moved to the security part of the config
file

This is running on gitea-2
2026-08-01 13:30:54 +02:00
raucao 8d0c6bc301 Update backup ignorelist 2026-07-24 19:16:41 +02:00
raucao 80766f2473 Update nodes 2026-07-24 19:16:41 +02:00
raucao d9a59e064e Merge pull request 'Make create_vm work on all OS versions in use' (#653) from bugfix/create_vm into master
Reviewed-on: #653
Reviewed-by: Greg <greg@kosmos.org>
2026-07-24 17:14:44 +00:00
raucao 16cb333991 Merge branch 'master' into bugfix/create_vm 2026-07-24 15:27:28 +02:00
raucao 7386de86d7 Make create_vm work on all OS versions in use
Makes it work with the same cloudinit code on Ubuntu 20.04 by mounting
it from a custom ISO as CD-ROM
2026-07-24 15:19:59 +02:00
raucao 5ff6046169 Add new Redis node 2026-07-24 15:19:43 +02:00
15 changed files with 108 additions and 9 deletions
+1 -1
Submodule nodes updated: 13c12de574...528c84f98f
@@ -87,7 +87,7 @@ node.default['lndhub-go']['branding'] = {
} }
node.default['nbxplorer']['repo'] = 'https://github.com/dgarage/NBXplorer' node.default['nbxplorer']['repo'] = 'https://github.com/dgarage/NBXplorer'
node.default['nbxplorer']['revision'] = 'v2.5.26' node.default['nbxplorer']['revision'] = 'v2.6.10'
node.default['nbxplorer']['source_dir'] = '/opt/nbxplorer' node.default['nbxplorer']['source_dir'] = '/opt/nbxplorer'
node.default['nbxplorer']['config_path'] = "/home/#{node['bitcoin']['username']}/.nbxplorer/Main/settings.config" node.default['nbxplorer']['config_path'] = "/home/#{node['bitcoin']['username']}/.nbxplorer/Main/settings.config"
node.default['nbxplorer']['port'] = '24445' node.default['nbxplorer']['port'] = '24445'
@@ -95,7 +95,7 @@ node.default['nbxplorer']['postgres']['database'] = 'nbxplorer'
node.default['nbxplorer']['postgres']['user'] = 'nbxplorer' node.default['nbxplorer']['postgres']['user'] = 'nbxplorer'
node.default['btcpay']['repo'] = 'https://github.com/btcpayserver/btcpayserver' node.default['btcpay']['repo'] = 'https://github.com/btcpayserver/btcpayserver'
node.default['btcpay']['revision'] = 'v2.3.7' node.default['btcpay']['revision'] = 'v2.4.2'
node.default['btcpay']['source_dir'] = '/opt/btcpay' node.default['btcpay']['source_dir'] = '/opt/btcpay'
node.default['btcpay']['config_path'] = "/home/#{node['bitcoin']['username']}/.btcpayserver/Main/settings.config" node.default['btcpay']['config_path'] = "/home/#{node['bitcoin']['username']}/.btcpayserver/Main/settings.config"
node.default['btcpay']['log_path'] = "/home/#{node['bitcoin']['username']}/.btcpayserver/debug.log" node.default['btcpay']['log_path'] = "/home/#{node['bitcoin']['username']}/.btcpayserver/debug.log"
@@ -21,7 +21,7 @@ bash 'build_btcpay' do
systemctl stop btcpayserver.service systemctl stop btcpayserver.service
./build.sh ./build.sh
EOH EOH
environment "DOTNET_CLI_TELEMETRY_OPTOUT" => 1 environment "DOTNET_CLI_TELEMETRY_OPTOUT" => "1"
action :nothing action :nothing
notifies :restart, "service[btcpayserver]", :delayed notifies :restart, "service[btcpayserver]", :delayed
end end
+1 -1
View File
@@ -3,7 +3,7 @@
# Recipe:: rtl # Recipe:: rtl
# #
node.override["kosmos_nodejs"]["version"] = "18.20.8" node.override["kosmos_nodejs"]["version"] = "22.23.1"
include_recipe 'kosmos-nodejs' include_recipe 'kosmos-nodejs'
app_name = "rtl" app_name = "rtl"
+14
View File
@@ -2,6 +2,20 @@
This file is used to list changes made in each version of the kosmos_gitea cookbook. This file is used to list changes made in each version of the kosmos_gitea cookbook.
# 0.2.2
- Add `config.yaml` for the gitea actions runner, enabling the built-in cache
server (listening on the Docker bridge gateway `172.17.0.1`) and bumping
`runner.capacity` to 2 for concurrent job execution. Each runner gets a unique
cache port derived from `cache_base_port` (8088) + its index in the runners
data bag.
- Set `container.network` to a user-defined Docker bridge network
(`gitea-actions`, subnet `172.20.0.0/16`) so job containers get DNS resolution
for service containers (e.g. `redis`) while keeping the cache server reachable
at the network gateway `172.20.0.1`.
- Open the cache port in the firewall for Docker bridge traffic
(`172.20.0.0/16`), fixing `Request timeout` errors from `actions/cache`.
# 0.1.0 # 0.1.0
Initial release. Initial release.
@@ -25,3 +25,17 @@ node.default["gitea"]["config"] = {
node.default["gitea"]["runner"]["version"] = "2.0.0" node.default["gitea"]["runner"]["version"] = "2.0.0"
node.default["gitea"]["runner"]["checksum"] = "447156b33407ee045409f5552bd4a188a315cdd4085b4b498d8d4a9ad26c9f73" node.default["gitea"]["runner"]["checksum"] = "447156b33407ee045409f5552bd4a188a315cdd4085b4b498d8d4a9ad26c9f73"
node.default["gitea"]["runner"]["cache_base_port"] = 8088
node.default["gitea"]["runner"]["config"] = {
"runner" => {
"capacity" => 2
},
"container" => {
"network" => "gitea-actions" # User-defined bridge network: provides DNS for service containers
},
"cache" => {
"enabled" => true,
"host" => "172.20.0.1" # Gateway of the gitea-actions network, reachable from job containers
# Port is set per-runner (cache_base_port + index) in the runner recipe
}
}
@@ -0,0 +1,25 @@
# Increase if you have very long User-Agent strings
map_hash_bucket_size 256;
# Bot user agents
map $http_user_agent $bot_name {
default "";
~*ClaudeBot "claude";
~*Sogou "sogou";
~*meta-externalagent "meta-externalagent";
# add more as needed
}
# Decide the rate-limit key (per-IP for each bot in this example)
map $bot_name $bot_limit_key {
default "";
"claude" $binary_remote_addr;
"sogou" $binary_remote_addr;
"meta-externalagent" $binary_remote_addr;
}
# Shared memory zone only non-empty keys are counted
limit_req_zone $bot_limit_key zone=bots:20m rate=240r/m; # 4r/s per IP+bot
# Status code returned when the limit is exceeded
limit_req_status 429;
+1 -1
View File
@@ -4,7 +4,7 @@ maintainer_email 'ops@kosmos.org'
license 'MIT' license 'MIT'
description 'Installs/configures Gitea' description 'Installs/configures Gitea'
long_description 'Installs/configures Gitea' long_description 'Installs/configures Gitea'
version '0.2.1' version '0.2.2'
chef_version '>= 14.0' chef_version '>= 14.0'
depends "firewall" depends "firewall"
@@ -17,6 +17,14 @@ tls_cert_for domain do
action :create action :create
end end
# Slow down requests from bots
cookbook_file "#{node["openresty"]["dir"]}/conf.d/rate_limits.conf" do
source "rate_limits.conf"
owner "root"
group "root"
mode "0644"
end
openresty_site domain do openresty_site domain do
template "nginx_conf_web.erb" template "nginx_conf_web.erb"
variables server_name: domain, variables server_name: domain,
+27 -2
View File
@@ -35,14 +35,39 @@ directory "#{working_directory}/runners" do
mode "0700" mode "0700"
end end
runners.each do |runner| execute "create_gitea_actions_network" do
command "docker network create --subnet 172.20.0.0/16 gitea-actions"
not_if "docker network inspect gitea-actions"
end
runners.each_with_index do |runner, index|
runner_name = "gitea-runner-#{runner["org"]}" runner_name = "gitea-runner-#{runner["org"]}"
runner_dir = "#{working_directory}/runners/#{runner["org"]}" runner_dir = "#{working_directory}/runners/#{runner["org"]}"
cache_port = node["gitea"]["runner"]["cache_base_port"] + index
directory runner_dir do directory runner_dir do
mode "0700" mode "0700"
end end
runner_config = node["gitea"]["runner"]["config"].to_hash
runner_config["cache"] = runner_config["cache"].merge("port" => cache_port)
firewall_rule "runner_cache_#{runner["org"]}" do
command :allow
port cache_port
protocol :tcp
source "172.20.0.0/16"
end
template "#{runner_dir}/config.yaml" do
source "runner.config.yaml.erb"
mode "0640"
owner "root"
group "root"
variables(config: runner_config)
notifies :restart, "service[#{runner_name}]", :delayed
end
bash "register_#{runner["org"]}_runner" do bash "register_#{runner["org"]}_runner" do
cwd runner_dir cwd runner_dir
code <<-EOF code <<-EOF
@@ -67,7 +92,7 @@ gitea_runner register \
Type: "simple", Type: "simple",
WorkingDirectory: runner_dir, WorkingDirectory: runner_dir,
Environment: "HOME=/root", Environment: "HOME=/root",
ExecStart: "/usr/local/bin/gitea_runner daemon", ExecStart: "/usr/local/bin/gitea_runner daemon --config #{runner_dir}/config.yaml",
ExecStartPre: "/bin/sleep 3", # Wait for Gitea's API to be up when restarting at the same time ExecStartPre: "/bin/sleep 3", # Wait for Gitea's API to be up when restarting at the same time
Restart: "always", Restart: "always",
}, },
@@ -20,6 +20,9 @@ server {
proxy_intercept_errors on; proxy_intercept_errors on;
# Rate limit for bots. Defined in /etc/openresty/conf.d/rate_limits.conf
limit_req zone=bots burst=10; # allow a larger spike for asset bursts
location ~ ^/(avatars|repo-avatars)/.*$ { location ~ ^/(avatars|repo-avatars)/.*$ {
proxy_buffers 1024 8k; proxy_buffers 1024 8k;
proxy_pass http://_gitea_web; proxy_pass http://_gitea_web;
@@ -0,0 +1 @@
<%= @config.to_yaml.sub(/^---\n/, '') %>
@@ -89,6 +89,11 @@ jobs = node["kosmos_prometheus"]["jobs"].merge(
"query" => "role:garage_node", "query" => "role:garage_node",
"port" => 3903 "port" => 3903
}, },
# strfry relay metrics
"strfry" => {
"query" => "role:strfry",
"port" => 7777
},
}.transform_values do |config| }.transform_values do |config|
{ {
"targets" => search(:node, config["query"]).map do |n| "targets" => search(:node, config["query"]).map do |n|
@@ -31,6 +31,10 @@ server {
proxy_pass http://_substr; proxy_pass http://_substr;
} }
location /metrics {
return 404;
}
location / { location / {
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;