# fast api 서버 실행
source .venv/scripts/activate
nohup uvicorn app.main:app --host 0.0.0.0 --port 8000 > uvicorn.log 2>&1 &
# 보드에 LED 끄기
echo 0 | sudo tee /sys/class/leds/ACT/brightness

fast api 서비스 등록

# 파일 생성
sudo nano /etc/systemd/system/wol-app.service
# /etc/systemd/system/wol-app.service 내용
[Unit]
Description=WOL FastAPI App
After=network.target

[Service]
User=erith
Group=erith
WorkingDirectory=/home/erith/wol-app

ExecStart=/home/erith/wol-app/.venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8000

Restart=always
RestartSec=5

StandardOutput=append:/home/erith/wol-app/uvicorn.log
StandardError=append:/home/erith/wol-app/uvicorn.log

Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
# 저장후 적용
sudo systemctl daemon-reload
sudo systemctl enable wol-app
sudo systemctl start wol-app

# 상태확인
sudo systemctl status wol-app

# 로그 확인
tail -f /home/erith/wol-app/uvicorn.log

# 수정 후 재시작
sudo systemctl restart wol-app

부팅 후 자동으로 보드에 LED 끄기

sudo nano /etc/systemd/system/disable-act-led.service

내용

[Unit]
Description=Disable ACT LED on boot
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo 0 > /sys/class/leds/ACT/brightness'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
# 내용 확인
cat /sys/class/leds/ACT/brightness
# 서비스 확인
sudo systemctl status disable-act-led.service
# 재부팅
sudo reboot
# 상태 확인
cat /sys/class/leds/ACT/brightness

'설정' 카테고리의 다른 글

docker로 ftp 띄우기  (1) 2025.08.15
우분투 nginx 설치  (0) 2025.03.26
heidisql 한글 버그  (0) 2025.01.05
ollama windows 설치 시 실행 오류 시  (0) 2024.12.25
bash 셸로 uuid 생성  (0) 2024.11.17

AI기능이 좋네요. 이런거 한번 만들어봐야지 했는데, 토큰 쭉쭉소비해서 만들었습니다.~

나만의 비서를 만들 요량으로 만들었는데, .. 

 

매일매일 공고를 확인하고, 수집하고, 적합한지 판단해서, 적합하면 저한테 텔레그램 메시지를 보내주도록 했습니다..
LLM분석은 토큰 비용이 들기 때문에, 무료로 일부 사용가능하고 속도도 빠른 Ollama Cloud모델로 분석을 시켰습니다...

 

매일 새벽1시에 수집하고, 새벽내내 분석해서 아침 9시에 텔레그램으로 요약해서 적합한것만... 보고합니다.

이런 프로그램 필요하신 분이 있을까요?

 

 

공공지원사업/입찰 공고를 자동으로 모으고 LLM으로 분석하는 OZ-BID 대시보드 

기업마당 지원사업, 나라장터 SW 개발 용역, K-Startup 공고를 매일 확인하고 엑셀로 정리하는 일은 생각보다 많은 시간을 잡아먹습니다. 제목만 보고 넘어갔다가 중요한 첨부파일 조건을 놓치기도 하고, 담당자가 바뀌면 어떤 공고가 우리 회사에 맞는지 판단 기준도 흔들립니다.

OZ-BID는 이런 반복 업무를 줄이기 위해 만든 FastAPI 기반 공고 수집/분석 대시보드입니다. 공고 목록 수집, 첨부파일 다운로드, 첨부 본문 추출, LLM 적합도 분석, Telegram 알림, 운영 설정 화면까지 하나의 시스템으로 구성되어 있습니다.

 

 

공고 목록, 최신 LLM 점수, 분석 요약, 첨부파일 수를 한 화면에서 확인할 수 있는 메인 대시보드입니다.

핵심 가치

OZ-BID는 단순 크롤러가 아니라 “우리 회사에 맞는 공고를 빨리 찾는” 운영형 대시보드입니다.

  • 여러 공고 소스를 한 화면에서 확인
  • 첨부파일 내용까지 읽고 LLM으로 적합도 분석
  • 적합도가 높은 공고는 Telegram으로 자동 알림
  • 수집 시간, 요약 발송 시간, 분석 timeout, 회사 필터 프로필을 화면에서 변경
  • 공고, 수집 로그, 분석 로그를 웹 대시보드에서 추적
  • FastAPI, PostgreSQL, Celery, Redis 기반으로 운영 확장 가능

