with base
This commit is contained in:
commit
351b92e54b
88
.drone.yml
Normal file
88
.drone.yml
Normal file
@ -0,0 +1,88 @@
|
||||
kind: pipeline
|
||||
name: default
|
||||
type: docker
|
||||
|
||||
steps:
|
||||
- name: load_secret
|
||||
image: debian:buster-slim
|
||||
volumes:
|
||||
- name: ssh
|
||||
path: /root/.ssh/
|
||||
environment:
|
||||
SSH_KEY:
|
||||
from_secret: gitea_id_ed25519
|
||||
commands:
|
||||
- mkdir -p $HOME/.ssh/
|
||||
- echo "$SSH_KEY" | base64 -d > $HOME/.ssh/id_ed25519
|
||||
|
||||
- name: build
|
||||
image: kasperhermansen/cuddle:latest
|
||||
pull: always
|
||||
volumes:
|
||||
- name: ssh
|
||||
path: /root/.ssh/
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
commands:
|
||||
- apk add bash git
|
||||
- git remote set-url origin $DRONE_GIT_SSH_URL
|
||||
- cuddle_cli x setup_ssh
|
||||
- cuddle_cli x start_deployment
|
||||
- cuddle_cli x render_templates
|
||||
- cuddle_cli x render_como_templates
|
||||
- cuddle_cli x build_release
|
||||
- cuddle_cli x push_release
|
||||
- cuddle_cli x deploy_release
|
||||
environment:
|
||||
DOCKER_BUILDKIT: 1
|
||||
DOCKER_USERNAME:
|
||||
from_secret: docker_username
|
||||
DOCKER_PASSWORD:
|
||||
from_secret: docker_password
|
||||
SSH_KEY:
|
||||
from_secret: gitea_id_ed25519
|
||||
|
||||
- name: push_tags
|
||||
image: kasperhermansen/drone-semantic-release:latest
|
||||
pull: always
|
||||
volumes:
|
||||
- name: ssh
|
||||
path: /root/.ssh/
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
commands:
|
||||
- semantic-release --no-ci
|
||||
environment:
|
||||
DOCKER_BUILDKIT: 1
|
||||
SSH_KEY:
|
||||
from_secret: gitea_id_ed25519
|
||||
depends_on:
|
||||
- build
|
||||
|
||||
- name: send telegram notification
|
||||
image: appleboy/drone-telegram
|
||||
settings:
|
||||
token:
|
||||
from_secret: telegram_token
|
||||
to: 2129601481
|
||||
format: markdown
|
||||
depends_on:
|
||||
- build
|
||||
- push_tags
|
||||
when:
|
||||
status: [failure, success]
|
||||
|
||||
services:
|
||||
- name: docker
|
||||
image: docker:dind
|
||||
privileged: true
|
||||
volumes:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
volumes:
|
||||
- name: ssh
|
||||
temp: {}
|
||||
- name: dockersock
|
||||
temp: {}
|
||||
|
||||
|
4
.env
Normal file
4
.env
Normal file
@ -0,0 +1,4 @@
|
||||
POSTGRES_DB=como
|
||||
POSTGRES_USER=como
|
||||
POSTGRES_PASSWORD=somenotverysecurepassword
|
||||
DATABASE_URL="postgres://como:somenotverysecurepassword@localhost:5432/como"
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/target
|
||||
.cuddle/
|
||||
node_modules/
|
8
.releaserc.yml
Normal file
8
.releaserc.yml
Normal file
@ -0,0 +1,8 @@
|
||||
branches:
|
||||
- "main"
|
||||
|
||||
plugins:
|
||||
- "@semantic-release/commit-analyzer"
|
||||
- "@semantic-release/release-notes-generator"
|
||||
- "@semantic-release/changelog"
|
||||
- "@semantic-release/git"
|
2067
Cargo.lock
generated
Normal file
2067
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
4
Cargo.toml
Normal file
4
Cargo.toml
Normal file
@ -0,0 +1,4 @@
|
||||
[workspace]
|
||||
members = [
|
||||
"como_bin"
|
||||
]
|
18
como_bin/Cargo.toml
Normal file
18
como_bin/Cargo.toml
Normal file
@ -0,0 +1,18 @@
|
||||
[package]
|
||||
name = "como_bin"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
async-graphql = "4.0.6"
|
||||
axum = "0.5.13"
|
||||
tokio = {version="1.20.1", features=["full"]}
|
||||
uuid = {version="1.1.2", features=["v4", "fast-rng"]}
|
||||
sqlx = { version = "0.6", features = [ "runtime-tokio-rustls", "postgres", "migrate"] }
|
||||
anyhow = "1.0.60"
|
||||
dotenv = "0.15.0"
|
||||
tracing = "0.1.36"
|
||||
tracing-subscriber = { version = "0.3.15", features = ["env-filter"] }
|
||||
tower-http = { version = "0.3.4", features = ["full"] }
|
6
como_bin/build.rs
Normal file
6
como_bin/build.rs
Normal file
@ -0,0 +1,6 @@
|
||||
// generated by `sqlx migrate build-script`
|
||||
fn main() {
|
||||
// trigger recompilation when a new migration is added
|
||||
println!("cargo:rerun-if-changed=migrations");
|
||||
}
|
||||
|
@ -0,0 +1,4 @@
|
||||
-- Add migration script here
|
||||
CREATE TABLE IF NOT EXISTS events (
|
||||
id BIGSERIAL PRIMARY KEY
|
||||
);
|
1
como_bin/db/migrations/20220808233152_something.sql
Normal file
1
como_bin/db/migrations/20220808233152_something.sql
Normal file
@ -0,0 +1 @@
|
||||
-- Add migration script here
|
67
como_bin/src/graphql.rs
Normal file
67
como_bin/src/graphql.rs
Normal file
@ -0,0 +1,67 @@
|
||||
use async_graphql::{Context, EmptyMutation, EmptySubscription, Object, Schema, SimpleObject};
|
||||
use uuid::Uuid;
|
||||
|
||||
pub type CibusSchema = Schema<QueryRoot, EmptyMutation, EmptySubscription>;
|
||||
|
||||
pub struct QueryRoot;
|
||||
|
||||
#[Object]
|
||||
impl QueryRoot {
|
||||
async fn get_upcoming(&self, ctx: &Context<'_>) -> Vec<Event> {
|
||||
vec![Event::new(
|
||||
None,
|
||||
"Some-name".into(),
|
||||
None,
|
||||
None,
|
||||
EventDate::new(2022, 08, 08, 23, 51),
|
||||
)]
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(SimpleObject)]
|
||||
pub struct Event {
|
||||
pub id: String,
|
||||
pub name: String,
|
||||
pub description: Option<Vec<String>>,
|
||||
pub location: Option<String>,
|
||||
pub date: EventDate,
|
||||
}
|
||||
|
||||
impl Event {
|
||||
pub fn new(
|
||||
id: Option<String>,
|
||||
name: String,
|
||||
description: Option<Vec<String>>,
|
||||
location: Option<String>,
|
||||
date: EventDate,
|
||||
) -> Self {
|
||||
Self {
|
||||
id: id.unwrap_or_else(|| Uuid::new_v4().to_string()),
|
||||
name,
|
||||
description,
|
||||
location,
|
||||
date,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(SimpleObject)]
|
||||
pub struct EventDate {
|
||||
pub year: u32,
|
||||
pub month: u32,
|
||||
pub day: u32,
|
||||
pub hour: u32,
|
||||
pub minute: u32,
|
||||
}
|
||||
|
||||
impl EventDate {
|
||||
pub fn new(year: u32, month: u32, day: u32, hour: u32, minute: u32) -> Self {
|
||||
Self {
|
||||
year,
|
||||
month,
|
||||
day,
|
||||
hour,
|
||||
minute,
|
||||
}
|
||||
}
|
||||
}
|
86
como_bin/src/main.rs
Normal file
86
como_bin/src/main.rs
Normal file
@ -0,0 +1,86 @@
|
||||
use std::env::{self, current_dir};
|
||||
|
||||
mod graphql;
|
||||
|
||||
use axum::{
|
||||
extract::Extension,
|
||||
http::Method,
|
||||
response::{Html, IntoResponse},
|
||||
routing::get,
|
||||
Json, Router,
|
||||
};
|
||||
|
||||
use async_graphql::{
|
||||
http::{playground_source, GraphQLPlaygroundConfig},
|
||||
EmptyMutation, EmptySubscription, Request, Response, Schema,
|
||||
};
|
||||
use graphql::CibusSchema;
|
||||
use sqlx::PgPool;
|
||||
use tower_http::{cors::CorsLayer, trace::TraceLayer};
|
||||
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
||||
|
||||
use crate::graphql::QueryRoot;
|
||||
|
||||
async fn graphql_handler(schema: Extension<CibusSchema>, req: Json<Request>) -> Json<Response> {
|
||||
schema.execute(req.0).await.into()
|
||||
}
|
||||
|
||||
async fn graphql_playground() -> impl IntoResponse {
|
||||
Html(playground_source(GraphQLPlaygroundConfig::new("/")))
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
// Environment
|
||||
tracing::info!("Loading dotenv");
|
||||
dotenv::dotenv()?;
|
||||
|
||||
// Logging
|
||||
tracing_subscriber::registry()
|
||||
.with(tracing_subscriber::EnvFilter::new(
|
||||
std::env::var("RUST_LOG").unwrap_or_else(|_| {
|
||||
"como_bin=debug,tower_http=debug,axum_extra=debug,hyper=info,mio=info".into()
|
||||
}),
|
||||
))
|
||||
.with(tracing_subscriber::fmt::layer())
|
||||
.init();
|
||||
|
||||
// Database
|
||||
tracing::info!("Creating pool");
|
||||
let db_url = env::var("DATABASE_URL")?;
|
||||
let pool = PgPool::connect(&db_url).await?;
|
||||
|
||||
// Database Migrate
|
||||
tracing::info!("Migrating db");
|
||||
sqlx::migrate!("db/migrations").run(&pool).await?;
|
||||
|
||||
tracing::info!("current path: {}", current_dir()?.to_string_lossy());
|
||||
|
||||
// Schema
|
||||
println!("Building schema");
|
||||
let schema = Schema::build(QueryRoot, EmptyMutation, EmptySubscription).finish();
|
||||
|
||||
// CORS
|
||||
let cors = vec!["http://localhost:3000".parse().unwrap()];
|
||||
|
||||
// Webserver
|
||||
tracing::info!("Building router");
|
||||
let app = Router::new()
|
||||
.route("/", get(graphql_playground).post(graphql_handler))
|
||||
.layer(Extension(schema))
|
||||
.layer(TraceLayer::new_for_http())
|
||||
.layer(
|
||||
CorsLayer::new()
|
||||
.allow_origin(cors)
|
||||
.allow_headers([axum::http::header::CONTENT_TYPE])
|
||||
.allow_methods([Method::GET, Method::POST, Method::OPTIONS]),
|
||||
);
|
||||
|
||||
tracing::info!("Starting webserver");
|
||||
axum::Server::bind(&"0.0.0.0:3001".parse().unwrap())
|
||||
.serve(app.into_make_service())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
Ok(())
|
||||
}
|
15
cuddle.yaml
Normal file
15
cuddle.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
# yaml-language-server: $schema=https://git.front.kjuulh.io/kjuulh/cuddle/raw/branch/main/schemas/base.json
|
||||
|
||||
base: "git@git.front.kjuulh.io:kjuulh/cuddle-rust-plan.git"
|
||||
|
||||
vars:
|
||||
service: "como-backend"
|
||||
deployments: "git@git.front.kjuulh.io:como/deployments.git"
|
||||
|
||||
scripts:
|
||||
render_como_templates:
|
||||
type: shell
|
||||
local_up:
|
||||
type: shell
|
||||
run_como:
|
||||
type: shell
|
7
scripts/local_up.sh
Executable file
7
scripts/local_up.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cuddle_cli render_templates --template-file $TMP/docker-compose.local_up.yml.tmpl --dest $TMP/docker-compose.local_up.yml
|
||||
|
||||
docker compose -f $TMP/docker-compose.local_up.yml up -d --remove-orphans
|
10
scripts/render_como_templates.sh
Executable file
10
scripts/render_como_templates.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
deploymentrepo="$TMP/deployments"
|
||||
|
||||
CUDDLE_FETCH_POLICY=never cuddle_cli render_template \
|
||||
--template-file "$TMP/.env.example.tmpl" \
|
||||
--dest "$deploymentrepo/$SERVICE/env.example"
|
||||
|
5
scripts/run_como.sh
Executable file
5
scripts/run_como.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
cargo run como_bin/
|
4
templates/.env.example.tmpl
Normal file
4
templates/.env.example.tmpl
Normal file
@ -0,0 +1,4 @@
|
||||
POSTGRES_DB=como
|
||||
POSTGRES_USER=como
|
||||
POSTGRES_PASSWORD=somenotverysecurepassword
|
||||
DATABASE_URL="postgres://como:somenotverysecurepassword@localhost:5432/como"
|
7
templates/docker-compose.local_up.dockerignore
Normal file
7
templates/docker-compose.local_up.dockerignore
Normal file
@ -0,0 +1,7 @@
|
||||
target/
|
||||
.git/
|
||||
.cuddle/
|
||||
scripts/
|
||||
cuddle.yaml
|
||||
local.sh
|
||||
README.md
|
15
templates/docker-compose.local_up.yml.tmpl
Normal file
15
templates/docker-compose.local_up.yml.tmpl
Normal file
@ -0,0 +1,15 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
db:
|
||||
image: postgres:13.5
|
||||
restart: always
|
||||
environment:
|
||||
- POSTGRES_DB=como
|
||||
- POSTGRES_USER=como
|
||||
- POSTGRES_PASSWORD=somenotverysecurepassword
|
||||
- DATABASE_URL="postgres://como:somenotverysecurepassword@localhost:5432/como"
|
||||
ports:
|
||||
- 5432:5432
|
||||
volumes:
|
||||
- ./data/postgres:/var/lib/postgresql/data
|
Loading…
Reference in New Issue
Block a user