1 Commits

Author SHA1 Message Date
Sweetbread 405e23ec8b ci: add docker-build 2025-08-06 19:56:05 +03:00
25 changed files with 56 additions and 481 deletions
+7 -9
View File
@@ -2,7 +2,7 @@ name: Docker Build and Push
on:
push:
branches: [master]
branches: [main]
jobs:
build-and-push:
@@ -11,23 +11,21 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Registry
uses: docker/login-action@v2
with:
registry: g.codrs.ru
registry: b.codrs.ru
username: ${{ vars.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name == 'push' }}
tags: |
g.codrs.ru/${{ vars.DOCKER_USERNAME }}/codrs.ru:latest
g.codrs.ru/${{ vars.DOCKER_USERNAME }}/codrs.ru:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
b.codrs.ru/${{ vars.DOCKER_USERNAME }}/codrs.ru:latest
b.codrs.ru/${{ vars.DOCKER_USERNAME }}/codrs.ru:${{ github.sha }}
+7 -16
View File
@@ -1,23 +1,14 @@
FROM node:18-alpine as sass
RUN NODE_OPTIONS=--dns-result-order=ipv4first npm install -g sass
WORKDIR /build
COPY ./static/style ./style
RUN sass ./style:./style \
--no-source-map \
--style=compressed
FROM python:3.11-slim
RUN apt-get update && apt-get install -y curl && \
curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
apt-get install -y nodejs && \
npm install -g sass && \
apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
COPY --from=sass /build/style/ ./static/style/
RUN pip install --no-cache-dir -r requirements.txt
ENV FLASK_ENV=production
ENV PYTHONUNBUFFERED=1
CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--workers", "4"]
CMD flask run
+2 -63
View File
@@ -1,65 +1,8 @@
from os import system as console
from configparser import ConfigParser
from flask import (
Flask,
g,
request,
render_template,
)
translations_cache = {}
def load_translations(lang):
if lang not in translations_cache:
translations_cache[lang] = {}
try:
config = ConfigParser()
config.read(f'locale/{lang}.ini')
for section in config.sections():
translations_cache[lang][section] = dict(config.items(section))
except:
pass
return translations_cache[lang]
def get_locale():
return request.accept_languages.best_match(('en', 'ru', 'de', 'fr', 'ja'), 'en')
from flask import Flask, render_template
app = Flask(__name__)
@app.before_request
def before_request():
g.locale = get_locale()
g.translations = load_translations(g.locale)
@app.context_processor
def inject_translations():
def translate(text, **kwargs):
if ":" in text:
section, key = text.split(":", 1)
else:
section, key = "common", text
template = g.translations \
.get(section, {}) \
.get(key, f"${section}: {key}$")
try:
return template.format(**kwargs)
except:
return template
return {'_': translate}
if app.debug:
console("sass static/style/main.scss static/style/main.css")
console("sass static/style/risdeveau.scss static/style/risdeveau.css")
console("sass static/style/main.scss static/style/main.css")
@app.route("/")
def index():
@@ -72,7 +15,3 @@ def host():
@app.route("/us")
def us():
return render_template('us.html')
@app.route("/risdeveau")
def risdeveau():
return render_template('personal/risdeveau.html')
-25
View File
@@ -1,25 +0,0 @@
[common]
site source = Website-Quellcode
contact us = Kontakt
about us = Über uns
about host = Über Server
[index]
bottom_text = Außerdem bieten wir {glitchtip}, {baikal} und {freshrss} für Mitglieder unserer Gruppe an!
[index.descr]
sharkey = Föderierter Microblogging-Dienst auf Basis des ActivityPub-Protokolls
gitea = Open-Source, selbst gehosteter Git-Repository-Hoster
matrix = Föderierter Messenger
copyparty = Cloud-Dateispeicher
4get = Proxy-Suchmaschine
tools = Satz verschiedener Werkzeuge
vert = Dateiumwandler
[host]
hoster = Hosting-Anbieter
specifications = Spezifikationen
hoster_descr = Nicht schlecht, nicht teuer. In der Vergangenheit gab es Netzwerkprobleme.
-25
View File
@@ -1,25 +0,0 @@
[common]
site source = Site source
contact us = Contact us
about us = About us
about host = About host
[index]
bottom_text = We also have {glitchtip}, {baikal} and {freshrss} for members of our squad!
[index.descr]
sharkey = ActivityPub-based federated microblogging service
gitea = Opensource selfhosted Git repository hosting
matrix = federated instant messenger
copyparty = cloud file storage
4get = proxy search engine
tools = set of various tools
vert = file converter
[host]
hoster = Hosting Provider
specifications = Specifications
hoster_descr = Not bad, not expensive. There were network issues in the past
-25
View File
@@ -1,25 +0,0 @@
[common]
site source = Code source du site
contact us = Contacte-nous
about us = À propos de nous
about host = À propos de serveur
[index]
bottom_text = On a aussi {glitchtip}, {baikal} et {freshrss} pour les membres du groupe !
[index.descr]
sharkey = Service de microblogging fédéré avec ActivityPub
gitea = Hébergement de dépôts Git open source en auto-hébergé
matrix = Messagerie fédérée
copyparty = Stockage de fichiers en cloud
4get = Moteur de recherche proxy
tools = ensemble d'outils variés
vert = convertisseur de fichiers
[host]
hoster = Hébergeur
specifications = Spécifications
hoster_descr = Pas mal, pas cher. Y'a eu des soucis réseau avant.
-25
View File
@@ -1,25 +0,0 @@
[common]
site source = サイトのソースコード
contact us = 問い合わせ
about us = 私たちについて
about host = サーバーについて
[index]
bottom_text = メンバーには {glitchtip}、{baikal}、{freshrss} も使えるよ!
[index.descr]
sharkey = ActivityPubを使った連合型マイクロブログ
gitea = オープンソースのセルフホスティングGitリポジトリ
matrix = 連合型メッセンジャー
copyparty = クラウドファイルストレージ
4get = プロキシ検索エンジン
tools = 様々なツールのセット
vert = ファイル変換ツール
[host]
hoster = ホスティングプロバイダー
specifications = サーバーのスペック
hoster_descr = 悪くないし安い。前にネットワークの不具合があったんだ。
-25
View File
@@ -1,25 +0,0 @@
[common]
site source = Исходники сайта
contact us = Для связи
about us = О нас
about host = О хосте
[index]
bottom_text = Ещё у нас есть {glitchtip}, {baikal} и {freshrss} для участников нашей группы!
[index.descr]
sharkey = Федеративная микроблогинговая система поверх протокола ActivityPub
gitea = Selfhosted хранилище Git-репозиториев со свободным исходным кодом
matrix = федеративный мессенджер
copyparty = облачное хранилище файлов
4get = прокси-поисковик
tools = набор разнообразных утилит
vert = конвертация файлов
[host]
hoster = Хостер
specifications = Характеристики
hoster_descr = Неплохой, недорогой. В прошлом были проблемы с сетью
-1
View File
@@ -1,2 +1 @@
Flask==3.1.1
gunicorn
Binary file not shown.
-16
View File
@@ -1,16 +0,0 @@
M+ FONTS Copyright (C) 2002-2013 M+ FONTS PROJECT
-
LICENSE_E
These fonts are free software.
Unlimited permission is granted to use, copy, and distribute them, with
or without modification, either commercially or noncommercially.
THESE FONTS ARE PROVIDED "AS IS" WITHOUT WARRANTY.
http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/
Binary file not shown.
+1 -2
View File
@@ -1,3 +1,2 @@
Monocraft: https://idreesinc.itch.io/monocraft
Pixeloid: https://ggbot.itch.io/pixeloid-font
PixelM+: https://itouhiro.hatenablog.com/entry/20130602/font
Pixeloid: https://ggbot.itch.io/pixeloid-font
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