수집 대상

현재 구현된 수집 대상은 다음과 같습니다.

  • 기업마당 지원사업 공고
  • 나라장터 SW 개발 용역 공고
  • K-Startup 모집중 공고

수집기는 소스별로 분리되어 있어 다른 공고 사이트를 추가하기 좋습니다. 수집된 공고는 PostgreSQL에 저장되고, 첨부파일은 로컬 data/attachments에 관리됩니다.

첨부파일 본문까지 분석

많은 공고의 핵심 조건은 제목이나 요약이 아니라 첨부파일 안에 있습니다. OZ-BID는 첨부파일을 다운로드한 뒤 Celery worker에서 본문을 추출하고, 그 내용을 LLM 분석 프롬프트에 포함합니다.

지원 형식:

  • PDF
  • DOCX
  • XLSX/XLSM
  • HWPX
  • HWP

API 서버에서 무거운 문서 분석을 직접 처리하지 않고 worker task로 분리했기 때문에, 웹 화면 응답성과 분석 작업을 독립적으로 운영할 수 있습니다.

LLM 적합도 분석

OZ-BID는 공고와 첨부 본문을 바탕으로 LLM 분석 결과를 저장합니다.

 

공고 상세 화면에서는 원문, 첨부파일, 적합도 점수, 수주 가능성, 필요 기술, 위험 요소를 함께 확인할 수 있습니다.

분석 결과 예시:

  • 공고 적합도 점수
  • 수주 가능성 점수
  • 분석 요약
  • 주요 적합 사유
  • 리스크 및 주의사항
  • 컨소시엄 필요 여부

기본 LLM provider는 Ollama OpenAI-compatible API입니다.

LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://ollama-server:11434/v1
OLLAMA_MODEL=gpt-oss:120b-cloud

OpenAI API로도 전환할 수 있도록 설정 구조가 준비되어 있습니다.

회사 맞춤 필터 프로필

공고 적합도 판단은 회사마다 다릅니다. OZ-BID는 회사명, 소재지, 인증/자격, 주업무, 기술 강점, 수행 이력, 선호 공고 유형, 제외/감점 공고 유형 등을 DB 설정값으로 관리합니다.

운영자는 /ui/settings 화면에서 이 값을 직접 수정할 수 있습니다. .env를 수정하고 서버를 재시작하는 방식이 아니라, 대시보드에서 바꾼 값이 다음 분석과 수집 우선순위에 반영됩니다.

 

회사정보를 설정하여 분석시 참고하도록 합니다.

 

수집 시간, Telegram 요약 시간, 분석 timeout, 재분석 횟수, 수집 소스, 회사 필터 프로필을 화면에서 관리할 수 있습니다.

공고 대시보드

대시보드는 실제 운영자가 매일 보는 화면을 기준으로 구성했습니다.

주요 기능:

  • 공고 목록 조회
  • 공고 상세 화면
  • 첨부파일 다운로드 상태 확인
  • 최신 LLM 분석 결과 표시
  • 키워드/기관/출처 필터
  • LLM 적합도 슬라이더 필터
  • 슬라이더 변경 시 즉시 검색 적용
  • 전체 데이터를 볼 수 있는 페이지네이션
  • 페이지 이동 시 기존 필터 유지

초기에는 목록 제한만 있었지만, 운영 데이터가 쌓이면 모든 공고를 탐색할 수 있어야 합니다. 그래서 페이지네이션을 추가했고, LLM 적합도 필터는 숫자 입력 대신 슬라이더로 바꿔 빠르게 기준을 조절할 수 있게 했습니다.

로그와 운영 추적

운영 시스템은 “돌았는지 안 돌았는지”를 확인할 수 있어야 합니다. OZ-BID는 수집 로그와 분석 로그 화면을 제공합니다.

수집 로그 화면에서는 소스별 수집 결과, 생성/업데이트/분석 큐 등록 건수, 실패 메시지를 확인할 수 있습니다.

 

 

