40 Commits

Author SHA1 Message Date
7949fd067c Add IPv6 support for nostr.kosmos.org 2024-10-16 12:37:47 +02:00
0726e58f7c Update ejabberd LDAP filter for new akkounts release 2024-10-16 12:36:30 +02:00
fe581c348a Fix bookmarks disappearing for XMPP users
The limit for PEP nodes was ridiculously low. No idea why, but it means
users were only able to save 10 items (e.g. channel bookmarks) at once.
2024-10-16 12:34:31 +02:00
af62078960 Update node info 2024-10-16 12:34:17 +02:00
9b4deff91e Remove cln from bitcoin-2 node 2024-10-16 12:34:01 +02:00
0944bc5266 Merge pull request 'Migrate S3 backups from AWS, fix automatic cleanups' (#574) from chore/move_fix_s3_backups into master
Reviewed-on: #574
2024-10-16 10:33:24 +00:00
eb06926606 Migrate S3 backups from AWS, fix automatic cleanups
The cleanups were broken in that every single archive was also copied to
a shared folder and never deleted from there.

Co-authored-by: Greg Karékinian <greg@karekinian.com>
2024-10-16 12:31:51 +02:00
15096ca17b Merge pull request 'Bitcoin-related software upgrades' (#573) from chore/bitcoin_upgrades into master
Reviewed-on: #573
2024-10-16 10:25:53 +00:00
3551b71154 Add sensitive attribute to resource with credentials 2024-10-16 12:23:38 +02:00
752bb74663 Remove boltz service and RTL integration
We use peerswap these days, and the build process for boltz was made
much more complicated at some point. Not worth upgrading for us.
2024-10-16 12:23:38 +02:00
c64526a944 Upgrade RTL to v0.15.2
Need to use `npm install --force` due to a dependency issue
2024-10-16 12:23:38 +02:00
da242d4817 Upgrade LND to 0.18.3 2024-10-16 12:23:29 +02:00
0af4bc1d0d Upgrade bitcoind to 28.0
Requires a newer C++ compiler
2024-10-16 11:28:13 +02:00
c9f5a745a3 Merge pull request 'Fix Mastodon signup/password/confirmation links' (#570) from chore/562-mastodon_login_urls into master
Reviewed-on: #570
Reviewed-by: Greg <greg@noreply.kosmos.org>
2024-08-23 14:18:12 +00:00
d935b99d7d Fix Mastodon signup/password/confirmation links
Adds ENV vars for our custom fix in b916182bc1

fixes #562
2024-08-22 21:51:49 +02:00
d048bbb297 Merge pull request 'Upgrade Gitea to 1.22.1' (#568) from chore/upgrade_gitea into master
Reviewed-on: #568
2024-08-10 11:45:39 +00:00
61bd121709 Upgrade Gitea to 1.22.1 2024-08-10 13:44:39 +02:00
ec9b912e45 Merge pull request 'Configure nginx default vhost, add specific redirects for some domains' (#565) from chore/nginx_redirects into master
Reviewed-on: #565
2024-08-09 12:44:29 +00:00
d53ba42a1d Make kosmos.org the default nginx vhost 2024-08-04 16:51:57 +02:00
a99f7f7574 Add config for accounts .well-known proxyying 2024-08-04 16:51:18 +02:00
1c8ee14bb3 Add HTTP redirects for kosmos.chat and kosmos.cash 2024-08-04 16:49:20 +02:00
cdedf49be3 Merge pull request 'Fix download URLs for Mastodon exports/archives' (#564) from bugfix/mastodon_archive_download_urls into master
Reviewed-on: #564
2024-08-04 14:46:26 +00:00
5e727ec279 Fix download URLs for Mastodon exports/archives
See https://github.com/mastodon/mastodon/issues/24380
2024-08-04 14:55:22 +02:00
9d928298d2 Fix Gitea user/repo avatar URLs in certain situations
I encountered a CORS proxy which somehow ended up with http://_gitea_web
URLs.
2024-07-10 11:36:07 +02:00
1174661b46 Use proxy domain for RS Discourse ACME challenge 2024-07-08 20:31:46 +02:00
2dff7cf850 Merge pull request 'Add new service: nostr.kosmos.org (members-only nostr relay)' (#559) from feature/strfry into master
Reviewed-on: #559
Reviewed-by: Greg <greg@noreply.kosmos.org>
2024-07-05 07:33:40 +00:00
232360efba Remove commented code 2024-07-03 09:23:13 +02:00
8b8e8f3438 Move strfry extras into their own directory 2024-07-03 09:22:50 +02:00
522c213b09 Add Deno lockfile 2024-06-20 18:16:27 +02:00
80eddfbf56 Configure strfry whitelist
Allow akkounts pubkey to publish to our own relay
2024-06-20 15:38:27 +02:00
7e664723a1 Configure akkounts nostr relay URL in production 2024-06-20 15:04:17 +02:00
f5961af7fe Create/deploy strfry VM 2024-06-11 23:17:33 +02:00
d1301dad3e Add, configure, deploy strfry policies 2024-06-11 23:12:22 +02:00
42c46a5645 Deploy strfry reverse proxy 2024-06-11 23:10:24 +02:00
5be9081613 Header name has to be all lowercase in strfry config 2024-06-11 23:09:49 +02:00
1649d03665 Update strfry cookbook 2024-06-11 23:09:48 +02:00
b9a3910364 Update strfry cookbook 2024-06-11 23:09:48 +02:00
9835b85181 Fall back to default port for strfry proxy
When we don't override it elsewhere
2024-06-11 23:09:48 +02:00
dbccd9d2bf Add kosmos_strfry cookbook, configs 2024-06-11 23:09:48 +02:00
1a5f312699 Add strfry cookbook 2024-06-11 23:09:48 +02:00
60 changed files with 549 additions and 208 deletions

6
.gitmodules vendored
View File

@@ -4,3 +4,9 @@
[submodule "site-cookbooks/openresty"] [submodule "site-cookbooks/openresty"]
path = site-cookbooks/openresty path = site-cookbooks/openresty
url = https://github.com/67P/chef-openresty.git url = https://github.com/67P/chef-openresty.git
[submodule "site-cookbooks/strfry"]
path = site-cookbooks/strfry
url = git@gitea.kosmos.org:kosmos/strfry-cookbook.git
[submodule "site-cookbooks/deno"]
path = site-cookbooks/deno
url = git@gitea.kosmos.org:kosmos/deno-cookbook.git

4
clients/strfry-1.json Normal file
View File

@@ -0,0 +1,4 @@
{
"name": "strfry-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzDV/RMGMXVDbvoA6PNh8\nQzhtHwYDCFcUSkbrwP6tzh6GpVunGEOdOdhj2V63T2tF1H+lujxQXh5pK7C0D6VZ\niO04ftJlo7/svyxUcwWr+znyN5sFdQRh3cBZiGSBYolizwoqgtPFlbNhmWAzV0Du\n9t8mhz70IK3B+UdwWyHtoK0NNsJGnQ9YzAvcjyDmEO/3sCjAhNnxVpmXftpcSmd9\nMonzFtIDBbRRll4AHZYRbmXCzx63+VmelvdnufnbY82liol0zzBwJaBD1wyNlG0y\ni96p3Kx03bLNlIaYVGbjZeJi+6oo2VDWJ4OloLLAYoHDSipeHT9qWfUdnE6ge4Lm\nywIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@@ -1,27 +1,38 @@
{ {
"id": "backup", "id": "backup",
"s3_access_key_id": { "s3_access_key_id": {
"encrypted_data": "emGNH4v7TTEh05Go/DsI3k7CFnaK4p/4JxodC4BYpyWw47/Z3dsuRMu4vXM3\n3YLH\n", "encrypted_data": "245TrPvuoBRRTimhbt6qqsFb+JnnD377sPt1pguJy7Q2BXOy/jrX0wyMt+cP\nuA==\n",
"iv": "Dau+ekb3UTYdl8w3fQKVcA==\n", "iv": "ylmRxSRO3AA4MSJN\n",
"version": 1, "auth_tag": "45tBcYZowPLrbv4Zu2P0Fw==\n",
"cipher": "aes-256-cbc" "version": 3,
"cipher": "aes-256-gcm"
}, },
"s3_secret_access_key": { "s3_secret_access_key": {
"encrypted_data": "Mxyly86JxrWUbubbSiqPdRosChzfI1Q8eBEG4n+2B9JJG4yExltO5Wc5kgSs\nX01MPXAc+PGLm+J9MngUtypo/g==\n", "encrypted_data": "jDIOjlBzTkBUzpj243T6KnBuH0qwyW7BUFMcqllljFSzxs7K8wYJOUreNbOP\ny8OpDWAuO0H4O4LuFMJXeM8=\n",
"iv": "WRhBJGiuScYYsUsoT5j/UA==\n", "iv": "PzvZr37EkJqz6JtM\n",
"version": 1, "auth_tag": "e3XW8oHVgmYibv/IBzj0yA==\n",
"cipher": "aes-256-cbc" "version": 3,
"cipher": "aes-256-gcm"
},
"s3_endpoint": {
"encrypted_data": "ErJIEChxrreW7WKEwRtuP2MyYlsZRtqLdGa/x5QY58qgO036FgR3Hs2Z3yce\n",
"iv": "HOSAOgUjO7XGwk50\n",
"auth_tag": "XE1bwMIXHHE72V9K2KOLnw==\n",
"version": 3,
"cipher": "aes-256-gcm"
}, },
"s3_region": { "s3_region": {
"encrypted_data": "2ZGxu0tVzKNfx3K1Wleg0SAwGaPkHCi/XfKpJ+J7q40=\n", "encrypted_data": "8cNSaYu7HH95ftG66lFdUIPZD7soz907CPA=\n",
"iv": "CNTZW2SEIgfw+IyzGI3TzQ==\n", "iv": "pU21ulF75y/SIs3x\n",
"version": 1, "auth_tag": "7WQQCbSbB2GybjY+C+5IvQ==\n",
"cipher": "aes-256-cbc" "version": 3,
"cipher": "aes-256-gcm"
}, },
"encryption_password": { "encryption_password": {
"encrypted_data": "tsBWKBwhQFfEAM0EWMPtljSbqU1c5mOJXPjYJjNT5RUFhPlqa7gsE8aJbs+D\nSPKjAQ62j+iHeqCk9mE9CCkgBA==\n", "encrypted_data": "l23CiIO2s1fIRn0NdoWZ+wK+Zhx3hCYDHf4ypjqMRekZ7xqafvXHHuogD5aj\npxYUKloH\n",
"iv": "uq5YAXuq2ynRLv9EIWoCFA==\n", "iv": "Dzx83eP9L7Jqqidh\n",
"version": 1, "auth_tag": "UVn5XA5Tgsikc1GdOt1MUQ==\n",
"cipher": "aes-256-cbc" "version": 3,
"cipher": "aes-256-gcm"
} }
} }

View File

@@ -1,9 +1,30 @@
{ {
"id": "dirsrv", "id": "dirsrv",
"admin_dn": {
"encrypted_data": "zRtz6Scb9WtUXGyjc0xyvsre0YvqupuaFz+RPApj7DEQTmYyZPVb\n",
"iv": "xfIXMhEBHBWqa4Dz\n",
"auth_tag": "BcA32u1njcnCZ+yrBGSceQ==\n",
"version": 3,
"cipher": "aes-256-gcm"
},
"admin_password": { "admin_password": {
"encrypted_data": "i71l5E129mXCcDAyME8sNMUkYUlQMgt7Eh6noyFcLNgbaMo=\n", "encrypted_data": "7JpXl3JZDqKWDfYt/wuNbkbob+oRuONhkuAlpqUCCEIn+tY=\n",
"iv": "KNW2B8tpX7ywZwbg\n", "iv": "Lcwc4NDzrfcBaIKQ\n",
"auth_tag": "GawQ+FSlA5v5YVyryeUxng==\n", "auth_tag": "rrePS3Bhdnwbr2d/o8vMhg==\n",
"version": 3,
"cipher": "aes-256-gcm"
},
"service_dn": {
"encrypted_data": "sqRFiZreLeTPQljSfhAuV3DmsPxSC8tzWjCdu+WSSbO67sBQA+xhmGtzBhBD\nDZPGJw+jtAxzuVvPdAjxgAVgxXO6C6WEo87L1tdJewE=\n",
"iv": "GUEGtyRJXrPhWcUs\n",
"auth_tag": "2USsrx//3V7RCyumGCbMkg==\n",
"version": 3,
"cipher": "aes-256-gcm"
},
"service_password": {
"encrypted_data": "f2wi8B8SEt6p5G0TF3dZ72j0vMFlvwcP1suxYnshBA==\n",
"iv": "rOnUoxbnkaJtodM+\n",
"auth_tag": "dVLCtBVMjxLfW2D8XjJBdQ==\n",
"version": 3, "version": 3,
"cipher": "aes-256-gcm" "cipher": "aes-256-gcm"
} }

View File

@@ -14,7 +14,8 @@
"public_key": "024cd3be18617f39cf645851e3ba63f51fc13f0bb09e3bb25e6fd4de556486d946" "public_key": "024cd3be18617f39cf645851e3ba63f51fc13f0bb09e3bb25e6fd4de556486d946"
}, },
"nostr": { "nostr": {
"public_key": "b3e1b7c1660b7db0ecb93ec55c09e67961171a5c4e9e2602f1b47477ea61c50a" "public_key": "b3e1b7c1660b7db0ecb93ec55c09e67961171a5c4e9e2602f1b47477ea61c50a",
"relay_url": "wss://nostr.kosmos.org"
} }
}, },
"discourse": { "discourse": {
@@ -101,6 +102,20 @@
}, },
"sentry": { "sentry": {
"allowed_ips": "10.1.1.0/24" "allowed_ips": "10.1.1.0/24"
},
"strfry": {
"domain": "nostr.kosmos.org",
"real_ip_header": "x-real-ip",
"policy_path": "/opt/strfry/strfry-policy.ts",
"whitelist_pubkeys": [
"b3e1b7c1660b7db0ecb93ec55c09e67961171a5c4e9e2602f1b47477ea61c50a"
],
"info": {
"name": "Kosmos Relay",
"description": "Members-only nostr relay for kosmos.org users",
"pubkey": "1f79058c77a224e5be226c8f024cacdad4d741855d75ed9f11473ba8eb86e1cb",
"contact": "ops@kosmos.org"
}
} }
} }
} }

View File

@@ -16,7 +16,6 @@
"kvm_guest", "kvm_guest",
"sentry_client", "sentry_client",
"bitcoind", "bitcoind",
"cln",
"lnd", "lnd",
"lndhub", "lndhub",
"postgresql_client", "postgresql_client",
@@ -30,10 +29,8 @@
"tor-full", "tor-full",
"tor-full::default", "tor-full::default",
"kosmos-bitcoin::bitcoind", "kosmos-bitcoin::bitcoind",
"kosmos-bitcoin::c-lightning",
"kosmos-bitcoin::lnd", "kosmos-bitcoin::lnd",
"kosmos-bitcoin::lnd-scb-s3", "kosmos-bitcoin::lnd-scb-s3",
"kosmos-bitcoin::boltz",
"kosmos-bitcoin::rtl", "kosmos-bitcoin::rtl",
"kosmos-bitcoin::peerswap-lnd", "kosmos-bitcoin::peerswap-lnd",
"kosmos_postgresql::hostsfile", "kosmos_postgresql::hostsfile",
@@ -103,7 +100,6 @@
"role[sentry_client]", "role[sentry_client]",
"recipe[tor-full]", "recipe[tor-full]",
"role[bitcoind]", "role[bitcoind]",
"role[cln]",
"role[lnd]", "role[lnd]",
"role[lndhub]", "role[lndhub]",
"role[btcpay]" "role[btcpay]"

View File

@@ -54,8 +54,10 @@
"kosmos_liquor-cabinet::nginx", "kosmos_liquor-cabinet::nginx",
"kosmos_rsk::nginx_testnet", "kosmos_rsk::nginx_testnet",
"kosmos_rsk::nginx_mainnet", "kosmos_rsk::nginx_mainnet",
"kosmos_strfry::nginx",
"kosmos_website", "kosmos_website",
"kosmos_website::default", "kosmos_website::default",
"kosmos_website::redirects",
"kosmos-akkounts::nginx", "kosmos-akkounts::nginx",
"kosmos-akkounts::nginx_api", "kosmos-akkounts::nginx_api",
"kosmos-bitcoin::nginx_lndhub", "kosmos-bitcoin::nginx_lndhub",

View File

@@ -48,8 +48,10 @@
"kosmos_liquor-cabinet::nginx", "kosmos_liquor-cabinet::nginx",
"kosmos_rsk::nginx_testnet", "kosmos_rsk::nginx_testnet",
"kosmos_rsk::nginx_mainnet", "kosmos_rsk::nginx_mainnet",
"kosmos_strfry::nginx",
"kosmos_website", "kosmos_website",
"kosmos_website::default", "kosmos_website::default",
"kosmos_website::redirects",
"kosmos-akkounts::nginx", "kosmos-akkounts::nginx",
"kosmos-akkounts::nginx_api", "kosmos-akkounts::nginx_api",
"kosmos-bitcoin::nginx_lndhub", "kosmos-bitcoin::nginx_lndhub",

View File

@@ -32,6 +32,7 @@
"kosmos_postgresql::hostsfile", "kosmos_postgresql::hostsfile",
"kosmos_gitea", "kosmos_gitea",
"kosmos_gitea::default", "kosmos_gitea::default",
"kosmos_gitea::backup",
"kosmos_gitea::act_runner", "kosmos_gitea::act_runner",
"apt::default", "apt::default",
"timezone_iii::default", "timezone_iii::default",
@@ -47,7 +48,9 @@
"postfix::_attributes", "postfix::_attributes",
"postfix::sasl_auth", "postfix::sasl_auth",
"hostname::default", "hostname::default",
"firewall::default" "firewall::default",
"backup::default",
"logrotate::default"
], ],
"platform": "ubuntu", "platform": "ubuntu",
"platform_version": "20.04", "platform_version": "20.04",

