Compare commits
10 Commits
dev
...
renovate/s
Author | SHA1 | Date | |
---|---|---|---|
ed0f936c6f | |||
91a11e4611
|
|||
13a703352b
|
|||
2c5388bcce
|
|||
f053b93c24
|
|||
babbe50c00
|
|||
92f594f27f
|
|||
cb5f5628a3
|
|||
8adbc9d354
|
|||
8a084c4e95
|
14
.gitignore
vendored
14
.gitignore
vendored
@@ -1,11 +1,7 @@
|
|||||||
|
# docker(-compose) stuff
|
||||||
data.db
|
data.db
|
||||||
*.yaml
|
docker-compose.yaml
|
||||||
*.yml
|
docker-compose.yml
|
||||||
|
compose.yaml
|
||||||
|
compose.yml
|
||||||
*.env
|
*.env
|
||||||
|
|
||||||
# don't ignore example deployment stuff
|
|
||||||
!deploy/*
|
|
||||||
!.github/*
|
|
||||||
!.gitea/*
|
|
||||||
!.github/*/*
|
|
||||||
!.gitea/*/*
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
# build the application with node
|
# build the application with node
|
||||||
FROM node:23.11.1 AS build
|
FROM node:24.4.1 AS build
|
||||||
|
|
||||||
ARG WEBSITE_REPORT_URL
|
ARG WEBSITE_REPORT_URL
|
||||||
ARG WEBSITE_SOURCE_URL
|
ARG WEBSITE_SOURCE_URL
|
||||||
@@ -16,7 +16,6 @@ ENV WEBSITE_API_PATH=$WEBSITE_API_PATH
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY . /app
|
COPY . /app
|
||||||
|
|
||||||
RUN apt install -y make sed wget
|
|
||||||
RUN npm install
|
RUN npm install
|
||||||
RUN make
|
RUN make
|
||||||
|
|
||||||
|
6
app/package-lock.json
generated
6
app/package-lock.json
generated
@@ -536,9 +536,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/kit": {
|
"node_modules/@sveltejs/kit": {
|
||||||
"version": "2.25.1",
|
"version": "2.26.1",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.25.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.26.1.tgz",
|
||||||
"integrity": "sha512-8H+fxDEp7Xq6tLFdrGdS5fLu6ONDQQ9DgyjboXpChubuFdfH9QoFX09ypssBpyNkJNZFt9eW3yLmXIc9CesPCA==",
|
"integrity": "sha512-FwDhHAoXYUGnYndrrEzEYcKdYWpSoRKq4kli29oMe83hLri4/DOGQk3xUgwjDo0LKpSmj5M/Sj29/Ug3wO0Cbg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@@ -17,10 +17,11 @@
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: end;
|
align-items: end;
|
||||||
background: var(--transparent);
|
background: var(--transparent);
|
||||||
|
height: 250px;
|
||||||
}
|
}
|
||||||
|
|
||||||
header div {
|
header div {
|
||||||
padding: 100px 40px 10px 40px;
|
padding: 0 40px 10px 40px;
|
||||||
color: var(--color);
|
color: var(--color);
|
||||||
font-size: var(--size-6);
|
font-size: var(--size-6);
|
||||||
font-family:
|
font-family:
|
||||||
@@ -50,10 +51,20 @@
|
|||||||
|
|
||||||
header img {
|
header img {
|
||||||
width: 220px;
|
width: 220px;
|
||||||
padding: 50px 50px 0 50px;
|
padding: 0 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 900px) {
|
@media only screen and (max-width: 900px) {
|
||||||
|
header {
|
||||||
|
height: 180px;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
header div {
|
||||||
|
padding: 30px 20px 20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
header img {
|
header img {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<form action="/" method="get" {onsubmit}>
|
<form method="get" {onsubmit}>
|
||||||
<input type="hidden" name="l" value={$next.code} />
|
<input type="hidden" name="l" value={$next.code} />
|
||||||
<button type="submit">{$next.icon}</button>
|
<button type="submit">{$next.icon}</button>
|
||||||
</form>
|
</form>
|
||||||
|
@@ -13,16 +13,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href={service.clear}> Clear</a></li>
|
<li><a href={service.clear}> Clear</a></li>
|
||||||
|
<span>|</span>
|
||||||
<li><a href={service.onion}>TOR</a></li>
|
<li><a href={service.onion}>TOR</a></li>
|
||||||
|
<span>|</span>
|
||||||
<li><a href={service.i2p}> I2P</a></li>
|
<li><a href={service.i2p}> I2P</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="check">
|
<div class="check">
|
||||||
<h1>
|
<p>
|
||||||
{$_("services.last", {
|
{$_("services.last", {
|
||||||
time: time_from_ts(service.check_time),
|
time: time_from_ts(service.check_time),
|
||||||
})}
|
})}
|
||||||
</h1>
|
</p>
|
||||||
{#if service.check_res == 0}
|
{#if service.check_res == 0}
|
||||||
<span style="background: var(--white-2)">
|
<span style="background: var(--white-2)">
|
||||||
{$_("services.status.down")}
|
{$_("services.status.down")}
|
||||||
@@ -48,7 +50,7 @@
|
|||||||
border: solid 1px var(--black-3);
|
border: solid 1px var(--black-3);
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
|
||||||
flex-grow: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
main .info {
|
main .info {
|
||||||
@@ -82,12 +84,6 @@
|
|||||||
list-style: none;
|
list-style: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
main .info ul li:not(:last-of-type)::after {
|
|
||||||
content: " / ";
|
|
||||||
color: var(--white-3);
|
|
||||||
font-weight: 900;
|
|
||||||
}
|
|
||||||
|
|
||||||
main .info li a {
|
main .info li a {
|
||||||
color: var(--color);
|
color: var(--color);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -110,6 +106,10 @@
|
|||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
main .info ul span {
|
||||||
|
color: var(--white-3);
|
||||||
|
}
|
||||||
|
|
||||||
main .check {
|
main .check {
|
||||||
border-top: solid 1px var(--black-3);
|
border-top: solid 1px var(--black-3);
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -119,12 +119,15 @@
|
|||||||
color: var(--white-1);
|
color: var(--white-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
main .check h1 {
|
main .check p {
|
||||||
font-size: var(--size-2);
|
font-size: var(--size-2);
|
||||||
font-weight: 100;
|
font-weight: 100;
|
||||||
|
|
||||||
color: var(--white-2);
|
color: var(--white-2);
|
||||||
padding: 5px 18px;
|
padding: 5px 18px;
|
||||||
|
|
||||||
|
word-break: keep-all;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
main .check span {
|
main .check span {
|
||||||
|
@@ -65,7 +65,7 @@ class Locale {
|
|||||||
for (let i = 0; i < links.length; i++) {
|
for (let i = 0; i < links.length; i++) {
|
||||||
let link = links[i][0];
|
let link = links[i][0];
|
||||||
let name = link.match(/(?<=\[).*?(?=])/g);
|
let name = link.match(/(?<=\[).*?(?=])/g);
|
||||||
let url = link.match(/(?<=\()[^ ]*(?=\))/g);
|
let url = link.match(/(?<=\]\()[^ ]*(?=\))/g);
|
||||||
|
|
||||||
// if we fail to extract the link name and/or URL, skip this match
|
// if we fail to extract the link name and/or URL, skip this match
|
||||||
if (null === name || null === url) continue;
|
if (null === name || null === url) continue;
|
||||||
|
98
app/src/locales/en.yaml
Normal file
98
app/src/locales/en.yaml
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
navbar:
|
||||||
|
home: home
|
||||||
|
services: services
|
||||||
|
donate: donate
|
||||||
|
|
||||||
|
home:
|
||||||
|
title: hello world!
|
||||||
|
welcome:
|
||||||
|
title: about
|
||||||
|
desc: |
|
||||||
|
Welcome to my personal website, I'm ngn. You might also know me as ngn13.
|
||||||
|
I am a security, privacy and freedom advocate high-school student from
|
||||||
|
Turkey. I'm mainly interesed in software development and system security,
|
||||||
|
so I usually spend my free time writing [Free/Libre
|
||||||
|
software](https://www.gnu.org/philosophy/free-sw.html), solving
|
||||||
|
[CTF](https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity))s and
|
||||||
|
learning new things.
|
||||||
|
thanks: |
|
||||||
|
I have few personal software projects and I host web based services. If
|
||||||
|
you would like to check them out, see the sections below. Thank you for
|
||||||
|
visiting my website and I hope you have a good rest of your day!
|
||||||
|
|
||||||
|
projects:
|
||||||
|
title: projects
|
||||||
|
desc: |
|
||||||
|
I develop and work on Free/Libre software. I don't work on massive
|
||||||
|
projects and I'm not a professional but I do enjoy it. Here are some of my
|
||||||
|
more popular projects that you might find interesting
|
||||||
|
|
||||||
|
services:
|
||||||
|
title: services
|
||||||
|
desc: |
|
||||||
|
I host web based services. Most of these services provide front-end or
|
||||||
|
alternatives to already existing popular web services. Here are all the
|
||||||
|
details
|
||||||
|
speed: All of these services are available over an 1 Gbit interface
|
||||||
|
security: All use SSL encrypted connection and they respect your privacy and freedom
|
||||||
|
blocks: |
|
||||||
|
Accessible from clearnet, [TOR](https://www.torproject.org/) and
|
||||||
|
[I2P](https://geti2p.net/en/) - no region or network blocks
|
||||||
|
bullshit: No CDNs, no cloudflare, no CAPTCHA, no analytics, no bullshit
|
||||||
|
link: See all the services!
|
||||||
|
|
||||||
|
contact:
|
||||||
|
title: contact
|
||||||
|
desc: |
|
||||||
|
If you have question or a suggestion, or if you simply want to chat, feel
|
||||||
|
free to send me an email at **ngn [at] ngn.tf**. You can use my [PGP
|
||||||
|
key](https://keyoxide.org/F9E70878C2FB389AEC2BA34CA3654DF5AD9F641D) to
|
||||||
|
send me an encrypted email, which I would highly prefer. My PGP key also
|
||||||
|
includes identity claims, which you can use to verify my public profiles.
|
||||||
|
mastodon: |
|
||||||
|
I'm also on [mastodon](https://defcon.social/@ngn) where I mainly post
|
||||||
|
Turkish stuff.
|
||||||
|
|
||||||
|
services:
|
||||||
|
title: service status
|
||||||
|
desc: |
|
||||||
|
Here you can find a list of all the publicly accessible services I host. I
|
||||||
|
have periodic status check for clearnet addresses: A request is sent to the
|
||||||
|
clearnet address the status of the service is reported based on the
|
||||||
|
response. The latest reported status is displayed next to the time of the
|
||||||
|
report. If you experience any issues with a service even though the status
|
||||||
|
is displayed as up, please [contact me](/#contact) to report this issue.
|
||||||
|
feed: |
|
||||||
|
I also have an [1:Atom feed] that you can follow to get the latest news and
|
||||||
|
updates about the changes made to the different services.
|
||||||
|
last: Last checked at {time}
|
||||||
|
status:
|
||||||
|
up: Up
|
||||||
|
down: Down
|
||||||
|
slow: Slow
|
||||||
|
|
||||||
|
donate:
|
||||||
|
title: donate!
|
||||||
|
desc: |
|
||||||
|
If you like my work or if you are feeling generous, you can financially
|
||||||
|
support me. I spend around $15 every month to maintain everything, so even a
|
||||||
|
small donation would be highly appreciated and it would help me keep
|
||||||
|
everything up and running.
|
||||||
|
info: |
|
||||||
|
Currently I only accept donations with [Monero
|
||||||
|
(XMR)](https://www.getmonero.org/). Here is my monero address
|
||||||
|
thanks: |
|
||||||
|
Also I would like to thank everyone who has donated so far. I really
|
||||||
|
appreciate it!
|
||||||
|
|
||||||
|
error:
|
||||||
|
title: something went wrong!
|
||||||
|
report: Report this issue
|
||||||
|
|
||||||
|
footer:
|
||||||
|
source: Source
|
||||||
|
license: License
|
||||||
|
privacy: Privacy
|
||||||
|
number: Visited {total} times since {since}
|
||||||
|
wow: wow!!
|
||||||
|
render: Rendered on {time} just for you
|
103
app/src/locales/tr.yaml
Normal file
103
app/src/locales/tr.yaml
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
navbar:
|
||||||
|
home: anasayfa
|
||||||
|
services: servisler
|
||||||
|
donate: bağış
|
||||||
|
|
||||||
|
home:
|
||||||
|
title: merhaba dünya!
|
||||||
|
welcome:
|
||||||
|
title: hakkımda
|
||||||
|
desc: |
|
||||||
|
Kişisel websiteme hoşgeldiniz, ben ngn. Beni ngn13 olarak da
|
||||||
|
bilebilirsiniz. Türkiye'den güvenlik, gizlilik ve özgürlük savunucusu bir
|
||||||
|
liseliyim. Genel olarak yazılım geliştirme ve sistem güvenliği ile
|
||||||
|
ilgileniyorum, o yüzden boş zamanımın çoğunu
|
||||||
|
[Özgür yazılım](https://www.gnu.org/philosophy/free-sw.tr.html) yazarak,
|
||||||
|
[CTF](https://wikipedia.org/wiki/Capture_the_flag_(cybersecurity)) çözerek
|
||||||
|
ve yeni şeyler öğrenerek harcıyorum.
|
||||||
|
thanks: |
|
||||||
|
Birkaç kişisel yazılım projem var ve web tabanlı servisler barındırıyorum.
|
||||||
|
Eğer bunları incelemek isterseniz, aşağıdaki bölümlere bakın. Websitemi
|
||||||
|
ziyaret ettiğiniz için teşekkür ederim ve size iyi günler dilerim!
|
||||||
|
|
||||||
|
projects:
|
||||||
|
title: projeler
|
||||||
|
desc: |
|
||||||
|
Özgür yazılım geliştiriyorum ve üzerinde çalışıyorum. Devasa projelerde
|
||||||
|
çalışmıyorum ve profesyonel değilim ama hoşuma gidiyor. İşte biraz daha
|
||||||
|
popüler olan ve ilginç bulabileceğiniz bazı projelerim
|
||||||
|
|
||||||
|
services:
|
||||||
|
title: servisler
|
||||||
|
desc: |
|
||||||
|
Web tabanlı servisler host ediyorum. Bu servislerin çoğu zaten mevcut
|
||||||
|
popüler web servislerine arayüz ya da alternatifler sağlıyor. İşte tüm
|
||||||
|
detaylar
|
||||||
|
speed: Tüm servisler 1 Gbit ağ arayüzü üzerinden erişilebilir
|
||||||
|
security: |
|
||||||
|
Hepsi SSL şifreli bağlantı kullanıyor ve mahremiyetinize ve özgürlüğünüze
|
||||||
|
saygı gösteriyor
|
||||||
|
blocks: |
|
||||||
|
Açık ağdan, [TOR](https://www.torproject.org/tr/) ve
|
||||||
|
[I2P](https://geti2p.net/tr/)'den erişilebilirler, bölge ya da ağ blokları
|
||||||
|
yok
|
||||||
|
bullshit: CDN yok, cloudflare yok, CAPTCHA yok, analitikler ve diğer saçmalıklar yok
|
||||||
|
link: Tüm servisleri görüntüle!
|
||||||
|
|
||||||
|
contact:
|
||||||
|
title: contact
|
||||||
|
desc: |
|
||||||
|
Eğer bir sorunuz ya da öneriniz varsa, ya da basitçe muhabbet etmek
|
||||||
|
istiyorsanız, bana **ngn [at] ngn.tf** adresinden bir e-posta göndermekten
|
||||||
|
çekinmeyin. [PGP anahtarımı
|
||||||
|
](https://keyoxide.org/F9E70878C2FB389AEC2BA34CA3654DF5AD9F641D) bana
|
||||||
|
tercihim olan şifreli e-postalar göndermek için kullanabilirsiniz. PGP
|
||||||
|
anahtarım aynı zamanda identity claim'leri içeriyor, bunları internete
|
||||||
|
açık profillerimi doğrulamak için kullanabilirisniz.
|
||||||
|
mastodon: |
|
||||||
|
Aynı zamanda [mastodon'dayım](https://defcon.social/@ngn),
|
||||||
|
çoğunlukla Türkçe olan paylaşımlar yapıyorum.
|
||||||
|
|
||||||
|
services:
|
||||||
|
title: servis durumu
|
||||||
|
desc: |
|
||||||
|
Burada barındırdığım internete açık tüm servislerin bir listesini
|
||||||
|
bulabilirsiniz. Açık ağ adresleri için periyodik bir durum kontrolü mevcut:
|
||||||
|
Açık ağ adresine bir istek gönderiliyor ve servisin durumu verilen cevaba
|
||||||
|
göre raporlanıyor. En son raporlanan durum raporun zamanının yanında
|
||||||
|
görüntüleniyor. Bir servisin durumu çalışıyor olarak görünmesine rağmen
|
||||||
|
servisle alakalı sorunlar yaşıyorsanız, lütfen bu sorunları raporlamak için
|
||||||
|
[bana ulaşın](/#contact).
|
||||||
|
feed: |
|
||||||
|
Farklı servislere yapılan değişiklikler hakkında güncellemeleri ve
|
||||||
|
haberleri görmek adına takip edebileceğiniz bir [1:Atom beslemesi] de
|
||||||
|
mevcut.
|
||||||
|
last: Son kontrol zamanı {time}
|
||||||
|
status:
|
||||||
|
up: Çalışıyor
|
||||||
|
down: Kapalı
|
||||||
|
slow: Yavaş
|
||||||
|
|
||||||
|
donate:
|
||||||
|
title: bağış yap!
|
||||||
|
desc: |
|
||||||
|
Eğer emeğimi seviyorsanız ya da kendinizi cömert hissediyorsanız, beni
|
||||||
|
finansal olarak destekleyebilirsiniz. Herşeyi yönetmek adına her yaklaşık
|
||||||
|
$15 harcıyorum, o yüzden küçük bir bağış bile oldukça faydalı olacaktır ve
|
||||||
|
herşeyi ayakta tutmama yardım eder.
|
||||||
|
info: |
|
||||||
|
Şuan sadece [Monero (XMR)](https://www.getmonero.org/tr/) ile bağış kabul
|
||||||
|
ediyorum. İşte monero adresim
|
||||||
|
thanks: Ayrıca şuana kadar bağış yapan herkese çok teşekkür ederim.
|
||||||
|
|
||||||
|
error:
|
||||||
|
title: birşeyler yanlış gitti!
|
||||||
|
report: Bu hatayı raporla
|
||||||
|
|
||||||
|
footer:
|
||||||
|
source: Kaynak
|
||||||
|
license: Lisans
|
||||||
|
privacy: Gizlilik
|
||||||
|
number: "{since} tarihinden beri {total} kez ziyaret edildi"
|
||||||
|
wow: vay be!
|
||||||
|
render: Sizin için {time} tarihinde işlendi
|
@@ -12,7 +12,7 @@ export async function load({ cookies, request, url }) {
|
|||||||
|
|
||||||
if (locale) {
|
if (locale) {
|
||||||
set_locale(cookies, locale);
|
set_locale(cookies, locale);
|
||||||
return redirect(307, "/");
|
return redirect(307, url.pathname);
|
||||||
}
|
}
|
||||||
|
|
||||||
// attempt get the preferred locale from cookies
|
// attempt get the preferred locale from cookies
|
||||||
|
@@ -54,12 +54,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
main .services {
|
main .services {
|
||||||
|
border-top: solid 1px var(--white-3);
|
||||||
|
padding-top: 20px;
|
||||||
margin-top: 15px;
|
margin-top: 15px;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
gap: 28px;
|
|
||||||
color: var(--white-3);
|
color: var(--white-3);
|
||||||
|
gap: 15px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
Reference in New Issue
Block a user