Ana içeriğe atla
Production ortamlarında veriye doğrudan müdahale edilmesi hiçbir zaman önerilmemektedir. Production ortamlarında yapılacak her türlü işlem veya değişiklik öncesinde, ilgili adımların mutlaka test ortamında denenmesi ve sistemin güncel yedeğinin alınması gerekmektedir.

MongoDb’ye Bağlanma

mongosh mongodb://localhost:25080 --authenticationDatabase "admin" -u "apinizer" -p

Bağlantıktan Sonraki Tüm İşlemler İçin

Doğru veritabanına geçilmeli ve burada çalışılmalıdır:
use apinizerdb

Genel Komutlar

# Replicaset detaylarını gösterme
rs.status()

# Kullanıcıları gösterme
db.getUsers()

# Mevcut veritabanındaki koleksiyonların isim ve bilgilerini gösterme
db.getCollectionNames()
db.getCollectionInfos()

# Herhangi bir koleksiyonun boyutunu MB olarak görme
db.audit_event.stats().storageSize/1024/1024

Arama

db.user.find( { login: "admin" } );
 
db.db_to_api.find().pretty().limit(10)
 
#Api Proxy'de full text search
db.api_proxy.ensureIndex(
    { "$**": "text" },
    { name: "TextIndex" }
);
 
#Belirli koleksiyonda bir metin araması yapar.
db.api_proxy.find(
    {
      $text: {
        $search: "XMLRESULTwithNS"
      }
    },{
        "name":1
    }
)
 
 #Kriter ile arama yapma
db.api_proxy.find( {importedUrl: /.*kps.*/ })
 
#Çoklu kriter ile arama yapma
db.getCollection('api_proxy').find({$and: [{'routing.kpsSettings': { $exists: true }},{importedUrl: /.*kps.*/ }]})
 
#Regex kullanımı
db.api_proxy.find({ "apiMethodList": { "$elemMatch": { "requestPolicyList": { "$elemMatch": { "name": { "$regex" : /^PolicyJwt3rdAuthentication/i } } } } } });
db.api_proxy.find({ "requestPolicyList": { "$elemMatch": { "name": { "$regex" : /^PolicyJwt3rdAuthentication/i } } } });
db.api_proxy.find({ "requestPolicyList": { "$elemMatch": { "_class": { "$regex" : /.*jwt.*/i } } } } , {"name":1,"requestPolicyList.name":1,"requestPolicyList._class":1});
 
#Tüm alanlarda arama yapılması
db.api_proxy.find({ $where: function() {
  for (var key in this) {
    if (JSON.stringify(this[key]).indexOf("172.16.1.1") !== -1) {
      return true;
    }
  }
  return false;
}}, {_id: 0,name:1,projectId:1})
 
 
#Son 2 saate kadar olan logların sayısını getirir
mongosh mongodb://localhost:25080/apinizerdb --authenticationDatabase "admin" -u "apinizer" -p "password" --eval 'db.apinizer_log.find({"date":{"$lte": new Date((new Date().getTime() - (2 * 60 * 60 * 1000)))}}).count()'
 
#Tüm koleksiyonlardaki tüm alanlarda <SEARCH_TERM> ifadesini arar
db.getCollectionNames().forEach(function(collName) {
    var cursor = db[collName].find();
    while (cursor.hasNext()) {
        var doc = cursor.next();
        if (JSON.stringify(doc).includes("<SEARCH_TERM>")) {
            print("Found in " + collName);
            printjson(doc);
        }
    }
});

Bir Variable’ın Hangi Api Proxy’lerdeki Hangi Metotlarda Kullanıldığını Arama

Fonksiyon çalıştırılmadan önce use apinizerdb komutu ile doğru database’e geçilmelidir.
#Fonksiyon çalıştırılmadan önce "use apinizerdb" komutu ile doğru database'e geçilmelidir.
 