66
nodes/strfry-1.json Normal file
View File

@@ -0,0 +1,66 @@
{
"name": "strfry-1",
"chef_environment": "production",
"normal": {
"knife_zero": {
"host": "10.1.1.164"
}
},
"automatic": {
"fqdn": "strfry-1",
"os": "linux",
"os_version": "5.15.0-1060-kvm",
"hostname": "strfry-1",
"ipaddress": "192.168.122.54",
"roles": [
"base",
"kvm_guest",
"strfry",
"ldap_client"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"kosmos_kvm::guest",
"kosmos-dirsrv::hostsfile",
"strfry",
"strfry::default",
"kosmos_strfry::policies",
"kosmos_strfry::firewall",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
"ntp::default",
"ntp::apparmor",
"kosmos-base::systemd_emails",
"apt::unattended-upgrades",
"kosmos-base::firewall",
"kosmos-postfix::default",
"postfix::default",
"postfix::_common",
"postfix::_attributes",
"postfix::sasl_auth",
"hostname::default",
"deno::default"
],
"platform": "ubuntu",
"platform_version": "22.04",
"cloud": null,
"chef_packages": {
"chef": {
"version": "18.4.12",
"chef_root": "/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/chef-18.4.12/lib",
"chef_effortless": null
},
"ohai": {
"version": "18.1.11",
"ohai_root": "/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.1.11/lib/ohai"
}
}
},
"run_list": [
"role[base]",
"role[kvm_guest]",
"role[strfry]"
]
}