분석 로그 화면에서는 첨부 본문 추출과 LLM 분석의 시작/종료 시간, 분석 시간, 상태, 점수를 추적할 수 있습니다.

  • 수집 실행 시간
  • 소스별 수집 결과
  • 생성/업데이트/분석 큐 등록 건수
  • 분석 시작/종료 시간
  • 분석 stage
  • 분석 소요 시간
  • 성공/실패 상태
  • 실패 메시지
  • timeout 재분석 여부

분석 timeout을 초과한 running 작업은 failed 처리하고, 설정된 재시도 횟수 안에서 다시 분석 큐에 넣습니다.

Telegram 알림

분석이 끝난 공고 중 적합도 기준을 넘는 항목은 Telegram으로 개별 알림을 보냅니다. 또한 지정된 시간에 최근 분석 결과 요약을 발송할 수 있습니다.

TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
TELEGRAM_NOTIFY_MIN_FIT_SCORE=80
PUBLIC_BASE_URL=http://사이트 주소를 입력

PUBLIC_BASE_URL을 설정하면 Telegram 메시지에서 바로 공고 상세 화면으로 이동할 수 있습니다.

OAuth 로그인

운영 대시보드는 Google, Naver, Kakao OAuth 로그인을 지원합니다.

 

 

공고 데이터와 분석 결과는 회사의 영업 전략과 입찰 판단 기준을 담고 있기 때문에, 대시보드는 처음부터 인증을 거쳐 접근하도록 구성되어 있습니다. OZ-BID는 로컬 계정 로그인과 주요 소셜 OAuth 로그인을 함께 지원해 운영 환경에 맞는 접근 방식을 선택할 수 있습니다.

  • Google OAuth
  • Naver OAuth
  • Kakao OAuth
  • 로컬 관리자 계정 로그인
  • 공통 허용 이메일/도메인 설정
  • provider별 callback URL 지원
  • 로그아웃 시 세션 정리 후 로그인 화면 이동

특장점은 단순히 로그인 버튼을 붙인 수준이 아니라, 실제 내부 업무용 도구에 필요한 접근 제어 흐름을 갖췄다는 점입니다. 허용 이메일과 도메인을 공통 정책으로 관리할 수 있고, OAuth 제공자별 callback URL을 운영 외부 URL 기준으로 분리해 배포 환경에서도 일관되게 동작합니다. 로그아웃 후에는 JSON 응답이 아니라 로그인 화면으로 이동해, 사용자가 다시 자연스럽게 인증 흐름으로 돌아오도록 구성했습니다.

이 구조 덕분에 사내 담당자는 별도 계정 체계를 새로 만들지 않고도 기존 Google, Naver, Kakao 계정으로 접속할 수 있고, 운영자는 필요한 사용자만 허용 목록에 올려 대시보드 접근을 제한할 수 있습니다. 공고 수집, 첨부 분석, LLM 판단 결과처럼 민감할 수 있는 데이터를 다루는 시스템에 적합한 현실적인 보안 출발점입니다.

운영 아키텍처

OZ-BID는 역할을 분리해 운영합니다.

  • FastAPI Main: API와 대시보드 제공
  • Celery Worker: 수집, 첨부 본문 추출, LLM 분석 처리
  • Celery Beat: 매분 scheduler tick 실행
  • Redis: Celery broker/result backend
  • PostgreSQL: 공고, 분석 결과, 설정, 로그 저장
  • Ollama/OpenAI: LLM 분석
  • Telegram Bot API: 알림 발송

수집/분석 작업은 API 요청에서 직접 실행하지 않고 Celery task로 처리합니다. 웹 서버는 화면과 API에 집중하고, 오래 걸리는 작업은 worker가 담당합니다.

직접 실행과 Docker 운영 모두 고려

로컬에서 바로 실행할 수 있습니다.

python -m uvicorn app.main:app --host 0.0.0.0 --port 8000
python -m celery -A app.celery_app.celery worker --loglevel=info
python -m celery -A app.celery_app.celery beat --loglevel=info

Dockerfile도 역할별로 분리되어 있습니다.

  • Dockerfile.main
  • Dockerfile.worker
  • Dockerfile.beat

