this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

docker setup

+128 -58
+4 -3
.env.template
··· 1 1 DB_USER=postgres 2 2 DB_PASSWORD=supersecurepassword123987 3 3 DB_NAME=advent 4 - DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@localhost:5432/${DB_NAME}" 5 - DOCKER_DB_URL="postgresql://${DB_USER}:${DB_PASSWORD}@host.docker.internal:5432/${DB_NAME}" 6 - REDIS_URL=redis://127.0.0.1:6379/ 4 + DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@postgres:5432/${DB_NAME}" 5 + #DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@localhost:5432/${DB_NAME}" 6 + REDIS_URL=redis://redis:6379/ 7 + #REDIS_URL=redis://127.0.0.1:6379/ 7 8 PROD=true 8 9 # Set's the hostname for oauth 9 10 #OAUTH_HOST=advent.codes
+1
.gitignore
··· 1 1 /target 2 2 .idea 3 3 .env 4 + .env.docker 4 5 at-advent.db 5 6 at-advent.db-shm 6 7 at-advent.db-wal
+29
.sqlx/query-5aaab1a1aee88cf73cb3cc52750ea2cd5b7a731a754608cfad7b1c60ebf55e12.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "SELECT time_challenge_one_completed, time_challenge_two_completed\n FROM challenges\n WHERE user_did = $1 AND day = $2", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "time_challenge_one_completed", 9 + "type_info": "Timestamptz" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "time_challenge_two_completed", 14 + "type_info": "Timestamptz" 15 + } 16 + ], 17 + "parameters": { 18 + "Left": [ 19 + "Text", 20 + "Int4" 21 + ] 22 + }, 23 + "nullable": [ 24 + true, 25 + true 26 + ] 27 + }, 28 + "hash": "5aaab1a1aee88cf73cb3cc52750ea2cd5b7a731a754608cfad7b1c60ebf55e12" 29 + }
+34
.sqlx/query-c1bdff20378acbf869de74c8a5e60c7c4f13b87d64c84d78436576657319170c.json
··· 1 + { 2 + "db_name": "PostgreSQL", 3 + "query": "SELECT day, time_challenge_one_completed, time_challenge_two_completed\n FROM challenges\n WHERE user_did = $1 AND day BETWEEN 1 AND 25\n ORDER BY day", 4 + "describe": { 5 + "columns": [ 6 + { 7 + "ordinal": 0, 8 + "name": "day", 9 + "type_info": "Int4" 10 + }, 11 + { 12 + "ordinal": 1, 13 + "name": "time_challenge_one_completed", 14 + "type_info": "Timestamptz" 15 + }, 16 + { 17 + "ordinal": 2, 18 + "name": "time_challenge_two_completed", 19 + "type_info": "Timestamptz" 20 + } 21 + ], 22 + "parameters": { 23 + "Left": [ 24 + "Text" 25 + ] 26 + }, 27 + "nullable": [ 28 + false, 29 + true, 30 + true 31 + ] 32 + }, 33 + "hash": "c1bdff20378acbf869de74c8a5e60c7c4f13b87d64c84d78436576657319170c" 34 + }
+10
Justfile
··· 1 + #!/usr/bin/env just --justfile 2 + 3 + release: 4 + docker buildx build \ 5 + --platform linux/arm64,linux/amd64 \ 6 + --tag fatfingers23/at_advent_web:latest \ 7 + --tag fatfingers23/at_advent:0.0.1 \ 8 + --file web/Dockerfile \ 9 + --builder desktop-linux \ 10 + --push .
+13
compose.dev.yml
··· 1 1 services: 2 + # app: 3 + # build: 4 + # context: . 5 + # dockerfile: ./web/Dockerfile 6 + # env_file: 7 + # - .env.docker 8 + # ports: 9 + # - '${FORWARD_APP_PORT:-3000}:3000' 10 + # depends_on: 11 + # - postgres 12 + # - redis 13 + # networks: 14 + # - advent-network 2 15 postgres: 3 16 image: postgres:17.6 4 17 restart: unless-stopped
+21 -3
web/Dockerfile
··· 1 - FROM ubuntu:latest 2 - LABEL authors="baileytownsend" 1 + # Build stage 2 + FROM rust:1.87-bookworm AS builder 3 3 4 - ENTRYPOINT ["top", "-b"] 4 + WORKDIR /app 5 + COPY . /app 6 + 7 + # Build the web binary 8 + ENV SQLX_OFFLINE=true 9 + RUN cargo build --release --package web 10 + 11 + # Runtime stage 12 + FROM debian:bookworm-slim 13 + 14 + RUN apt-get update \ 15 + && apt-get install -y --no-install-recommends ca-certificates \ 16 + && rm -rf /var/lib/apt/lists/* 17 + 18 + COPY --from=builder /app/target/release/web /usr/local/bin/web 19 + 20 + EXPOSE 3000 21 + 22 + CMD ["web"]
-49
web/build.rs
··· 1 - use std::process::Command; 2 - 3 - fn main() { 4 - std::fs::create_dir_all("build").expect("failed to create build directory"); 5 - 6 - Command::new("npx") 7 - .args([ 8 - "@tailwindcss/cli", 9 - "-m", 10 - "-i", 11 - "assets/css/base.css", 12 - "-o", 13 - "public/css/style.css", 14 - ]) 15 - .status() 16 - .expect("failed to run tailwindcss"); 17 - 18 - // Command::new("bun") 19 - // .args([ 20 - // "build", 21 - // "--minify", 22 - // "--outdir=build", 23 - // "--entry-naming", 24 - // "[name].[hash].[ext]", 25 - // "--asset-naming", 26 - // "[name].[hash].[ext]", 27 - // "./assets/scripts/index.ts", 28 - // ]) 29 - // .status() 30 - // .expect("failed to run bun"); 31 - 32 - copy_files("public"); 33 - } 34 - 35 - fn copy_files(dir: &str) { 36 - for entry in std::fs::read_dir(dir).expect("failed to read dir `public`") { 37 - let entry = entry.expect("failed to read entry"); 38 - 39 - if entry.file_type().unwrap().is_dir() { 40 - copy_files(entry.path().to_str().unwrap()); 41 - } else { 42 - let path = entry.path(); 43 - let filename = path.file_name().unwrap().to_str().unwrap(); 44 - let dest = format!("build/{}", filename); 45 - 46 - std::fs::copy(path, dest).expect("failed to copy file"); 47 - } 48 - } 49 - }
+16 -3
web/src/main.rs
··· 34 34 atrium::stores::AtriumSessionStore, 35 35 atrium::stores::AtriumStateStore, 36 36 }; 37 - use sqlx::{PgPool, postgres::PgPoolOptions}; 37 + use sqlx::{PgPool, migrate::Migrator, postgres::PgPoolOptions}; 38 38 use std::{ 39 39 env, 40 40 net::{IpAddr, Ipv4Addr, SocketAddr}, ··· 112 112 }; 113 113 114 114 if let Ok(oauth_host) = env::var("OAUTH_HOST") { 115 - println!("https://{oauth_host}/oauth-client-metadata.json"); 116 115 let config = OAuthClientConfig { 117 116 client_metadata: AtprotoClientMetadata { 118 117 client_id: format!("https://{oauth_host}/oauth-client-metadata.json"), ··· 158 157 ) 159 158 .init(); 160 159 161 - let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7878); 160 + let host = env::var("HOST").unwrap_or_else(|_| "127.0.0.1".to_string()); 161 + let port: u16 = env::var("PORT") 162 + .unwrap_or_else(|_| "7878".to_string()) 163 + .parse() 164 + .expect("PORT must be a number"); 165 + 166 + let addr = SocketAddr::new(host.parse().expect("Invalid HOST address"), port); 162 167 let host = addr.ip(); 163 168 let port = addr.port(); 164 169 let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); ··· 174 179 .connect(&database_url) 175 180 .await 176 181 .expect("can't connect to database"); 182 + 183 + // Run database migrations 184 + static MIGRATOR: Migrator = sqlx::migrate!("../migrations"); 185 + MIGRATOR 186 + .run(&postgres_pool) 187 + .await 188 + .expect("failed to run database migrations"); 189 + log::info!("database migrations applied successfully"); 177 190 178 191 // redis pool setup 179 192 let redis_url =