View File

@@ -8,16 +8,19 @@
"automatic": { "automatic": {
"fqdn": "wiki-1", "fqdn": "wiki-1",
"os": "linux", "os": "linux",
"os_version": "5.4.0-91-generic", "os_version": "5.4.0-167-generic",
"hostname": "wiki-1", "hostname": "wiki-1",
"ipaddress": "192.168.122.26", "ipaddress": "192.168.122.26",
"roles": [ "roles": [
"kvm_guest" "base",
"kvm_guest",
"ldap_client"
], ],
"recipes": [ "recipes": [
"kosmos-base", "kosmos-base",
"kosmos-base::default", "kosmos-base::default",
"kosmos_kvm::guest", "kosmos_kvm::guest",
"kosmos-dirsrv::hostsfile",
"kosmos-mediawiki", "kosmos-mediawiki",
"kosmos-mediawiki::default", "kosmos-mediawiki::default",
"apt::default", "apt::default",
@@ -41,7 +44,6 @@
"php::package", "php::package",
"php::ini", "php::ini",
"composer::global_configs", "composer::global_configs",
"kosmos-dirsrv::hostsfile",
"mediawiki::default", "mediawiki::default",
"mediawiki::database", "mediawiki::database",
"kosmos-nginx::default", "kosmos-nginx::default",
@@ -79,4 +81,4 @@
"role[ldap_client]", "role[ldap_client]",
"recipe[kosmos-mediawiki]" "recipe[kosmos-mediawiki]"
] ]
} }

View File

@@ -3,4 +3,5 @@ name "gitea"
run_list %w( run_list %w(
role[postgresql_client] role[postgresql_client]
kosmos_gitea::default kosmos_gitea::default
kosmos_gitea::backup
) )

View File

@@ -3,7 +3,6 @@ name "lnd"
run_list %w( run_list %w(
kosmos-bitcoin::lnd kosmos-bitcoin::lnd
kosmos-bitcoin::lnd-scb-s3 kosmos-bitcoin::lnd-scb-s3
kosmos-bitcoin::boltz
kosmos-bitcoin::rtl kosmos-bitcoin::rtl
kosmos-bitcoin::peerswap-lnd kosmos-bitcoin::peerswap-lnd
) )

View File