+14 -88
View File
@@ -34,7 +34,7 @@ body {
display: flex;
flex-direction: column;
background-color: $base;
font-family: Pixeloid, PixelMPlus;
font-family: Pixeloid;
color: $text;
width: 100%;
height: 100%;
@@ -44,7 +44,7 @@ body {
main {
max-width: 45rem;
margin-inline: auto;
padding: 0 .5rem;
padding: 0 8px;
flex: 1 0 auto;
}
@@ -54,10 +54,9 @@ h1 {
a {
color: unset;
text: {
decoration: underline {color: $blue};
underline-offset: 1px;
}
text-decoration: underline;
text-decoration-color: $blue;
text-underline-offset: 1px;
transition: 0.3s ease;
&:hover {
@@ -68,7 +67,6 @@ a {
transition: none !important;
display: inline-block;
transform: scale(.98) !important;
background-color: $mantle !important;
}
&.block {
@@ -76,24 +74,16 @@ a {
&:hover {
transform: scale(1.02) translateY(-.25rem);
background-color: $surface1;
}
}
}
p {
margin: .5rem;
}
ul {
margin-top: .25rem;
}
header {
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
background-color: $mantle;
padding: .5rem;
padding: 8px;
font-size: larger;
}
@@ -101,9 +91,9 @@ footer {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
background-color: $mantle;
margin-top: 2rem;
padding: 1rem;
background-color: $crust;
margin-top: 32px;
padding: 16px;
column-gap: 4ch;
}
@@ -111,7 +101,7 @@ footer {
font-family: Monocraft, monospace;
background-color: $mantle;
border-radius: 2px;
padding: 0 .25rem;
padding: 0 4px;
color: $subtext0;
overflow-wrap: anywhere;
@@ -124,11 +114,11 @@ footer {
.block {
display: block;
background-color: $surface0;
border-radius: .5rem;
padding: .5rem;
border-radius: 8px;
padding: 8px;
& + & {
margin-top: .5rem;
margin-top: 8px;
}
&.red {
@@ -139,8 +129,6 @@ footer {
}
&.green {
background-color: color.mix($surface0, $green, 60%);
&:hover { background-color: color.mix($surface1, $green, 60%); }
&:active { background-color: color.mix($mantle, $green, 60%) !important; }
}
& .header {
@@ -154,64 +142,12 @@ footer {
}
}
.blocks {
display: flex;
flex-wrap: wrap;
margin-top: .5rem;
gap: .5rem;
& + &,
& + .block,
.block + & {
margin-top: .5rem;
}
.block {
margin-top: 0;
}
}
.badges {
.block {
flex: 1;
text-wrap-mode: nowrap;
text-align: -webkit-center;
&:hover {
flex: 1.5;
transform: none;
}
}
}
.icon {
width: 1.5em;
vertical-align: middle;
border-radius: .2em;
}
::-webkit-scrollbar {
width: .5rem;
&-button {
display: none;
}
&-track {
background-color: $base;
}
&-thumb {
background-color: $overlay0;
border-radius: .25rem;
&:hover {
background-color: $overlay1;
}
}
}
@font-face {
font-family: Monocraft;
src: url("/static/font/Monocraft.ttc");
@@ -230,13 +166,3 @@ footer {
url("/static/font/Pixeloid/otf/Sans-Bold.otf") format("opentype");
font-weight: bold;
}
@font-face {
font-family: PixelMPlus;
src: url("/static/font/PixelMPlus/Regular.ttf");
}
@font-face {
font-family: PixelMPlus;
src: url("/static/font/PixelMPlus/Bold.ttf");
font-weight: bold;
}
-33
View File
@@ -1,33 +0,0 @@
h3 {
margin-block-end: 0;
}
.qr {
img { width: 100% }
p { text-align: center; }
&.blocks {
flex-wrap: nowrap;
overflow-x: auto;
width: calc(100vw - 1rem);
max-width: 45rem;
scroll: {
behavior: smooth;
snap-type: x mandatory;
}
&::-webkit-scrollbar { display: none; }
&:hover .block.qr:not(:hover) {
filter: blur(5px);
transition: all 0.3s ease;
}
}
&.block {
flex: 0 0 calc(100vw - 2rem);
scroll-snap-align: start;
max-width: 13.666rem;
}
}
-5
View File
@@ -6,11 +6,6 @@
<link rel="stylesheet" href="/static/style/main.css">
<link rel="icon" type="image/webp" href="/static/icon/codrs.webp" />
<script src="/static/script/copy-mono.js"> </script>
<script
src="https://track.codrs.ru/api/script.js"
data-site-id="1"
defer
></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
+2 -2
View File
@@ -1,5 +1,5 @@
<footer>
<div>codrs.ru &#169; 2025</div>
<div><a href="https://g.codrs.ru/Sweetbread/codrs.ru">{{ _('site source') }}</a></div>
<div>{{ _('contact us') }}: <a href="mailto:admin@codrs.ru">admin@codrs.ru</a></div>
<div><a href="https://g.codrs.ru/Sweetbread/codrs.ru">Исходники сайта</a></div>
<div>Для связи: <a href="mailto:admin@codrs.ru">admin@codrs.ru</a></div>
</footer>
+6 -8
View File
@@ -1,14 +1,8 @@
<header>
{%- if request.path != url_for('index') %}
<a href="{{ url_for('index') }}">Coders Squad</a>
{%- else %}
<div></div>
{%- endif %}
<div class="header-links">
{%- for (l, t) in (
('us', _('about us')),
('host', _('about host'))
('us', 'О нас'),
('host', 'О хосте')
) %}
{%- if url_for(l) == request.path %}
<strong>{{ t }}</strong>
@@ -17,4 +11,8 @@
{%- endif %}
{%- endfor %}
</div>
{%- if request.path != url_for('index') %}
<a href="{{ url_for('index') }}">Coders Squad</a>
{%- endif %}
</header>
+9 -9
View File
@@ -1,20 +1,20 @@
{% extends 'base.tmpl' %}
{% block title %}{{ _('about host') }}{% endblock %}
{% block title %}О хосте{% endblock %}
{% block content %}
<a href="https://play2go.cloud/?ref_id=4baFoOIp5QE" target="_blank" class="block">
<strong>{{ _("host:hoster") }}</strong>: play2go
<p>{{ _('host:hoster_descr') }}</p>
<a href="https://play2go.cloud/" target="_blank" class="block">
<strong>Хостер</strong>: play2go
<p>Неплохой, недорогой. В прошлом были проблемы с сетью</p>
</a>
<div class="block">
<strong>{{ _("host:specifications") }}</strong>:
<strong>Характеристики</strong>:
<ul>
<li>CPU: Ryzen i9@3.4GHz (4 cores)</li>
<li>RAM: 8 GiB</li>
<li>SSD: 150 GB</li>
<li>ETH: 500Mb/s</li>
<li>CPU: Ryzen i9</li>
<li>RAM: 16 GiB</li>
<li>SSD: 120 GiB</li>
<li>ETH: 500GiB/s</li>
<li>Loc: Deutchland, Frankfurt am Mein</li>
</ul>
</div>
+7 -15
View File
@@ -11,29 +11,27 @@
<img src="/static/icon/service/sharkey.webp" class="icon"/>
<strong>Sharkey</strong>
</div>
<p>{{ _('index.descr:sharkey') }}</p>
<p>Федеративная микроблогинговая система поверх протокола ActivityPub</p>
</a>
<a href="https://g.codrs.ru" target="_blank" class="block">
<div class="header">
<img src="/static/icon/service/gitea.webp" class="icon"/>
<strong>Gitea</strong>
</div>
<p>{{ _('index.descr:gitea') }}</p>
<p>Selfhosted хранилище git-репозиториев со свободным исходным кодом</p>
</a>
<div class="block">
<p><a href="https://m.codrs.ru" target="_blank"><strong>Matrix</strong></a> &mdash; {{ _('index.descr:matrix') }}</p>
<p><a href="https://c.codrs.ru" target="_blank"><strong>Copyparty</strong></a> &mdash; {{ _('index.descr:copyparty') }}</p>
<p><a href="https://s.codrs.ru" target="_blank"><strong>4get</strong></a> &mdash; {{ _('index.descr:4get') }}</p>
<p><a href="https://tools.codrs.ru" target="_blank"><strong>IT-tools</strong></a> &mdash; {{ _('index.descr:tools') }}</p>
<p><a href="https://vert.codrs.ru" target="_blank"><strong>Vert</strong></a> &mdash; {{ _('index.descr:vert') }}</p>
<p><a href="https://m.codrs.ru" target="_blank"><strong>Matrix</strong></a> &mdash; федеративный мессанджер</p>
<p><a href="https://c.codrs.ru" target="_blank"><strong>Copyparty</strong></a> &mdash; облачное хранилище файлов</p>
<p><a href="https://s.codrs.ru" target="_blank"><strong>4get</strong></a> &mdash; прокси-поисковик</p>
</div>
<div class="block">
<div>
<strong>DNS</strong>:
<ul>
<li><span class="mono">64.188.64.176</span></li>
<li><span class="mono">193.222.99.172</span></li>
<li>DoT: <span class="mono">codrs.ru:853</span></li>
<li>DoH: <span class="mono">dns.codrs.ru</span></li>
</ul>
@@ -45,12 +43,6 @@
</div>
<div class="block">
{{
_('index:bottom_text',
glitchtip='<a href="https://bug.codrs.ru" target="_blank"><strong>GlitchTip</strong></a>',
baikal='<a href="https://dav.codrs.ru" target="_blank"><strong>Baikal</strong></a>',
freshrss='<a href="https://rss.codrs.ru" target="_blank"><strong>FreshRSS</strong></a>',
) | safe
}}
Ещё у нас есть <a href="https://bug.codrs.ru" target="_blank"><strong>GlitchTip</strong></a> и <a href="https://dav.codrs.ru" target="_blank"><strong>Baikal</strong></a> для участников нашей группы!
</div>
{% endblock %}
-88
View File
@@ -1,88 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Sweet Bread</title>
<link rel="stylesheet" href="/static/style/main.css">
<link rel="stylesheet" href="/static/style/risdeveau.css">
<link rel="icon" type="image/webp" href="/static/icon/us/risdeveau.webp" />
<script
src="https://track.codrs.ru/api/script.js"
data-site-id="1"
defer
></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<header>
<a href="{{ url_for('index') }}">Coders Squad</a>
</header>
<main>
<h3>Development</h3>
<div class="blocks badges">
<a class="block" href="//g.codrs.ru/Sweetbread">
<img class="icon" src="/static/icon/service/gitea.webp" />
Gitea
</a>
<a class="block" href="https://github.com/VerySweetBread">
<img class="icon" src="https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png" />
GitHub
</a>
<a class="block" href="https://git.kolibrios.org/Sweetbread">
<img class="icon" src="https://git.kolibrios.org/assets/img/logo.svg" />
KolibriOS Git
</a>
</div>
<h3>Contacts</h3>
<div class="blocks badges">
<a class="block" href="https://matrix.to/#/@risdeveau:codrs.ru">
<img class="icon" src="https://matrix.org/assets/favicon.ico" />
Matrix
</a>
<a class="block" href="//b.codrs.ru/@risdeveau">
<img class="icon" src="/static/icon/service/sharkey.webp" />
Fediverse
</a>
<a class="block" href="https://discord.com/users/459823895256498186">
<img class="icon" src="https://cdn.prod.website-files.com/6257adef93867e50d84d30e2/66e3d80db9971f10a9757c99_Symbol.svg" />
Discord
</a>
<a class="block" href="mailto:risdeveau@codrs.ru">
Mail
</a>
</div>
<h3>Game accounts</h3>
<div class="blocks badges">
<a class="block" href="https://steamcommunity.com/id/risdeveau">
<img class="icon" src="https://store.steampowered.com/favicon.ico" />
Steam
</a>
<a class="block" href="https://gamebanana.com/members/3899828">
<img class="icon" src="https://images.gamebanana.com/static/img/favicon/favicon.ico" />
GameBanana
</a>
</div>
<h3>Wallets</h3>
<div class="blocks qr">
<div class="block qr">
<p>POL, BNB</p>
<img src="/static/img/risdeveau/wallets/evm.webp">
</div>
<div class="block qr">
<p>TON</p>
<img src="/static/img/risdeveau/wallets/ton.webp">
</div>
<div class="block qr">
<p>XMR</p>
<img src="/static/img/risdeveau/wallets/xmr.webp">
</div>
</div>
</main>
</body>
</html>
+1 -1
View File
@@ -3,7 +3,7 @@
{% block title %}О нас{% endblock %}
{% block content %}
<a href="{{ url_for('risdeveau') }}" class="block green">
<a href="#" class="block green">
<div class="header">
<img src="/static/icon/us/risdeveau.webp" class="icon"/>
Sweetbread