HWP 분석용 libhwp 빌드를 위해 Docker 이미지에는 Rust/Cargo 설치가 반영되어 있습니다.

이런 분께 적합합니다

  • 공공지원사업 공고를 매일 확인하는 기업
  • 나라장터 SW 개발 용역을 모니터링하는 개발사
  • 영업/사업개발 담당자가 공고 선별에 많은 시간을 쓰는 팀
  • LLM을 활용해 공고 검토 자동화를 만들고 싶은 조직
  • FastAPI + Celery + PostgreSQL 기반 업무 자동화 소스가 필요한 개발자
  • 기존 크롤러를 운영형 대시보드로 확장하고 싶은 팀

소스 구매 후 확장 포인트

소스 구조가 service, collector, analyzer, task로 분리되어 있어 다음 확장이 가능합니다.

  • 신규 공고 사이트 수집기 추가
  • 회사별 분석 프롬프트 커스터마이징
  • 공고 점수 산정 기준 변경
  • 첨부파일 형식 추가
  • Slack, Email 등 알림 채널 추가
  • 관리자 권한/사용자 관리 확장
  • 배포 환경에 맞춘 Docker Compose 수정
  • 사내 그룹웨어나 CRM 연동

판매 포인트 요약

OZ-BID는 공고 수집부터 LLM 분석, 운영 화면, 알림까지 이미 연결된 완성형 업무 자동화 소스입니다.

단순히 공고를 긁어오는 코드가 아니라, 실제 운영자가 매일 확인할 수 있는 대시보드와 로그, 설정 화면까지 포함되어 있습니다. 공고를 놓치지 않고, 첨부파일을 읽고, 우리 회사 기준으로 빠르게 판단하고, 중요한 공고만 알림으로 받는 흐름을 바로 시작할 수 있습니다.

공공지원사업/입찰 공고 모니터링을 자동화하려는 팀이라면 OZ-BID 소스를 기반으로 빠르게 내부 시스템을 구축할 수 있습니다.

 

 

/home/user/ftp/data 경로에 ftp 데이터를 저장합니다.

2021 번으로 매핑했기때문에 접속시 pasv모드로 2021번으로 접속해야 합니다.

 

docker run --rm -d \
-v /home/user/ftp/data:/home/vsftpd \ # Local 경로 : 컨테이너 경로
-p 2020:20 \   # 데이터 포트
-p 2021:21 \   # 접속 및 제어 포트
-p 21100-21110:21100-21110 \ # PASV 포트
-e FTP_USER=test_user \  # 계정
-e FTP_PASS=change_me \ # 비번
--name vsftpd \ # 컨테이너이름
--restart=always \ 
fauria/vsftpd # 이미지 이름

 

'설정' 카테고리의 다른 글

RaspberryPI Zero2w 몇가지...  (0) 2026.06.29
우분투 nginx 설치  (0) 2025.03.26
heidisql 한글 버그  (0) 2025.01.05
ollama windows 설치 시 실행 오류 시  (0) 2024.12.25
bash 셸로 uuid 생성  (0) 2024.11.17

nextjs에서 eslint 사용하지 않는 변수 오류 없애기

 

1.lint 관련 플러그인 설치

npm install @next/eslint-plugin-next

 

2. eslinet.config.mjs 파일을 다음과 같이 설정

 

const eslintConfig = [
  ...compat.extends("next/core-web-vitals", "next/typescript"),
  {
    plugins: ["@typescript-eslint/eslint-plugin-next"],
    rules: {
      "no-unused-vars": "off",
      "@typescript-eslint/no-unused-vars": "error",
    },
  },
];

 

 

공식 설치 문서 : 

https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#installing-prebuilt-ubuntu-packages

 

Installing NGINX Open Source | NGINX Documentation

MyF5 Your key to everything F5, including support, registration keys, and subscriptions

docs.nginx.com

 

공식 우분투 패키지 레포를 통하지 않고, nginx 에서 제공하는 패키지 레포를 통해 설치하도록 한다.

 

# 다음과 같이 키 정보를 등록

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

 

# 패키지 정보 등록

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

 

# 설치 진행

sudo apt update
sudo apt install nginx

 

----