@@ -28,7 +28,9 @@ production_run_list = %w(
kosmos_liquor-cabinet::nginx kosmos_liquor-cabinet::nginx
kosmos_rsk::nginx_testnet kosmos_rsk::nginx_testnet
kosmos_rsk::nginx_mainnet kosmos_rsk::nginx_mainnet
kosmos_strfry::nginx
kosmos_website::default kosmos_website::default
kosmos_website::redirects
kosmos-akkounts::nginx kosmos-akkounts::nginx
kosmos-akkounts::nginx_api kosmos-akkounts::nginx_api
kosmos-bitcoin::nginx_lndhub kosmos-bitcoin::nginx_lndhub

8
roles/strfry.rb Normal file
View File

@@ -0,0 +1,8 @@
name "strfry"
run_list %w(
role[ldap_client]
strfry::default
kosmos_strfry::policies
kosmos_strfry::firewall
)

View File

@@ -42,5 +42,5 @@ default['backup']['orbit']['keep'] = 10
default['backup']['cron']['hour'] = "05" default['backup']['cron']['hour'] = "05"
default['backup']['cron']['minute'] = "7" default['backup']['cron']['minute'] = "7"
default['backup']['s3']['keep'] = 15 default['backup']['s3']['keep'] = 10
default['backup']['s3']['bucket'] = "kosmos-dev-backups" default['backup']['s3']['bucket'] = "kosmos-backups"

View File

@@ -28,6 +28,7 @@ template "#{backup_dir}/config.rb" do
sensitive true sensitive true
variables s3_access_key_id: backup_data["s3_access_key_id"], variables s3_access_key_id: backup_data["s3_access_key_id"],
s3_secret_access_key: backup_data["s3_secret_access_key"], s3_secret_access_key: backup_data["s3_secret_access_key"],
s3_endpoint: backup_data["s3_endpoint"],
s3_region: backup_data["s3_region"], s3_region: backup_data["s3_region"],
encryption_password: backup_data["encryption_password"], encryption_password: backup_data["encryption_password"],
mail_from: "backups@kosmos.org", mail_from: "backups@kosmos.org",

View File

@@ -23,6 +23,10 @@ Storage::S3.defaults do |s3|
s3.secret_access_key = "<%= @s3_secret_access_key %>" s3.secret_access_key = "<%= @s3_secret_access_key %>"
s3.region = "<%= @s3_region %>" s3.region = "<%= @s3_region %>"
s3.bucket = "<%= node['backup']['s3']['bucket'] %>" s3.bucket = "<%= node['backup']['s3']['bucket'] %>"
s3.fog_options = {
endpoint: "<%= @s3_endpoint %>",
aws_signature_version: 2
}
end end
Encryptor::OpenSSL.defaults do |encryption| Encryptor::OpenSSL.defaults do |encryption|
@@ -88,7 +92,6 @@ end
preconfigure 'KosmosBackup' do preconfigure 'KosmosBackup' do
split_into_chunks_of 250 # megabytes split_into_chunks_of 250 # megabytes
store_with S3
compress_with Bzip2 compress_with Bzip2
encrypt_with OpenSSL encrypt_with OpenSSL
notify_by Mail do |mail| notify_by Mail do |mail|

1
site-cookbooks/deno Submodule

Submodule site-cookbooks/deno added at 617f7959ab

View File

@@ -22,6 +22,7 @@ node.default['akkounts']['lndhub']['public_key'] = nil
node.default['akkounts']['lndhub']['postgres_db'] = 'lndhub' node.default['akkounts']['lndhub']['postgres_db'] = 'lndhub'
node.default['akkounts']['nostr']['public_key'] = nil node.default['akkounts']['nostr']['public_key'] = nil
node.default['akkounts']['nostr']['relay_url'] = nil
node.default['akkounts']['s3_enabled'] = true node.default['akkounts']['s3_enabled'] = true
node.default['akkounts']['s3_endpoint'] = "https://s3.kosmos.org" node.default['akkounts']['s3_endpoint'] = "https://s3.kosmos.org"

View File

@@ -163,6 +163,7 @@ env[:mediawiki_public_url] = node['mediawiki']['url']
env[:nostr_private_key] = credentials['nostr_private_key'] env[:nostr_private_key] = credentials['nostr_private_key']
env[:nostr_public_key] = node['akkounts']['nostr']['public_key'] env[:nostr_public_key] = node['akkounts']['nostr']['public_key']
env[:nostr_relay_url] = node['akkounts']['nostr']['relay_url']
# #
# remoteStorage / Liquor Cabinet # remoteStorage / Liquor Cabinet

View File

@@ -1,5 +1,5 @@
node.default['bitcoin']['version'] = '26.0' node.default['bitcoin']['version'] = '28.0'
node.default['bitcoin']['checksum'] = 'ab1d99276e28db62d1d9f3901e85ac358d7f1ebcb942d348a9c4e46f0fcdc0a1' node.default['bitcoin']['checksum'] = '700ae2d1e204602eb07f2779a6e6669893bc96c0dca290593f80ff8e102ff37f'
node.default['bitcoin']['username'] = 'satoshi' node.default['bitcoin']['username'] = 'satoshi'
node.default['bitcoin']['usergroup'] = 'bitcoin' node.default['bitcoin']['usergroup'] = 'bitcoin'
node.default['bitcoin']['network'] = 'mainnet' node.default['bitcoin']['network'] = 'mainnet'
@@ -24,7 +24,8 @@ node.default['bitcoin']['conf'] = {
rpcbind: "127.0.0.1:8332", rpcbind: "127.0.0.1:8332",
gen: 0, gen: 0,
zmqpubrawblock: 'tcp://127.0.0.1:8337', zmqpubrawblock: 'tcp://127.0.0.1:8337',
zmqpubrawtx: 'tcp://127.0.0.1:8338' zmqpubrawtx: 'tcp://127.0.0.1:8338',
deprecatedrpc: 'warnings' # TODO remove when upgrading to LND 0.18.4
} }
# Also enables Tor for LND # Also enables Tor for LND
@@ -40,7 +41,7 @@ node.default['c-lightning']['log_level'] = 'info'
node.default['c-lightning']['public_ip'] = '148.251.237.73' node.default['c-lightning']['public_ip'] = '148.251.237.73'
node.default['lnd']['repo'] = 'https://github.com/lightningnetwork/lnd' node.default['lnd']['repo'] = 'https://github.com/lightningnetwork/lnd'
node.default['lnd']['revision'] = 'v0.17.3-beta' node.default['lnd']['revision'] = 'v0.18.3-beta'
node.default['lnd']['source_dir'] = '/opt/lnd' node.default['lnd']['source_dir'] = '/opt/lnd'
node.default['lnd']['lnd_dir'] = "/home/#{node['bitcoin']['username']}/.lnd" node.default['lnd']['lnd_dir'] = "/home/#{node['bitcoin']['username']}/.lnd"
node.default['lnd']['alias'] = 'ln2.kosmos.org' node.default['lnd']['alias'] = 'ln2.kosmos.org'
@@ -58,19 +59,8 @@ node.default['lnd']['tor'] = {
'skip-proxy-for-clearnet-targets' => 'true' 'skip-proxy-for-clearnet-targets' => 'true'
} }
node.default['boltz']['repo'] = 'https://github.com/BoltzExchange/boltz-lnd.git'
node.default['boltz']['revision'] = 'v1.2.7'
node.default['boltz']['source_dir'] = '/opt/boltz'
node.default['boltz']['boltz_dir'] = "/home/#{node['bitcoin']['username']}/.boltz-lnd"
node.default['boltz']['grpc_host'] = '127.0.0.1'
node.default['boltz']['grpc_port'] = '9002'
node.default['boltz']['rest_disabled'] = 'false'
node.default['boltz']['rest_host'] = '127.0.0.1'
node.default['boltz']['rest_port'] = '9003'
node.default['boltz']['no_macaroons'] = 'false'
node.default['rtl']['repo'] = 'https://github.com/Ride-The-Lightning/RTL.git' node.default['rtl']['repo'] = 'https://github.com/Ride-The-Lightning/RTL.git'
node.default['rtl']['revision'] = 'v0.15.0' node.default['rtl']['revision'] = 'v0.15.2'
node.default['rtl']['host'] = '10.1.1.163' node.default['rtl']['host'] = '10.1.1.163'
node.default['rtl']['port'] = '3000' node.default['rtl']['port'] = '3000'

View File

