Compare commits
34
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
451903f663
|
||
|
|
7345eaceb1
|
||
|
|
db7e9b7014
|
||
|
|
098dcd4e32
|
||
|
|
bd0e0dc810
|
||
|
|
4971bbfd1a
|
||
|
|
7e55a1f1d1
|
||
|
|
2abd33aba7
|
||
|
|
67877f1880
|
||
|
|
d0804bd7dc
|
||
|
|
24e4498f75
|
||
|
|
71a27eb3ca
|
||
|
|
63d6b1eb9c
|
||
|
|
de2c4f27fe
|
||
|
|
956a58a310
|
||
|
|
f453a3004d
|
||
|
|
da969e7709
|
||
|
|
73ef2cb575
|
||
|
|
4fe2f34557
|
||
|
|
4b74dcdf07
|
||
|
|
777efbca4c
|
||
|
|
a8294f25ab
|
||
|
|
f5cd38c457
|
||
|
|
c74d2f1025
|
||
|
|
bdb04e374f
|
||
|
|
051c497054
|
||
|
|
64e1639c06
|
||
|
|
fae8f57298
|
||
|
|
8d0c6bc301
|
||
|
|
80766f2473
|
||
|
|
d9a59e064e
|
||
|
|
16cb333991
|
||
|
|
7386de86d7
|
||
|
|
5ff6046169
|
@@ -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: 13c12de574...5fd2e23a01
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
require ["fileinto", "mailbox"];
|
||||
|
||||
if header :contains "X-Spam-Flag" "YES" {
|
||||
fileinto :create "Junk";
|
||||
stop;
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
@@ -4,7 +4,7 @@ maintainer_email 'ops@kosmos.org'
|
||||
license 'MIT'
|
||||
description 'Installs/configures Gitea'
|
||||
long_description 'Installs/configures Gitea'
|
||||
version '0.2.1'
|
||||
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,
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
+1
-1
Submodule site-cookbooks/strfry updated: 2c6e64d231...9c04b393ec
Reference in New Issue
Block a user