function getApiMethodListObjectsWithFilledRequestPolicyList(nameToCheck) {
    let skipCount = 0;
    const limitCount = 1000;
    console.log("Çıktı formatı: Proxy Adı;Metod Adı;Request/Response Hattı;Politika cinsi.")
    console.log("")
    while (true) {
        const cursor = db.api_proxy.find(
            { "apiMethodList": { $exists: true, $ne: [] } }
        ).skip(skipCount).limit(limitCount);
 
        if (!cursor.hasNext()) {
            break;
        }
        cursor.forEach(doc => {
            doc.apiMethodList.forEach(object => {
                if (object.requestPolicyList && object.requestPolicyList.length > 0) {
                    object.requestPolicyList.forEach(policy => {
                     if (JSON.stringify(policy).includes(nameToCheck)) {
                            console.log(doc.name + ";" + object.name + ";Request;" + policy._class)
                    }
                    });
                }
                if (object.responsePolicyList && object.responsePolicyList.length > 0) {
                    object.responsePolicyList.forEach(policy => {
                        if (JSON.stringify(policy).includes(nameToCheck)) {
                           console.log(doc.name + ";" + object.name + ";Response;" + policy._class)
                        }
                    });
                }
            });
            if (doc.requestPolicyList && doc.requestPolicyList.length > 0) {
                doc.requestPolicyList.forEach(policy => {
                    if (JSON.stringify(policy).includes(nameToCheck)) {
                        console.log(doc.name + ";ALL;Request;" + policy._class)
                    }
                });
            }
            if (doc.responsePolicyList && doc.responsePolicyList.length > 0) {
                doc.responsePolicyList.forEach(policy => {
                    if (JSON.stringify(policy).includes(nameToCheck)) {
                        console.log(doc.name + ";ALL;Response;" + policy._class)
                    }
                });
            }
        });
        skipCount += limitCount;
    }
  console.log("")
}
 
getApiMethodListObjectsWithFilledRequestPolicyList("KEYWORDTOSEARCH");

Güncelleme

#Alt elemanın güncellenmesi
db.api_proxy.update( {name :"KYS Yabanci AdSoyad Getir GW"}, {$set: {"routing.connectTimeout": "30"}} );
 
#Soap-2-Rest cinsindeki bir proxy'deki tüm "unwrapelement" objelerinin değerini true'a çevirme (1 kayıt içinde birden fazla array'de düzenleme yapılırsa sonuç 1 olarak döner)
db.api_proxy.updateMany({relativePath:"/tarServis"},{$set:{"apiMethodList.$[].protocolTransformation.unwrapElement":true}});
 
#Alt elemana obje eklenmesi (objedeki array'in ikinci objesine ilgili alanı ekler )
db.api_proxy.update( {"relativePath":"/ydsSorgulamaServisi"}, {$push: {"requestPolicyList.1.unPasswordDecrypted": "false"}} );
 
 
#admin kullanıcısının şifresini "admin" yapma
db.user.update({"login" : "admin"},{$set: { "password" : "$2a$10$Wv6i9IIdNzlxgDdaf13UdOl7uumVcG7zkSEKaOG4Xqn6IlLuwA13e"}});
 
#admin kullanıcısının kilitlenmesi sonrası kilidi kaldırma
db.user.updateOne({ _id: "admin" },{ $set: { locked: false } })
 
 
#Bir tabloyu kontrol etme ve bir kritere uyan kayıtların değeri değiştirme
db.getCollection('patch_history').find({})
db.patch_history.update({"status" : "RUNNING"},{$set: { "status" : "COMPLETED"}});
 
db.api_proxy.update( {},
    { 
        "$pull": { 
            "apiProxyDeployList": { 
                "environmentSettingsId": "60e2ad54d5ba7a7636db3aa6" 
            }
        } 
    }, { "multi": true }
);
 
 
db.api_proxy.update( {_id : ObjectId("611628a3c21a5c04977e98e2")},
    { 
        "$pull": { 
            "apiProxyDeployList": { 
                "environmentSettingsId": "60e2ad54d5ba7a7636db3aa6" 
            }
        } 
    }, { "multi": true }
);

Silme

#Obje silme (where koşuluna uygun her şeyi siler)
db.privacy_settings.remove({ "salt":"UCPyFvw0EAnOgfOJ"  })
 
