{"id":15168454,"url":"https://github.com/gwak2837/sobok-backend","last_synced_at":"2025-10-01T00:32:15.573Z","repository":{"id":45326814,"uuid":"394828748","full_name":"gwak2837/sobok-backend","owner":"gwak2837","description":"소복소복이 백엔드","archived":true,"fork":false,"pushed_at":"2021-12-21T03:17:25.000Z","size":4422,"stargazers_count":1,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-09-30T16:40:53.480Z","etag":null,"topics":["docker","graphql","postgresql","typescript","yarn2"],"latest_commit_sha":null,"homepage":"https://sobok-lvpyu53n5q-du.a.run.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gwak2837.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-08-11T01:46:52.000Z","updated_at":"2024-08-14T07:24:04.000Z","dependencies_parsed_at":"2022-09-17T08:11:05.291Z","dependency_job_id":null,"html_url":"https://github.com/gwak2837/sobok-backend","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwak2837%2Fsobok-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwak2837%2Fsobok-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwak2837%2Fsobok-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwak2837%2Fsobok-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gwak2837","download_url":"https://codeload.github.com/gwak2837/sobok-backend/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234803469,"owners_count":18889260,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","graphql","postgresql","typescript","yarn2"],"created_at":"2024-09-27T06:03:40.643Z","updated_at":"2025-10-01T00:32:10.082Z","avatar_url":"https://github.com/gwak2837.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ☁️ 소복 (Sobok) Back-End\n\n소소한 행복 :)\n\n## Requires\n\n- macOS 11.5\n- [Git](https://git-scm.com/downloads) 2.32\n- [Node](https://hub.docker.com/_/node) 16 Alpine\n- [Yarn](https://yarnpkg.com/getting-started/install#about-global-installs) berry\n- [Visual Studio Code](https://code.visualstudio.com/Download) 1.61\n- [PostgreSQL](https://hub.docker.com/_/postgres) 14 Alpine\n- [Docker](https://www.docker.com/get-started) 20.10\n- Docker Compose 1.29\n\n```bash\n$ git --version\n$ node --version\n$ yarn --version\n$ code --version\n$ docker --version\n$ docker-compose --version\n```\n\n위 명령어를 통해 프로젝트에 필요한 모든 프로그램이 설치되어 있는지 확인합니다.\n\n## Project structure\n\n![images/architecture.webp](images/architecture.webp)\n\n## Quick start\n\n### Download codes\n\n```bash\n$ git clone https://github.com/rmfpdlxmtidl/sobok-backend.git\n$ cd sobok-backend\n$ git checkout main\n$ yarn\n```\n\n프로젝트를 다운로드 받고 해당 폴더로 이동한 후 적절한 브랜치(`main` 등)로 이동하고 프로젝트에 필요한 외부 패키지를 설치합니다.\n\n그리고 프로젝트 폴더에서 VSCode를 실행하면 오른쪽 아래에 '권장 확장 프로그램 설치' 알림이 뜨는데, 프로젝트에서 권장하는 확장 프로그램(ESLint, Prettier 등)을 모두 설치합니다.\n\n### Create environment variables\n\n```\nPORT=4000\n\nCONNECTION_STRING=postgresql://DB계정이름:DB계정암호@DB서버주소:포트/DB이름\n\nJWT_SECRET_KEY=임의의문자열\n\nGOOGLE_CLIENT_ID=\nGOOGLE_CLIENT_SECRET=\n\nFACEBOOK_APP_ID=\nFACEBOOK_APP_SECRET=\n\nFRONTEND_URL=\nBACKEND_URL=\n\n# for yarn generate-db\nPOSTGRES_DB=DB이름\n```\n\n루트 폴더에 `.env`, `.env.development`, `.env.test` 파일을 생성하고 프로젝트에서 사용되는 환경 변수를 설정합니다.\n\n### Start PostgreSQL server\n\n#### Connect to Oracle Instance with SSH\n\n```shell\n$ ssh -i {Oracle Instance 비밀키 경로} {Oracle Instance 사용자 이름}@{Oracle Instance 공용 IP}\n```\n\n#### Install Docker\n\n```shell\n# Install Docker Engine on Ubuntu https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository\nsudo apt remove docker docker-engine docker.io containerd runc\n\nsudo apt update\nsudo apt install \\\n  ca-certificates \\\n  curl \\\n  gnupg \\\n  lsb-release\n\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg\n\necho \\\n  \"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \\\n  $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null\n\nsudo apt update\nsudo apt install docker-ce docker-ce-cli containerd.io\n```\n\n#### Run PostgreSQL container\n\n```shell\n# Set variables\nDOCKER_VOLUME_NAME=도커볼륨이름\nPOSTGRES_HOST=DB서버주소\nPOSTGRES_USER=DB계정이름\nPOSTGRES_PASSWORD=DB계정암호\nPOSTGRES_DB=DB이름\n\n# generate the server.key and server.crt https://www.postgresql.org/docs/14/ssl-tcp.html\nopenssl req -new -nodes -text -out root.csr \\\n  -keyout root.key -subj \"/CN=Sindy\"\nchmod og-rwx root.key\n\nopenssl x509 -req -in root.csr -text -days 3650 \\\n  -extfile /etc/ssl/openssl.cnf -extensions v3_ca \\\n  -signkey root.key -out root.crt\n\nopenssl req -new -nodes -text -out server.csr \\\n  -keyout server.key -subj \"/CN=$POSTGRES_HOST\"\n\nopenssl x509 -req -in server.csr -text -days 365 \\\n  -CA root.crt -CAkey root.key -CAcreateserial \\\n  -out server.crt\n\n# set postgres (alpine) user as owner of the server.key and permissions to 600\nsudo chown 0:70 server.key\nsudo chmod 640 server.key\n\n# set client connection policy\necho \"\n# TYPE  DATABASE        USER            ADDRESS                 METHOD\n\n# 'local' is for Unix domain socket connections only\nlocal   all             all                                     trust\n# IPv4 local connections:\nhost    all             all             127.0.0.1/32            trust\n# IPv6 local connections:\nhost    all             all             ::1/128                 trust\n# Allow replication connections from localhost, by a user with the\n# replication privilege.\nlocal   replication     all                                     trust\nhost    replication     all             127.0.0.1/32            trust\nhost    replication     all             ::1/128                 trust\n\nhostssl all all all scram-sha-256\n\" \u003e pg_hba.conf\n\n# start a postgres docker container, mapping the .key and .crt into the image.\nsudo docker volume create $DOCKER_VOLUME_NAME\nsudo docker run \\\n  -d \\\n  -e POSTGRES_USER=$POSTGRES_USER \\\n  -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD \\\n  -e POSTGRES_DB=$POSTGRES_DB \\\n  -e LANG=ko_KR.UTF8 \\\n  -e LC_COLLATE=C \\\n  -e POSTGRES_INITDB_ARGS=--data-checksums \\\n  --name postgres \\\n  -p 5432:5432 \\\n  --restart=always \\\n  --shm-size=256MB \\\n  -v \"$PWD/server.crt:/var/lib/postgresql/server.crt:ro\" \\\n  -v \"$PWD/server.key:/var/lib/postgresql/server.key:ro\" \\\n  -v \"$PWD/pg_hba.conf:/var/lib/postgresql/pg_hba.conf\" \\\n  -v $DOCKER_VOLUME_NAME:/var/lib/postgresql/data \\\n  postgres:14-alpine \\\n  -c ssl=on \\\n  -c ssl_cert_file=/var/lib/postgresql/server.crt \\\n  -c ssl_key_file=/var/lib/postgresql/server.key \\\n  -c hba_file=/var/lib/postgresql/pg_hba.conf\n```\n\n도커를 통해 PostgreSQL 컨테이너와 도커 볼륨을 생성하고, OpenSSL을 이용해 자체 서명된 인증서를 생성해서 SSL 연결을 활성화합니다.\n\n```shell\n$ scp -i {Oracle Instance 비밀키 경로} {Oracle Instance 사용자 이름}@{Oracle Instance 공용 IP}:{CA 인증서 경로}/root.crt ./\n```\n\nSCP로 root 인증서 다운로드 받기\n\n#### Initialize database\n\n```bash\nyarn import-db 환경변수파일위치\n```\n\n그리고 `import-db` 스크립트를 실행해 [`database/initialization.sql`](database/initialization.sql)와 CSV 파일로 되어 있는 더미데이터를 넣어줍니다.\n\n### Start Node.js server\n\n```shell\n$ yarn dev\n```\n\nTypeScript 파일을 그대로 사용해 Nodemon으로 서비스를 실행합니다.\n\nor\n\n```shell\n$ yarn build \u0026\u0026 yarn start\n```\n\nTypeScript 파일을 JavaScript로 트랜스파일한 후 Node.js로 서비스를 실행합니다.\n\nor\n\n```shell\n$ docker-compose up --detach --build --force-recreate\n```\n\n(Cloud Run 환경과 동일한) Docker 환경에서 Node.js 서버를 실행합니다.\n\n## Cloud\n\n### GCP Cloud Run\n\nCloud Run이 GitHub 저장소 변경 사항을 자동으로 감지하기 때문에 GitHub로 commit을 push할 때마다 Cloud Run에 자동으로 배포됩니다.\n\n## Scripts\n\n#### `test`\n\n실행 중인 GraphQL 서버에 테스트용 GraphQL 쿼리를 요청하고 응답을 검사합니다. 이 스크립트를 실행 하기 전에 `localhost` 또는 원격에서 GraphQL API 서버를 실행해야 합니다.\n\n#### `generate-db`\n\n```bash\n$ yarn generate-db {환경 변수 파일 위치}\n```\n\nPostgreSQL 데이터베이스 구조를 바탕으로 TypeScript 기반 자료형이 담긴 파일을 생성합니다.\n\n#### `export-db`\n\n```bash\n$ yarn export-db {환경 변수 파일 위치}\n```\n\nPostgreSQL 데이터베이스에 있는 모든 스키마의 모든 테이블을 CSV 파일로 저장합니다. 더미 데이터 CSV 파일을 변경하기 전에 수행합니다.\n\n#### `import-db`\n\n```bash\n$ yarn import-db {환경 변수 파일 위치}\n```\n\nCSV 파일을 PostgreSQL 데이터베이스에 삽입합니다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwak2837%2Fsobok-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgwak2837%2Fsobok-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwak2837%2Fsobok-backend/lists"}