diff --git a/doc/Makefile b/doc/Makefile index 3b2620a..15d5c38 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -30,6 +30,7 @@ lint: clang-tidy --warnings-as-errors --config= $(CSRCS) $(HSRCS) clean: + rm -f *.elf rm -rf $(DISTDIR) run: diff --git a/doc/pages/api.en.md b/doc/pages/api.en.md index 9ae7015..90fa666 100644 --- a/doc/pages/api.en.md +++ b/doc/pages/api.en.md @@ -1,52 +1,64 @@ -My website's API, stores information about my self-hosted services, it also allows me -to publish news and updates about these services using an Atom feed and it keeps track -of visitor metrics. +My website's API, stores information about my self-hosted services, it also +allows me to publish news and updates about these services using an Atom feed +and it keeps track of visitor metrics. -This documentation contains information about all the available API endpoints. All the -endpoints can be accessed using the `/api` route. +This documentation contains information about all the available API endpoints. +All the endpoints can be accessed using the `/api` route. ## Version 1 Endpoints + Each version 1 endpoint, can be accessed using the `/v1` route. All the endpoints return JSON formatted data. ### Errors -If any error occurs, you will get a non-200 response. And the JSON data will have an -`error` key, which will contain information about the error that occured, in the -string format. This is the only JSON key that will be set in non-200 responses. + +If any error occurs, you will get a non-200 response. And the JSON data will +have an `error` key, which will contain information about the error that +occured, in the string format. This is the only JSON key that will be set in +non-200 responses. ### Results -If no error occurs, `error` key will be set to an emtpy string (""). If the endpoint -returns any data, this will be stored using the `result` key. The `result` have a -different expected type and a format for each endpoint. + +If no error occurs, `error` key will be set to an emtpy string (""). If the +endpoint returns any data, this will be stored using the `result` key. The +`result` have a different expected type and a format for each endpoint. ### Multilang -Some `result` formats may use a structure called "Multilang". This is a simple JSON -structure that includes one key for each supported language. The key is named after -the language it represents. Currently only supported languages are: + +Some `result` formats may use a structure called "Multilang". This is a simple +JSON structure that includes one key for each supported language. The key is +named after the language it represents. Currently only supported languages are: + - English (`en`) - Turkish (`tr`) So each multilang structure, will have **at least** one of these keys. Here is an example multilang structure: + ``` { "en": "Hello, world!", "tr": "Merhaba, dünya!" } ``` -If a `result` field is using a multilang structure, it will be specified as "Multilang" -in the rest of the documentation. + +If a `result` field is using a multilang structure, it will be specified as +"Multilang" in the rest of the documentation. ### Administrator routes -The endpoints under the `/v1/admin` route, are administrator-only routes. To access -these routes you'll need to specfiy a password using the `Authorization` header. If -the password you specify, matches with the password specified using the `API_PASSWORD` -environment variable, you will be able to access the route. + +The endpoints under the `/v1/admin` route, are administrator-only routes. To +access these routes you'll need to specfiy a password using the `Authorization` +header. If the password you specify, matches with the password specified using +the `API_PASSWORD` environment variable, you will be able to access the route. ### GET /v1/services -Returns a list of available services. Each service has the following JSON format: + +Returns a list of available services. Each service has the following JSON +format: + ``` { "name": "Test Service", @@ -62,73 +74,91 @@ Returns a list of available services. Each service has the following JSON format "i2p": "" } ``` + Where: + - `name`: Service name (string) - `desc`: Service description (Multilang) -- `check_time`: Last time status check time for the service, set 0 if status checking is -not supported for this service/status checking is disabled (integer, UNIX timestamp) +- `check_time`: Last time status check time for the service, set 0 if status + checking is not supported for this service/status checking is disabled + (integer, UNIX timestamp) - `check_res`: Last service status check result (integer) - * 0 if the service is down - * 1 if the service is up - * 2 if the service is up, but slow - * 3 if the service doesn't support status checking/status checking is disabled + - 0 if the service is down + - 1 if the service is up + - 2 if the service is up, but slow + - 3 if the service doesn't support status checking/status checking is disabled - `check_url`: URL used for service's status check (string, empty if none) - `clear`: Clearnet URL for the service (string, empty string if none) - `onion`: Onion (TOR) URL for the service (string, empty string if none) - `i2p`: I2P URL for the service (string, empty string if none) -You can also get information about a specific service by specifying it's name using -a URL query named `name`. +You can also get information about a specific service by specifying it's name +using a URL query named `name`. ### GET /v1/news/:language -Returns a Atom feed of news for the given language. Supports languages that are supported -by Multilang. + +Returns a Atom feed of news for the given language. Supports languages that are +supported by Multilang. ### GET /v1/metrics + Returns metrics about the API usage. The metric data has the following format: + ``` { - "since":1736294400, - "total":8 + "since": 1736294400, + "total": 8 } ``` + Where: + - `since`: Metric collection start date (integer, UNIX timestamp) - `total`: Total number of visitors (integer) ### GET /v1/admin/logs + Returns a list of administrator logs. Each log has the following JSON format: + ``` { "action": "Added service \"Test Service\"", "time": 1735861794 } ``` + Where: + - `action`: Action that the administrator performed (string) -- `time`: Time when the administrator action was performed (integer, UNIX timestamp) +- `time`: Time when the administrator action was performed (integer, UNIX + timestamp) ### PUT /v1/admin/service/add -Creates a new service. The request body needs to contain JSON data, and it needs to -have the JSON format used to represent a service. See `/v1/services/all` route to -see this format. + +Creates a new service. The request body needs to contain JSON data, and it needs +to have the JSON format used to represent a service. See `/v1/services/all` +route to see this format. Returns no data on success. ### DELETE /v1/admin/service/del -Deletes a service. The client needs to specify the name of the service to delete, by -setting the URL query `name`. + +Deletes a service. The client needs to specify the name of the service to +delete, by setting the URL query `name`. Returns no data on success. ### GET /v1/admin/service/check + Forces a status check for all the services. Returns no data on success. ### PUT /v1/admin/news/add + Creates a news post. The request body needs to contain JSON data, and it needs to use the following JSON format: + ``` { "id": "test_news", @@ -143,7 +173,9 @@ to use the following JSON format: } } ``` + Where: + - `id`: Unique ID for the news post (string) - `title`: Title for the news post (Multilang) - `author`: Author of the news post (string) @@ -152,7 +184,8 @@ Where: Returns no data on success. ### DELETE /v1/admin/news/del -Deletes a news post. The client needs to specify the ID of the news post to delete, -by setting the URL query `id`. + +Deletes a news post. The client needs to specify the ID of the news post to +delete, by setting the URL query `id`. Returns no data on success. diff --git a/doc/pages/api.tr.md b/doc/pages/api.tr.md index 67eeb7b..31e6bef 100644 --- a/doc/pages/api.tr.md +++ b/doc/pages/api.tr.md @@ -1,53 +1,64 @@ -Websitemin API, self-host edilen servisler hakkında bilgileri tutuyor, bu servisler hakkında -haberleri ve güncellemeleri bir Atom feed'i aracılığı ile paylaşmama izin veriyor ve ziyartçi -metriklerini takip ediyor. +Websitemin API, self-host edilen servisler hakkında bilgileri tutuyor, bu +servisler hakkında haberleri ve güncellemeleri bir Atom feed'i aracılığı ile +paylaşmama izin veriyor ve ziyartçi metriklerini takip ediyor. -Bu dökümentasyon tüm erişime açık API endpoint'leri hakkında bilgiler içeriyor. Tüm endpoint'lere -`/api` yolu ile erişilebilir. +Bu dökümentasyon tüm erişime açık API endpoint'leri hakkında bilgiler içeriyor. +Tüm endpoint'lere `/api` yolu ile erişilebilir. ## Versyion 1 Endpoint'leri + Tüm versiyon 1 endpoint'leri `/v1` yolu ile erişilebilir. Tüm endpoint'ler JSON ile formatlanmış veri döndürür. ### Hatalar + Herhangi bir hata ortaya çıkarsa 200 dışı bir cevap alırsınız. Ve JSON verisinde -bir `error` girdisi bulunur, bu ortaya çıkan hata hakkında gerekli bilgileri, metin formunda -içerir. 200 dışı bir cevap aldığınızda tek JSON girdisi bu olacaktır. +bir `error` girdisi bulunur, bu ortaya çıkan hata hakkında gerekli bilgileri, +metin formunda içerir. 200 dışı bir cevap aldığınızda tek JSON girdisi bu +olacaktır. ### Sonuçlar -Eğer bir hata ortaya çıkmaz ise, `error` girdisi boş bir metin olarak ayarlanır (""). -Eğer endpoint herhangi bir veri döndürüyorsa, bu veri `result` giridisi ile sağlanır. -Her endpoint için `result` girdisinin tipi farklı olabilir. + +Eğer bir hata ortaya çıkmaz ise, `error` girdisi boş bir metin olarak ayarlanır +(""). Eğer endpoint herhangi bir veri döndürüyorsa, bu veri `result` giridisi +ile sağlanır. Her endpoint için `result` girdisinin tipi farklı olabilir. ### Multilang -Bazı `result` formatları "Multilang" isimli bir yapıyı kullanabilir. Bu her desteklenen -dil için bir girdi bulunduran basit bir JSON yapısıdır. Her girdi ifade ettiği dil -ile isimlendirilir. Şuan tek desteklenen diller: + +Bazı `result` formatları "Multilang" isimli bir yapıyı kullanabilir. Bu her +desteklenen dil için bir girdi bulunduran basit bir JSON yapısıdır. Her girdi +ifade ettiği dil ile isimlendirilir. Şuan tek desteklenen diller: + - English (`en`) - Turkish (`tr`) Yani her multilang yapısında, bu girdilerden **en az** bir tanesi bulunur. İşte örnek bir multilang yapısı: + ``` { "en": "Hello, world!", "tr": "Merhaba, dünya!" } ``` -Bu dökümantasyonun geri kalanında, eğer bir `result` girdisi bir multilang yapısı kullanıyorsa, -"Multilang" olarak isimlendirilecek. + +Bu dökümantasyonun geri kalanında, eğer bir `result` girdisi bir multilang +yapısı kullanıyorsa, "Multilang" olarak isimlendirilecek. ### Yönetici yolları -`/v1/admin` yolu altındaki endpoint'ler yöneticiye-özeldir. Bu yollara erişmek için, -`Authorization` header'ı aracılığı ile bir parola belirtmeniz gerekecektir. Eğer -belritiğiniz parola `API_PASSWORD` ortam değişkeni ile belirtilen parola ile -uyuşuyorsa, yola erişebilirsiniz. + +`/v1/admin` yolu altındaki endpoint'ler yöneticiye-özeldir. Bu yollara erişmek +için, `Authorization` header'ı aracılığı ile bir parola belirtmeniz +gerekecektir. Eğer belritiğiniz parola `API_PASSWORD` ortam değişkeni ile +belirtilen parola ile uyuşuyorsa, yola erişebilirsiniz. ### GET /v1/services + Erişilebilir servislerin bir listesini döndürür. Her servis şu JSON formatını takip eder: + ``` { "name": "Test Service", @@ -63,74 +74,93 @@ takip eder: "i2p": "" } ``` + Burada: + - `name`: Servis ismi (metin) - `desc`: Servis açıklaması (Multilang) -- `check_time`: Servisin en son durumunun kontrol edildiği zaman, eğer bu servis için -durum kontrolü desteklenmiyorsa/durum kontrolü devra dışı bırakılmış ise 0 olarak -ayarlanır (sayı, UNIX zaman damgası) +- `check_time`: Servisin en son durumunun kontrol edildiği zaman, eğer bu servis + için durum kontrolü desteklenmiyorsa/durum kontrolü devra dışı bırakılmış ise + 0 olarak ayarlanır (sayı, UNIX zaman damgası) - `check_res`: En son servis durum kontrolünün sonucu (sayı) - * servis kapalı ise 0 - * servis çalışıyor ise 1 - * serivs çalışıyor, ama yavaş ise 2 - * bu servis için durum kontrolü desteklenmiyorsa/durum kontrolü devre dışı ise 3 -- `check_url`: Servis durum kontrolü için kullanılan URL (metin, yoksa boş metin) + - servis kapalı ise 0 + - servis çalışıyor ise 1 + - serivs çalışıyor, ama yavaş ise 2 + - bu servis için durum kontrolü desteklenmiyorsa/durum kontrolü devre dışı ise + 3 +- `check_url`: Servis durum kontrolü için kullanılan URL (metin, yoksa boş + metin) - `clear`: Servisin açık ağ URL'si (metin, yoksa boş metin) - `onion`: Servisin Onion (TOR) URL'si (metin, yoksa boş metin) - `i2p`: Servisin I2P URL'si (metin, yoksa boş metin) -`name` isimli bir URL sorgusu ile servisin ismini belirterek, spesifik bir servis hakkında -bilgi de alabilirsiniz. +`name` isimli bir URL sorgusu ile servisin ismini belirterek, spesifik bir +servis hakkında bilgi de alabilirsiniz. ### GET /v1/news/:language -Verilen dil için haberlerin bir Atom feed'i döndürür. Multilang tarafından desteklenen -dilleri destekler. + +Verilen dil için haberlerin bir Atom feed'i döndürür. Multilang tarafından +desteklenen dilleri destekler. ### GET /v1/metrics + API kullanımı hakkınadaki metrikleri döndürür. Metrik şu formatı kullanır: + ``` { - "since":1736294400, - "total":8 + "since": 1736294400, + "total": 8 } ``` + Burada: + - `since`: Metrik toplama başlangıç tarihi (sayı, UNIX zaman damgası) - `total`: Toplam ziyaretçi sayısı (sayı) ### GET /v1/admin/logs -Yönetici kayıtlarının bir listesini döndürür. Her kayıt şu JSON formatını takip eder: + +Yönetici kayıtlarının bir listesini döndürür. Her kayıt şu JSON formatını takip +eder: + ``` { "action": "Added service \"Test Service\"", "time": 1735861794 } ``` + Burada: + - `action`: Yöneticinin yaptığı eylem (metin) - `time`: Yönetici eylemin yapıldığı zaman (sayı, UNIX zaman damgası) ### PUT /v1/admin/service/add -Yeni bir servis oluşturur. İstek gövdesinin servis için kullanılan JSON formatını -takip eden JSON verisini içermesi gerekir. Bu formatı görmek için `/v1/services/all` -yoluna bakınız. + +Yeni bir servis oluşturur. İstek gövdesinin servis için kullanılan JSON +formatını takip eden JSON verisini içermesi gerekir. Bu formatı görmek için +`/v1/services/all` yoluna bakınız. Başarılı ise herhangi bir veri döndürmez. ### DELETE /v1/admin/service/del -Bir servisi siler. İstemcinin `name` URL sorgusu ile silinecek servisin ismini belirtmesi -gerekir. + +Bir servisi siler. İstemcinin `name` URL sorgusu ile silinecek servisin ismini +belirtmesi gerekir. Başarılı ise herhangi bir veri döndürmez. ### GET /v1/admin/service/check + Tüm servisler için bir durum kontrolünü zorlar. Başarılı ise herhangi bir veri döndürmez. ### PUT /v1/admin/news/add -Yeni bir haber paylaşımı oluşturur. İstek gövedisinin JSOn verisi içermesi ve verilen formatı -takip etmesi gerekir: + +Yeni bir haber paylaşımı oluşturur. İstek gövedisinin JSOn verisi içermesi ve +verilen formatı takip etmesi gerekir: + ``` { "id": "test_news", @@ -145,7 +175,9 @@ takip etmesi gerekir: } } ``` + Burada: + - `id`: Haber paylaşımının benzersiz ID'si (metin) - `title`: Haber paylaşımının başlığı (Multilang) - `author`: Haber paylaşımının yazarı (metin) @@ -154,7 +186,8 @@ Burada: Başarılı ise herhangi bir veri döndürmez. ### DELETE /v1/admin/news/del -Bir haber paylaşımı siler. İstemcinin `id` URL sorgusu ile silinecek paylaşımın ID'sini -belirtmesi gerekir. + +Bir haber paylaşımı siler. İstemcinin `id` URL sorgusu ile silinecek paylaşımın +ID'sini belirtmesi gerekir. Başarılı ise herhangi bir veri döndürmez. diff --git a/doc/pages/privacy.en.md b/doc/pages/privacy.en.md index 622e062..48102e9 100644 --- a/doc/pages/privacy.en.md +++ b/doc/pages/privacy.en.md @@ -1,31 +1,44 @@ -As a privacy advocate myself I do my best to respect your privacy while simultaneously keeping my server safe. I also think it's -important to be transparent about this kind of stuff so I wrote this document to tell you how exactly I process or store your -information. +As a privacy advocate myself I do my best to respect your privacy while +simultaneously keeping my server safe. I also think it's important to be +transparent about this kind of stuff so I wrote this document to tell you how +exactly I process or store your information. ## DNS & SSL -Currently I use cloudflare's name servers, however cloudflare doesn't own my domain (I didn't purchase the domain from cloudflare) -nor it proxies any of the traffic. All of my records use the *DNS only*" mode, meaning they are just DNS records and they point -to my server, not cloudflare. This also means cloudflare doesn't control any of the SSL certificates. All the certificates are -stored on my server and they are created with Let's Encrypt. So I own the certificates and it's not possible for cloudlfare to -suddenly switch DNS records (it would break SSL). + +Currently I use cloudflare's name servers, however cloudflare doesn't own my +domain (I didn't purchase the domain from cloudflare) nor it proxies any of the +traffic. All of my records use the _DNS only_" mode, meaning they are just DNS +records and they point to my server, not cloudflare. This also means cloudflare +doesn't control any of the SSL certificates. All the certificates are stored on +my server and they are created with Let's Encrypt. So I own the certificates and +it's not possible for cloudlfare to suddenly switch DNS records (it would break +SSL). ## Usage metrics -I don't have any kind of request or traffic monitoring on my server. So no, your HTTP(S) requests or other network -connections are not processed to generate colorful graphs, pie charts and stuff. -You may have realized that in the bottom of this page there is total visitor number tracker. It is the only -usage/visitor metric tracking I have, which is implemented by website's API, which is free (as in freedom) so you can -go audit it's code yourself. +I don't have any kind of request or traffic monitoring on my server. So no, your +HTTP(S) requests or other network connections are not processed to generate +colorful graphs, pie charts and stuff. -I want to make it clear that this metric tracker does not store any information about you or your HTTP(S) requests to -a database. It temporarily stores your IP address' SHA1 hash, in memory, so it doesn't recount the same visitor again -when they refresh the website or visit it multiple times in a short period of time. After a certain amount of requests, -your IP address' SHA1 hash will be removed from the memory and it will be replaced with a new visitor's SHA1 hash instead. +You may have realized that in the bottom of this page there is total visitor +number tracker. It is the only usage/visitor metric tracking I have, which is +implemented by website's API, which is free (as in freedom) so you can go audit +it's code yourself. + +I want to make it clear that this metric tracker does not store any information +about you or your HTTP(S) requests to a database. It temporarily stores your IP +address' SHA1 hash, in memory, so it doesn't recount the same visitor again when +they refresh the website or visit it multiple times in a short period of time. +After a certain amount of requests, your IP address' SHA1 hash will be removed +from the memory and it will be replaced with a new visitor's SHA1 hash instead. ## Logs -All the HTTP(S) services are proxied with nginx, and nginx logs all of them to a file on the disk. This file (`access.log`) -is only readable by the root user, and it is contents are deleted every 4 hours (with `shred` to make sure it doesn't leave -anything on the disk). The logs include *only* the following information: + +All the HTTP(S) services are proxied with nginx, and nginx logs all of them to a +file on the disk. This file (`access.log`) is only readable by the root user, +and it is contents are deleted every 4 hours (with `shred` to make sure it +doesn't leave anything on the disk). The logs include _only_ the following +information: - Request time - Requested host @@ -33,9 +46,12 @@ anything on the disk). The logs include *only* the following information: - HTTP request method - HTTP response code -This is the minimal information I need to trace any issues if something goes wrong, which is the main reason why I use -logging at all, to make it easier to find any issues. +This is the minimal information I need to trace any issues if something goes +wrong, which is the main reason why I use logging at all, to make it easier to +find any issues. ## Data removal -If you want to remove any of your data from my server, [you can send me an email](mailto:ngn@ngn.tf). And yes this includes -removing usage metrics and logs. + +If you want to remove any of your data from my server, +[you can contact me](/#contact). And yes this includes removing usage metrics +and logs. diff --git a/doc/pages/privacy.tr.md b/doc/pages/privacy.tr.md index e591bda..8cd4a1f 100644 --- a/doc/pages/privacy.tr.md +++ b/doc/pages/privacy.tr.md @@ -1,30 +1,46 @@ -Kişisel olarak ben de bir gizlik savunucusu olduğumdan, bir yandan sunucumu güvende tutarken bir yandan da gizliliğinize önem -göstermek için elimden geleni yapıyorum. Aynı zamanda bu tarz şeyler hakkında şeffaf ve açık olmanın önemli olduğunu düşünüyorum, -o yüzden verilerinizi nasıl işlediğimi ya da depoladığımı anlamanız için bu dökümanı yazmaya karar verdim. +Kişisel olarak ben de bir gizlik savunucusu olduğumdan, bir yandan sunucumu +güvende tutarken bir yandan da gizliliğinize önem göstermek için elimden geleni +yapıyorum. Aynı zamanda bu tarz şeyler hakkında şeffaf ve açık olmanın önemli +olduğunu düşünüyorum, o yüzden verilerinizi nasıl işlediğimi ya da depoladığımı +anlamanız için bu dökümanı yazmaya karar verdim. ## DNS & SSL -Şuan cloudflare'in isim sunucularını kullanıyorum, ancak cloudflare alan adıma sahip değil (alan adımı cloudflare'den almadım) -ve aynı şekilde herhangi bir trafiğe vekillik etmiyor. Tüm DNS kayıtlarım *Sadece DNS* modunu kullanıyor, yani sadece -DNS kayıtlarından ibaretler ve benim sunucuma işaret ediyorlar, cloudflare'e değil. Bu aynı zamanda cloudflare SSL sertifikalarımı -kontrol etmiyor demek. Tüm sertifikalar benim sunucumda tutuluyor ve Let's Encrypt ile oluşturuldular. Yani sertifikalar bana ait -ve cloudflare'in aniden DNS kayıtlarını değiştirmesi mümkün değil (bu SSL'in bozulmasına sebep olur). + +Şuan cloudflare'in isim sunucularını kullanıyorum, ancak cloudflare alan adıma +sahip değil (alan adımı cloudflare'den almadım) ve aynı şekilde herhangi bir +trafiğe vekillik etmiyor. Tüm DNS kayıtlarım _Sadece DNS_ modunu kullanıyor, +yani sadece DNS kayıtlarından ibaretler ve benim sunucuma işaret ediyorlar, +cloudflare'e değil. Bu aynı zamanda cloudflare SSL sertifikalarımı kontrol +etmiyor demek. Tüm sertifikalar benim sunucumda tutuluyor ve Let's Encrypt ile +oluşturuldular. Yani sertifikalar bana ait ve cloudflare'in aniden DNS +kayıtlarını değiştirmesi mümkün değil (bu SSL'in bozulmasına sebep olur). ## Kullanım metrikleri -Sunucumda herhangi bir istek ya da trafik monitörlermesi yok. Yani hayır, HTTP(S) istekleriniz ya da diğer ağ -bağlantılarınız renki grafikler, pasta grafikleri gibi şeyler üretmek için işlenmiyor. -Bu sayfanın altında bir ziyaretçi sayısı takipçisi olduğunu farketmiş olabilirsiniz. Bu kullandığım tek kullanım/ziyaretçi -metrik takibi ve websitemin, özgür olan, bu yüzden kodunu kendiniz denetleyebileceğiniz API'ı ile implemente edildi. +Sunucumda herhangi bir istek ya da trafik monitörlermesi yok. Yani hayır, +HTTP(S) istekleriniz ya da diğer ağ bağlantılarınız renki grafikler, pasta +grafikleri gibi şeyler üretmek için işlenmiyor. -Bu metrik takipçisinin, HTTP(S) istekleriniz hakkında herhangi bir veriyi bir veri tabanına kaydetmediğini belirtmek isterim. -Bu takipçi geçici olarak IP adresinizin SHA1 hash'ini bellekte tutuyor, bunun amacı aynı ziyaretçiyi sayfayı yenilediği zaman -ya da kısa bir süre için websitesini birden fazla kez ziyaret ettiği zaman tekrar saymayı önlemek. Belirli bir miktar istekten -sonra, IP adresinizin SHA1 hash'i bellekten kaldırılacaktır ve yeni bir ziyaretçinin SHA1'i onun yerine geçicektir. +Bu sayfanın altında bir ziyaretçi sayısı takipçisi olduğunu farketmiş +olabilirsiniz. Bu kullandığım tek kullanım/ziyaretçi metrik takibi ve +websitemin, özgür olan, bu yüzden kodunu kendiniz denetleyebileceğiniz API'ı ile +implemente edildi. + +Bu metrik takipçisinin, HTTP(S) istekleriniz hakkında herhangi bir veriyi bir +veri tabanına kaydetmediğini belirtmek isterim. Bu takipçi geçici olarak IP +adresinizin SHA1 hash'ini bellekte tutuyor, bunun amacı aynı ziyaretçiyi sayfayı +yenilediği zaman ya da kısa bir süre için websitesini birden fazla kez ziyaret +ettiği zaman tekrar saymayı önlemek. Belirli bir miktar istekten sonra, IP +adresinizin SHA1 hash'i bellekten kaldırılacaktır ve yeni bir ziyaretçinin +SHA1'i onun yerine geçicektir. ## Kayıtlar -Tüm HTTP(S) servisleri nginx ile vekilleniyor, ve nginx hepsini disk üzerindeki bir dosyaya kaydediyor. Bu dosya (`access.log`) -sadece root kullanıcısı tarafından okunabilir, ve içerği her 4 saatde bir siliniyor (diskde veri kalmadığından emin olmak için -shred komutu ile). Kayıtlar *sadece* aşağıdaki bilgileri içeriyor: + +Tüm HTTP(S) servisleri nginx ile vekilleniyor, ve nginx hepsini disk üzerindeki +bir dosyaya kaydediyor. Bu dosya (`access.log`) sadece root kullanıcısı +tarafından okunabilir, ve içerği her 4 saatde bir siliniyor (diskde veri +kalmadığından emin olmak için shred komutu ile). Kayıtlar _sadece_ aşağıdaki +bilgileri içeriyor: - İstek zamanı - İstenilen host @@ -32,9 +48,12 @@ shred komutu ile). Kayıtlar *sadece* aşağıdaki bilgileri içeriyor: - HTTP istek yöntemi - HTTP cevap kodu -Bu birşeyler yanlış giderse sorunları bulmak için ihtiyacım olan en az bilgi, kayıt tutmamın ana sebeplerinden bir tanesi -zaten bu, sorunları bulmayı kolaylaştırmak. +Bu birşeyler yanlış giderse sorunları bulmak için ihtiyacım olan en az bilgi, +kayıt tutmamın ana sebeplerinden bir tanesi zaten bu, sorunları bulmayı +kolaylaştırmak. ## Veri silimi -Sunucumdan herhangi bir verinizi kaldırmak isterseniz, [bana bir email gönderebilirsiniz](mailto:ngn@ngn.tf). Ve evet buna -kullanım metrikleri ve kayıtlar dahil. + +Sunucumdan herhangi bir verinizi kaldırmak isterseniz, +[bana bir ulaşabilirsiniz](/#contact). Ve evet buna kullanım metrikleri ve +kayıtlar dahil.