diff --git a/.env b/.env index 17697f6..f7117c2 100644 --- a/.env +++ b/.env @@ -35,6 +35,10 @@ REST_GW_IMAGE=truecloudlab/frostfs-rest-gw S3_GW_VERSION=0.30.4 S3_GW_IMAGE=truecloudlab/frostfs-s3-gw +# Lifecycler +S3_LIFECYCLER_VERSION=755083e36f +S3_LIFECYCLER_IMAGE=truecloudlab/frostfs-s3-lifecycler + # FrostFS LOCODE database LOCODE_DB_URL=https://git.frostfs.info/attachments/a2e8def7-52b6-49f1-89cd-a056712e8e54 #LOCODE_DB_PATH=/path/to/locode_db diff --git a/.services b/.services index d9f34c7..d165241 100644 --- a/.services +++ b/.services @@ -3,3 +3,4 @@ http_gate s3_gate rest_gate +s3_lifecycler diff --git a/services/s3_lifecycler/.env b/services/s3_lifecycler/.env new file mode 100644 index 0000000..0b0e2d2 --- /dev/null +++ b/services/s3_lifecycler/.env @@ -0,0 +1,66 @@ +# Basenet settings +LOCAL_DOMAIN=frostfs.devenv +IPV4_PREFIX=192.168.130 +CA_CERTS_TRUSTED_STORE=/etc/ssl/certs + +# Bastion image +BASTION_VERSION=10 +BASTION_IMAGE=debian + +# NeoGo privnet +NEOGO_VERSION=0.101.1 +NEOGO_IMAGE=nspccdev/neo-go + +# FrostFS InnerRing nodes +IR_VERSION=365a7ca0 +IR_IMAGE=truecloudlab/frostfs-ir + +# FrostFS Storage nodes +NODE_VERSION=365a7ca0 +NODE_IMAGE=truecloudlab/frostfs-storage + +# NATS Server +NATS_VERSION=2.7.2 +NATS_IMAGE=nats + +# HTTP Gate +HTTP_GW_VERSION=0.27.0-rc.1-15-g1776db28 +HTTP_GW_IMAGE=truecloudlab/frostfs-http-gw + +# REST Gate +REST_GW_VERSION=c9c85e90 +REST_GW_IMAGE=truecloudlab/frostfs-rest-gw + +# S3 Gate +S3_GW_VERSION=0.27.0-rc.1-30-gce929468 +S3_GW_IMAGE=truecloudlab/frostfs-s3-gw + +# Lifecycler +S3_LIFECYCLER_VERSION=0.1.3 +S3_LIFECYCLER_IMAGE=truecloudlab/frostfs-s3-lifecycler + +# FrostFS LOCODE database +LOCODE_DB_URL=https://git.frostfs.info/attachments/a2e8def7-52b6-49f1-89cd-a056712e8e54 +#LOCODE_DB_PATH=/path/to/locode_db + +# FrostFS CLI binary +FROSTFS_CLI_URL=https://http.t5.fs.neo.org/7sm9csjtRLpr4c9QD55q9JJM73v79ohuAhTzP4fYRHFz/BbngJDdRJEDJTJk7qptq3SxKqrJqtvVYWU6R5AaFGbtG +#FROSTFS_CLI_PATH=/path/to/frostfs-cli-binary + +# FrostFS ADM tool binary +FROSTFS_ADM_VERSION=eca5c210 +FROSTFS_ADM_URL=https://http.t5.fs.neo.org/7sm9csjtRLpr4c9QD55q9JJM73v79ohuAhTzP4fYRHFz/2GxarAjGUb3RevxvqFGYT3hDQxNNaHzK6aFxhJCAMehq +#FROSTFS_ADM_PATH=/path/to/frostfs-adm-binary + +# Compiled FrostFS Smart Contracts +FROSTFS_CONTRACTS_VERSION=8537293e +FROSTFS_CONTRACTS_URL=https://http.t5.fs.neo.org/7sm9csjtRLpr4c9QD55q9JJM73v79ohuAhTzP4fYRHFz/6ccZoj4HxoN1G1qvJAX2Qw9p2D6qdyzAjNMaNkEKYQpA +#FROSTFS_CONTRACTS_PATH=/path/to/unpacked/frostfs-contracts-dir + +# Jaeger tracing +JAEGER_VERSION=1.42.0 +JAEGER_IMAGE=jaegertracing/all-in-one + +# Prometheus monitoring +PROMETHEUS_VERSION=v2.43.0 +PROMETHEUS_IMAGE=prom/prometheus diff --git a/services/s3_lifecycler/.hosts b/services/s3_lifecycler/.hosts new file mode 100644 index 0000000..1ac6251 --- /dev/null +++ b/services/s3_lifecycler/.hosts @@ -0,0 +1,2 @@ +IPV4_PREFIX.82 s3.LOCAL_DOMAIN +IPV4_PREFIX.82 *.s3.LOCAL_DOMAIN diff --git a/services/s3_lifecycler/.int_test.env b/services/s3_lifecycler/.int_test.env new file mode 100644 index 0000000..e69de29 diff --git a/services/s3_lifecycler/.s3_lifecycler.env b/services/s3_lifecycler/.s3_lifecycler.env new file mode 100644 index 0000000..e69de29 diff --git a/services/s3_lifecycler/cfg/config.yml b/services/s3_lifecycler/cfg/config.yml new file mode 100644 index 0000000..6a19f30 --- /dev/null +++ b/services/s3_lifecycler/cfg/config.yml @@ -0,0 +1,29 @@ +logger: + level: debug + +prometheus: + enabled: true + address: :9090 + +# Interval to check node health +rebalance_interval: 30s + +# Timeout to check node health during rebalance +healthcheck_timeout: 15s + +# Timeout to connect to a node +connect_timeout: 10s + +# Limits for processing of clients' requests +max_clients_count: 100 + +# Deadline after which the gate sends error `RequestTimeout` to a client +max_clients_deadline: 30s + +resolve_order: + - nns + +# Wallet configuration +wallet: + path: /wallet.json # Path to wallet + passphrase: "s3" # Passphrase to decrypt wallet diff --git a/services/s3_lifecycler/docker-compose.yml b/services/s3_lifecycler/docker-compose.yml new file mode 100644 index 0000000..80a0c3b --- /dev/null +++ b/services/s3_lifecycler/docker-compose.yml @@ -0,0 +1,58 @@ +--- + +version: "2.4" +services: + s3_lifecycler: + image: ${S3_LIFECYCLER_IMAGE}:${S3_LIFECYCLER_VERSION} + domainname: ${LOCAL_DOMAIN} + hostname: s3_lifecycler + container_name: s3_lifecycler + restart: on-failure + networks: + s3_lifecycler_int: + internet: + ipv4_address: ${IPV4_PREFIX}.84 + volumes: + - ./wallet.json:/wallet.json + - ./tls.key:/tls.key + - ./tls.crt:/tls.crt + - ./../../vendor/hosts:/etc/hosts + - ./cfg:/etc/frostfs/s3-lifecycler + stop_signal: SIGKILL + env_file: [ ".env", ".s3_lifecycler.env", ".int_test.env" ] + command: [ "frostfs-s3-lifecycler", "--config", "/etc/frostfs/s3-lifecycler/config.yml" ] + environment: + - S3_LIFECYCLER_CREDENTIAL_USE=wallets + - S3_LIFECYCLER_CREDENTIAL_SOURCE_WALLETS_0_PATH=./wallet.json + - S3_LIFECYCLER_CREDENTIAL_SOURCE_WALLETS_0_ADDRESS=NTt1rxvmEDxEuuogLxs2xgxA71qhVaUcN7 + - S3_LIFECYCLER_CREDENTIAL_SOURCE_WALLETS_0_PASSPHRASE="cycle" + - S3_LIFECYCLER_LIFECYCLE_JOB_FETCHER_BUFFER=1000 + - S3_LIFECYCLER_LIFECYCLE_EXECUTOR_POOL_SIZE=100 + - S3_LIFECYCLER_LIFECYCLE_SERVICES=031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a + - S3_LIFECYCLER_RPC_ENDPOINT=http://morph-chain.${LOCAL_DOMAIN}:30333 + - S3_LIFECYCLER_MORPH_RPC_ENDPOINT_0_ADDRESS="wss://rpc1.morph.frostfs.info:40341/ws" + - S3_LIFECYCLER_MORPH_RPC_ENDPOINT_0_PRIORITY=0 + - S3_LIFECYCLER_MORPH_RPC_ENDPOINT_0_TRUSTED_CA_LIST="/path/to/ca.pem" + - S3_LIFECYCLER_MORPH_RPC_ENDPOINT_0_CERTIFICATE="/path/to/cert" + - S3_LIFECYCLER_MORPH_RPC_ENDPOINT_0_KEY="/path/to/key" + - S3_LIFECYCLER_MORPH_RECONNECT_CLIENTS_INTERVAL=30s + - S3_LIFECYCLER_MORPH_RECONNECT_DIAL_TIMEOUT=5s + - S3_LIFECYCLER_MORPH_CONTRACT_NETMAP=netmap.frostfs + - S3_LIFECYCLER_MORPH_CONTRACT_FROSTFSID=frostfsid.frostfs + - S3_LIFECYCLER_MORPH_CONTRACT_CONTAINER=container.frostfs + - S3_LIFECYCLER_PEERS_0_ADDRESS=s01.${LOCAL_DOMAIN}:8080 + - S3_LIFECYCLER_PEERS_0_WEIGHT=0.2 + - S3_LIFECYCLER_PEERS_1_ADDRESS=s02.${LOCAL_DOMAIN}:8080 + - S3_LIFECYCLER_PEERS_1_WEIGHT=0.2 + - S3_LIFECYCLER_PEERS_2_ADDRESS=s03.${LOCAL_DOMAIN}:8080 + - S3_LIFECYCLER_PEERS_2_WEIGHT=0.2 + - S3_LIFECYCLER_PEERS_3_ADDRESS=s04.${LOCAL_DOMAIN}:8080 + - S3_LIFECYCLER_PEERS_3_WEIGHT=0.2 + - S3_LIFECYCLER_SERVER_0_ADDRESS=s3.${LOCAL_DOMAIN}:8080 + - S3_LIFECYCLER_LISTEN_DOMAINS=s3.${LOCAL_DOMAIN} + +networks: + s3_lifecycler_int: + internet: + external: true + name: basenet_internet diff --git a/services/s3_lifecycler/tls.crt b/services/s3_lifecycler/tls.crt new file mode 100644 index 0000000..c286881 --- /dev/null +++ b/services/s3_lifecycler/tls.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDpDCCAowCCQDXZEH0aQRqFzANBgkqhkiG9w0BAQsFADCBkzELMAkGA1UEBhMC +UlUxFjAUBgNVBAgMDVN0LlBldGVyc2J1cmcxGTAXBgNVBAcMEFNhaW50IFBldGVy +c2J1cmcxDjAMBgNVBAoMBU5TUENDMREwDwYDVQQLDAhOZW8gU1BDQzERMA8GA1UE +AwwIbnNwY2MucnUxGzAZBgkqhkiG9w0BCQEWDG9wc0Buc3BjYy5ydTAeFw0yMDA3 +MTMxNTQyMzZaFw0zMDA3MTExNTQyMzZaMIGTMQswCQYDVQQGEwJSVTEWMBQGA1UE +CAwNU3QuUGV0ZXJzYnVyZzEZMBcGA1UEBwwQU2FpbnQgUGV0ZXJzYnVyZzEOMAwG +A1UECgwFTlNQQ0MxETAPBgNVBAsMCE5lbyBTUENDMREwDwYDVQQDDAhuc3BjYy5y +dTEbMBkGCSqGSIb3DQEJARYMb3BzQG5zcGNjLnJ1MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAwqo2l4fS0U6wZCLh7VjQn1LXN8pZlVaA62C+g1SwoWV2 +Q5qM8FDihWj3UBO3F+6vUVJl8N5S0JroxxU6L48Wmshei145SLSl/F28tsk7Bbuz +NOchonlelW77Xr6l7cDJBWUWGkDoq6a/S6w6jjCGhZq+X0gyS5nZ4HTouVNv2oFK +eeJGtueLsS4zoVovrHdLSYdZH9/yC+E1WVCzQB+vdUF/vJLTuULgqncLV0sELmRl ++xsnnAV/REJswtCmKgrmAv9pMebBw5EEgROTGazdToWdD5X44xTlHjUb1bMuF9tL +YtUMdLxXceXZFhYhiTBO7ev9awKaNYslbxh+goJo1wIDAQABMA0GCSqGSIb3DQEB +CwUAA4IBAQBDEGhAyOtfsNwbZ0oZIw06e0JXCmri+8jsn5Ly/yHU0+ecHgMA5AAQ +AG2QRpZZtZCtD/Cj4i6nSTWbRhS0FgqY998p5Lnh/AXTZHBx0t3LKJupN59CIjCK +1eMEfQChoAZg66oO/obAFkq72gj8gpagMY9vFNVcszmse3FWrvlKmO1TwTEh+CzM +7wbmiL/ujm0lIf44pp0U4qYFcSimSDqbwOfeDPif9lMinzylDxMfaAKBHBHPj5Vt +fX8dgf6MIqyz51u/2G0gHfXMDxXec8huYKt2EtPyavh6kFxxGvcA15m6seJTcu+h +6WzeQFa2NBg7Z3ai4DiPXirNtcHWeqxK +-----END CERTIFICATE----- diff --git a/services/s3_lifecycler/tls.key b/services/s3_lifecycler/tls.key new file mode 100644 index 0000000..bd29be5 --- /dev/null +++ b/services/s3_lifecycler/tls.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAwqo2l4fS0U6wZCLh7VjQn1LXN8pZlVaA62C+g1SwoWV2Q5qM +8FDihWj3UBO3F+6vUVJl8N5S0JroxxU6L48Wmshei145SLSl/F28tsk7BbuzNOch +onlelW77Xr6l7cDJBWUWGkDoq6a/S6w6jjCGhZq+X0gyS5nZ4HTouVNv2oFKeeJG +tueLsS4zoVovrHdLSYdZH9/yC+E1WVCzQB+vdUF/vJLTuULgqncLV0sELmRl+xsn +nAV/REJswtCmKgrmAv9pMebBw5EEgROTGazdToWdD5X44xTlHjUb1bMuF9tLYtUM +dLxXceXZFhYhiTBO7ev9awKaNYslbxh+goJo1wIDAQABAoIBAEIp3mJEjPgNOdDf +NlEYpdfxLStOQIKMo0bdXAOBToOc28SAjDTGGSflFGIIQWwF+Vq3meRzfExgyouY +AG3XwYQcZF4USX4XwG71YUXzQXdiY7ewc3Mos2gxD4kVXYpgwzJtOET2GN72zwAm +asSXY7GXdesmu8mMYkxzEAKlhFgMj+bGE/4QQUBKG9ylGIdo07zmU6rAsVhnwQTb +LE3cf+AxCeTVA7OsJCUUR4S9qsgXUN1WeaV8LNg0lYx8UTu1xlbrpSjx7B4eYy6J +FGJWuT9b3X+cBLcGk3BzheUAfqBG2UFDxUCt0grqmmTBkB850MtCDhffhPjxxrD7 +KrwAcpECgYEA6HApn2VtWI/tDYCbNix6yxeqq73fO3ng6yFry1u7EYvl8hJXBgR4 +b6kAVc3y/9pZO/5D23dHl1PQtnU5401/j6dQrb8A2TMqZ1vA8XIdIMjOiVjZtYMF +nXzmf78PEbw9jWlDVARJdAwkJeuDI4/HVvgiDAh3zxx5F8uDVP16/r8CgYEA1mXS +9owfLIPtPSxyMJoGU0jP7OP+HVwlKkXpvg7uBtINKSDW4UU4rnpIGW5MohR3ACWO +ReFliOnGA5FXBp9GzkbJ+wIYovPIsGuBdxSsBlPY1S0yPlo30hr7E6cK3B3EuxDg +SkbJcWp2EwXYEIyEcopbVUTTlBO3wmBFgm/Ps+kCgYA/+Kar9OlMR4hRgAS3uzQs +cx4I2F/46YlKjU8yj9ODd8JYhk2nHVHcQWITO3RWkEyg41DftQtiDbJSlR7SfUDP +U5gzyW69WISiH7GRgfucS0f0qxx4BVBlULvLitTl5631HnRmSivBIZpNSW01O1v8 +hpwwPaBjww1czCkgGgdg1wKBgQCkaSdTW/bX+z9lpvzWWnc5TN/uSJRpTW1Osphh +4C8WWeQvwvglfiDOZAWAQv5PWKQ9H4+v9P4Y9TSdLcpv0JrKuqxPabcc1xfyei6o +89hLbecc6vDZsfOWkowx8Oo6DDX+Qh3Nt+TorXxocBXV8vvqnkEV7ZbWuhwz2gHT +2gyMaQKBgEE7rNzm8Q03IqQ08eYaRw8gWz8EpLeVebrGqtoH9AR5cd4OeTeZAEqc +iPehXctke2pUgS47XgG98G7Yg3E9UuOYM+H2nzQCoT7jrM0dZrVGZ0ty7z1a8QGe +UrjaAC/cyIGdszhf0Rf3qA7450nit9Txh+ilLiumgnUezl+eJXyI +-----END RSA PRIVATE KEY----- diff --git a/services/s3_lifecycler/wallet.json b/services/s3_lifecycler/wallet.json new file mode 100644 index 0000000..ff8f34e --- /dev/null +++ b/services/s3_lifecycler/wallet.json @@ -0,0 +1,30 @@ +{ + "version": "1.0", + "accounts": [ + { + "address": "NTt1rxvmEDxEuuogLxs2xgxA71qhVaUcN7", + "key": "6PYR3XurAyTzVeDG5WV2Z8vnGdySw3mTLuKjr6Nwo7tae64SJ7XjZSMMPQ", + "label": "lifecycler", + "contract": { + "script": "DCED9z0M+WSGfXZGxYLj1yYwmgxJXE/kNA4+oWNi0q1uKCdBVuezJw==", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "lock": false, + "isDefault": false + } + ], + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "extra": { + "Tokens": null + } +}