Author SHA1 Message Date
raucao 7a57d3b4c5 Cache successful Blossom responses
Cache returned files from Blossom on the Nginx hosts, until either
deleted by the user or hitting the global cache size limit (1 GB)
2026-08-16 11:53:51 -06:00
greg 1cb6040a21 Merge pull request 'Enable Sieve and ManageSieve for Dovecot' (#665) from feature/566-sieve into master
Reviewed-on: #665
Reviewed-by: Greg <greg@kosmos.org>
2026-08-16 09:49:37 +00:00
raucao 451903f663 Enable Sieve and ManageSieve for Dovecot
Enables both sieve and managesieved, and adds a global rule that moves
detected spam to a user's Junk folder automatically
2026-08-15 17:29:41 -06:00
raucao 7345eaceb1 Update VM base image 2026-08-15 15:44:05 -06:00
greg db7e9b7014 Merge pull request 'Auto-configure swap' (#664) from feature/swap into master
Reviewed-on: #664
Reviewed-by: Greg <greg@kosmos.org>
2026-08-14 19:17:22 +00:00
raucao 098dcd4e32 Auto-configure swap
Create a swapfile and configure it to be used for swap, immediately and
on boot; defaults to half the size of RAM. See attribute for overriding
configs to tune size or swappiness.
2026-08-14 12:10:37 -06:00
raucao bd0e0dc810 Update nodes 2026-08-14 09:42:10 -06:00
raucao 4971bbfd1a Update nodes 2026-08-10 21:04:49 -06:00
raucao 7e55a1f1d1 Tweak timeoutsec for akkounts service 2026-08-10 17:22:21 -06:00
raucao 2abd33aba7 Add privacy policy URL to strfry config 2026-08-10 10:21:11 -06:00
raucao 67877f1880 Merge pull request 'Akkounts: Set up Bun properly, upgrade Ruby' (#660) from chore/akkounts_bun_ruby into master
Reviewed-on: #660
2026-08-10 01:06:33 +00:00
raucao d0804bd7dc akkounts: Set up Bun properly, upgrade Ruby 2026-08-09 19:04:19 -06:00
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
33 changed files with 316 additions and 30 deletions
+4
View File
@@ -0,0 +1,4 @@
{
"name": "redis-4",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn3Zdzfao+n3PdtlJlViJ\nnpVDcL8ofw2rb2/VK7ivpWMKaL7mOq8HIQ+R+ghvllX/vPmN6co3+aUxOvvQ6KGC\nmAcnc7StqOpYUK0g6QZFROESO0vz1hy078AL9D2dEwOj7XS8leWCQyGgA1Z89T9n\naatXqEF1zGuvnVLA340prYkJk5S1X6KHq1WIi9H23hYehvGZlpkJ87wv8sKIo4Y3\nzIVA5hio0t0q+JyStOGr+xRl3mM43b25XcIh2ibrzKp3YoRWSCvMfhAdMKm1WEEI\njM/3fQRtkI1OQSb0o/wUoAmpUEEOTIvbWU2SuFVY7HYRuPwEilvbrGZKgrvbp8R+\nZQIDAQAB\n-----END PUBLIC KEY-----\n"
}
+3 -2
View File
@@ -81,7 +81,7 @@
"garage-",
"lq-",
"rsk-",
"postgres-6"
"postgres-11"
]
}
},
@@ -127,7 +127,8 @@
"description": "Members-only nostr relay for kosmos.org users",
"pubkey": "b3e1b7c0ef48294bd856203bfd460625de95d3afb894e5f09b14cd1f0e7097cf",
"contact": "ops@kosmos.org",
"icon": "https://assets.kosmos.org/img/app-icon-256px.png"
"icon": "https://assets.kosmos.org/img/app-icon-256px.png",
"privacy": "https://accounts.kosmos.org/privacy"
},
"write_policy": {
"plugin": "/opt/strfry/strfry-policy.ts"
+1 -1
Submodule nodes updated: 503f8ec5ff...5fd2e23a01
+1 -1
View File
@@ -8,7 +8,7 @@ version '0.3.0'
chef_version '>= 18.0'
depends 'kosmos_openresty'
depends "kosmos-nodejs"
depends "ark"
depends "postgresql"
depends "kosmos_postgresql"
depends "backup"
@@ -27,12 +27,24 @@ end
package "libpq-dev"
package "libvips"
package "unzip"
node.override["kosmos_nodejs"]["version"] = "22.23.1"
include_recipe 'kosmos-nodejs'
npm_package "bun"
bun_version = "1.3.14"
bun_checksum = "951ee2aee855f08595aeec6225226a298d3fea83a3dcd6465c09cbccdf7e848f"
ruby_version = "3.3.8"
ark "bun" do
url "https://github.com/oven-sh/bun/releases/download/bun-v#{bun_version}/bun-linux-x64.zip"
checksum bun_checksum
creates "bun"
path "/usr/local/bun/#{bun_version}/bin"
action :cherry_pick
end
link "/usr/local/bin/bun" do
to "/usr/local/bun/#{bun_version}/bin/bun"
end
ruby_version = "3.3.12"
ruby_path = "/opt/ruby_build/builds/#{ruby_version}"
bundle_path = "#{ruby_path}/bin/bundle"
rails_env = node.chef_environment == "development" ? "development" : "production"
@@ -234,7 +246,7 @@ systemd_unit "akkounts.service" do
ExecStart: "#{bundle_path} exec puma -C config/puma.rb --pidfile #{deploy_path}/tmp/puma.pid",
ExecReload: "#{bundle_path} exec pumactl -F config/puma.rb --pidfile #{deploy_path}/tmp/puma.pid phased-restart",
PIDFile: "#{deploy_path}/tmp/puma.pid",
TimeoutSec: "10",
TimeoutSec: "30",
Restart: "always",
},
Install: {
@@ -87,7 +87,7 @@ node.default['lndhub-go']['branding'] = {
}
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']['config_path'] = "/home/#{node['bitcoin']['username']}/.nbxplorer/Main/settings.config"
node.default['nbxplorer']['port'] = '24445'
@@ -95,7 +95,7 @@ node.default['nbxplorer']['postgres']['database'] = 'nbxplorer'
node.default['nbxplorer']['postgres']['user'] = 'nbxplorer'
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']['config_path'] = "/home/#{node['bitcoin']['username']}/.btcpayserver/Main/settings.config"
node.default['btcpay']['log_path'] = "/home/#{node['bitcoin']['username']}/.btcpayserver/debug.log"
@@ -21,7 +21,7 @@ bash 'build_btcpay' do
systemctl stop btcpayserver.service
./build.sh
EOH
environment "DOTNET_CLI_TELEMETRY_OPTOUT" => 1
environment "DOTNET_CLI_TELEMETRY_OPTOUT" => "1"
action :nothing
notifies :restart, "service[btcpayserver]", :delayed
end
+1 -1
View File
@@ -3,7 +3,7 @@
# Recipe:: rtl
#
node.override["kosmos_nodejs"]["version"] = "18.20.8"
node.override["kosmos_nodejs"]["version"] = "22.23.1"
include_recipe 'kosmos-nodejs'
app_name = "rtl"
@@ -1 +1,3 @@
# No attributes here, use the blossom cookbook's attributes
node.default['blossom']['nginx_cache_max_size'] = '1g'
@@ -23,6 +23,7 @@ openresty_site domain do
upstream_host: blossom_node['knife_zero']['host'],
upstream_port: node['blossom']['port'],
max_size_mb: node['blossom']['max_size'] / 1024 / 1024,
cache_max_size: node['blossom']['nginx_cache_max_size'],
ssl_cert: "/etc/letsencrypt/live/#{domain}/fullchain.pem",
ssl_key: "/etc/letsencrypt/live/#{domain}/privkey.pem"
end
@@ -2,12 +2,16 @@ upstream _blossom {
server <%= @upstream_host %>:<%= @upstream_port %>;
}
proxy_cache_path <%= node['openresty']['cache_dir'] %>/blossom
keys_zone=blossom_cache:10m
max_size=<%= @cache_max_size %> inactive=100y use_temp_path=off;
server {
server_name <%= @domain %>;
listen <%= "#{node['openresty']['listen_ip']}:" if node['openresty']['listen_ip'] %>443 ssl http2;
listen <%= "[#{node['openresty']['listen_ipv6']}]" %>:443 ssl http2;
access_log "/var/log/nginx/<%= @domain %>.access.log";
access_log "/var/log/nginx/<%= @domain %>.access.log" json;
error_log "/var/log/nginx/<%= @domain %>.error.log";
client_max_body_size <%= @max_size_mb %>M;
@@ -15,6 +19,27 @@ server {
ssl_certificate <%= @ssl_cert %>;
ssl_certificate_key <%= @ssl_key %>;
location ~ ^/(?<sha256>[a-f0-9]{64})(\.[a-zA-Z0-9]+)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://_blossom;
proxy_http_version 1.1;
proxy_cache blossom_cache;
proxy_cache_key $sha256;
proxy_cache_valid 200 1y;
proxy_cache_lock on;
proxy_cache_use_stale error timeout updating;
log_by_lua_block {
if ngx.var.request_method == "DELETE" and ngx.status >= 200 and ngx.status < 300 then
os.remove("<%= node['openresty']['cache_dir'] %>/blossom/" .. ngx.md5(ngx.var.sha256))
end
}
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
@@ -0,0 +1,6 @@
require ["fileinto", "mailbox"];
if header :contains "X-Spam-Flag" "YES" {
fileinto :create "Junk";
stop;
}
+38 -2
View File
@@ -9,6 +9,8 @@
dovecot-ldap
dovecot-lmtpd
dovecot-pop3d
dovecot-sieve
dovecot-managesieved
].each do |pkg|
apt_package pkg
end
@@ -26,8 +28,8 @@ credentials = Chef::EncryptedDataBagItem.load('credentials', 'email')
template "/etc/dovecot/dovecot.conf" do
source "dovecot.conf.erb"
mode 0644
# TODO variables protocols: "imap pop3 lmtp"
variables protocols: "imap lmtp",
# TODO variables protocols: "imap pop3 lmtp sieve"
variables protocols: "imap lmtp sieve",
# TODO find by email_proxy role
haproxy_trusted_networks: "10.1.1.167/32"
notifies :restart, "service[dovecot]", :delayed
@@ -85,6 +87,40 @@ template "/etc/dovecot/conf.d/15-mailboxes.conf" do
notifies :restart, "service[dovecot]", :delayed
end
template "/etc/dovecot/conf.d/20-lmtp.conf" do
source "dovecot_20-lmtp.conf.erb"
mode 0644
notifies :restart, "service[dovecot]", :delayed
end
template "/etc/dovecot/conf.d/90-sieve.conf" do
source "dovecot_90-sieve.conf.erb"
mode 0644
notifies :restart, "service[dovecot]", :delayed
end
# Directory for global Sieve scripts (applied after user scripts)
directory "/var/lib/dovecot/sieve" do
owner "dovecot"
group "dovecot"
mode 0755
end
# Global Sieve script run after every user script (sieve_after).
# Files spam flagged by SpamAssassin (X-Spam-Flag: YES) into the Junk folder.
cookbook_file "/var/lib/dovecot/sieve/after.sieve" do
source "after.sieve"
owner "dovecot"
group "dovecot"
mode 0644
notifies :run, "execute[compile after.sieve]", :immediately
end
execute "compile after.sieve" do
command "sievec /var/lib/dovecot/sieve/after.sieve"
action :nothing
end
service "dovecot" do
action [:enable, :start]
end
@@ -32,3 +32,9 @@ firewall_rule "IMAPS" do
port 993
protocol :tcp
end
firewall_rule "ManageSieve" do
command :allow
port 4190
protocol :tcp
end
@@ -60,6 +60,18 @@ service submission-login {
}
}
service managesieve-login {
inet_listener sieve {
port = 4190
ssl = yes
}
inet_listener sieve_haproxy {
port = 14190
ssl = yes
haproxy = yes
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
@@ -0,0 +1,9 @@
##
## LMTP specific settings
##
# Enable the Sieve plugin for LMTP delivery so that Sieve scripts are
# executed for incoming mail handed over by Postfix.
protocol lmtp {
mail_plugins = $mail_plugins sieve
}
@@ -0,0 +1,15 @@
##
## Plugin settings (Sieve)
##
plugin {
# Per-user Sieve script storage. The "~" expands to mail_home
# (/var/vmail/%d/%n) set in 10-mail.conf, so scripts for LDAP virtual
# users are stored under ~/sieve/ with the active script symlinked at
# ~/.dovecot.sieve.
sieve = file:~/sieve;active=~/.dovecot.sieve
# Global Sieve script executed AFTER user scripts. Used to enforce
# server-side spam filing regardless of per-user rules.
sieve_after = /var/lib/dovecot/sieve/after.sieve
}
+14
View File
@@ -2,6 +2,20 @@
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
Initial release.
@@ -1,5 +1,5 @@
node.default["gitea"]["version"] = "1.26.4"
node.default["gitea"]["checksum"] = "0faa36d151918f8f7d6e0f3ae67597d1c338583d695add146ac393109d0fc44a"
node.default["gitea"]["version"] = "1.27.1"
node.default["gitea"]["checksum"] = "86a7ac26e7f9c9cca0f56c4fac07fff205d5fc3bca0e54af23a204f07b833bc9"
node.default["gitea"]["repo"] = nil
node.default["gitea"]["revision"] = nil
node.default["gitea"]["working_directory"] = "/var/lib/gitea"
@@ -25,3 +25,17 @@ node.default["gitea"]["config"] = {
node.default["gitea"]["runner"]["version"] = "2.0.0"
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'
description 'Installs/configures Gitea'
long_description 'Installs/configures Gitea'
version '0.2.0'
version '0.2.2'
chef_version '>= 14.0'
depends "firewall"
@@ -17,6 +17,14 @@ tls_cert_for domain do
action :create
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
template "nginx_conf_web.erb"
variables server_name: domain,
+27 -2
View File
@@ -35,14 +35,39 @@ directory "#{working_directory}/runners" do
mode "0700"
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_dir = "#{working_directory}/runners/#{runner["org"]}"
cache_port = node["gitea"]["runner"]["cache_base_port"] + index
directory runner_dir do
mode "0700"
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
cwd runner_dir
code <<-EOF
@@ -67,7 +92,7 @@ gitea_runner register \
Type: "simple",
WorkingDirectory: runner_dir,
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
Restart: "always",
},
@@ -62,6 +62,9 @@ FROM = <%= @email %>
INTERNAL_TOKEN = <%= @internal_token %>
INSTALL_LOCK = true
SECRET_KEY = <%= @secret_key %>
<% if c = @config["webhook"] %>
<% if c["allowed_host_list"] %>ALLOWED_HOST_LIST = <%= c["allowed_host_list"] %><% end %>
<% end %>
[service]
REGISTER_EMAIL_CONFIRM = false
@@ -101,11 +104,6 @@ RUN_AT_START = false
NOTICE_ON_SUCCESS = false
SCHEDULE = @every 15m
<% if c = @config["webhook"] %>
[webhook]
<% if c["allowed_host_list"] %>ALLOWED_HOST_LIST = <%= c["allowed_host_list"] %><% end %>
<% end %>
<% if c = @config["storage"] %>
[storage]
<% if c["type"] == "minio" %>
@@ -20,6 +20,9 @@ server {
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)/.*$ {
proxy_buffers 1024 8k;
proxy_pass http://_gitea_web;
@@ -0,0 +1 @@
<%= @config.to_yaml.sub(/^---\n/, '') %>
@@ -1,9 +1,9 @@
release = "20260321"
release = "20260801"
img_filename = "ubuntu-24.04-server-cloudimg-amd64"
node.default["kosmos_kvm"]["host"]["qemu_base_image"] = {
"url" => "https://cloud-images.ubuntu.com/releases/noble/release-#{release}/#{img_filename}.img",
"checksum" => "5c3ddb00f60bc455dac0862fabe9d8bacec46c33ac1751143c5c3683404b110d",
"checksum" => "0533b0655c32e68b31d792ecd6ccfca95abdbc536c4446874fe0513bd4140ffe",
"path" => "/var/lib/libvirt/images/base/#{img_filename}-#{release}.qcow2"
}
@@ -11,3 +11,10 @@ node.default["kosmos_kvm"]["host"]["qemu_base_image"] = {
node.default["kosmos_kvm"]["backup"]["schedule"] = "0/3:00"
# Node/VM names excluded from backups
node.default["kosmos_kvm"]["backup"]["nodes_excluded"] = []
node.default["kosmos_kvm"]["guest"]["swap"] = {
"enabled" => true, # set to false to disable swap on a guest
"size_mb" => nil, # nil => auto (half of RAM); integer => fixed MB; 0 => disabled
"path" => "/swapfile",
"swappiness" => nil # nil => leave kernel default; e.g. 10 to tune
}
@@ -8,3 +8,20 @@ package %w(qemu-guest-agent)
service "qemu-guest-agent" do
action [:enable, :start]
end
swap_cfg = node["kosmos_kvm"]["guest"]["swap"]
if swap_cfg["enabled"] && swap_cfg["size_mb"] != 0
size = swap_cfg["size_mb"] ||
(node["memory"]["total"].to_i / 2 / 1024) # kB -> MB, half RAM
# The resource only creates/activates the swapfile if it is not already
# active; an existing active swapfile is left untouched (size is NOT
# reconciled to current RAM).
swap_file swap_cfg["path"] do
size size
persist true
swappiness swap_cfg["swappiness"] if swap_cfg["swappiness"]
action :create
end
end
+9 -1
View File
@@ -5,6 +5,11 @@
package %w(virtinst libvirt-daemon-system libvirt-clients)
# Required on legacy hosts (Ubuntu 20.04) to build the NoCloud seed ISO
# via cloud-localds. Modern virt-install (>= 4.0.0, Ubuntu >= 22.04)
# handles cloud-init natively via --cloud-init and does not need it.
package "cloud-image-utils" if node["platform_version"].to_f < 22.04
directory "/var/lib/libvirt/images/base" do
recursive true
owner "libvirt-qemu"
@@ -24,7 +29,10 @@ end
template "/usr/local/sbin/create_vm" do
source "create_vm.erb"
mode "0750"
variables base_image_path: node["kosmos_kvm"]["host"]["qemu_base_image"]["path"]
variables(
base_image_path: node["kosmos_kvm"]["host"]["qemu_base_image"]["path"],
modern_virt_install: node["platform_version"].to_f >= 22.04
)
end
firewall_rule 'ssh-alt-port' do
@@ -64,6 +64,7 @@ EOS
popd
fi
<% if @modern_virt_install -%>
virt-install \
--name "$VMNAME" \
--ram "$RAM" \
@@ -83,3 +84,30 @@ virt-install \
--autostart \
--import \
--cloud-init root-password-generate=off,disable=on,meta-data=$CIDATA_PATH/meta-data,user-data=$CIDATA_PATH/user-data
<% else -%>
# Legacy path for hosts running virt-install < 4.0.0 (e.g. Ubuntu 20.04,
# virt-install 2.2.x). These versions predate the --osinfo/--cloud-init
# options, so we build a NoCloud seed ISO from the same user-data and
# meta-data files and attach it as a cdrom. The guest receives the
# exact same cloud-init configuration as on modern hosts.
cloud-localds "$CIDATA_PATH/seed.iso" "$CIDATA_PATH/user-data" "$CIDATA_PATH/meta-data"
virt-install \
--name "$VMNAME" \
--ram "$RAM" \
--vcpus "$CPUS" \
--cpu host \
--arch x86_64 \
--hvm \
--virt-type kvm \
--disk "$IMAGE_PATH" \
--disk "$CIDATA_PATH/seed.iso,device=cdrom" \
--boot hd \
--network=bridge=virbr0,model=virtio \
--graphics none \
--serial pty \
--console pty \
--channel unix,mode=bind,path=/var/lib/libvirt/qemu/$VMNAME.guest_agent.0,target_type=virtio,name=org.qemu.guest_agent.0 \
--autostart \
--import
<% end -%>
@@ -89,6 +89,11 @@ jobs = node["kosmos_prometheus"]["jobs"].merge(
"query" => "role:garage_node",
"port" => 3903
},
# strfry relay metrics
"strfry" => {
"query" => "role:strfry",
"port" => 7777
},
}.transform_values do |config|
{
"targets" => search(:node, config["query"]).map do |n|
@@ -31,6 +31,10 @@ server {
proxy_pass http://_substr;
}
location /metrics {
return 404;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;