This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
Async Telegram bot for selling and extending Marzban VPN subscriptions.
|
Async Telegram bot for selling and extending Marzban VPN subscriptions.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Plans:
|
- Plans:
|
||||||
- 1 month = ⭐️100
|
- 1 month = ⭐️100
|
||||||
- 3 months = ⭐️270
|
- 3 months = ⭐️270
|
||||||
@@ -26,6 +27,7 @@ Async Telegram bot for selling and extending Marzban VPN subscriptions.
|
|||||||
- traffic usage/total quota
|
- traffic usage/total quota
|
||||||
|
|
||||||
## Admin user management
|
## Admin user management
|
||||||
|
|
||||||
- `/select_user <username|telegram_id>` — select user for further updates and show current values.
|
- `/select_user <username|telegram_id>` — select user for further updates and show current values.
|
||||||
- `/selected_user` — show the currently selected user and current values.
|
- `/selected_user` — show the currently selected user and current values.
|
||||||
- `/set_expire <YYYY-MM-DD or ISO datetime>` — set selected user expiration (UTC).
|
- `/set_expire <YYYY-MM-DD or ISO datetime>` — set selected user expiration (UTC).
|
||||||
@@ -33,6 +35,7 @@ Async Telegram bot for selling and extending Marzban VPN subscriptions.
|
|||||||
- `/set_multiplier <float>` — set selected user price multiplier.
|
- `/set_multiplier <float>` — set selected user price multiplier.
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python -m venv .venv
|
python -m venv .venv
|
||||||
source .venv/bin/activate
|
source .venv/bin/activate
|
||||||
@@ -41,6 +44,7 @@ cp .env.example .env
|
|||||||
```
|
```
|
||||||
|
|
||||||
Fill `.env` and run:
|
Fill `.env` and run:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
set -a
|
set -a
|
||||||
source .env
|
source .env
|
||||||
@@ -90,57 +94,7 @@ git tag v0.1.0
|
|||||||
git push origin main v0.1.0
|
git push origin main v0.1.0
|
||||||
```
|
```
|
||||||
|
|
||||||
### K3s deployment
|
|
||||||
|
|
||||||
Create the namespace first:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl apply -f k8s/namespace.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
Create or update the application Secret from the local `.env` file. The Secret
|
|
||||||
is never stored in Git:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl -n tt-simple create secret generic tt-simple-env \
|
|
||||||
--from-env-file=.env \
|
|
||||||
--dry-run=client -o yaml | kubectl apply -f -
|
|
||||||
```
|
|
||||||
|
|
||||||
For a private GHCR package, create a classic GitHub token with `read:packages`
|
|
||||||
and create the registry pull secret:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
read -rsp "GHCR token: " GHCR_TOKEN
|
|
||||||
echo
|
|
||||||
kubectl -n tt-simple create secret docker-registry ghcr-creds \
|
|
||||||
--docker-server=ghcr.io \
|
|
||||||
--docker-username=kr0sh512 \
|
|
||||||
--docker-password="$GHCR_TOKEN" \
|
|
||||||
--dry-run=client -o yaml | kubectl apply -f -
|
|
||||||
unset GHCR_TOKEN
|
|
||||||
```
|
|
||||||
|
|
||||||
If the package is public, remove `imagePullSecrets` from
|
|
||||||
`k8s/tt-simple.yaml`. Deploy the PVC and bot after publishing the `v0.1.0`
|
|
||||||
image:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl apply -f k8s/tt-simple.yaml
|
|
||||||
kubectl -n tt-simple rollout status deployment/tt-simple
|
|
||||||
kubectl -n tt-simple logs -f deployment/tt-simple
|
|
||||||
```
|
|
||||||
|
|
||||||
The manifest injects the Secret, mounts persistent storage at `/data`, and sets
|
|
||||||
`DB_PATH=/data/stats.db`. To use the shared non-Russian proxy, add this to the
|
|
||||||
local `.env` before updating `tt-simple-env`:
|
|
||||||
|
|
||||||
```dotenv
|
|
||||||
HTTP_PROXY=http://shared-http-proxy.proxy.svc.cluster.local:3128
|
|
||||||
```
|
|
||||||
|
|
||||||
The included namespace and pod labels satisfy the proxy `NetworkPolicy`.
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
- Telegram Stars invoices use `currency="XTR"` and empty `provider_token`.
|
- Telegram Stars invoices use `currency="XTR"` and empty `provider_token`.
|
||||||
- Local SQLite database stores only payment statistics. User state is read from Marzban API.
|
- Local SQLite database stores only payment statistics. User state is read from Marzban API.
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: Namespace
|
|
||||||
metadata:
|
|
||||||
name: tt-simple
|
|
||||||
labels:
|
|
||||||
# Required by the shared proxy NetworkPolicy when HTTP_PROXY is enabled.
|
|
||||||
proxy-access: "true"
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: PersistentVolumeClaim
|
|
||||||
metadata:
|
|
||||||
name: tt-simple-data
|
|
||||||
namespace: tt-simple
|
|
||||||
spec:
|
|
||||||
accessModes:
|
|
||||||
- ReadWriteOnce
|
|
||||||
storageClassName: local-path
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 256Mi
|
|
||||||
---
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: tt-simple
|
|
||||||
namespace: tt-simple
|
|
||||||
labels:
|
|
||||||
app.kubernetes.io/name: tt-simple
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
strategy:
|
|
||||||
type: Recreate
|
|
||||||
revisionHistoryLimit: 2
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app.kubernetes.io/name: tt-simple
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app.kubernetes.io/name: tt-simple
|
|
||||||
# Required by the shared proxy NetworkPolicy when HTTP_PROXY is enabled.
|
|
||||||
proxy-client: "true"
|
|
||||||
spec:
|
|
||||||
automountServiceAccountToken: false
|
|
||||||
terminationGracePeriodSeconds: 30
|
|
||||||
imagePullSecrets:
|
|
||||||
- name: ghcr-creds
|
|
||||||
securityContext:
|
|
||||||
runAsNonRoot: true
|
|
||||||
runAsUser: 1000
|
|
||||||
runAsGroup: 1000
|
|
||||||
fsGroup: 1000
|
|
||||||
fsGroupChangePolicy: OnRootMismatch
|
|
||||||
seccompProfile:
|
|
||||||
type: RuntimeDefault
|
|
||||||
containers:
|
|
||||||
- name: bot
|
|
||||||
# Replace this with an immutable release tag or image digest.
|
|
||||||
image: ghcr.io/kr0sh512/tt-simple:v0.1.0
|
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
envFrom:
|
|
||||||
- secretRef:
|
|
||||||
name: tt-simple-env
|
|
||||||
env:
|
|
||||||
- name: DB_PATH
|
|
||||||
value: /data/stats.db
|
|
||||||
- name: PYTHONUNBUFFERED
|
|
||||||
value: "1"
|
|
||||||
- name: PYTHONDONTWRITEBYTECODE
|
|
||||||
value: "1"
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
cpu: 25m
|
|
||||||
memory: 64Mi
|
|
||||||
limits:
|
|
||||||
cpu: 250m
|
|
||||||
memory: 256Mi
|
|
||||||
securityContext:
|
|
||||||
allowPrivilegeEscalation: false
|
|
||||||
readOnlyRootFilesystem: true
|
|
||||||
capabilities:
|
|
||||||
drop:
|
|
||||||
- ALL
|
|
||||||
volumeMounts:
|
|
||||||
- name: data
|
|
||||||
mountPath: /data
|
|
||||||
- name: tmp
|
|
||||||
mountPath: /tmp
|
|
||||||
volumes:
|
|
||||||
- name: data
|
|
||||||
persistentVolumeClaim:
|
|
||||||
claimName: tt-simple-data
|
|
||||||
- name: tmp
|
|
||||||
emptyDir:
|
|
||||||
sizeLimit: 32Mi
|
|
||||||
Reference in New Issue
Block a user