@@ -11,6 +11,7 @@ credentials = Chef::EncryptedDataBagItem.load('credentials', 'backup')
file "/root/.aws/config" do file "/root/.aws/config" do
mode "600" mode "600"
sensitive true
content lazy { <<-EOF content lazy { <<-EOF
[default] [default]
region = #{credentials["s3_region"]} region = #{credentials["s3_region"]}

View File

@@ -12,8 +12,15 @@ if node["bitcoin"]["blocksdir_mount_type"]
include_recipe "kosmos-bitcoin::blocksdir-mount" include_recipe "kosmos-bitcoin::blocksdir-mount"
end end
%w{ libtool autotools-dev make automake cmake curl g++-multilib libtool apt_repository "ubuntu-toolchain-r" do
binutils-gold bsdmainutils pkg-config python3 patch }.each do |pkg| # provides g++-13, needed for better c++-20 support
uri "ppa:ubuntu-toolchain-r/test"
end
%w{
gcc-13 g++-13 libtool autotools-dev make automake cmake curl bison
binutils-gold pkg-config python3 patch
}.each do |pkg|
apt_package pkg apt_package pkg
end end
@@ -26,20 +33,21 @@ end
execute "compile_bitcoin-core_dependencies" do execute "compile_bitcoin-core_dependencies" do
cwd "/usr/local/bitcoind/depends" cwd "/usr/local/bitcoind/depends"
command "make NO_QT=1" environment ({'CC' => 'gcc-13', 'CXX' => 'g++-13', 'NO_QT' => '1'})
command "make -j 2"
action :nothing action :nothing
notifies :run, 'bash[compile_bitcoin-core]', :immediately notifies :run, 'bash[compile_bitcoin-core]', :immediately
end end
bash "compile_bitcoin-core" do bash "compile_bitcoin-core" do
cwd "/usr/local/bitcoind" cwd "/usr/local/bitcoind"
environment ({'CC' => 'gcc-13', 'CXX' => 'g++-13', 'NO_QT' => '1'})
code <<-EOH code <<-EOH
./autogen.sh ./autogen.sh
./configure --prefix=$PWD/depends/x86_64-pc-linux-gnu ./configure --prefix=$PWD/depends/x86_64-pc-linux-gnu
make make
EOH EOH
action :nothing action :nothing
notifies :restart, "systemd_unit[bitcoind.service]", :delayed
end end
link "/usr/local/bin/bitcoind" do link "/usr/local/bin/bitcoind" do

View File

@@ -1,87 +0,0 @@
#
# Cookbook:: kosmos-bitcoin
# Recipe:: boltz
#
include_recipe "git"
include_recipe "kosmos-bitcoin::golang"
git node['boltz']['source_dir'] do
repository node['boltz']['repo']
revision node['boltz']['revision']
action :sync
notifies :run, 'bash[compile_and_install_boltz]', :immediately
end
bash "compile_and_install_boltz" do
cwd node['boltz']['source_dir']
code <<-EOH
go mod vendor && \
make build && \
make install
EOH
action :nothing
notifies :restart, "systemd_unit[boltzd.service]", :delayed
end
bitcoin_user = node['bitcoin']['username']
bitcoin_group = node['bitcoin']['usergroup']
boltz_dir = node['boltz']['boltz_dir']
lnd_dir = node['lnd']['lnd_dir']
directory boltz_dir do
owner bitcoin_user
group bitcoin_group
mode '0750'
action :create
end
template "#{boltz_dir}/boltz.toml" do
source "boltz.toml.erb"
owner bitcoin_user
group bitcoin_group
mode '0640'
variables lnd_grpc_host: '127.0.0.1',
lnd_grpc_port: '10009',
lnd_macaroon_path: "#{lnd_dir}/data/chain/bitcoin/mainnet/admin.macaroon",
lnd_tlscert_path: "#{lnd_dir}/tls.cert",
boltz_config: node['boltz']
notifies :restart, "systemd_unit[boltzd.service]", :delayed
end
systemd_unit 'boltzd.service' do
content({
Unit: {
Description: 'Boltz Daemon',
Documentation: ['https://lnd.docs.boltz.exchange'],
Requires: 'lnd.service',
After: 'lnd.service'
},
Service: {
User: bitcoin_user,
Group: bitcoin_group,
Type: 'simple',
ExecStart: "/opt/boltz/boltzd",
Restart: 'always',
RestartSec: '30',
TimeoutSec: '240',
LimitNOFILE: '128000',
PrivateTmp: true,
ProtectSystem: 'full',
NoNewPrivileges: true,
PrivateDevices: true,
MemoryDenyWriteExecute: true
},
Install: {
WantedBy: 'multi-user.target'
}
})
verify false
triggers_reload true
action [:create, :enable, :start]
end
unless node.chef_environment == 'development'
node.override['backup']['archives']['boltz'] = [node['boltz']['boltz_dir']]
include_recipe 'backup'
end

View File

@@ -5,7 +5,7 @@
# Internal recipe for managing the Go installation in one place # Internal recipe for managing the Go installation in one place
# #
node.override['golang']['version'] = "1.20.3" node.override['golang']['version'] = "1.23.1"
include_recipe "golang" include_recipe "golang"
link '/usr/local/bin/go' do link '/usr/local/bin/go' do

View File

@@ -10,12 +10,14 @@ include_recipe "kosmos-bitcoin::aws-client"
package "inotify-tools" package "inotify-tools"
backup_script_path = "/opt/lnd-channel-backup-s3.sh" backup_script_path = "/opt/lnd-channel-backup-s3.sh"
backup_credentials = Chef::EncryptedDataBagItem.load('credentials', 'backup')
template backup_script_path do template backup_script_path do
source "lnd-channel-backup-s3.sh.erb" source "lnd-channel-backup-s3.sh.erb"
mode '0740' mode '0740'
variables lnd_dir: node['lnd']['lnd_dir'], variables lnd_dir: node['lnd']['lnd_dir'],
bitcoin_network: node['bitcoin']['network'], bitcoin_network: node['bitcoin']['network'],
s3_endpoint: backup_credentials['s3_endpoint'],
s3_bucket: node['backup']['s3']['bucket'], s3_bucket: node['backup']['s3']['bucket'],
s3_scb_dir: "#{node['name']}/lnd/#{node['bitcoin']['network']}" s3_scb_dir: "#{node['name']}/lnd/#{node['bitcoin']['network']}"
notifies :restart, "systemd_unit[lnd-channel-backup.service]", :delayed notifies :restart, "systemd_unit[lnd-channel-backup.service]", :delayed

View File

@@ -46,24 +46,22 @@ rtl_config = {
multiPassHashed: credentials["multiPassHashed"] multiPassHashed: credentials["multiPassHashed"]
} }
if node['boltz']
# TODO adapt for multi-node usage
rtl_config[:nodes][0][:Authentication][:boltzMacaroonPath] = "#{node['boltz']['boltz_dir']}/macaroons"
rtl_config[:nodes][0][:Settings][:boltzServerUrl] = "https://#{node['boltz']['rest_host']}:#{node['boltz']['rest_port']}"
end
git rtl_dir do git rtl_dir do
user bitcoin_user user bitcoin_user
group bitcoin_group group bitcoin_group
repository node['rtl']['repo'] repository node['rtl']['repo']
revision node['rtl']['revision'] revision node['rtl']['revision']
notifies :run, "execute[npm_install]", :immediately
notifies :restart, "systemd_unit[#{app_name}.service]", :delayed notifies :restart, "systemd_unit[#{app_name}.service]", :delayed
end end
execute "npm install" do execute "npm_install" do
cwd rtl_dir cwd rtl_dir
environment "HOME" => rtl_dir environment "HOME" => rtl_dir
user bitcoin_user user bitcoin_user
# TODO remove --force when upstream dependency issues have been resolved
command "npm install --force"
action :nothing
end end
file "#{rtl_dir}/RTL-Config.json" do file "#{rtl_dir}/RTL-Config.json" do

View File

@@ -1,32 +0,0 @@
[LND]
# Host of the gRPC interface of LND
host = "<%= @lnd_grpc_host %>"
# Port of the gRPC interface of LND
port = <%= @lnd_grpc_port %>
# Path to a macaroon file of LND
# The daemon needs to have permission to read various endpoints, generate addresses and pay invoices
macaroon = "<%= @lnd_macaroon_path %>"
# Path to the TLS certificate of LND
certificate = "<%= @lnd_tlscert_path %>"
[RPC]
# Host of the gRPC interface
host = "<%= @boltz_config['grpc_host'] %>"
# Port of the gRPC interface
port = <%= @boltz_config['grpc_port'] %>
# Whether the REST proxy for the gRPC interface should be disabled
restDisabled = <%= @boltz_config['rest_disabled'] %>
# Host of the REST proxy
restHost = "<%= @boltz_config['rest_host'] %>"
# Port of the REST proxy
restPort = <%= @boltz_config['rest_port'] %>
# Whether the macaroon authentication for the gRPC and REST interface should be disabled
noMacaroons = <%= @boltz_config['no_macaroons'] %>

View File

@@ -3,5 +3,5 @@ set -xe -o pipefail
while true; do while true; do
inotifywait <%= @lnd_dir %>/data/chain/bitcoin/<%= @bitcoin_network %>/channel.backup inotifywait <%= @lnd_dir %>/data/chain/bitcoin/<%= @bitcoin_network %>/channel.backup
aws s3 cp <%= @lnd_dir %>/data/chain/bitcoin/<%= @bitcoin_network %>/channel.backup "s3://<%= @s3_bucket %>/<%= @s3_scb_dir %>/channel.backup" aws --endpoint <%= @s3_endpoint %> s3 cp <%= @lnd_dir %>/data/chain/bitcoin/<%= @bitcoin_network %>/channel.backup "s3://<%= @s3_bucket %>/<%= @s3_scb_dir %>/channel.backup"
done done

View File

@@ -12,7 +12,6 @@ minchansize=<%= @lnd_minchansize %>
autopilot.active=0 autopilot.active=0
[Bitcoin] [Bitcoin]
bitcoin.active=1
bitcoin.mainnet=1 bitcoin.mainnet=1
bitcoin.node=bitcoind bitcoin.node=bitcoind
bitcoin.basefee=<%= @lnd_basefee %> bitcoin.basefee=<%= @lnd_basefee %>

View File

@@ -155,7 +155,7 @@ admin_users = ejabberd_credentials['admins']
hosts.each do |host| hosts.each do |host|
ldap_rootdn = "uid=service,ou=#{host[:name]},cn=applications,dc=kosmos,dc=org" ldap_rootdn = "uid=service,ou=#{host[:name]},cn=applications,dc=kosmos,dc=org"
if host[:name] == "kosmos.org" if host[:name] == "kosmos.org"
ldap_filter = "(&(objectClass=person)(serviceEnabled=xmpp))" ldap_filter = "(&(objectClass=person)(serviceEnabled=ejabberd))"
else else
ldap_filter = "(objectClass=person)" ldap_filter = "(objectClass=person)"
end end

View File

@@ -216,7 +216,7 @@ modules:
access_createnode: pubsub_createnode access_createnode: pubsub_createnode
ignore_pep_from_offline: false ignore_pep_from_offline: false
last_item_cache: false last_item_cache: false
max_items_node: 10 max_items_node: 10000
plugins: plugins:
- "flat" - "flat"
- "pep" # pep requires mod_caps - "pep" # pep requires mod_caps

View File

@@ -10,7 +10,7 @@ node.default["kosmos-mastodon"]["redis_url"] = "redis://localhost:6379/0
node.default["kosmos-mastodon"]["sidekiq_threads"] = 25 node.default["kosmos-mastodon"]["sidekiq_threads"] = 25
node.default["kosmos-mastodon"]["allowed_private_addresses"] = "127.0.0.1" node.default["kosmos-mastodon"]["allowed_private_addresses"] = "127.0.0.1"
node.default["kosmos-mastodon"]["onion_address"] = nil node.default["kosmos-mastodon"]["onion_address"] = nil
# Allocate this amount of RAM to the Java heap for Elasticsearch # Allocate this amount of RAM to the Java heap for Elasticsearch
node.default["kosmos-mastodon"]["elasticsearch"]["allocated_memory"] = "1536m" node.default["kosmos-mastodon"]["elasticsearch"]["allocated_memory"] = "1536m"
@@ -20,6 +20,10 @@ node.default["kosmos-mastodon"]["s3_region"] = nil
node.default["kosmos-mastodon"]["s3_bucket"] = nil node.default["kosmos-mastodon"]["s3_bucket"] = nil
node.default["kosmos-mastodon"]["s3_alias_host"] = nil node.default["kosmos-mastodon"]["s3_alias_host"] = nil
node.default["kosmos-mastodon"]["sso_account_sign_up_url"] = "https://kosmos.org"
node.default["kosmos-mastodon"]["sso_account_reset_password_url"] = "https://accounts.kosmos.org/users/password/new"
node.default["kosmos-mastodon"]["sso_account_resend_confirmation_url"] = "https://accounts.kosmos.org/users/confirmation/new"
node.default["kosmos-mastodon"]["default_locale"] = "en" node.default["kosmos-mastodon"]["default_locale"] = "en"
node.default["kosmos-mastodon"]["libre_translate_endpoint"] = nil node.default["kosmos-mastodon"]["libre_translate_endpoint"] = nil

View File

@@ -6,13 +6,12 @@
postgresql_data_bag_item = data_bag_item('credentials', 'postgresql') postgresql_data_bag_item = data_bag_item('credentials', 'postgresql')
unless node.chef_environment == "development" unless node.chef_environment == "development"
unless node["backup"]["postgresql"]["databases"].keys.include? 'mastodon' node.override['backup']['s3']['keep'] = 1
node.override["backup"]["postgresql"]["host"] = "pg.kosmos.local" node.override["backup"]["postgresql"]["host"] = "pg.kosmos.local"
node.override["backup"]["postgresql"]["databases"]["mastodon"] = { node.override["backup"]["postgresql"]["databases"]["mastodon"] = {
username: "mastodon", username: "mastodon",
password: postgresql_data_bag_item['mastodon_user_password'] password: postgresql_data_bag_item['mastodon_user_password']
} }
end
include_recipe "backup" include_recipe "backup"
end end

View File

@@ -190,6 +190,7 @@ template "#{mastodon_path}/.env.#{rails_env}" do
mode "0640" mode "0640"
owner mastodon_user owner mastodon_user
group mastodon_user group mastodon_user
sensitive true
variables redis_url: node["kosmos-mastodon"]["redis_url"], variables redis_url: node["kosmos-mastodon"]["redis_url"],
domain: node["kosmos-mastodon"]["domain"], domain: node["kosmos-mastodon"]["domain"],
alternate_domains: node["kosmos-mastodon"]["alternate_domains"], alternate_domains: node["kosmos-mastodon"]["alternate_domains"],
@@ -210,6 +211,9 @@ template "#{mastodon_path}/.env.#{rails_env}" do
vapid_public_key: credentials['vapid_public_key'], vapid_public_key: credentials['vapid_public_key'],
db_pass: postgresql_credentials['mastodon_user_password'], db_pass: postgresql_credentials['mastodon_user_password'],
db_host: "pg.kosmos.local", db_host: "pg.kosmos.local",
sso_account_sign_up_url: node["kosmos-mastodon"]["sso_account_sign_up_url"],
sso_account_reset_password_url: node["kosmos-mastodon"]["sso_account_reset_password_url"],
sso_account_resend_confirmation_url: node["kosmos-mastodon"]["sso_account_resend_confirmation_url"],
default_locale: node["kosmos-mastodon"]["default_locale"], default_locale: node["kosmos-mastodon"]["default_locale"],
allowed_private_addresses: node["kosmos-mastodon"]["allowed_private_addresses"], allowed_private_addresses: node["kosmos-mastodon"]["allowed_private_addresses"],
libre_translate_endpoint: node["kosmos-mastodon"]["libre_translate_endpoint"] libre_translate_endpoint: node["kosmos-mastodon"]["libre_translate_endpoint"]

View File

@@ -28,7 +28,9 @@ template "#{node['openresty']['dir']}/snippets/mastodon.conf" do
owner 'www-data' owner 'www-data'
mode 0640 mode 0640
variables web_root_dir: web_root_dir, variables web_root_dir: web_root_dir,
server_name: server_name server_name: server_name,
s3_private_url: "#{node["kosmos-mastodon"]["s3_endpoint"]}/#{node["kosmos-mastodon"]["s3_bucket"]}/",
s3_public_url: "https://#{node["kosmos-mastodon"]["s3_alias_host"]}/"
notifies :reload, 'service[openresty]', :delayed notifies :reload, 'service[openresty]', :delayed
end end

View File

@@ -44,6 +44,9 @@ LDAP_SEARCH_FILTER='<%= @ldap[:search_filter] %>'
LDAP_UID_CONVERSION_ENABLED=<%= @ldap[:uid_conversion_enabled] %> LDAP_UID_CONVERSION_ENABLED=<%= @ldap[:uid_conversion_enabled] %>
LDAP_UID_CONVERSION_SEARCH=<%= @ldap[:uid_conversion_search] %> LDAP_UID_CONVERSION_SEARCH=<%= @ldap[:uid_conversion_search] %>
LDAP_UID_CONVERSION_REPLACE=<%= @ldap[:uid_conversion_replace] %> LDAP_UID_CONVERSION_REPLACE=<%= @ldap[:uid_conversion_replace] %>
SSO_ACCOUNT_SIGN_UP=<%= @sso_account_sign_up_url %>
SSO_ACCOUNT_RESET_PASSWORD=<%= @sso_account_reset_password_url %>
SSO_ACCOUNT_RESEND_CONFIRMATION=<%= @sso_account_resend_confirmation_url %>
<% end %> <% end %>
# Optional asset host for multi-server setups # Optional asset host for multi-server setups

View File

@@ -108,11 +108,13 @@ location @proxy {
proxy_pass http://mastodon_app; proxy_pass http://mastodon_app;
proxy_buffering on; proxy_buffering on;
proxy_redirect off;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade; proxy_set_header Connection $connection_upgrade;
# https://github.com/mastodon/mastodon/issues/24380
proxy_redirect <%= @s3_private_url %> <%= @s3_public_url %>;
tcp_nodelay on; tcp_nodelay on;
} }