# 부팅 시 Nginx 자동 시작 해제
sudo systemctl disable nginx
# 자동 재시작으로 다시 활성화 경우
sudo systemctl enable nginx
# 서비스 상태확인
sudo systemctl status nginx

## 제어 명령


# Nginx 시작 및 systemctl에 등록
sudo systemctl start nginx
#Nginx 중지
sudo systemctl stop nginx
# Nginx 재시작
sudo systemctl restart nginx
# Nginx 다시 로드
sudo systemctl reload nginx

 

 

설치 후 브라우저로 접근하여 잘 뜨는지 확인합니다.

 

 

 

---

사이트 추가 설정

touch /etc/nginx/sites-available/gitea.ozstack.net.conf

 

안에 내용 예시)

server {
  listen 80;
  server_name gitea.ozstack.net;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  client_max_body_size 20G;
  server_name ozstack.net;
  ssl_certificate /etc/letsencrypt/live/ozstack.net/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/ozstack.net/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;



  location / {
    proxy_redirect off;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto  $scheme;
    proxy_set_header   Host  $http_host;
    proxy_set_header   X-NginX-Proxy  true;
    proxy_http_version 1.1;
    proxy_cookie_path / "/; SameSite=None; HTTPOnly; Secure";
    proxy_pass         http://192.168.0.114:3000;
  }
}



# 심볼링 링크 추가

 sudo ln -s /etc/nginx/sites-available/gitea.ozstack.net.conf /etc/nginx/sites-enabled/gitea.ozstack.net.conf

 

 

# nginx.conf 에    include /etc/nginx/conf.d/*.conf; 아래 줄에 다음을 추가

include /etc/nginx/sites-enabled/*;

'설정' 카테고리의 다른 글

RaspberryPI Zero2w 몇가지...  (0) 2026.06.29
docker로 ftp 띄우기  (1) 2025.08.15
heidisql 한글 버그  (0) 2025.01.05
ollama windows 설치 시 실행 오류 시  (0) 2024.12.25
bash 셸로 uuid 생성  (0) 2024.11.17

 

 

dotnet 툴 설치 후, nswag.json을 통해 client생성시 위와 같은 오류를 만날때,

프로젝트에 Templates라는 디렉토리를 생성해주자.

 

메시지창을 보면 오류내용을 알 수 있다.

 

 

 

php8.2와 Mariadb 10.6.17-MariaDB-log 환경에서 json 데이터 저장시 한글이 깨지는 현상을 발견...

인코딩 문제인가 싶어서 한참동안 찾았는데...

hedisql 툴의 버그였다... 어이없....

 

아래는 발견한 현상이다. 편집을 누르면 한글이 깨진다..

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

해결방법은 접속 드라이버를 아래처럼 변경하면 해결이 가능하다.

 

 

 

 

DBeaver에서는 정상적으로 출력된다...

 

'설정' 카테고리의 다른 글

docker로 ftp 띄우기  (1) 2025.08.15
우분투 nginx 설치  (0) 2025.03.26
ollama windows 설치 시 실행 오류 시  (0) 2024.12.25
bash 셸로 uuid 생성  (0) 2024.11.17
asp.net core 에서 unix domain socket으로 서비스 바인딩하기  (0) 2024.06.23

 

ollama windows 설치 시 실행 오류 시

 

아래 환경변수를 설정한다.

환경변수 키 OLLAMA_HOST
환경변수 값 0.0.0.0:11434

 

 

https://github.com/ollama/ollama/issues/2627

 

Error: listen tcp 127.0.0.1:11434: bind: · Issue #2627 · ollama/ollama

Windows 10, I cannot start Ollama, $ ollama serve Error: listen tcp 127.0.0.1:11434: bind: An attempt was made to access a socket in a way forbidden by its access permissions. from app.log time=202...

github.com

 

'설정' 카테고리의 다른 글

우분투 nginx 설치  (0) 2025.03.26
heidisql 한글 버그  (0) 2025.01.05
bash 셸로 uuid 생성  (0) 2024.11.17
asp.net core 에서 unix domain socket으로 서비스 바인딩하기  (0) 2024.06.23
우분투 리눅스 논리 볼륨 확장하기  (0) 2023.08.12

+ Recent posts