#api_proxy altındaki apiProxyDeployList'i temizleme
//ilk satırdaki where koşulu, tüm doküman üzerinde güncelleme yapılmak istendiği için boş
//ikinci satırdaki where koşulu, apiProxyDeployList'in altındaki her şey silineceği için boş
db.api_proxy.update(
  {  },
  {$pull : {"apiProxyDeployList" : {} }}
)
 
#Koleksiyondaki tüm kayıtları silme (truncate)
db.db_to_api.remove({})
 
#Koleksiyonu drop etme
db.db_to_api.drop()
 
#Koleksiyonu mongoya girmeden drop etme
mongo "mongodb://<IP_ADDRESS>:25080/apinizerdb" --eval 'db.getSiblingDB("admin").auth("apinizer", "PASSWORD"); db.getSiblingDB("apinizerdb").apinizer_log.drop();'
 
#Veritabanını drop etme
db.dropDatabase()

Replicaset İşlemleri

# replicaset'li sistemde replicayı masterdan sync'e zorlama
rs.syncFrom("hostname:port");

Yedekleme ve Geri Yükleme

sudo mongodump --host <IP_ADDRESS> --port=25080 --username=apinizer --password=<PASSWORD> --authenticationDatabase=admin --gzip --archive=/home/apinizer/apinizer-backup-2023-01-31--1.archive
sudo mongodump --host <IP_ADDRESS> --port 25080 --excludeCollection apinizer_log --excludeCollection audit_event -d apinizerdb --authenticationDatabase "admin" -u apinizer -p <PASSWORD> --gzip --archive=/home/apinizer/apinizer-backup-2023-01-31--1.archive
sudo mongorestore --drop --host <IP_ADDRESS> --port 25080 -u apinizer -p <PASSWORD> --authenticationDatabase=admin --gzip --archive=/home/apinizer/apinizer-backup-2023-01-31--1.archive
sudo mongodump --host <IP_ADDRESS> --port=25080 --authenticationDatabase "admin" -d apinizerdb -u apinizer -p <PASSWORD> --collection=<COLLECTION_NAME> --out=/home/apinizer/
sudo mongorestore --drop --host <IP_ADDRESS> --port 25080 --authenticationDatabase "admin" -d apinizerdb -u apinizer -p <PASSWORD> --collection=<COLLECTION_NAME> /home/apinizer/apinizerdb/<COLLECTION_NAME>.bson
Toplu veritabanı yedeklerinde gzip ile sıkıştırılma yapılabiliyor, bu durumda aşağıdaki komutu kullanarak düzgün bir archive haline getirip yukarıdaki komutu tekrar çalıştırabilirsiniz.
gunzip < all-dbs-backup-2023-10-5--02.archive > all-dbs-backup-2023-10-5--02
mongorestore --host <IP_ADDRESS> --port 25080 --username apinizer --password <PASSWORD> --authenticationDatabase admin --drop --nsInclude 'apinizer-dev.environment_settings' --archive=all-dbs-backup-2023-10-5--02

Loglar

# Uygulama logları
sudo tail -999f /var/log/mongodb/mongod.log

Apinizer’da API Proxy Yeniden Oluşturma ve Elasticsearch Loglarına Ulaşma

Bu komutlar, bir API Proxy silindiğinde ve yeniden oluşturulduğunda ya da export/import işlemleri yapıldığında Elasticsearch loglarına aynı API Proxy üzerinden erişimi sağlamak için kullanılır.
# Proxy belgesini bir değişkende sakla
doc = db.api_proxy.findOne({_id: ObjectId("YANLISPROXYID")})

# Yeni bir _id ayarla
doc._id = ObjectId("OLMASIGEREKENPROXYID")

# Yeni _id ile belgeyi ekle
db.api_proxy.insert(doc)

# Eski _id ile olan belgeyi sil
db.api_proxy.remove({_id: ObjectId("YANLISPROXYID")})

# Apinizer için gerekli güncelleme
db.api_proxy_revision.update(
  { apiProxyId: "YANLISPROXYID" },
  { $set: { apiProxyId: "OLMASIGEREKENPROXYID" } }
)

# Yetkilerin güncellenmesi
db.credential_allowed_api_proxy.updateMany(
  { apiProxyId: "YANLISPROXYID" },
  { $set: { apiProxyId: "OLMASIGEREKENPROXYID" } }
)