View File

@@ -1,5 +1,5 @@
node.default["gitea"]["version"] = "1.22.0" node.default["gitea"]["version"] = "1.22.1"
node.default["gitea"]["checksum"] = "a31086f073cb9592d28611394b2de3655db515d961e4fdcf5b549cb40753ef3d" node.default["gitea"]["checksum"] = "b8043324545eec269fc8f18c22b49fc365ed367e0dd41e081b79832de2570f9c"
node.default["gitea"]["working_directory"] = "/var/lib/gitea" node.default["gitea"]["working_directory"] = "/var/lib/gitea"
node.default["gitea"]["port"] = 3000 node.default["gitea"]["port"] = 3000
node.default["gitea"]["postgresql_host"] = "localhost:5432" node.default["gitea"]["postgresql_host"] = "localhost:5432"

View File

@@ -8,5 +8,6 @@
unless node.chef_environment == "development" unless node.chef_environment == "development"
# backup the data dir and the config files # backup the data dir and the config files
node.override["backup"]["archives"]["gitea"] = [node["gitea"]["working_directory"]] node.override["backup"]["archives"]["gitea"] = [node["gitea"]["working_directory"]]
node.override['backup']['s3']['keep'] = 2
include_recipe "backup" include_recipe "backup"
end end

View File

