From a80dde2e7f9380b1895fa845b5391f81c1958927 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Mon, 30 Jun 2025 10:14:25 -0300 Subject: [PATCH] Add container setup scripts for various services - Implemented ALM container setup with Forgejo installation and systemd service configuration. - Created Bot container setup with necessary dependencies and Node.js application installation. - Developed Desktop container setup with XRDP and Brave browser installation. - Established Directory container setup with Zitadel installation and service configuration. - Added Doc Editor container setup for Collabora Online integration. - Implemented Drive container setup with MinIO installation and service configuration. - Created Email container setup with Stalwart Mail installation and service configuration. - Developed Meeting container setup with LiveKit and TURN server configuration. - Added Proxy container setup with Caddy installation and service configuration. - Implemented System container setup for general bots with service configuration. - Created Table Editor container setup with NocoDB installation and service configuration. - Developed Tables container setup with PostgreSQL installation and configuration. - Added Webmail container setup with Roundcube installation and service configuration. - Included prompt guidelines for container setup scripts. --- Cargo.lock | 591 ++++++++++++++++++ Cargo.toml | 25 +- src/main.rs | 27 +- src/prompts/code/system-code.bas | 5 + src/scripts/{ => containers}/cleaner.sh | 0 .../install-libreoffice-online.sh | 0 src/scripts/{ => containers}/set-limits.sh | 0 src/scripts/{ => containers}/set-size-5GB.sh | 0 src/scripts/{ => containers}/setup-host.sh | 0 src/scripts/{ => containers}/startup.sh | 0 src/scripts/database/0001.sql | 6 + src/services/email.rs | 79 +-- src/services/file.rs | 2 +- src/services/state.rs | 1 + .../default => containers}/alm-ci/alm-ci.sh | 1 + .../tenants/default => containers}/alm/alm.sh | 0 .../tenants/default => containers}/bot/bot.sh | 8 +- .../default => containers}/desktop/desktop.sh | 11 +- .../directory/directory.sh | 0 .../doc-editor/doc-editor.sh | 0 .../default => containers}/drive/drive.sh | 0 .../default => containers}/email/email.sh | 0 .../default => containers}/meeting/meeting.sh | 0 .../tenants/default => containers}/prompt.txt | 0 .../default => containers}/proxy/proxy.sh | 0 .../tenants/default => containers}/social/.sh | 0 .../default => containers}/system/system.sh | 0 .../table-editor/table-editor.sh | 0 .../default => containers}/tables/tables.sh | 0 .../default => containers}/webmail/webmail.sh | 0 30 files changed, 688 insertions(+), 68 deletions(-) create mode 100644 src/prompts/code/system-code.bas rename src/scripts/{ => containers}/cleaner.sh (100%) rename src/scripts/{ => containers}/install-libreoffice-online.sh (100%) rename src/scripts/{ => containers}/set-limits.sh (100%) rename src/scripts/{ => containers}/set-size-5GB.sh (100%) rename src/scripts/{ => containers}/setup-host.sh (100%) rename src/scripts/{ => containers}/startup.sh (100%) create mode 100644 src/scripts/database/0001.sql rename src/templates/{opt/gbo/tenants/default => containers}/alm-ci/alm-ci.sh (99%) rename src/templates/{opt/gbo/tenants/default => containers}/alm/alm.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/bot/bot.sh (92%) rename src/templates/{opt/gbo/tenants/default => containers}/desktop/desktop.sh (86%) rename src/templates/{opt/gbo/tenants/default => containers}/directory/directory.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/doc-editor/doc-editor.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/drive/drive.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/email/email.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/meeting/meeting.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/prompt.txt (100%) rename src/templates/{opt/gbo/tenants/default => containers}/proxy/proxy.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/social/.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/system/system.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/table-editor/table-editor.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/tables/tables.sh (100%) rename src/templates/{opt/gbo/tenants/default => containers}/webmail/webmail.sh (100%) diff --git a/Cargo.lock b/Cargo.lock index 4319a5b..0ad2f16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -277,6 +277,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -511,6 +517,15 @@ dependencies = [ "syn 2.0.103", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -556,6 +571,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + [[package]] name = "bitflags" version = "1.3.2" @@ -567,6 +588,9 @@ name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +dependencies = [ + "serde", +] [[package]] name = "block-buffer" @@ -685,6 +709,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "convert_case" version = "0.4.0" @@ -751,6 +781,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -822,6 +861,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.4.0" @@ -883,6 +933,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -904,6 +955,21 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -952,6 +1018,17 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -995,6 +1072,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1073,6 +1161,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -1145,6 +1244,7 @@ dependencies = [ "minio", "serde", "serde_json", + "sqlx", "tempfile", "tokio", "tokio-stream", @@ -1246,6 +1346,10 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] [[package]] name = "hashbrown" @@ -1253,6 +1357,24 @@ version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "hermit-abi" version = "0.5.2" @@ -1265,6 +1387,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + [[package]] name = "hmac" version = "0.12.1" @@ -1274,6 +1405,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "http" version = "0.2.12" @@ -1708,6 +1848,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -1715,6 +1858,23 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libsqlite3-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -1774,6 +1934,16 @@ dependencies = [ "syn 2.0.103", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "md5" version = "0.7.0" @@ -1792,6 +1962,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "minio" version = "0.3.0" @@ -1877,6 +2053,16 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1887,12 +2073,49 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1900,6 +2123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2008,6 +2232,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -2037,6 +2276,27 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -2320,6 +2580,26 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rustc-demangle" version = "0.1.25" @@ -2578,6 +2858,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "slab" version = "0.4.10" @@ -2600,12 +2890,249 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +dependencies = [ + "ahash", + "atoi", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener 2.5.3", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rustls 0.21.12", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", + "webpki-roots 0.25.4", +] + +[[package]] +name = "sqlx-macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +dependencies = [ + "atoi", + "base64 0.21.7", + "bitflags 2.9.1", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +dependencies = [ + "atoi", + "base64 0.21.7", + "bitflags 2.9.1", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "tracing", + "url", + "urlencoding", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" @@ -2770,6 +3297,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.45.1" @@ -3006,18 +3548,51 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + [[package]] name = "untrusted" version = "0.9.0" @@ -3107,6 +3682,12 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -3225,6 +3806,16 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "whoami" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +dependencies = [ + "redox_syscall", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index aff314a..bb5d348 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,22 +2,23 @@ name = "gbserver" version = "0.1.0" edition = "2021" -authors = ["Your Name "] -description = "File server with MinIO integration" -license = "MIT" -repository = "" +authors = ["Rodrigo Rodriguez "] +description = "General Bots Server" +license = "AGPL" +repository = "https://alm.pragmatismo.com.br/generalbots/gbserver" [dependencies] -actix-web = "4" actix-multipart = "0.6" -tokio = { version = "1", features = ["full"] } -log = "0.4" -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["fmt"] } +actix-web = "4" dotenv = "0.15" -tempfile = "3" +jmap-client = "0.3.2" +log = "0.4" +minio = { git = "https://github.com/minio/minio-rs", branch = "master" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -minio = { git = "https://github.com/minio/minio-rs", branch = "master" } +sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] } +tempfile = "3" +tokio = { version = "1", features = ["full"] } tokio-stream = "0.1.17" -jmap-client = "0.3.2" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["fmt"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 913dfa2..21bf708 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,27 +1,35 @@ use actix_web::{middleware, web, App, HttpServer}; -use tracing_subscriber::fmt::format::FmtSpan; use dotenv::dotenv; +use sqlx::PgPool; +use tracing_subscriber::fmt::format::FmtSpan; use services::config::*; use services::file::*; use services::state::*; +use services::email::*; + + mod services; #[actix_web::main] async fn main() -> std::io::Result<()> { - + dotenv().ok(); + let config = AppConfig::from_env(); + let db = PgPool::connect(&std::env::var("DATABASE_URL").unwrap()) + .await + .unwrap(); tracing_subscriber::fmt() .with_span_events(FmtSpan::CLOSE) .init(); - // log::set_max_level(LevelFilter::Info); - - let config = AppConfig::from_env(); - let minio_client = init_minio(&config).await.expect("Failed to initialize Minio"); + let minio_client = init_minio(&config) + .await + .expect("Failed to initialize Minio"); let app_state = web::Data::new(AppState { + db: Some(db.clone()), config: Some(config.clone()), minio_client: Some(minio_client), }); @@ -33,9 +41,10 @@ async fn main() -> std::io::Result<()> { .wrap(middleware::Compress::default()) .app_data(app_state.clone()) .service(upload_file) - .service(list_file) - - }) + .service(list_file) + .service(save_click) + .service(get_emails) + }) .bind((config.server.host.clone(), config.server.port))? .run() .await diff --git a/src/prompts/code/system-code.bas b/src/prompts/code/system-code.bas new file mode 100644 index 0000000..2312d22 --- /dev/null +++ b/src/prompts/code/system-code.bas @@ -0,0 +1,5 @@ +BEGIN SYSTEM PROMPT + + No comments, no echo, condensed. + +END SYSTEM PROMPT diff --git a/src/scripts/cleaner.sh b/src/scripts/containers/cleaner.sh similarity index 100% rename from src/scripts/cleaner.sh rename to src/scripts/containers/cleaner.sh diff --git a/src/scripts/install-libreoffice-online.sh b/src/scripts/containers/install-libreoffice-online.sh similarity index 100% rename from src/scripts/install-libreoffice-online.sh rename to src/scripts/containers/install-libreoffice-online.sh diff --git a/src/scripts/set-limits.sh b/src/scripts/containers/set-limits.sh similarity index 100% rename from src/scripts/set-limits.sh rename to src/scripts/containers/set-limits.sh diff --git a/src/scripts/set-size-5GB.sh b/src/scripts/containers/set-size-5GB.sh similarity index 100% rename from src/scripts/set-size-5GB.sh rename to src/scripts/containers/set-size-5GB.sh diff --git a/src/scripts/setup-host.sh b/src/scripts/containers/setup-host.sh similarity index 100% rename from src/scripts/setup-host.sh rename to src/scripts/containers/setup-host.sh diff --git a/src/scripts/startup.sh b/src/scripts/containers/startup.sh similarity index 100% rename from src/scripts/startup.sh rename to src/scripts/containers/startup.sh diff --git a/src/scripts/database/0001.sql b/src/scripts/database/0001.sql new file mode 100644 index 0000000..6a3f5d8 --- /dev/null +++ b/src/scripts/database/0001.sql @@ -0,0 +1,6 @@ +CREATE TABLE clicks ( + campaign_id TEXT NOT NULL, + email TEXT NOT NULL, + updated_at TIMESTAMP DEFAULT NOW(), + UNIQUE(campaign_id, email) +); \ No newline at end of file diff --git a/src/services/email.rs b/src/services/email.rs index 67eb5f0..3d23b0a 100644 --- a/src/services/email.rs +++ b/src/services/email.rs @@ -1,4 +1,4 @@ - +use actix_web::web; use jmap_client::{ client::Client, core::query::Filter, @@ -6,16 +6,16 @@ use jmap_client::{ mailbox::{self, Role}, }; +use crate::services::state::AppState; -pub async fn list_emails( -) -> Result, jmap_client::Error> { - +#[actix_web::post("/emails/list")] +pub async fn list_emails() -> Result>, actix_web::Error> { // 1. Authenticate with JMAP server let client = Client::new() .credentials(("test@", "")) .connect("https://mail/jmap/") .await - .unwrap(); + .map_err(|e| actix_web::error::ErrorInternalServerError(e))?; let inbox_id = client .mailbox_query( @@ -23,35 +23,10 @@ pub async fn list_emails( None::>, ) .await - .unwrap() + .map_err(|e| actix_web::error::ErrorInternalServerError(e))? .take_ids() .pop() - .unwrap(); - - let email_id = client - .email_query( - Filter::and([ - // email::query::Filter::subject("test"), - email::query::Filter::in_mailbox(&inbox_id), - // email::query::Filter::has_keyword("$draft"), - ]) - .into(), - [email::query::Comparator::from()].into(), - ) - .await - .unwrap() - .take_ids() - .pop() - .unwrap(); - - // Fetch message - let email = client - .email_get( - &email_id, - [Property::Subject, Property::Preview, Property::Keywords].into(), - ) - .await - .unwrap(); + .ok_or_else(|| actix_web::error::ErrorInternalServerError("No inbox found"))?; let mut emails = client .email_query( @@ -59,7 +34,8 @@ pub async fn list_emails( .into(), [email::query::Comparator::from()].into(), ) - .await?; + .await + .map_err(|e| actix_web::error::ErrorInternalServerError(e))?; let email_ids = emails.take_ids(); let mut email_list = Vec::new(); @@ -70,12 +46,41 @@ pub async fn list_emails( &email_id, [Property::Subject, Property::Preview, Property::Keywords].into(), ) - .await? + .await + .map_err(|e| actix_web::error::ErrorInternalServerError(e))? { email_list.push(email); } } - Ok(email_list) - -} \ No newline at end of file + Ok(web::Json(email_list)) +} + + +#[actix_web::post("/campaigns/{campaign_id}/click/{email}")] +pub async fn save_click( + path: web::Path<(String, String)>, + state: web::Data, +) -> String { + let (campaign_id, email) = path.into_inner(); + let _ = sqlx::query("INSERT INTO clicks (campaign_id, email, updated_at) VALUES ($1, $2, NOW()) ON CONFLICT (campaign_id, email) DO UPDATE SET updated_at = NOW()") + .bind(campaign_id) + .bind(email) + .execute(state.db.as_ref().unwrap()) + .await; + "OK".to_string() +} + +#[actix_web::get("/campaigns/{campaign_id}/emails")] +pub async fn get_emails( + path: web::Path, + state: web::Data, +) -> String { + let campaign_id = path.into_inner(); + let rows = sqlx::query_scalar::<_, String>("SELECT email FROM clicks WHERE campaign_id = $1") + .bind(campaign_id) + .fetch_all(state.db.as_ref().unwrap()) + .await + .unwrap_or_default(); + rows.join(",") +} diff --git a/src/services/file.rs b/src/services/file.rs index 77cbf32..0d6b3a7 100644 --- a/src/services/file.rs +++ b/src/services/file.rs @@ -77,7 +77,7 @@ pub async fn upload_file( // Upload the file to the MinIO bucket let client: Client = state.minio_client.clone().unwrap(); - let bucket_name = "file-upload-rust-bucket"; + let bucket_name = state.config.as_ref().unwrap().minio.bucket.clone(); let content = ObjectContent::from(temp_file.path()); client diff --git a/src/services/state.rs b/src/services/state.rs index 9499697..2ff306f 100644 --- a/src/services/state.rs +++ b/src/services/state.rs @@ -7,6 +7,7 @@ use crate::services::config::AppConfig; pub struct AppState { pub minio_client: Option, pub config: Option, + pub db: Option, } diff --git a/src/templates/opt/gbo/tenants/default/alm-ci/alm-ci.sh b/src/templates/containers/alm-ci/alm-ci.sh similarity index 99% rename from src/templates/opt/gbo/tenants/default/alm-ci/alm-ci.sh rename to src/templates/containers/alm-ci/alm-ci.sh index 49b5426..8f9a856 100644 --- a/src/templates/opt/gbo/tenants/default/alm-ci/alm-ci.sh +++ b/src/templates/containers/alm-ci/alm-ci.sh @@ -77,6 +77,7 @@ sudo apt install -y curl gnupg ca-certificates git # Install Node.js 22.x curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash - sudo apt install -y nodejs +npm install -g pnpm@latest # Install rust 1.85 apt-get install -y libssl-dev pkg-config diff --git a/src/templates/opt/gbo/tenants/default/alm/alm.sh b/src/templates/containers/alm/alm.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/alm/alm.sh rename to src/templates/containers/alm/alm.sh diff --git a/src/templates/opt/gbo/tenants/default/bot/bot.sh b/src/templates/containers/bot/bot.sh similarity index 92% rename from src/templates/opt/gbo/tenants/default/bot/bot.sh rename to src/templates/containers/bot/bot.sh index 1f18fef..5925f94 100644 --- a/src/templates/opt/gbo/tenants/default/bot/bot.sh +++ b/src/templates/containers/bot/bot.sh @@ -58,19 +58,19 @@ mkdir -p /opt/gbo/data /opt/gbo/conf /opt/gbo/logs sudo apt update sudo apt install -y curl gnupg ca-certificates git -# Install Node.js 22.x curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash - sudo apt install -y nodejs -# Install Xvfb and other dependencies sudo apt install -y xvfb libgbm-dev -# Clone and setup bot server +wget https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_128.0.6613.119-1_amd64.deb +sudo apt install ./google-chrome-stable_128.0.6613.119-1_amd64.deb + cd /opt/gbo/data git clone https://alm.pragmatismo.com.br/generalbots/botserver.git cd botserver npm install -npx puppeteer browsers install chrome + ./node_modules/.bin/tsc cd packages/default.gbui npm install diff --git a/src/templates/opt/gbo/tenants/default/desktop/desktop.sh b/src/templates/containers/desktop/desktop.sh similarity index 86% rename from src/templates/opt/gbo/tenants/default/desktop/desktop.sh rename to src/templates/containers/desktop/desktop.sh index ed5ee28..724a514 100644 --- a/src/templates/opt/gbo/tenants/default/desktop/desktop.sh +++ b/src/templates/containers/desktop/desktop.sh @@ -36,12 +36,13 @@ curl -s https://brave-browser-apt-release.s3.brave.com/brave-core.asc | gpg --de echo "deb [arch=amd64 signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main" > /etc/apt/sources.list.d/brave-browser-release.list apt update && apt install -y brave-browser - - - +sudo apt install gnome-tweaks +/etc/environment + GTK_IM_MODULE=cedilla + QT_IM_MODULE=cedilla " -sudo iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination CONTAINER_IP:3389 -sudo iptables -A FORWARD -p tcp -d CONTAINER_IP --dport 3389 -j ACCEPT \ No newline at end of file +sudo iptables -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to-destination $CONTAINER_IP:3389 +sudo iptables -A FORWARD -p tcp -d $CONTAINER_IP --dport 3389 -j ACCEPT \ No newline at end of file diff --git a/src/templates/opt/gbo/tenants/default/directory/directory.sh b/src/templates/containers/directory/directory.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/directory/directory.sh rename to src/templates/containers/directory/directory.sh diff --git a/src/templates/opt/gbo/tenants/default/doc-editor/doc-editor.sh b/src/templates/containers/doc-editor/doc-editor.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/doc-editor/doc-editor.sh rename to src/templates/containers/doc-editor/doc-editor.sh diff --git a/src/templates/opt/gbo/tenants/default/drive/drive.sh b/src/templates/containers/drive/drive.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/drive/drive.sh rename to src/templates/containers/drive/drive.sh diff --git a/src/templates/opt/gbo/tenants/default/email/email.sh b/src/templates/containers/email/email.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/email/email.sh rename to src/templates/containers/email/email.sh diff --git a/src/templates/opt/gbo/tenants/default/meeting/meeting.sh b/src/templates/containers/meeting/meeting.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/meeting/meeting.sh rename to src/templates/containers/meeting/meeting.sh diff --git a/src/templates/opt/gbo/tenants/default/prompt.txt b/src/templates/containers/prompt.txt similarity index 100% rename from src/templates/opt/gbo/tenants/default/prompt.txt rename to src/templates/containers/prompt.txt diff --git a/src/templates/opt/gbo/tenants/default/proxy/proxy.sh b/src/templates/containers/proxy/proxy.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/proxy/proxy.sh rename to src/templates/containers/proxy/proxy.sh diff --git a/src/templates/opt/gbo/tenants/default/social/.sh b/src/templates/containers/social/.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/social/.sh rename to src/templates/containers/social/.sh diff --git a/src/templates/opt/gbo/tenants/default/system/system.sh b/src/templates/containers/system/system.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/system/system.sh rename to src/templates/containers/system/system.sh diff --git a/src/templates/opt/gbo/tenants/default/table-editor/table-editor.sh b/src/templates/containers/table-editor/table-editor.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/table-editor/table-editor.sh rename to src/templates/containers/table-editor/table-editor.sh diff --git a/src/templates/opt/gbo/tenants/default/tables/tables.sh b/src/templates/containers/tables/tables.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/tables/tables.sh rename to src/templates/containers/tables/tables.sh diff --git a/src/templates/opt/gbo/tenants/default/webmail/webmail.sh b/src/templates/containers/webmail/webmail.sh similarity index 100% rename from src/templates/opt/gbo/tenants/default/webmail/webmail.sh rename to src/templates/containers/webmail/webmail.sh