@@ -21,8 +21,13 @@ server {
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;
proxy_http_version 1.1;
expires 30d; expires 30d;
proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
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;
} }
# Docker registry # Docker registry
@@ -30,12 +35,22 @@ server {
client_max_body_size 0; client_max_body_size 0;
proxy_buffers 1024 8k; proxy_buffers 1024 8k;
proxy_pass http://_gitea_web; proxy_pass http://_gitea_web;
proxy_http_version 1.1; proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
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;
} }
location / { location / {
proxy_buffers 1024 8k; proxy_buffers 1024 8k;
proxy_pass http://_gitea_web; proxy_pass http://_gitea_web;
proxy_http_version 1.1; proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
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;
} }
} }

View File

@@ -1,9 +1,10 @@
ubuntu_server_cloud_image_release = "20230506" release = "20240514"
img_filename = "ubuntu-22.04-server-cloudimg-amd64-disk-kvm"
node.default["kosmos_kvm"]["host"]["qemu_base_image"] = { node.default["kosmos_kvm"]["host"]["qemu_base_image"] = {
"url" => "https://cloud-images.ubuntu.com/releases/focal/release-#{ubuntu_server_cloud_image_release}/ubuntu-20.04-server-cloudimg-amd64-disk-kvm.img", "url" => "https://cloud-images.ubuntu.com/releases/jammy/release-#{release}/#{img_filename}.img",
"checksum" => "27d2b91fd2b715729d739e2a3155dce70d1aaae4f05c177f338b9d4b60be638c", "checksum" => "2e7698b3ebd7caead06b08bd3ece241e6ce294a6db01f92ea12bcb56d6972c3f",
"path" => "/var/lib/libvirt/images/base/ubuntu-20.04-server-cloudimg-amd64-disk-kvm-#{ubuntu_server_cloud_image_release}.qcow2" "path" => "/var/lib/libvirt/images/base/#{img_filename}-#{release}.qcow2"
} }
# A systemd.timer OnCalendar config value # A systemd.timer OnCalendar config value

View File

@@ -0,0 +1,20 @@
Copyright (c) 2024 Kosmos Developers
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,4 @@
kosmos_strfry
=============
Installs/configures a strfry relay and its reverse proxy config

View File

@@ -0,0 +1,2 @@
node.default["strfry"]["ldap_search_dn"] = "ou=kosmos.org,cn=users,dc=kosmos,dc=org"
node.default["strfry"]["extras_dir"] = "/opt/strfry"

View File

@@ -0,0 +1,10 @@
name 'kosmos_strfry'
maintainer 'Kosmos'
maintainer_email 'mail@kosmos.org'
license 'MIT'
description 'strfry wrapper cookbook'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '0.1.0'
depends 'kosmos_openresty'
depends 'deno'

View File

@@ -0,0 +1,13 @@
#
# Cookbook Name:: kosmos_strfry
# Recipe:: firewall
#
include_recipe "kosmos-base::firewall"
firewall_rule "strfry" do
port node["strfry"]["port"]
source "10.1.1.0/24"
protocol :tcp
command :allow
end

View File

@@ -0,0 +1,29 @@
#
# Cookbook Name:: kosmos_strfry
# Recipe:: nginx
#
domain = node["strfry"]["domain"]
upstream_hosts = []
search(:node, 'role:strfry').each do |node|
upstream_hosts << node['knife_zero']['host']
end
if upstream_hosts.empty?
Chef::Log.warn("No node found with 'strfry' role. Not configuring nginx site.")
return
end
tls_cert_for domain do
auth "gandi_dns"
action :create
end
openresty_site domain do
template "nginx_conf_strfry.erb"
variables domain: domain,
upstream_port: node['strfry']['port'],
upstream_hosts: upstream_hosts,
ssl_cert: "/etc/letsencrypt/live/#{domain}/fullchain.pem",
ssl_key: "/etc/letsencrypt/live/#{domain}/privkey.pem"
end

View File

@@ -0,0 +1,83 @@
#
# Cookbook Name:: kosmos_strfry
# Recipe:: policies
#
include_recipe "deno"
#
# config
#
ldap_credentials = Chef::EncryptedDataBagItem.load('credentials', 'dirsrv')
extras_dir = node["strfry"]["extras_dir"]
directory extras_dir do
owner node["strfry"]["user"]
group node["strfry"]["group"]
mode "0755"
end
env = {
ldap_url: 'ldap://ldap.kosmos.local:389', # requires "ldap_client" role
ldap_bind_dn: ldap_credentials["service_dn"],
ldap_password: ldap_credentials["service_password"],
ldap_search_dn: node["strfry"]["ldap_search_dn"],
whitelist_pubkeys: node["strfry"]["whitelist_pubkeys"].join(",")
}
template "#{extras_dir}/.env" do
source 'env.erb'
owner node["strfry"]["user"]
group node["strfry"]["group"]
mode 0600
sensitive true
variables config: env
notifies :restart, "service[strfry]", :delayed
end
#
# strfry deno scripts
#
base_url = "https://gitea.kosmos.org/kosmos/akkounts/raw/branch/live/extras/strfry"
remote_file "#{extras_dir}/deno.json" do
source "#{base_url}/deno.json"
owner node["strfry"]["user"]
group node["strfry"]["group"]
mode "0644"
notifies :restart, "service[strfry]", :delayed
end
remote_file "#{extras_dir}/deno.lock" do
source "#{base_url}/deno.lock"
owner node["strfry"]["user"]
group node["strfry"]["group"]
mode "0644"
notifies :restart, "service[strfry]", :delayed
end
remote_file "#{extras_dir}/strfry-policy.ts" do
source "#{base_url}/strfry-policy.ts"
owner node["strfry"]["user"]
group node["strfry"]["group"]
mode "0755"
notifies :restart, "service[strfry]", :delayed
end
remote_file "#{extras_dir}/ldap-policy.ts" do
source "#{base_url}/ldap-policy.ts"
owner node["strfry"]["user"]
group node["strfry"]["group"]
mode "0644"
notifies :restart, "service[strfry]", :delayed
end
remote_file "#{extras_dir}/strfry-sync.ts" do
source "#{base_url}/strfry-sync.ts"
owner node["strfry"]["user"]
group node["strfry"]["group"]
mode "0644"
end

View File

@@ -0,0 +1,11 @@
<% @config.each do |key, value| %>
<% if value.is_a?(Hash) %>
<% value.each do |k, v| %>
<%= "#{key.upcase}_#{k.upcase}" %>=<%= v.to_s %>
<% end %>
<% else %>
<% if value %>
<%= key.upcase %>=<%= value.to_s %>
<% end %>
<% end %>
<% end %>

View File

@@ -0,0 +1,26 @@
upstream _strfry {
<% @upstream_hosts.each do |host| %>
server <%= host %>:<%= @upstream_port || "7777" %>;
<% end %>
}
server {
server_name <%= @domain %>;
listen <%= "#{node['openresty']['listen_ip']}:" if node['openresty']['listen_ip'] %>443 ssl http2;
listen [::]:443 ssl http2;
access_log "/var/log/nginx/<%= @domain %>.access.log";
error_log "/var/log/nginx/<%= @domain %>.error.log";
ssl_certificate <%= @ssl_cert %>;
ssl_certificate_key <%= @ssl_key %>;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://_strfry;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

View File

@@ -1,3 +1,4 @@
node.default["kosmos_website"]["domain"] = "kosmos.org" node.default["kosmos_website"]["domain"] = "kosmos.org"
node.default["kosmos_website"]["repo"] = "https://gitea.kosmos.org/kosmos/website.git" node.default["kosmos_website"]["repo"] = "https://gitea.kosmos.org/kosmos/website.git"
node.default["kosmos_website"]["revision"] = "chore/content" node.default["kosmos_website"]["revision"] = "chore/content"
node.default["kosmos_website"]["accounts_url"] = "https://accounts.kosmos.org"

View File

@@ -23,6 +23,7 @@ end
openresty_site domain do openresty_site domain do
template "nginx_conf_website.erb" template "nginx_conf_website.erb"
variables domain: domain, variables domain: domain,
accounts_url: node.default["kosmos_website"]["accounts_url"],
ssl_cert: "/etc/letsencrypt/live/#{domain}/fullchain.pem", ssl_cert: "/etc/letsencrypt/live/#{domain}/fullchain.pem",
ssl_key: "/etc/letsencrypt/live/#{domain}/privkey.pem" ssl_key: "/etc/letsencrypt/live/#{domain}/privkey.pem"
end end

View File

@@ -0,0 +1,35 @@
#
# Cookbook:: kosmos_website
# Recipe:: redirects
#
redirects = [
{
domain: "kosmos.chat",
target: "https://kosmos.org",
http_status: 307
},
{
domain: "kosmos.cash",
acme_domain: "letsencrypt.kosmos.org",
target: "https://kosmos.org",
http_status: 307
}
]
redirects.each do |redirect|
tls_cert_for redirect[:domain] do
auth "gandi_dns"
acme_domain redirect[:acme_domain] unless redirect[:acme_domain].nil?
action :create
end
openresty_site redirect[:domain] do
template "nginx_conf_redirect.erb"
variables domain: redirect[:domain],
target: redirect[:target],
http_status: redirect[:http_status],
ssl_cert: "/etc/letsencrypt/live/#{redirect[:domain]}/fullchain.pem",
ssl_key: "/etc/letsencrypt/live/#{redirect[:domain]}/privkey.pem"
end
end

View File

@@ -0,0 +1,20 @@
# Generated by Chef
server {
server_name <%= @domain %>;
listen <%= "#{node['openresty']['listen_ip']}:" if node['openresty']['listen_ip'] %>443 ssl http2;
listen [::]:443 ssl http2;
access_log <%= node[:openresty][:log_dir] %>/<%= @domain %>.access.log;
error_log <%= node[:openresty][:log_dir] %>/<%= @domain %>.error.log warn;
gzip_static on;
gzip_comp_level 5;
ssl_certificate <%= @ssl_cert %>;
ssl_certificate_key <%= @ssl_key %>;
location / {
return <%= @http_status || 301 %> <%= @target %>;
}
}

View File

@@ -0,0 +1,18 @@
# Generated by Chef
server {
server_name <%= @domain %>;
listen <%= "#{node['openresty']['listen_ip']}:" if node['openresty']['listen_ip'] %>443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/<%= @domain %>/public;
access_log <%= node[:openresty][:log_dir] %>/<%= @domain %>.access.log;
error_log <%= node[:openresty][:log_dir] %>/<%= @domain %>.error.log warn;
gzip_static on;
gzip_comp_level 5;
ssl_certificate <%= @ssl_cert %>;
ssl_certificate_key <%= @ssl_key %>;
}

View File

@@ -1,9 +1,18 @@
# Generated by Chef # Generated by Chef
server {
server_name _;
listen 80 default_server;
location / {
return 301 https://<%= @domain %>;
}
}
server { server {
server_name <%= @domain %>; server_name <%= @domain %>;
listen <%= "#{node['openresty']['listen_ip']}:" if node['openresty']['listen_ip'] %>443 ssl http2; listen <%= "#{node['openresty']['listen_ip']}:" if node['openresty']['listen_ip'] %>443 ssl http2 default_server;
listen [::]:443 ssl http2; listen [::]:443 ssl http2 default_server;
root /var/www/<%= @domain %>/public; root /var/www/<%= @domain %>/public;
@@ -18,8 +27,10 @@ server {
ssl_certificate <%= @ssl_cert %>; ssl_certificate <%= @ssl_cert %>;
ssl_certificate_key <%= @ssl_key %>; ssl_certificate_key <%= @ssl_key %>;
<% if @accounts_url %>
location ~ ^/.well-known/(webfinger|nostr|lnurlp|keysend) { location ~ ^/.well-known/(webfinger|nostr|lnurlp|keysend) {
proxy_ssl_server_name on; proxy_ssl_server_name on;
proxy_pass https://accounts.kosmos.org; proxy_pass https://accounts.kosmos.org;
} }
<% end %>
} }

View File

@@ -18,6 +18,7 @@ end
tls_cert_for domain do tls_cert_for domain do
auth "gandi_dns" auth "gandi_dns"
acme_domain "letsencrypt.kosmos.org"
action :create action :create
end end

1
site-cookbooks/strfry Submodule

Submodule site-cookbooks/strfry added at a4756377b4